Merge "Prevent space before ellipsis when truncating"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sat, 16 Nov 2013 12:10:27 +0000 (12:10 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sat, 16 Nov 2013 12:10:27 +0000 (12:10 +0000)
287 files changed:
.gitignore
RELEASE-NOTES-1.22
RELEASE-NOTES-1.23
docs/README
docs/hooks.txt
docs/maintenance.txt
docs/memcached.txt
extensions/README
includes/Article.php
includes/AutoLoader.php
includes/DefaultSettings.php
includes/Hooks.php
includes/OutputPage.php
includes/ProxyTools.php
includes/Sanitizer.php
includes/Skin.php
includes/SkinTemplate.php
includes/SpecialPageFactory.php
includes/UserMailer.php
includes/WikiPage.php
includes/actions/CachedAction.php
includes/actions/CreditsAction.php
includes/actions/DeleteAction.php
includes/actions/EditAction.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/MarkpatrolledAction.php
includes/actions/ProtectAction.php
includes/actions/RawAction.php
includes/actions/RenderAction.php
includes/actions/RevertAction.php
includes/actions/RollbackAction.php
includes/actions/ViewAction.php
includes/actions/WatchAction.php
includes/api/ApiBase.php
includes/api/ApiComparePages.php
includes/api/ApiCreateAccount.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatRaw.php
includes/api/ApiFormatWddx.php
includes/api/ApiFormatXml.php
includes/api/ApiHelp.php
includes/api/ApiImageRotate.php
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiMain.php
includes/api/ApiModuleManager.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPatrol.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFileRepoInfo.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryORM.php
includes/api/ApiQueryPagePropNames.php
includes/api/ApiQueryPageProps.php
includes/api/ApiQueryPagesWithProp.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiResult.php
includes/api/ApiRollback.php
includes/api/ApiRsd.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiTokens.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiWatch.php
includes/cache/BacklinkCache.php
includes/changes/RecentChange.php
includes/clientpool/RedisConnectionPool.php
includes/content/ContentHandler.php
includes/db/Database.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabasePostgres.php
includes/diff/DifferenceEngine.php
includes/installer/DatabaseInstaller.php
includes/installer/WebInstaller.php
includes/profiler/ProfilerSimpleUDP.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialLog.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/utils/Cdb.php
includes/utils/CdbDBA.php [new file with mode: 0644]
includes/utils/CdbPHP.php
languages/LanguageConverter.php
languages/messages/MessagesAce.php
languages/messages/MessagesAf.php
languages/messages/MessagesAng.php
languages/messages/MessagesAr.php
languages/messages/MessagesAz.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCe.php
languages/messages/MessagesCs.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrr.php
languages/messages/MessagesGa.php
languages/messages/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGom_latn.php
languages/messages/MessagesGu.php
languages/messages/MessagesHe.php
languages/messages/MessagesHil.php
languages/messages/MessagesHr.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKo.php
languages/messages/MessagesLa.php
languages/messages/MessagesLb.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMy.php
languages/messages/MessagesNan.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesOc.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRo.php
languages/messages/MessagesRu.php
languages/messages/MessagesSa.php
languages/messages/MessagesShi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTl.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesVi.php
languages/messages/MessagesWar.php
languages/messages/MessagesWuu.php
languages/messages/MessagesYi.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/archives/patch-val_ip.sql [deleted file]
maintenance/archives/patch-validate.sql [deleted file]
maintenance/cleanupUploadStash.php
maintenance/copyFileBackend.php
maintenance/language/StatOutputs.php
maintenance/language/checkDupeMessages.php
maintenance/language/checkLanguage.inc
maintenance/language/countMessages.php
maintenance/language/generateCollationData.php
maintenance/language/generateNormalizerData.php
maintenance/language/langmemusage.php
maintenance/language/languages.inc
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/language/rebuildLanguage.php
maintenance/language/transstat.php
maintenance/language/validate.php
maintenance/language/writeMessagesArray.inc
maintenance/moveBatch.php
maintenance/postgres/mediawiki_mysql2postgres.pl
maintenance/purgeChangedFiles.php
maintenance/rebuildrecentchanges.php
maintenance/tables.sql
resources/Resources.php
resources/mediawiki.action/mediawiki.action.edit.js
resources/mediawiki.ui/components/default/buttons.less [new file with mode: 0644]
resources/mediawiki.ui/components/default/forms.less [new file with mode: 0644]
resources/mediawiki.ui/components/utilities.less [new file with mode: 0644]
resources/mediawiki.ui/components/vector/buttons.less [new file with mode: 0644]
resources/mediawiki.ui/components/vector/containers.less [new file with mode: 0644]
resources/mediawiki.ui/components/vector/forms.less [new file with mode: 0644]
resources/mediawiki.ui/default.less [new file with mode: 0644]
resources/mediawiki.ui/mediawiki.ui.default.css [deleted file]
resources/mediawiki.ui/mediawiki.ui.vector.css [deleted file]
resources/mediawiki.ui/mixins/effects.less [new file with mode: 0644]
resources/mediawiki.ui/mixins/forms.less [new file with mode: 0644]
resources/mediawiki.ui/mixins/type.less [new file with mode: 0644]
resources/mediawiki.ui/mixins/utilities.less [new file with mode: 0644]
resources/mediawiki.ui/settings/colors.less [new file with mode: 0644]
resources/mediawiki.ui/settings/typography.less [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/Makefile [deleted file]
resources/mediawiki.ui/sourcefiles/config.rb [deleted file]
resources/mediawiki.ui/sourcefiles/scss/components/_default.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss [deleted file]
resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss [deleted file]
resources/mediawiki.ui/vector.less [new file with mode: 0644]
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.util.js
skins/vector/screen.less
tests/parser/parserTests.txt
tests/phpunit/includes/ArticleTablesTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
thumb.php

index 7d1a309..9c0c3b6 100644 (file)
@@ -41,7 +41,6 @@ sftp-config.json
 
 # Building & testing
 node_modules/
-.sass-cache/
 
 # Composer
 /vendor
index 6826478..333696b 100644 (file)
@@ -354,6 +354,7 @@ production.
 * (bug 55818) BREAKING CHANGE: Removed undocumented 'Debug' hook in wfDebug.
   This resolves an infinite loop when using $wgDebugFunctionEntry = true.
 * (bug 56707) Correct tooltip of "Next n results" on query special pages.
+* (bug 56770) mw.util.addPortletLink: Check length before access array index.
 
 === API changes in 1.22 ===
 * (bug 25553) The JSON output formatter now leaves forward slashes unescaped
@@ -531,6 +532,8 @@ changes to languages because of Bugzilla reports.
   'mediawiki.legacy.wikibits' (which IEFixes depends on) and that will import
   IEFixes automatically if user agent conditions are met.
 * Code specific to the Math extension was marked as deprecated.
+* mediawiki.util: mw.util.wikiGetlink has been renamed to getUrl. (The old name
+  still works, but is deprecated.)
 
 == Compatibility ==
 
index 64c55f5..d7c252a 100644 (file)
@@ -35,6 +35,8 @@ production.
 * Add "wgRelevantUserName" to mw.config containing the current
   Skin::getRelevantUser value.
 * (bug 56033) Add content model to the page information.
+* Added Article::MissingArticleConditions hook to give extensions a chance to
+  hide their (unrelated) log entries.
 
 === Bug fixes in 1.23 ===
 * (bug 41759) The "updated since last visit" markers (on history pages, recent
@@ -45,6 +47,10 @@ production.
   when the email address is already confirmed. Also, consistently use
   "confirmed", rather than "authenticated", when messaging whether or not the
   user has confirmed an email address.
+* (bug 19415) action=render no longer shows section edit links. This affects
+  behavior of several other features where (bogus) section edit links will
+  disappear, such as file description pages loaded via $wgUseInstantCommons or
+  pages transcluded cross-wiki via $wgEnableScaryTranscluding.
 
 === API changes in 1.23 ===
 * (bug 54884) action=parse&prop=categories now indicates hidden and missing
@@ -66,9 +72,9 @@ changes to languages because of Bugzilla reports.
    review the sql and comments in maintenance/archives/patch-rc_source.sql.
 ** The rc_type field of recentchanges will be deprecated in a future point
    release.
-* The global variable $wgArticle has been removed after a lengthy deprecation
-* mediawiki.util: mw.util.wikiGetlink has been renamed to getUrl. (The old name still
-  works, but is deprecated.)
+* The global variable $wgArticle has been removed after a lengthy deprecation.
+* The global functions addButton and insertTags (for mw.toolbar.addButton and
+  mw.toolbar.insertTags) now emits mw.log.warn when accessed.
 
 == Compatibility ==
 
index 6917076..5bc8bfc 100644 (file)
@@ -1,16 +1,19 @@
-[July 22nd 2008]
+/docs Directory README
+======================
 
 The 'docs' directory contain various text files that should help you understand
 the most important parts of the code of MediaWiki. More in-depth documentation
-can be found at http://www.mediawiki.org/wiki/Manual:Code.
+can be found at:
+  https://www.mediawiki.org/wiki/Manual:Code
 
 API documentation is automatically generated and updated daily at:
-  http://svn.wikimedia.org/doc/
+  https://doc.wikimedia.org/mediawiki-core/master/php/html/
 
 You can get a fresh version using 'make doc' or mwdocgen.php in the
 ../maintenance/ directory.
 
 
-For end user / administrators, most of the documentation is located online at:
-  http://www.mediawiki.org/wiki/Help:Contents
-  http://www.mediawiki.org/wiki/Manual:Contents
+For end users, most of the documentation is located online at:
+  https://www.mediawiki.org/wiki/Help:Contents
+Documentation for MediaWiki site administrators is at:
+  https://www.mediawiki.org/wiki/Manual:Contents
index 700f765..d56886c 100644 (file)
@@ -295,10 +295,6 @@ $article: Article object
 $user: the User object that was created. (Parameter added in 1.7)
 $byEmail: true when account was created "by email" (added in 1.12)
 
-'ValidateNewUser': Before user account is created, check account settings
-$user: the User object to be created.
-$&error: Error message, if any, returned by failed validation
-
 'AfterFinalPageOutput': At the end of OutputPage::output() but before final
 ob_end_flush() which will send the buffered output to the client. This allows
 for last-minute modification of the output within the buffer by using
@@ -465,6 +461,13 @@ types.
 &$tokenTypes: supported token types in format 'type' => callback function
 used to retrieve this type of tokens.
 
+'Article::MissingArticleConditions': Before fetching deletion & move log entries
+to display a message of a non-existing page being deleted/moved, give extensions
+a chance to hide their (unrelated) log entries.
+&$conds: Array of query conditions (all of which have to be met; conditions will
+AND in the final query)
+$logTypes: Array of log types being queried
+
 'ArticleAfterFetchContent': After fetching content of an article from the
 database. DEPRECATED, use ArticleAfterFetchContentObject instead.
 $article: the article (object) being loaded from the database
@@ -769,7 +772,7 @@ $output: OutputPage object in use
 'CanIPUseHTTPS': Determine whether the client at a given source IP is likely
 to be able to access the wiki via HTTPS.
 $ip: The IP address in human-readable form
-&$canDo: This reference should be set to false if the client may not be able 
+&$canDo: This reference should be set to false if the client may not be able
 to use HTTPS
 
 'CanonicalNamespaces': For extensions adding their own namespaces or altering
@@ -1217,6 +1220,9 @@ without any fancy queries or variants.
 $title: Title object of page
 &$url: string value as output (out parameter, can modify)
 
+'GetLogTypesOnUser': Add log types where the target is a userpage
+&$types: Array of log types
+
 'GetMetadataVersion': Modify the image metadata version currently in use. This
 is used when requesting image metadata from a ForeignApiRepo. Media handlers
 that need to have versioned metadata should add an element to the end of the
@@ -1538,6 +1544,11 @@ $cache: The LocalisationCache object
 $code: language code
 &$alldata: The localisation data from core and extensions
 
+'LocalisationChecksBlacklist': When fetching the blacklist of
+localisation checks.
+&$blacklist: array of checks to blacklist. See the bottom of
+  maintenance/language/checkLanguage.inc for the format of this variable.
+
 'LogEventsListShowLogExtract': Called before the string is added to OutputPage.
 Returning false will prevent the string from being added to the OutputPage.
 &$s: html string to show for the log extract
@@ -1765,7 +1776,7 @@ $baseRevId: the rev ID (or false) this edit was based on
 $article: the article that the history is loading for
 $context: RequestContext object
 
-'PageHistoryLineEnding' : Right before the end <li> is added to a history line.
+'PageHistoryLineEnding': Right before the end <li> is added to a history line.
 $row: the revision row for this line
 $s: the string representing this parsed line
 $classes: array containing the <li> element classes
@@ -2381,7 +2392,7 @@ $special: the special page object
 $values: array of variables with watchlist options
 
 'SpecialWatchlistGetNonRevisionTypes': Called when building sql query for
-SpecialWatchlist. Allows extensions to register custom values they have 
+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
 
@@ -2848,4 +2859,4 @@ data. Can be used to post-process the results.
   of values).
 
 More hooks might be available but undocumented, you can execute
-'php maintenance/findHooks.php' to find hidden ones.
+"php maintenance/findHooks.php" to find hidden ones.
index 87a32a8..87071f2 100644 (file)
@@ -54,4 +54,4 @@ require_once RUN_MAINTENANCE_IF_MAIN;
 That's it. In the execute() method, you have access to all of the normal
 MediaWiki functions, so you can get a DB connection, use the cache, etc.
 For full docs on the Maintenance class, see the auto-generated docs at
-http://svn.wikimedia.org/doc/classMaintenance.html
+https://doc.wikimedia.org/mediawiki-core/master/php/html/classMaintenance.html
index e5c597d..16c5760 100644 (file)
@@ -105,7 +105,7 @@ Date Formatter:
        expiry: one hour
 
 Difference Engine:
-       key: $wgDBname:diff:version:{DifferenceEngine::CACHE_VERSION}:oldid:$old:newid:$new
+       key: $wgDBname:diff:version:{MW_DIFF_VERSION}:oldid:$old:newid:$new
        ex: wikidb:diff:version:1.11a:oldid:1:newid:2
        stores: body of a difference
        cleared by: nothing
index e815062..b665001 100644 (file)
@@ -2,20 +2,22 @@ Extensions (such as the hieroglyphic module WikiHiero) are distributed
 separately. Drop them into this extensions directory and enable as
 per the extension's directions.
 
+You can find a list of extensions and documentation on the MediaWiki website:
+    https://www.mediawiki.org/wiki/Category:Extensions
+
+
 If you are a developer, you want to fetch the extension tree in another
 directory and make a symbolic link:
 
  mediawiki/extensions$ ln -s ../../extensions-trunk/FooBarExt
 
-The extensions are available through Git:
+Most extensions are available through Git:
     https://gerrit.wikimedia.org/r/#/admin/projects/
+    https://git.wikimedia.org/project/mediawiki
 
-or Subversion:
+Old extensions are on Subversion:
     https://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions/
 
-You can find documentation and additional extensions on MediaWiki website:
-    https://www.mediawiki.org/wiki/Category:Extensions
-
 
 Please note that under POSIX systems (Linux...), parent of a symbolic path
 refers to the link source, NOT to the target! You should check the env
index 701dae9..854f7f1 100644 (file)
@@ -812,7 +812,7 @@ class Article implements Page {
                $de = $contentHandler->createDifferenceEngine( $this->getContext(), $oldid, $diff, $rcid, $purge, $unhide );
 
                // DifferenceEngine directly fetched the revision:
-               $this->mRevIdFetched = $de->getNewid();
+               $this->mRevIdFetched = $de->mNewid;
                $de->showDiffPage( $diffOnly );
 
                // Run view updates for the newer revision being diffed (and shown below the diff if not $diffOnly)
@@ -1201,10 +1201,15 @@ class Article implements Page {
 
                wfRunHooks( 'ShowMissingArticle', array( $this ) );
 
+               // Give extensions a chance to hide their (unrelated) log entries
+               $logTypes = array( 'delete', 'move' );
+               $conds = array( "log_action != 'revision'" );
+               wfRunHooks( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
+
                # Show delete and move logs
-               LogEventsList::showLogExtract( $outputPage, array( 'delete', 'move' ), $this->getTitle(), '',
+               LogEventsList::showLogExtract( $outputPage, $logTypes, $this->getTitle(), '',
                        array( 'lim' => 10,
-                               'conds' => array( "log_action != 'revision'" ),
+                               'conds' => $conds,
                                'showIfEmpty' => false,
                                'msgKey' => array( 'moveddeleted-notice' ) )
                );
@@ -1473,6 +1478,7 @@ class Article implements Page {
         */
        public function render() {
                $this->getContext()->getOutput()->setArticleBodyOnly( true );
+               $this->getContext()->getOutput()->enableSectionEditLinks( false );
                $this->view();
        }
 
index f73f24b..c94c46b 100644 (file)
@@ -1046,12 +1046,13 @@ $wgAutoloadLocalClasses = array(
 
        # includes/utils
        'ArrayUtils' => 'includes/utils/ArrayUtils.php',
+       'CdbException' => 'includes/utils/Cdb.php',
        'CdbFunctions' => 'includes/utils/CdbPHP.php',
        'CdbReader' => 'includes/utils/Cdb.php',
-       'CdbReaderDBA' => 'includes/utils/Cdb.php',
+       'CdbReaderDBA' => 'includes/utils/CdbDBA.php',
        'CdbReaderPHP' => 'includes/utils/CdbPHP.php',
        'CdbWriter' => 'includes/utils/Cdb.php',
-       'CdbWriterDBA' => 'includes/utils/Cdb.php',
+       'CdbWriterDBA' => 'includes/utils/CdbDBA.php',
        'CdbWriterPHP' => 'includes/utils/CdbPHP.php',
        'ConfEditor' => 'includes/utils/ConfEditor.php',
        'ConfEditorParseError' => 'includes/utils/ConfEditor.php',
@@ -1114,13 +1115,13 @@ $wgAutoloadLocalClasses = array(
        'UserDupes' => 'maintenance/userDupes.inc',
 
        # maintenance/language
-       'csvStatsOutput' => 'maintenance/language/StatOutputs.php',
-       'extensionLanguages' => 'maintenance/language/languages.inc',
-       'languages' => 'maintenance/language/languages.inc',
+       'CsvStatsOutput' => 'maintenance/language/StatOutputs.php',
+       'ExtensionLanguages' => 'maintenance/language/languages.inc',
+       'Languages' => 'maintenance/language/languages.inc',
        'MessageWriter' => 'maintenance/language/writeMessagesArray.inc',
-       'statsOutput' => 'maintenance/language/StatOutputs.php',
-       'textStatsOutput' => 'maintenance/language/StatOutputs.php',
-       'wikiStatsOutput' => 'maintenance/language/StatOutputs.php',
+       'StatsOutput' => 'maintenance/language/StatOutputs.php',
+       'TextStatsOutput' => 'maintenance/language/StatOutputs.php',
+       'WikiStatsOutput' => 'maintenance/language/StatOutputs.php',
 
        # maintenance/term
        'AnsiTermColorer' => 'maintenance/term/MWTerm.php',
@@ -1142,7 +1143,7 @@ $wgAutoloadLocalClasses = array(
 );
 
 class AutoLoader {
-       static protected  $autoloadLocalClassesLower = null;
+       static protected $autoloadLocalClassesLower = null;
 
        /**
         * autoload - take a class name and attempt to load it
@@ -1165,6 +1166,8 @@ class AutoLoader {
                // do not strip the leading backlash in this case, causing autoloading to fail.
                $className = ltrim( $className, '\\' );
 
+               $filename = false;
+
                if ( isset( $wgAutoloadLocalClasses[$className] ) ) {
                        $filename = $wgAutoloadLocalClasses[$className];
                } elseif ( isset( $wgAutoloadClasses[$className] ) ) {
@@ -1177,7 +1180,6 @@ class AutoLoader {
                         * 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 );
 
                        if ( self::$autoloadLocalClassesLower === null ) {
index 2d1ddcb..d428910 100644 (file)
@@ -2287,6 +2287,7 @@ $wgSquidServers = array();
  * As above, except these servers aren't purged on page changes; use to set a
  * list of trusted proxies, etc. Supports both individual IP addresses and
  * CIDR blocks.
+ * @since 1.23 Supports CIDR ranges
  */
 $wgSquidServersNoPurge = array();
 
@@ -5031,7 +5032,8 @@ $wgProfilePerHost = false;
  * Host for UDP profiler.
  *
  * The host should be running a daemon which can be obtained from MediaWiki
- * Subversion at: http://svn.wikimedia.org/svnroot/mediawiki/trunk/udpprofile
+ * Git at: 
+ * http://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile
  */
 $wgUDPProfilerHost = '127.0.0.1';
 
index 396e360..db47d31 100644 (file)
@@ -199,6 +199,9 @@ class Hooks {
                                $retval = call_user_func_array( $callback, $hook_args );
                        } catch ( MWHookException $e ) {
                                $badhookmsg = $e->getMessage();
+                       } catch ( Exception $e ) {
+                               restore_error_handler();
+                               throw $e;
                        }
                        restore_error_handler();
                        wfProfileOut( $func );
index b4fda13..5ffb802 100644 (file)
@@ -256,10 +256,15 @@ class OutputPage extends ContextSource {
        private $mTarget = null;
 
        /**
-        * @var bool: Whether output should contain table of contents
+        * @var bool: Whether parser output should contain table of contents
         */
        private $mEnableTOC = true;
 
+       /**
+        * @var bool: Whether parser output should contain section edit links
+        */
+       private $mEnableSectionEditLinks = true;
+
        /**
         * Constructor for OutputPage. This should not be called directly.
         * Instead a new RequestContext should be created and it will implicitly create
@@ -1612,6 +1617,7 @@ class OutputPage extends ContextSource {
        function addParserOutput( &$parserOutput ) {
                $this->addParserOutputNoText( $parserOutput );
                $parserOutput->setTOCEnabled( $this->mEnableTOC );
+               $parserOutput->setEditSectionTokens( $this->mEnableSectionEditLinks );
                $text = $parserOutput->getText();
                wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
                $this->addHTML( $text );
@@ -3675,4 +3681,21 @@ $templates
        public function isTOCEnabled() {
                return $this->mEnableTOC;
        }
+
+       /**
+        * Enables/disables section edit links, doesn't override __NOEDITSECTION__
+        * @param bool $flag
+        * @since 1.23
+        */
+       public function enableSectionEditLinks( $flag = true ) {
+               $this->mEnableSectionEditLinks = $flag;
+       }
+
+       /**
+        * @return bool
+        * @since 1.23
+        */
+       public function sectionEditLinksEnabled() {
+               return $this->mEnableSectionEditLinks;
+       }
 }
index 4efd347..a0f9e5f 100644 (file)
@@ -77,18 +77,20 @@ function wfIsTrustedProxy( $ip ) {
  * Checks if an IP matches a proxy we've configured.
  * @param $ip String
  * @return bool
+ * @since 1.23 Supports CIDR ranges in $wgSquidServersNoPurge
  */
 function wfIsConfiguredProxy( $ip ) {
        global $wgSquidServers, $wgSquidServersNoPurge;
 
        // quick check of known proxy servers
-       $trusted = in_array( $ip, $wgSquidServers );
+       $trusted = in_array( $ip, $wgSquidServers )
+               || in_array( $ip, $wgSquidServersNoPurge );
 
        if ( !$trusted ) {
                // slightly slower check to see if the ip is listed directly or in a CIDR
                // block in $wgSquidServersNoPurge
                foreach ( $wgSquidServersNoPurge as $block ) {
-                       if ( IP::isInRange( $ip, $block ) ) {
+                       if ( strpos( $block, '/' ) !== false && IP::isInRange( $ip, $block ) ) {
                                $trusted = true;
                                break;
                        }
index 4dbc9dd..3384af0 100644 (file)
@@ -865,6 +865,27 @@ class Sanitizer {
                $value = preg_replace_callback( $decodeRegex,
                        array( __CLASS__, 'cssDecodeCallback' ), $value );
 
+               // Normalize Halfwidth and Fullwidth Unicode block that IE6 might treat as ascii
+               $value = preg_replace_callback(
+                       '/[!-z]/u', // U+FF01 to U+FF5A
+                       function ( $matches ) {
+                               $cp = utf8ToCodepoint( $matches[0] );
+                               if ( $cp === false ) {
+                                       return '';
+                               }
+                               return chr( $cp - 65248 ); // ASCII range \x21-\x7A
+                       },
+                       $value
+               );
+
+               // Convert more characters IE6 might treat as ascii
+               // U+0280, U+0274, U+207F, U+029F, U+026A, U+207D, U+208D
+               $value = str_replace(
+                       array( 'ʀ', 'ɴ', 'ⁿ', 'ʟ', 'ɪ', '⁽', '₍' ),
+                       array( 'r', 'n', 'n', 'l', 'i', '(', '(' ),
+                       $value
+               );
+
                // Let the value through if it's nothing but a single comment, to
                // allow other functions which may reject it to pass some error
                // message through.
@@ -885,8 +906,24 @@ class Sanitizer {
                        }
                }
 
+               // S followed by repeat, iteration, or prolonged sound marks,
+               // which IE will treat as "ss"
+               $value = preg_replace(
+                       '/s(?:
+                               \xE3\x80\xB1 | # U+3031
+                               \xE3\x82\x9D | # U+309D
+                               \xE3\x83\xBC | # U+30FC
+                               \xE3\x83\xBD | # U+30FD
+                               \xEF\xB9\xBC | # U+FE7C
+                               \xEF\xB9\xBD | # U+FE7D
+                               \xEF\xBD\xB0   # U+FF70
+                       )/ix',
+                       'ss',
+                       $value
+               );
+
                // Reject problematic keywords and control characters
-               if ( preg_match( '/[\000-\010\016-\037\177]/', $value ) ) {
+               if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ) {
                        return '/* invalid control char */';
                } elseif ( preg_match( '! expression | filter\s*: | accelerator\s*: | url\s*\( | image\s*\( | image-set\s*\( !ix', $value ) ) {
                        return '/* insecure input */';
index 170e96f..a71bafc 100644 (file)
@@ -1559,7 +1559,7 @@ abstract class Skin extends ContextSource {
         * editSectionLinkForOther().
         *
         * @param $nt      Title  The title being linked to (may not be the same as
-        *   $wgTitle, if the section is included from a template)
+        *   the current page, if the section is included from a template)
         * @param string $section The designation of the section being pointed to,
         *   to be included in the link, like "&section=$section"
         * @param string $tooltip The tooltip to use for the link: will be escaped
index f25545d..77ea307 100644 (file)
@@ -159,7 +159,7 @@ class SkinTemplate extends Skin {
                                        $language_urls[] = array(
                                                'href' => $languageLinkTitle->getFullURL(),
                                                'text' => $ilLangName,
-                                               'title' => wfMessage( 'tooltip-iwiki', $languageLinkTitle->getText(), $ilLangLocalName )->escaped(),
+                                               'title' => wfMessage( 'interlanguage-link-title', $languageLinkTitle->getText(), $ilLangLocalName )->text(),
                                                'class' => $class,
                                                'lang' => wfBCP47( $ilInterwikiCode ),
                                                'hreflang' => wfBCP47( $ilInterwikiCode ),
@@ -245,6 +245,8 @@ class SkinTemplate extends Skin {
                if ( $oldContext ) {
                        $this->setContext( $oldContext );
                }
+
+               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -261,6 +263,8 @@ class SkinTemplate extends Skin {
                        $wgShowCreditsIfMax, $wgPageShowWatchingUsers, $wgArticlePath,
                        $wgScriptPath, $wgServer;
 
+               wfProfileIn( __METHOD__ );
+
                $title = $this->getTitle();
                $request = $this->getRequest();
                $tpl = $this->setupTemplateForOutput();
index 11edc8a..1ede0c1 100644 (file)
@@ -108,7 +108,7 @@ class SpecialPageFactory {
                'Log'                       => 'SpecialLog',
                'Watchlist'                 => 'SpecialWatchlist',
                'Newpages'                  => 'SpecialNewpages',
-               'Recentchanges'             => 'SpecialRecentchanges',
+               'Recentchanges'             => 'SpecialRecentChanges',
                'Recentchangeslinked'       => 'SpecialRecentchangeslinked',
                'Tags'                      => 'SpecialTags',
 
index 8ab10b2..6157f78 100644 (file)
@@ -352,14 +352,19 @@ class UserMailer {
                        ini_set( 'html_errors', '0' );
                        set_error_handler( 'UserMailer::errorHandler' );
 
-                       $safeMode = wfIniGetBool( 'safe_mode' );
-
-                       foreach ( $to as $recip ) {
-                               if ( $safeMode ) {
-                                       $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers );
-                               } else {
-                                       $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers, $wgAdditionalMailParams );
+                       try {
+                               $safeMode = wfIniGetBool( 'safe_mode' );
+
+                               foreach ( $to as $recip ) {
+                                       if ( $safeMode ) {
+                                               $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers );
+                                       } else {
+                                               $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers, $wgAdditionalMailParams );
+                                       }
                                }
+                       } catch ( Exception $e ) {
+                               restore_error_handler();
+                               throw $e;
                        }
 
                        restore_error_handler();
index 576979c..5fc01cc 100644 (file)
@@ -48,9 +48,11 @@ class WikiPage implements Page, IDBAccessObject {
        public $mDataLoaded = false;         // !< Boolean
        public $mIsRedirect = false;         // !< Boolean
        public $mLatest = false;             // !< Integer (false means "not loaded")
-       public $mPreparedEdit = false;       // !< Array
        /**@}}*/
 
+       /** @var stdclass Map of cache fields (text, parser output, ect) for a proposed/new edit */
+       protected $mPreparedEdit = false;
+
        /**
         * @var int
         */
@@ -242,7 +244,9 @@ class WikiPage implements Page, IDBAccessObject {
                $this->mTimestamp = '';
                $this->mIsRedirect = false;
                $this->mLatest = false;
-               $this->mPreparedEdit = false;
+               // Bug 57026: do not clear mPreparedEdit since prepareTextForEdit() already checks
+               // the requested rev ID and immutable content against the cached one.
+               // Clearing it can cause extra parses on edit for no reason.
        }
 
        /**
index bfdda7b..186ad46 100644 (file)
@@ -133,7 +133,8 @@ abstract class CachedAction extends FormlessAction implements ICacheHelper {
         * @param string|null $key
         */
        public function addCachedHTML( $computeFunction, $args = array(), $key = null ) {
-               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ) );
+               $html = $this->cacheHelper->getCachedValue( $computeFunction, $args, $key );
+               $this->getOutput()->addHTML( $html );
        }
 
        /**
@@ -147,7 +148,8 @@ abstract class CachedAction extends FormlessAction implements ICacheHelper {
        }
 
        /**
-        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
+        * Sets the time to live for the cache, in seconds or a unix timestamp
+        * indicating the point of expiry.
         *
         * @since 1.20
         *
@@ -184,5 +186,4 @@ abstract class CachedAction extends FormlessAction implements ICacheHelper {
                        $this->getOutput()->setSubtitle( $this->cacheHelper->getCachedNotice( $this->getContext() ) );
                }
        }
-
 }
index 0a2bf30..97c1605 100644 (file)
@@ -74,6 +74,7 @@ class CreditsAction extends FormlessAction {
                }
 
                wfProfileOut( __METHOD__ );
+
                return $s;
        }
 
@@ -94,6 +95,7 @@ class CreditsAction extends FormlessAction {
                        $d = '';
                        $t = '';
                }
+
                return $this->msg( 'lastmodifiedatby', $d, $t )->rawParams(
                        $this->userLink( $user ) )->params( $user->getName() )->escaped();
        }
@@ -125,6 +127,7 @@ class CreditsAction extends FormlessAction {
                $anon_ips = array();
 
                # Sift for real versus user names
+               /** @var $user User */
                foreach ( $contributors as $user ) {
                        $cnt--;
                        if ( $user->isLoggedIn() ) {
@@ -175,6 +178,7 @@ class CreditsAction extends FormlessAction {
                }
 
                $count = count( $fulllist );
+
                # "Based on work by ..."
                return $count
                        ? $this->msg( 'othercontribs' )->rawParams(
index db7123d..069d570 100644 (file)
@@ -43,7 +43,5 @@ class DeleteAction extends FormlessAction {
        public function show() {
 
                $this->page->delete();
-
        }
-
 }
index 3dd4c48..72210a9 100644 (file)
@@ -49,9 +49,7 @@ class EditAction extends FormlessAction {
                        $editor = new EditPage( $page );
                        $editor->edit();
                }
-
        }
-
 }
 
 /**
@@ -75,5 +73,4 @@ class SubmitAction extends EditAction {
 
                parent::show();
        }
-
 }
index e58791e..e492bd4 100644 (file)
@@ -37,6 +37,9 @@ class HistoryAction extends FormlessAction {
        const DIR_PREV = 0;
        const DIR_NEXT = 1;
 
+       /** @var array Array of message keys and strings */
+       public $message;
+
        public function getName() {
                return 'history';
        }
@@ -122,6 +125,7 @@ class HistoryAction extends FormlessAction {
                if ( $feedType ) {
                        $this->feed( $feedType );
                        wfProfileOut( __METHOD__ );
+
                        return;
                }
 
@@ -141,6 +145,7 @@ class HistoryAction extends FormlessAction {
                                )
                        );
                        wfProfileOut( __METHOD__ );
+
                        return;
                }
 
@@ -162,7 +167,7 @@ class HistoryAction extends FormlessAction {
                }
                if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
                        $checkDeleted = Xml::checkLabel( $this->msg( 'history-show-deleted' )->text(),
-                       'deleted', 'mw-show-deleted-only', $request->getBool( 'deleted' ) ) . "\n";
+                               'deleted', 'mw-show-deleted-only', $request->getBool( 'deleted' ) ) . "\n";
                } else {
                        $checkDeleted = '';
                }
@@ -178,7 +183,10 @@ class HistoryAction extends FormlessAction {
                        ) .
                        Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
                        Html::hidden( 'action', 'history' ) . "\n" .
-                       Xml::dateMenu( ( $year == null ? MWTimestamp::getLocalInstance()->format( 'Y' ) : $year ), $month ) . '&#160;' .
+                       Xml::dateMenu(
+                               ( $year == null ? MWTimestamp::getLocalInstance()->format( 'Y' ) : $year ),
+                               $month
+                       ) . '&#160;' .
                        ( $tagSelector ? ( implode( '&#160;', $tagSelector ) . '&#160;' ) : '' ) .
                        $checkDeleted .
                        Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n" .
@@ -316,9 +324,10 @@ class HistoryAction extends FormlessAction {
                                $wgContLang->time( $rev->getTimestamp() ) )->inContentLanguage()->text();
                } else {
                        $title = $rev->getUserText() .
-                       $this->msg( 'colon-separator' )->inContentLanguage()->text() .
-                       FeedItem::stripComment( $rev->getComment() );
+                               $this->msg( 'colon-separator' )->inContentLanguage()->text() .
+                               FeedItem::stripComment( $rev->getComment() );
                }
+
                return new FeedItem(
                        $title,
                        $text,
@@ -335,14 +344,28 @@ class HistoryAction extends FormlessAction {
  * @ingroup Actions
  */
 class HistoryPager extends ReverseChronologicalPager {
-       public $lastRow = false, $counter, $historyPage, $buttons, $conds;
+       /**
+        * @var bool|stdClass
+        */
+       public $lastRow = false;
+
+       public $counter, $historyPage, $buttons, $conds;
+
        protected $oldIdChecked;
+
        protected $preventClickjacking = false;
        /**
         * @var array
         */
        protected $parentLens;
 
+       /**
+        * @param HistoryAction $historyPage
+        * @param string $year
+        * @param string $month
+        * @param string $tagFilter
+        * @param array $conds
+        */
        function __construct( $historyPage, $year = '', $month = '', $tagFilter = '', $conds = array() ) {
                parent::__construct( $historyPage->getContext() );
                $this->historyPage = $historyPage;
@@ -383,6 +406,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        $this->tagFilter
                );
                wfRunHooks( 'PageHistoryPager::getQueryInfo', array( &$this, &$queryInfo ) );
+
                return $queryInfo;
        }
 
@@ -390,6 +414,10 @@ class HistoryPager extends ReverseChronologicalPager {
                return 'rev_timestamp';
        }
 
+       /**
+        * @param stdClass $row
+        * @return string
+        */
        function formatRow( $row ) {
                if ( $this->lastRow ) {
                        $latest = ( $this->counter == 1 && $this->mIsFirst );
@@ -401,6 +429,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        $s = '';
                }
                $this->lastRow = $row;
+
                return $s;
        }
 
@@ -457,13 +486,15 @@ class HistoryPager extends ReverseChronologicalPager {
 
                $s .= $this->buttons;
                $s .= '<ul id="pagehistory">' . "\n";
+
                return $s;
        }
 
        private function getRevisionButton( $name, $msg ) {
                $this->preventClickjacking();
                # Note bug #20966, <button> is non-standard in IE<8
-               $element = Html::element( 'button',
+               $element = Html::element(
+                       'button',
                        array(
                                'type' => 'submit',
                                'name' => $name,
@@ -502,6 +533,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        $s .= $this->buttons;
                }
                $s .= '</form>';
+
                return $s;
        }
 
@@ -526,16 +558,17 @@ class HistoryPager extends ReverseChronologicalPager {
         *
         * @todo document some more, and maybe clean up the code (some params redundant?)
         *
-        * @param $row Object: the database row corresponding to the previous line.
-        * @param $next Mixed: the database row corresponding to the next line. (chronologically previous)
-        * @param $notificationtimestamp
-        * @param $latest Boolean: whether this row corresponds to the page's latest revision.
-        * @param $firstInList Boolean: whether this row corresponds to the first displayed on this history page.
-        * @return String: HTML output for the row
+        * @param stdObject $row The database row corresponding to the previous line.
+        * @param mixed $next The database row corresponding to the next line
+        *   (chronologically previous)
+        * @param bool|string $notificationtimestamp
+        * @param bool $latest Whether this row corresponds to the page's latest revision.
+        * @param bool $firstInList Whether this row corresponds to the first
+        *   displayed on this history page.
+        * @return string HTML output for the row
         */
        function historyLine( $row, $next, $notificationtimestamp = false,
-               $latest = false, $firstInList = false )
-       {
+               $latest = false, $firstInList = false ) {
                $rev = new Revision( $row );
                $rev->setTitle( $this->getTitle() );
 
@@ -548,12 +581,14 @@ class HistoryPager extends ReverseChronologicalPager {
 
                $curlink = $this->curLink( $rev, $latest );
                $lastlink = $this->lastLink( $rev, $next );
-               $diffButtons = $this->diffButtons( $rev, $firstInList );
+               $curLastlinks = $curlink . $this->historyPage->message['pipe-separator'] . $lastlink;
                $histLinks = Html::rawElement(
-                               'span',
-                               array( 'class' => 'mw-history-histlinks' ),
-                               $this->msg( 'parentheses' )->rawParams( $curlink . $this->historyPage->message['pipe-separator'] . $lastlink )->escaped()
+                       'span',
+                       array( 'class' => 'mw-history-histlinks' ),
+                       $this->msg( 'parentheses' )->rawParams( $curLastlinks )->escaped()
                );
+
+               $diffButtons = $this->diffButtons( $rev, $firstInList );
                $s = $histLinks . $diffButtons;
 
                $link = $this->revLink( $rev );
@@ -627,7 +662,11 @@ class HistoryPager extends ReverseChronologicalPager {
                if ( $prevRev && $this->getTitle()->quickUserCan( 'edit', $user ) ) {
                        if ( $latest && $this->getTitle()->quickUserCan( 'rollback', $user ) ) {
                                // Get a rollback link without the brackets
-                               $rollbackLink = Linker::generateRollback( $rev, $this->getContext(), array( 'verify', 'noBrackets' ) );
+                               $rollbackLink = Linker::generateRollback(
+                                       $rev,
+                                       $this->getContext(),
+                                       array( 'verify', 'noBrackets' )
+                               );
                                if ( $rollbackLink ) {
                                        $this->preventClickjacking();
                                        $tools[] = $rollbackLink;
@@ -635,8 +674,8 @@ class HistoryPager extends ReverseChronologicalPager {
                        }
 
                        if ( !$rev->isDeleted( Revision::DELETED_TEXT )
-                               && !$prevRev->isDeleted( Revision::DELETED_TEXT ) )
-                       {
+                               && !$prevRev->isDeleted( Revision::DELETED_TEXT )
+                       {
                                # Create undo tooltip for the first (=latest) line only
                                $undoTooltip = $latest
                                        ? array( 'title' => $this->msg( 'tooltip-undo' )->text() )
@@ -705,6 +744,7 @@ class HistoryPager extends ReverseChronologicalPager {
                if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
                        $link = "<span class=\"history-deleted\">$link</span>";
                }
+
                return $link;
        }
 
@@ -758,8 +798,8 @@ class HistoryPager extends ReverseChronologicalPager {
                                )
                        );
                } elseif ( !$prevRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
-                       || !$nextRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) )
-               {
+                       || !$nextRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
+               {
                        return $last;
                } else {
                        return Linker::linkKnown(
@@ -816,6 +856,7 @@ class HistoryPager extends ReverseChronologicalPager {
                                array_merge( $radio, $checkmark, array(
                                        'name' => 'diff',
                                        'id' => "mw-diff-$id" ) ) );
+
                        return $first . $second;
                } else {
                        return '';
@@ -842,9 +883,11 @@ class HistoryPager extends ReverseChronologicalPager {
  * Backwards-compatibility alias
  */
 class HistoryPage extends HistoryAction {
-       public function __construct( Page $article ) { # Just to make it public
+       // @codingStandardsIgnoreStart Needed "useless" override to make it public.
+       public function __construct( Page $article ) {
                parent::__construct( $article );
        }
+       // @codingStandardsIgnoreEnd
 
        public function history() {
                $this->onView();
index 701f6d4..811e35d 100644 (file)
@@ -153,6 +153,7 @@ class InfoAction extends FormlessAction {
         */
        protected function makeHeader( $header ) {
                $spanAttribs = array( 'class' => 'mw-headline', 'id' => Sanitizer::escapeId( $header ) );
+
                return Html::rawElement( 'h2', array(), Html::element( 'span', $spanAttribs, $header ) );
        }
 
@@ -306,7 +307,7 @@ class InfoAction extends FormlessAction {
                if (
                        $user->isAllowed( 'unwatchedpages' ) ||
                        ( $wgUnwatchedPageThreshold !== false &&
-                         $pageCounts['watchers'] >= $wgUnwatchedPageThreshold )
+                               $pageCounts['watchers'] >= $wgUnwatchedPageThreshold )
                ) {
                        // Number of page watchers
                        $pageInfo['header-basic'][] = array(
@@ -736,6 +737,7 @@ class InfoAction extends FormlessAction {
                );
 
                wfProfileOut( __METHOD__ );
+
                return $result;
        }
 
@@ -761,6 +763,7 @@ class InfoAction extends FormlessAction {
                $anon_ips = array();
 
                # Sift for real versus user names
+               /** @var $user User */
                foreach ( $contributors as $user ) {
                        $page = $user->isAnon()
                                ? SpecialPage::getTitleFor( 'Contributions', $user->getName() )
@@ -803,6 +806,7 @@ class InfoAction extends FormlessAction {
                }
 
                $count = count( $fulllist );
+
                # "Based on work by ..."
                return $count
                        ? $this->msg( 'othercontribs' )->rawParams(
index ff6cf13..4016f67 100644 (file)
@@ -70,6 +70,7 @@ class MarkpatrolledAction extends FormlessAction {
                        $this->getOutput()->setPageTitle( $this->msg( 'markedaspatrollederror' ) );
                        $this->getOutput()->addWikiMsg( 'markedaspatrollederror-noautopatrol' );
                        $this->getOutput()->returnToMain( null, $return );
+
                        return;
                }
 
index ec6648e..8b2bfaa 100644 (file)
@@ -43,9 +43,7 @@ class ProtectAction extends FormlessAction {
        public function show() {
 
                $this->page->protect();
-
        }
-
 }
 
 /**
@@ -64,7 +62,5 @@ class UnprotectAction extends ProtectAction {
        public function show() {
 
                $this->page->unprotect();
-
        }
-
 }
index 32751e4..a0116fb 100644 (file)
@@ -94,9 +94,14 @@ class RawAction extends FormlessAction {
                # Output may contain user-specific data;
                # vary generated content for open sessions on private wikis
                $privateCache = !User::isEveryoneAllowed( 'read' ) && ( $smaxage == 0 || session_id() != '' );
+               // Bug 53032 - make this private if user is logged in,
+               // so we don't accidentally cache cookies
+               $privateCache = $privateCache ?: $this->getUser()->isLoggedIn();
                # allow the client to cache this for 24 hours
                $mode = $privateCache ? 'private' : 'public';
-               $response->header( 'Cache-Control: ' . $mode . ', s-maxage=' . $smaxage . ', max-age=' . $maxage );
+               $response->header(
+                       'Cache-Control: ' . $mode . ', s-maxage=' . $smaxage . ', max-age=' . $maxage
+               );
 
                $text = $this->getRawText();
 
@@ -135,8 +140,9 @@ class RawAction extends FormlessAction {
 
                // If it's a MediaWiki message we can just hit the message cache
                if ( $request->getBool( 'usemsgcache' ) && $title->getNamespace() == NS_MEDIAWIKI ) {
-                       // The first "true" is to use the database, the second is to use the content langue
-                       // and the last one is to specify the message key already contains the language in it ("/de", etc.)
+                       // The first "true" is to use the database, the second is to use
+                       // the content langue and the last one is to specify the message
+                       // key already contains the language in it ("/de", etc.).
                        $text = MessageCache::singleton()->get( $title->getDBkey(), true, true, true );
                        // If the message doesn't exist, return a blank
                        if ( $text === false ) {
@@ -178,7 +184,11 @@ class RawAction extends FormlessAction {
                }
 
                if ( $text !== false && $text !== '' && $request->getVal( 'templates' ) === 'expand' ) {
-                       $text = $wgParser->preprocess( $text, $title, ParserOptions::newFromContext( $this->getContext() ) );
+                       $text = $wgParser->preprocess(
+                               $text,
+                               $title,
+                               ParserOptions::newFromContext( $this->getContext() )
+                       );
                }
 
                return $text;
@@ -212,6 +222,7 @@ class RawAction extends FormlessAction {
                                $oldid = 0;
                                break;
                }
+
                return $oldid;
        }
 
@@ -273,6 +284,7 @@ class RawPage extends RawAction {
                if ( $this->mOldId !== null ) {
                        return $this->mOldId;
                }
+
                return parent::getOldId();
        }
 }
index 3d244fb..c9b3f8f 100644 (file)
@@ -43,7 +43,5 @@ class RenderAction extends FormlessAction {
        public function show() {
 
                $this->page->render();
-
        }
-
 }
index a5fc4e1..cdd139e 100644 (file)
@@ -38,7 +38,8 @@ class RevertAction extends Action {
                $this->getOutput()->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
        }
 
-       public function execute() {}
+       public function execute() {
+       }
 }
 
 /**
@@ -47,6 +48,9 @@ class RevertAction extends Action {
  * @ingroup Actions
  */
 class RevertFileAction extends FormAction {
+       /**
+        * @var OldLocalFile
+        */
        protected $oldFile;
 
        public function getName() {
@@ -63,12 +67,16 @@ class RevertFileAction extends FormAction {
                $oldimage = $this->getRequest()->getText( 'oldimage' );
                if ( strlen( $oldimage ) < 16
                        || strpos( $oldimage, '/' ) !== false
-                       || strpos( $oldimage, '\\' ) !== false )
-               {
+                       || strpos( $oldimage, '\\' ) !== false
+               {
                        throw new ErrorPageError( 'internalerror', 'unexpected', array( 'oldimage', $oldimage ) );
                }
 
-               $this->oldFile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $this->getTitle(), $oldimage );
+               $this->oldFile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName(
+                       $this->getTitle(),
+                       $oldimage
+               );
+
                if ( !$this->oldFile->exists() ) {
                        throw new ErrorPageError( '', 'filerevert-badversion' );
                }
@@ -99,8 +107,10 @@ class RevertFileAction extends FormAction {
                                'raw' => true,
                                'default' => $this->msg( 'filerevert-intro',
                                        $this->getTitle()->getText(), $userDate, $userTime,
-                                       wfExpandUrl( $this->page->getFile()->getArchiveUrl( $this->getRequest()->getText( 'oldimage' ) ),
-                                               PROTO_CURRENT ) )->parseAsBlock()
+                                       wfExpandUrl(
+                                               $this->page->getFile()->getArchiveUrl( $this->getRequest()->getText( 'oldimage' ) ),
+                                               PROTO_CURRENT
+                                       ) )->parseAsBlock()
                        ),
                        'comment' => array(
                                'type' => 'text',
@@ -112,10 +122,21 @@ class RevertFileAction extends FormAction {
        }
 
        public function onSubmit( $data ) {
-               $source = $this->page->getFile()->getArchiveVirtualUrl( $this->getRequest()->getText( 'oldimage' ) );
+               $source = $this->page->getFile()->getArchiveVirtualUrl(
+                       $this->getRequest()->getText( 'oldimage' )
+               );
                $comment = $data['comment'];
+
                // TODO: Preserve file properties from database instead of reloading from file
-               return $this->page->getFile()->upload( $source, $comment, $comment, 0, false, false, $this->getUser() );
+               return $this->page->getFile()->upload(
+                       $source,
+                       $comment,
+                       $comment,
+                       0,
+                       false,
+                       false,
+                       $this->getUser()
+               );
        }
 
        public function onSuccess() {
@@ -139,6 +160,7 @@ class RevertFileAction extends FormAction {
 
        protected function getDescription() {
                $this->getOutput()->addBacklinkSubtitle( $this->getTitle() );
+
                return '';
        }
 }
index 81bad9d..d48a0ea 100644 (file)
@@ -53,7 +53,9 @@ class RollbackAction extends FormlessAction {
                        throw new ThrottledError;
                }
 
-               if ( isset( $result[0][0] ) && ( $result[0][0] == 'alreadyrolled' || $result[0][0] == 'cantrollback' ) ) {
+               if ( isset( $result[0][0] ) &&
+                       ( $result[0][0] == 'alreadyrolled' || $result[0][0] == 'cantrollback' )
+               ) {
                        $this->getOutput()->setPageTitle( $this->msg( 'rollbackfailed' ) );
                        $errArray = $result[0];
                        $errMsg = array_shift( $errArray );
@@ -91,12 +93,21 @@ class RollbackAction extends FormlessAction {
 
                $old = Linker::revUserTools( $current );
                $new = Linker::revUserTools( $target );
-               $this->getOutput()->addHTML( $this->msg( 'rollback-success' )->rawParams( $old, $new )->parseAsBlock() );
+               $this->getOutput()->addHTML( $this->msg( 'rollback-success' )->rawParams( $old, $new )
+                       ->parseAsBlock() );
                $this->getOutput()->returnToMain( false, $this->getTitle() );
 
-               if ( !$request->getBool( 'hidediff', false ) && !$this->getUser()->getBoolOption( 'norollbackdiff', false ) ) {
+               if ( !$request->getBool( 'hidediff', false ) &&
+                       !$this->getUser()->getBoolOption( 'norollbackdiff', false )
+               ) {
                        $contentHandler = $current->getContentHandler();
-                       $de = $contentHandler->createDifferenceEngine( $this->getContext(), $current->getId(), $newId, false, true );
+                       $de = $contentHandler->createDifferenceEngine(
+                               $this->getContext(),
+                               $current->getId(),
+                               $newId,
+                               false,
+                               true
+                       );
                        $de->showDiff( '', '' );
                }
        }
index e227197..3a24565 100644 (file)
@@ -43,5 +43,4 @@ class ViewAction extends FormlessAction {
        public function show() {
                $this->page->view();
        }
-
 }
index 929c1b5..e1b5d52 100644 (file)
@@ -51,6 +51,7 @@ class WatchAction extends FormAction {
                wfProfileIn( __METHOD__ );
                self::doWatch( $this->getTitle(), $this->getUser() );
                wfProfileOut( __METHOD__ );
+
                return true;
        }
 
@@ -96,7 +97,9 @@ class WatchAction extends FormAction {
         * @return Status
         */
        public static function doWatchOrUnwatch( $watch, Title $title, User $user ) {
-               if ( $user->isLoggedIn() && $user->isWatched( $title, WatchedItem::IGNORE_USER_RIGHTS ) != $watch ) {
+               if ( $user->isLoggedIn() &&
+                       $user->isWatched( $title, WatchedItem::IGNORE_USER_RIGHTS ) != $watch
+               ) {
                        // If the user doesn't have 'editmywatchlist', we still want to
                        // allow them to add but not remove items via edits and such.
                        if ( $watch ) {
@@ -105,6 +108,7 @@ class WatchAction extends FormAction {
                                return self::doUnwatch( $title, $user );
                        }
                }
+
                return Status::newGood();
        }
 
@@ -116,8 +120,12 @@ class WatchAction extends FormAction {
         * @param int $checkRights Passed through to $user->addWatch()
         * @return Status
         */
-       public static function doWatch( Title $title, User $user, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
-               if ( $checkRights !== WatchedItem::IGNORE_USER_RIGHTS && !$user->isAllowed( 'editmywatchlist' ) ) {
+       public static function doWatch( Title $title, User $user,
+               $checkRights = WatchedItem::CHECK_USER_RIGHTS
+       ) {
+               if ( $checkRights !== WatchedItem::IGNORE_USER_RIGHTS &&
+                       !$user->isAllowed( 'editmywatchlist' )
+               ) {
                        return User::newFatalPermissionDeniedStatus( 'editmywatchlist' );
                }
 
@@ -129,6 +137,7 @@ class WatchAction extends FormAction {
                        $user->addWatch( $title, $checkRights );
                        wfRunHooks( 'WatchArticleComplete', array( &$user, &$page ) );
                }
+
                return $status;
        }
 
@@ -152,6 +161,7 @@ class WatchAction extends FormAction {
                        $user->removeWatch( $title );
                        wfRunHooks( 'UnwatchArticleComplete', array( &$user, &$page ) );
                }
+
                return $status;
        }
 
@@ -220,6 +230,7 @@ class UnwatchAction extends WatchAction {
                wfProfileIn( __METHOD__ );
                self::doUnwatch( $this->getTitle(), $this->getUser() );
                wfProfileOut( __METHOD__ );
+
                return true;
        }
 
index 6be044c..f776e6d 100644 (file)
  * The class functions are divided into several areas of functionality:
  *
  * Module parameters: Derived classes can define getAllowedParams() to specify
- *     which parameters to expect, how to parse and validate them.
+ *    which parameters to expect, how to parse and validate them.
  *
  * Profiling: various methods to allow keeping tabs on various tasks and their
- *     time costs
+ *    time costs
  *
  * Self-documentation: code to allow the API to document its own state
  *
@@ -124,6 +124,7 @@ abstract class ApiBase extends ContextSource {
         */
        public function getVersion() {
                wfDeprecated( __METHOD__, '1.21' );
+
                return '';
        }
 
@@ -194,6 +195,7 @@ abstract class ApiBase extends ContextSource {
                if ( $this->isMain() ) {
                        ApiBase::dieDebug( __METHOD__, 'base method was called on main module. ' );
                }
+
                return $this->getMain()->getResult();
        }
 
@@ -216,6 +218,7 @@ abstract class ApiBase extends ContextSource {
         */
        public function createContext() {
                wfDeprecated( __METHOD__, '1.19' );
+
                return new DerivativeContext( $this->getContext() );
        }
 
@@ -293,7 +296,8 @@ abstract class ApiBase extends ContextSource {
                                $msg .= "\nThis module only accepts POST requests";
                        }
                        if ( $this->isReadMode() || $this->isWriteMode() ||
-                                       $this->mustBePosted() ) {
+                               $this->mustBePosted()
+                       ) {
                                $msg .= "\n";
                        }
 
@@ -359,8 +363,10 @@ abstract class ApiBase extends ContextSource {
                                $msg = '  ';
                        }
                        $msg .= implode( $prefix, $input ) . "\n";
+
                        return $msg;
                }
+
                return '';
        }
 
@@ -479,9 +485,10 @@ abstract class ApiBase extends ContextSource {
 
                                                $isArray = is_array( $type );
                                                if ( !$isArray
-                                                               || $isArray && count( $type ) > self::LIMIT_SML1 ) {
+                                                       || $isArray && count( $type ) > self::LIMIT_SML1
+                                               ) {
                                                        $desc .= $paramPrefix . "Maximum number of values " .
-                                                                       self::LIMIT_SML1 . " (" . self::LIMIT_SML2 . " for bots)";
+                                                               self::LIMIT_SML1 . " (" . self::LIMIT_SML2 . " for bots)";
                                                }
                                        }
                                }
@@ -493,8 +500,8 @@ abstract class ApiBase extends ContextSource {
 
                                $msg .= sprintf( "  %-19s - %s\n", $this->encodeParamName( $paramName ), $desc );
                        }
-                       return $msg;
 
+                       return $msg;
                } else {
                        return false;
                }
@@ -555,6 +562,7 @@ abstract class ApiBase extends ContextSource {
        public function getFinalParams( $flags = 0 ) {
                $params = $this->getAllowedParams( $flags );
                wfRunHooks( 'APIGetAllowedParams', array( &$this, &$params, $flags ) );
+
                return $params;
        }
 
@@ -567,6 +575,7 @@ abstract class ApiBase extends ContextSource {
        public function getFinalParamDescription() {
                $desc = $this->getParamDescription();
                wfRunHooks( 'APIGetParamDescription', array( &$this, &$desc ) );
+
                return $desc;
        }
 
@@ -599,6 +608,7 @@ abstract class ApiBase extends ContextSource {
        public function getFinalResultProperties() {
                $properties = $this->getResultProperties();
                wfRunHooks( 'APIGetResultProperties', array( $this, &$properties ) );
+
                return $properties;
        }
 
@@ -624,6 +634,7 @@ abstract class ApiBase extends ContextSource {
        public function getFinalDescription() {
                $desc = $this->getDescription();
                wfRunHooks( 'APIGetDescription', array( &$this, &$desc ) );
+
                return $desc;
        }
 
@@ -660,6 +671,7 @@ abstract class ApiBase extends ContextSource {
                        }
                        $this->mParamCache[$parseLimit] = $results;
                }
+
                return $this->mParamCache[$parseLimit];
        }
 
@@ -672,6 +684,7 @@ abstract class ApiBase extends ContextSource {
        protected function getParameter( $paramName, $parseLimit = true ) {
                $params = $this->getFinalParams();
                $paramSettings = $params[$paramName];
+
                return $this->getParameterFromSettings( $paramName, $paramSettings, $parseLimit );
        }
 
@@ -810,6 +823,7 @@ abstract class ApiBase extends ContextSource {
         */
        public static function getValidNamespaces() {
                wfDeprecated( __METHOD__, '1.17' );
+
                return MWNamespace::getValidNamespaces();
        }
 
@@ -818,7 +832,7 @@ abstract class ApiBase extends ContextSource {
         * @param string $watchlist Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
         * @param $titleObj Title the page under consideration
         * @param string $userOption The user option to consider when $watchlist=preferences.
-        *      If not set will use watchdefault always and watchcreations if $titleObj doesn't exist.
+        *    If not set will use watchdefault always and watchcreations if $titleObj doesn't exist.
         * @return bool
         */
        protected function getWatchlistValue( $watchlist, $titleObj, $userOption = null ) {
@@ -842,6 +856,7 @@ abstract class ApiBase extends ContextSource {
                                        return $this->getUser()->getBoolOption( 'watchdefault' ) ||
                                                $this->getUser()->getBoolOption( 'watchcreations' ) && !$titleObj->exists();
                                }
+
                                # Watch the article based on the user preference
                                return $this->getUser()->getBoolOption( $userOption );
 
@@ -964,7 +979,7 @@ abstract class ApiBase extends ContextSource {
                                                $min = isset( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
                                                $max = isset( $paramSettings[self::PARAM_MAX] ) ? $paramSettings[self::PARAM_MAX] : null;
                                                $enforceLimits = isset( $paramSettings[self::PARAM_RANGE_ENFORCE] )
-                                                               ? $paramSettings[self::PARAM_RANGE_ENFORCE] : false;
+                                                       ? $paramSettings[self::PARAM_RANGE_ENFORCE] : false;
 
                                                if ( is_array( $value ) ) {
                                                        $value = array_map( 'intval', $value );
@@ -1067,7 +1082,7 @@ abstract class ApiBase extends ContextSource {
                // This is a bit awkward, but we want to avoid calling canApiHighLimits() because it unstubs $wgUser
                $valuesList = explode( '|', $value, self::LIMIT_SML2 + 1 );
                $sizeLimit = count( $valuesList ) > self::LIMIT_SML1 && $this->mMainModule->canApiHighLimits() ?
-                               self::LIMIT_SML2 : self::LIMIT_SML1;
+                       self::LIMIT_SML2 : self::LIMIT_SML1;
 
                if ( self::truncateArray( $valuesList, $sizeLimit ) ) {
                        $this->setWarning( "Too many values supplied for parameter '$valueName': the limit is $sizeLimit" );
@@ -1153,6 +1168,7 @@ abstract class ApiBase extends ContextSource {
                if ( $unixTimestamp === false ) {
                        $this->dieUsage( "Invalid value '$value' for timestamp parameter $encParamName", "badtimestamp_{$encParamName}" );
                }
+
                return wfTimestamp( TS_MW, $unixTimestamp );
        }
 
@@ -1167,6 +1183,7 @@ abstract class ApiBase extends ContextSource {
                if ( $title === null ) {
                        $this->dieUsage( "Invalid value '$value' for user parameter $encParamName", "baduser_{$encParamName}" );
                }
+
                return $title->getText();
        }
 
@@ -1196,6 +1213,7 @@ abstract class ApiBase extends ContextSource {
                        array_pop( $arr );
                        $modified = true;
                }
+
                return $modified;
        }
 
@@ -1521,6 +1539,7 @@ abstract class ApiBase extends ContextSource {
        public function isReadMode() {
                return true;
        }
+
        /**
         * Indicates whether this module requires write mode
         * @return bool
@@ -1584,6 +1603,7 @@ abstract class ApiBase extends ContextSource {
                        }
                        $user = $this->getUser();
                }
+
                return $user;
        }
 
@@ -1656,6 +1676,7 @@ abstract class ApiBase extends ContextSource {
        public function getFinalPossibleErrors() {
                $possibleErrors = $this->getPossibleErrors();
                wfRunHooks( 'APIGetPossibleErrors', array( $this, &$possibleErrors ) );
+
                return $possibleErrors;
        }
 
@@ -1674,6 +1695,7 @@ abstract class ApiBase extends ContextSource {
                                $ret[] = $this->parseMsg( $row );
                        }
                }
+
                return $ret;
        }
 
@@ -1730,6 +1752,7 @@ abstract class ApiBase extends ContextSource {
                if ( $this->mTimeIn !== 0 ) {
                        ApiBase::dieDebug( __METHOD__, 'called without calling profileOut() first' );
                }
+
                return $this->mModuleTime;
        }
 
@@ -1779,6 +1802,7 @@ abstract class ApiBase extends ContextSource {
                if ( $this->mDBTimeIn !== 0 ) {
                        ApiBase::dieDebug( __METHOD__, 'called without calling profileDBOut() first' );
                }
+
                return $this->mDBTime;
        }
 
@@ -1792,6 +1816,7 @@ abstract class ApiBase extends ContextSource {
                        $this->mSlaveDB = wfGetDB( DB_SLAVE, 'api' );
                        $this->profileDBOut();
                }
+
                return $this->mSlaveDB;
        }
 
index 1e35c34..79a472c 100644 (file)
@@ -88,12 +88,14 @@ class ApiComparePages extends ApiBase {
                        if ( !$title || $title->isExternal() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $titleText ) );
                        }
+
                        return $title->getLatestRevID();
                } elseif ( $titleId ) {
                        $title = Title::newFromID( $titleId );
                        if ( !$title ) {
                                $this->dieUsageMsg( array( 'nosuchpageid', $titleId ) );
                        }
+
                        return $title->getLatestRevID();
                }
                $this->dieUsage( 'inputneeded', 'A title, a page ID, or a revision number is needed for both the from and the to parameters' );
index 0e752c5..f25f5ae 100644 (file)
@@ -172,6 +172,7 @@ class ApiCreateAccount extends ApiBase {
 
        public function getAllowedParams() {
                global $wgEmailConfirmToEdit;
+
                return array(
                        'name' => array(
                                ApiBase::PARAM_TYPE => 'user',
@@ -196,6 +197,7 @@ class ApiCreateAccount extends ApiBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'name' => 'Username',
                        'password' => "Password (ignored if {$p}mailpassword is set)",
@@ -280,6 +282,7 @@ class ApiCreateAccount extends ApiBase {
                        'code' => 'passwordtooshort',
                        'info' => wfMessage( 'passwordtooshort', $wgMinimalPasswordLength )->inLanguage( 'en' )->useDatabase( false )->parse()
                );
+
                return $errors;
        }
 
index aea1048..21264bc 100644 (file)
@@ -121,6 +121,7 @@ class ApiDelete extends ApiBase {
                }
 
                $error = '';
+
                // Luckily, Article.php provides a reusable delete function that does the hard work for us
                return $page->doDeleteArticleReal( $reason, false, 0, true, $error );
        }
@@ -159,6 +160,7 @@ class ApiDelete extends ApiBase {
                if ( is_null( $reason ) ) { // Log and RC don't like null reasons
                        $reason = '';
                }
+
                return FileDeleteForm::doDelete( $title, $file, $oldimage, $reason, $suppress, $user );
        }
 
@@ -204,6 +206,7 @@ class ApiDelete extends ApiBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'title' => "Title of the page you want to delete. Cannot be used together with {$p}pageid",
                        'pageid' => "Page ID of the page you want to delete. Cannot be used together with {$p}title",
index bd61895..fd024e1 100644 (file)
@@ -38,9 +38,9 @@ class ApiEditPage extends ApiBase {
                $params = $this->extractRequestParams();
 
                if ( is_null( $params['text'] ) && is_null( $params['appendtext'] ) &&
-                               is_null( $params['prependtext'] ) &&
-                               $params['undo'] == 0 )
-               {
+                       is_null( $params['prependtext'] ) &&
+                       $params['undo'] == 0
+               {
                        $this->dieUsageMsg( 'missingtext' );
                }
 
@@ -53,8 +53,8 @@ class ApiEditPage extends ApiBase {
                                $oldTitle = $titleObj;
 
                                $titles = Revision::newFromTitle( $oldTitle, false, Revision::READ_LATEST )
-                                                       ->getContent( Revision::FOR_THIS_USER, $user )
-                                                       ->getRedirectChain();
+                                       ->getContent( Revision::FOR_THIS_USER, $user )
+                                       ->getRedirectChain();
                                // array_shift( $titles );
 
                                $redirValues = array();
@@ -101,7 +101,7 @@ class ApiEditPage extends ApiBase {
                        $model = $contentHandler->getModelID();
 
                        $this->dieUsage( "The requested format $contentFormat is not supported for content model " .
-                                                       " $model used by $name", 'badformat' );
+                               " $model used by $name", 'badformat' );
                }
 
                if ( $params['createonly'] && $titleObj->exists() ) {
@@ -121,8 +121,7 @@ class ApiEditPage extends ApiBase {
                }
 
                $toMD5 = $params['text'];
-               if ( !is_null( $params['appendtext'] ) || !is_null( $params['prependtext'] ) )
-               {
+               if ( !is_null( $params['appendtext'] ) || !is_null( $params['prependtext'] ) ) {
                        $content = $pageObj->getContent();
 
                        if ( !$content ) {
@@ -138,6 +137,7 @@ class ApiEditPage extends ApiBase {
                                                $content = ContentHandler::makeContent( $text, $this->getTitle() );
                                        } catch ( MWContentSerializationException $ex ) {
                                                $this->dieUsage( $ex->getMessage(), 'parseerror' );
+
                                                return;
                                        }
                                } else {
@@ -187,7 +187,7 @@ class ApiEditPage extends ApiBase {
                        if ( $params['undoafter'] > 0 ) {
                                if ( $params['undo'] < $params['undoafter'] ) {
                                        list( $params['undo'], $params['undoafter'] ) =
-                                       array( $params['undoafter'], $params['undo'] );
+                                               array( $params['undoafter'], $params['undo'] );
                                }
                                $undoafterRev = Revision::newFromID( $params['undoafter'] );
                        }
@@ -363,6 +363,7 @@ class ApiEditPage extends ApiBase {
                        if ( count( $r ) ) {
                                $r['result'] = 'Failure';
                                $apiResult->addValue( null, $this->getModuleName(), $r );
+
                                return;
                        } else {
                                $this->dieUsageMsg( 'hookaborted' );
@@ -513,11 +514,11 @@ class ApiEditPage extends ApiBase {
                                array( 'code' => 'invalidsection', 'info' => 'The section parameter must be set to an integer or \'new\'' ),
                                array( 'code' => 'sectionsnotsupported', 'info' => 'Sections are not supported for this type of page.' ),
                                array( 'code' => 'editnotsupported', 'info' => 'Editing of this type of page is not supported using '
-                                                                                                                               . 'the text based edit API.' ),
+                                       . 'the text based edit API.' ),
                                array( 'code' => 'appendnotsupported', 'info' => 'This type of page can not be edited by appending '
-                                                                                                                               . 'or prepending text.' ),
+                                       . 'or prepending text.' ),
                                array( 'code' => 'badformat', 'info' => 'The requested serialization format can not be applied to '
-                                                                                                               . 'the page\'s content model' ),
+                                       . 'the page\'s content model' ),
                                array( 'customcssprotected' ),
                                array( 'customjsprotected' ),
                        )
@@ -591,6 +592,7 @@ class ApiEditPage extends ApiBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'title' => "Title of the page you want to edit. Cannot be used together with {$p}pageid",
                        'pageid' => "Page ID of the page you want to edit. Cannot be used together with {$p}title",
@@ -598,17 +600,17 @@ class ApiEditPage extends ApiBase {
                        'sectiontitle' => 'The title for a new section',
                        'text' => 'Page content',
                        'token' => array( 'Edit token. You can get one of these through prop=info.',
-                                               "The token should always be sent as the last parameter, or at least, after the {$p}text parameter"
+                               "The token should always be sent as the last parameter, or at least, after the {$p}text parameter"
                        ),
                        'summary' => "Edit summary. Also section title when {$p}section=new and {$p}sectiontitle is not set",
                        'minor' => 'Minor edit',
                        'notminor' => 'Non-minor edit',
                        'bot' => 'Mark this edit as bot',
                        'basetimestamp' => array( 'Timestamp of the base revision (obtained through prop=revisions&rvprop=timestamp).',
-                                               'Used to detect edit conflicts; leave unset to ignore conflicts'
+                               'Used to detect edit conflicts; leave unset to ignore conflicts'
                        ),
                        'starttimestamp' => array( 'Timestamp when you obtained the edit token.',
-                                               'Used to detect edit conflicts; leave unset to ignore conflicts'
+                               'Used to detect edit conflicts; leave unset to ignore conflicts'
                        ),
                        'recreate' => 'Override any errors about the article having been deleted in the meantime',
                        'createonly' => 'Don\'t edit the page if it exists already',
@@ -617,10 +619,10 @@ class ApiEditPage extends ApiBase {
                        'unwatch' => 'Remove the page from your watchlist',
                        'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
                        'md5' => array( "The MD5 hash of the {$p}text parameter, or the {$p}prependtext and {$p}appendtext parameters concatenated.",
-                                       'If set, the edit won\'t be done unless the hash is correct' ),
+                               'If set, the edit won\'t be done unless the hash is correct' ),
                        'prependtext' => "Add this text to the beginning of the page. Overrides {$p}text",
                        'appendtext' => array( "Add this text to the end of the page. Overrides {$p}text.",
-                                               "Use {$p}section=new to append a new section" ),
+                               "Use {$p}section=new to append a new section" ),
                        'undo' => "Undo this revision. Overrides {$p}text, {$p}prependtext and {$p}appendtext",
                        'undoafter' => 'Undo all revisions from undo to this one. If not set, just undo one revision',
                        'redirect' => 'Automatically resolve redirects',
index 0569109..27037cb 100644 (file)
@@ -61,8 +61,8 @@ class ApiFeedContributions extends ApiBase {
                $feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL();
 
                $target = $params['user'] == 'newbies'
-                               ? 'newbies'
-                               : Title::makeTitleSafe( NS_USER, $params['user'] )->getText();
+                       ? 'newbies'
+                       : Title::makeTitleSafe( NS_USER, $params['user'] )->getText();
 
                $feed = new $wgFeedClasses[$params['feedformat']] (
                        $feedTitle,
@@ -107,6 +107,7 @@ class ApiFeedContributions extends ApiBase {
                                $comments
                        );
                }
+
                return null;
        }
 
@@ -142,12 +143,14 @@ class ApiFeedContributions extends ApiBase {
                                htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
                                "</p>\n<hr />\n<div>" . $html . "</div>";
                }
+
                return '';
        }
 
        public function getAllowedParams() {
                global $wgFeedClasses;
                $feedFormatNames = array_keys( $wgFeedClasses );
+
                return array(
                        'feedformat' => array(
                                ApiBase::PARAM_DFLT => 'rss',
index fbb70fb..645e7c7 100644 (file)
@@ -135,7 +135,6 @@ class ApiFeedWatchlist extends ApiBase {
                        $feed = new $wgFeedClasses[$params['feedformat']] ( $feedTitle, htmlspecialchars( $msg ), $feedUrl );
 
                        ApiFormatFeedWrapper::setResult( $this->getResult(), $feed, $feedItems );
-
                } catch ( Exception $e ) {
 
                        // Error results should not be cached
@@ -199,6 +198,7 @@ class ApiFeedWatchlist extends ApiBase {
                        $this->watchlistModule = $this->getMain()->getModuleManager()->getModule( 'query' )
                                ->getModuleManager()->getModule( 'watchlist' );
                }
+
                return $this->watchlistModule;
        }
 
@@ -235,11 +235,13 @@ class ApiFeedWatchlist extends ApiBase {
                        $ret['wltype'] = null;
                        $ret['wlexcludeuser'] = null;
                }
+
                return $ret;
        }
 
        public function getParamDescription() {
                $wldescr = $this->getWatchlistModule()->getParamDescription();
+
                return array(
                        'feedformat' => 'The format of the feed',
                        'hours' => 'List pages modified within this many hours from now',
index cbb2ba6..2a7f46d 100644 (file)
@@ -58,7 +58,6 @@ class ApiFileRevert extends ApiBase {
                }
 
                $this->getResult()->addValue( null, $this->getModuleName(), $result );
-
        }
 
        /**
@@ -130,7 +129,6 @@ class ApiFileRevert extends ApiBase {
                                ApiBase::PARAM_REQUIRED => true
                        ),
                );
-
        }
 
        public function getParamDescription() {
index b89fb3a..c1817fa 100644 (file)
@@ -43,9 +43,9 @@ abstract class ApiFormatBase extends ApiBase {
        public function __construct( $main, $format ) {
                parent::__construct( $main, $format );
 
-               $this->mIsHtml = ( substr( $format, - 2, 2 ) === 'fm' ); // ends with 'fm'
+               $this->mIsHtml = ( substr( $format, -2, 2 ) === 'fm' ); // ends with 'fm'
                if ( $this->mIsHtml ) {
-                       $this->mFormat = substr( $format, 0, - 2 ); // remove ending 'fm'
+                       $this->mFormat = substr( $format, 0, -2 ); // remove ending 'fm'
                } else {
                        $this->mFormat = $format;
                }
@@ -360,8 +360,8 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
 
        /**
         * This class expects the result data to be in a custom format set by self::setResult()
-        * $result['_feed']             - an instance of one of the $wgFeedClasses classes
-        * $result['_feeditems']        - an array of FeedItem instances
+        * $result['_feed'] - an instance of one of the $wgFeedClasses classes
+        * $result['_feeditems'] - an array of FeedItem instances
         */
        public function execute() {
                $data = $this->getResultData();
index 342a580..7a88176 100644 (file)
@@ -43,6 +43,7 @@ class ApiFormatJson extends ApiFormatBase {
                if ( $params['callback'] ) {
                        return 'text/javascript';
                }
+
                return 'application/json';
        }
 
index d278efa..45003e9 100644 (file)
@@ -58,6 +58,7 @@ class ApiFormatRaw extends ApiFormatBase {
                $data = $this->getResultData();
                if ( isset( $data['error'] ) ) {
                        $this->mErrorFallback->execute();
+
                        return;
                }
 
index 5685d93..eb83198 100644 (file)
@@ -40,8 +40,9 @@ class ApiFormatWddx extends ApiFormatBase {
                // to avoid this.
                $expected = "<wddxPacket version='1.0'><header/><data><string>\xc2\xa0</string></data></wddxPacket>";
                if ( function_exists( 'wddx_serialize_value' )
-                               && !$this->getIsHtml()
-                               && wddx_serialize_value( "\xc2\xa0" ) == $expected ) {
+                       && !$this->getIsHtml()
+                       && wddx_serialize_value( "\xc2\xa0" ) == $expected
+               ) {
                        $this->printText( wddx_serialize_value( $this->getResultData() ) );
                } else {
                        // Don't do newlines and indentation if we weren't asked
index 4ec149c..0917ac7 100644 (file)
@@ -69,7 +69,7 @@ class ApiFormatXml extends ApiFormatBase {
                $this->printText(
                        self::recXmlPrint( $this->mRootElemName,
                                $data,
-                               $this->getIsHtml() ? - 2 : null
+                               $this->getIsHtml() ? -2 : null
                        )
                );
        }
@@ -193,6 +193,7 @@ class ApiFormatXml extends ApiFormatBase {
                                $retval .= $indstr . Xml::element( $elemName, null, $elemValue );
                        }
                }
+
                return $retval;
        }
 
@@ -200,14 +201,17 @@ class ApiFormatXml extends ApiFormatBase {
                $nt = Title::newFromText( $this->mXslt );
                if ( is_null( $nt ) || !$nt->exists() ) {
                        $this->setWarning( 'Invalid or non-existent stylesheet specified' );
+
                        return;
                }
                if ( $nt->getNamespace() != NS_MEDIAWIKI ) {
                        $this->setWarning( 'Stylesheet should be in the MediaWiki namespace.' );
+
                        return;
                }
-               if ( substr( $nt->getText(), - 4 ) !== '.xsl' ) {
+               if ( substr( $nt->getText(), -4 ) !== '.xsl' ) {
                        $this->setWarning( 'Stylesheet should have .xsl extension.' );
+
                        return;
                }
                $this->printText( '<?xml-stylesheet href="' . htmlspecialchars( $nt->getLocalURL( 'action=raw' ) ) . '" type="text/xsl" ?>' );
index 9cafc5b..1aa300a 100644 (file)
@@ -78,9 +78,9 @@ class ApiHelp extends ApiBase {
                                }
                                if ( $module === null ) {
                                        if ( count( $subNames ) === 2
-                                                       && $i === 1
-                                                       && $subNames[0] === 'query'
-                                                       && in_array( $subNames[1], $queryModules )
+                                               && $i === 1
+                                               && $subNames[0] === 'query'
+                                               && in_array( $subNames[1], $queryModules )
                                        ) {
                                                // Legacy: This is one of the renamed 'querymodule=...' parameters,
                                                // do not use '+' notation in the output, use submodule's name instead.
index 7a60e83..1a8f2a6 100644 (file)
@@ -145,6 +145,7 @@ class ApiImageRotate extends ApiBase {
                if ( $this->mPageSet === null ) {
                        $this->mPageSet = new ApiPageSet( $this, 0, NS_FILE );
                }
+
                return $this->mPageSet;
        }
 
@@ -163,6 +164,7 @@ class ApiImageRotate extends ApiBase {
                if ( $permissionErrors ) {
                        // Just return the first error
                        $msg = $this->parseMsg( $permissionErrors[0] );
+
                        return $msg['info'];
                }
 
@@ -191,11 +193,13 @@ class ApiImageRotate extends ApiBase {
                if ( $flags ) {
                        $result += $this->getPageSet()->getFinalParams( $flags );
                }
+
                return $result;
        }
 
        public function getParamDescription() {
                $pageSet = $this->getPageSet();
+
                return $pageSet->getFinalParamDescription() + array(
                        'rotation' => 'Degrees to rotate image clockwise',
                        'token' => 'Edit token. You can get one of these through action=tokens',
@@ -216,6 +220,7 @@ class ApiImageRotate extends ApiBase {
 
        public function getPossibleErrors() {
                $pageSet = $this->getPageSet();
+
                return array_merge(
                        parent::getPossibleErrors(),
                        $pageSet->getFinalPossibleErrors()
index f48a822..9253964 100644 (file)
@@ -99,6 +99,7 @@ class ApiImport extends ApiBase {
 
        public function getAllowedParams() {
                global $wgImportSources;
+
                return array(
                        'token' => array(
                                ApiBase::PARAM_TYPE => 'string',
index 13e58b8..18fd0c7 100644 (file)
@@ -52,6 +52,7 @@ class ApiLogin extends ApiBase {
                                'result' => 'Aborted',
                                'reason' => 'Cannot log in when using a callback',
                        ) );
+
                        return;
                }
 
index c11f16c..c301e9e 100644 (file)
@@ -191,7 +191,7 @@ class ApiMain extends ApiBase {
                $this->mResult = new ApiResult( $this );
                $this->mEnableWrite = $enableWrite;
 
-               $this->mSquidMaxage = - 1; // flag for executeActionWithErrorHandling()
+               $this->mSquidMaxage = -1; // flag for executeActionWithErrorHandling()
                $this->mCommit = false;
        }
 
@@ -270,6 +270,7 @@ class ApiMain extends ApiBase {
        public function setCacheMode( $mode ) {
                if ( !in_array( $mode, array( 'private', 'public', 'anon-public-user-private' ) ) ) {
                        wfDebug( __METHOD__ . ": unrecognised cache mode \"$mode\"\n" );
+
                        // Ignore for forwards-compatibility
                        return;
                }
@@ -278,6 +279,7 @@ class ApiMain extends ApiBase {
                        // Private wiki, only private headers
                        if ( $mode !== 'private' ) {
                                wfDebug( __METHOD__ . ": ignoring request for $mode cache mode, private wiki\n" );
+
                                return;
                        }
                }
@@ -337,6 +339,7 @@ class ApiMain extends ApiBase {
                if ( $printer === null ) {
                        $this->dieUsage( "Unrecognized format: {$format}", 'unknown_format' );
                }
+
                return $printer;
        }
 
@@ -463,6 +466,7 @@ class ApiMain extends ApiBase {
                        $response->header( "HTTP/1.1 403 $message", true, 403 );
                        $response->header( 'Cache-Control: no-cache' );
                        echo "'origin' parameter does not match Origin header\n";
+
                        return false;
                }
                if ( self::matchOrigin( $originParam, $wgCrossSiteAJAXdomains, $wgCrossSiteAJAXdomainExceptions ) ) {
@@ -470,6 +474,7 @@ class ApiMain extends ApiBase {
                        $response->header( 'Access-Control-Allow-Credentials: true' );
                        $this->getOutput()->addVaryHeader( 'Origin' );
                }
+
                return true;
        }
 
@@ -489,9 +494,11 @@ class ApiMain extends ApiBase {
                                                return false;
                                        }
                                }
+
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -510,6 +517,7 @@ class ApiMain extends ApiBase {
                        array( '.*?', '.' ),
                        $wildcard
                );
+
                return "/https?:\/\/$wildcard/";
        }
 
@@ -524,6 +532,7 @@ class ApiMain extends ApiBase {
 
                if ( $this->mCacheMode == 'private' ) {
                        $response->header( 'Cache-Control: private' );
+
                        return;
                }
 
@@ -535,6 +544,7 @@ class ApiMain extends ApiBase {
                                if ( $out->haveCacheVaryCookies() ) {
                                        // Logged in, mark this request private
                                        $response->header( 'Cache-Control: private' );
+
                                        return;
                                }
                                // Logged out, send normal public headers below
@@ -542,6 +552,7 @@ class ApiMain extends ApiBase {
                                // Logged in or otherwise has session (e.g. anonymous users who have edited)
                                // Mark request private
                                $response->header( 'Cache-Control: private' );
+
                                return;
                        } // else no XVO and anonymous, send public headers below
                }
@@ -565,6 +576,7 @@ class ApiMain extends ApiBase {
                        // Sending a Vary header in this case is harmless, and protects us
                        // against conditional calls of setCacheMaxAge().
                        $response->header( 'Cache-Control: private' );
+
                        return;
                }
 
@@ -720,6 +732,7 @@ class ApiMain extends ApiBase {
                                }
                        }
                }
+
                return $module;
        }
 
@@ -746,9 +759,11 @@ class ApiMain extends ApiBase {
                                } else {
                                        $this->dieUsage( "Waiting for a database server: $lag seconds lagged", 'maxlag' );
                                }
+
                                return false;
                        }
                }
+
                return true;
        }
 
@@ -759,8 +774,8 @@ class ApiMain extends ApiBase {
        protected function checkExecutePermissions( $module ) {
                $user = $this->getUser();
                if ( $module->isReadMode() && !User::isEveryoneAllowed( 'read' ) &&
-                       !$user->isAllowed( 'read' ) )
-               {
+                       !$user->isAllowed( 'read' )
+               {
                        $this->dieUsageMsg( 'readrequired' );
                }
                if ( $module->isWriteMode() ) {
@@ -881,6 +896,7 @@ class ApiMain extends ApiBase {
                                $table[rawurlencode( $chars[$i] )] = $chars[$i];
                        }
                }
+
                return strtr( rawurlencode( $s ), $table );
        }
 
@@ -896,6 +912,7 @@ class ApiMain extends ApiBase {
         */
        public function getVal( $name, $default = null ) {
                $this->mParamsUsed[$name] = true;
+
                return $this->getRequest()->getVal( $name, $default );
        }
 
@@ -905,6 +922,7 @@ class ApiMain extends ApiBase {
         */
        public function getCheck( $name ) {
                $this->mParamsUsed[$name] = true;
+
                return $this->getRequest()->getCheck( $name );
        }
 
@@ -917,6 +935,7 @@ class ApiMain extends ApiBase {
         */
        public function getUpload( $name ) {
                $this->mParamsUsed[$name] = true;
+
                return $this->getRequest()->getUpload( $name );
        }
 
@@ -1150,6 +1169,7 @@ class ApiMain extends ApiBase {
                if ( $wgAPICacheHelpTimeout > 0 ) {
                        $wgMemc->set( $key, $retval, $wgAPICacheHelpTimeout );
                }
+
                return $retval;
        }
 
@@ -1180,7 +1200,7 @@ class ApiMain extends ApiBase {
                foreach ( self::$mRights as $right => $rightMsg ) {
                        $groups = User::getGroupsWithPermission( $right );
                        $msg .= "* " . $right . " *\n  " . wfMsgReplaceArgs( $rightMsg['msg'], $rightMsg['params'] ) .
-                                               "\nGranted to:\n  " . str_replace( '*', 'all', implode( ', ', $groups ) ) . "\n\n";
+                               "\nGranted to:\n  " . str_replace( '*', 'all', implode( ', ', $groups ) ) . "\n\n";
                }
 
                $msg .= "\n$astriks Formats  $astriks\n\n";
@@ -1234,6 +1254,7 @@ class ApiMain extends ApiBase {
         */
        public function getShowVersions() {
                wfDeprecated( __METHOD__, '1.21' );
+
                return false;
        }
 
@@ -1336,6 +1357,7 @@ class UsageException extends MWException {
                if ( is_array( $this->mExtraData ) ) {
                        $result = array_merge( $result, $this->mExtraData );
                }
+
                return $result;
        }
 
index 100392b..407e089 100644 (file)
@@ -97,6 +97,7 @@ class ApiModuleManager extends ContextSource {
                                // cache this instance in case it is needed later
                                $this->mInstances[$moduleName] = $instance;
                        }
+
                        return $instance;
                }
        }
@@ -116,6 +117,7 @@ class ApiModuleManager extends ContextSource {
                                $result[] = $name;
                        }
                }
+
                return $result;
        }
 
@@ -131,6 +133,7 @@ class ApiModuleManager extends ContextSource {
                                $result[$name] = $grpCls[1];
                        }
                }
+
                return $result;
        }
 
index c18036c..c2d0959 100644 (file)
@@ -61,8 +61,8 @@ class ApiMove extends ApiBase {
 
                if ( $toTitle->getNamespace() == NS_FILE
                        && !RepoGroup::singleton()->getLocalRepo()->findFile( $toTitle )
-                       && wfFindFile( $toTitle ) )
-               {
+                       && wfFindFile( $toTitle )
+               {
                        if ( !$params['ignorewarnings'] && $user->isAllowed( 'reupload-shared' ) ) {
                                $this->dieUsageMsg( 'sharedfile-exists' );
                        } elseif ( !$user->isAllowed( 'reupload-shared' ) ) {
@@ -115,7 +115,7 @@ class ApiMove extends ApiBase {
                // Move subpages
                if ( $params['movesubpages'] ) {
                        $r['subpages'] = $this->moveSubpages( $fromTitle, $toTitle,
-                                       $params['reason'], $params['noredirect'] );
+                               $params['reason'], $params['noredirect'] );
                        $result->setIndexedTagName( $r['subpages'], 'subpage' );
 
                        if ( $params['movetalk'] ) {
@@ -167,6 +167,7 @@ class ApiMove extends ApiBase {
                                $retval[] = $r;
                        }
                }
+
                return $retval;
        }
 
@@ -219,6 +220,7 @@ class ApiMove extends ApiBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'from' => "Title of the page you want to move. Cannot be used together with {$p}fromid",
                        'fromid' => "Page ID of the page you want to move. Cannot be used together with {$p}from",
index 315ace3..433b743 100644 (file)
@@ -40,6 +40,7 @@ class ApiOpenSearch extends ApiBase {
                if ( in_array( $format, $allowed ) ) {
                        return $this->getMain()->createPrinterByName( $format );
                }
+
                return $this->getMain()->createPrinterByName( $allowed[0] );
        }
 
index b05cb2b..6c4bb08 100644 (file)
@@ -112,7 +112,8 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Populate the PageSet from the request parameters.
-        * @param bool $isDryRun If true, instantiates generator, but only to mark relevant parameters as used
+        * @param bool $isDryRun If true, instantiates generator, but only to mark
+        *    relevant parameters as used
         */
        private function executeInternal( $isDryRun ) {
                $this->profileIn();
@@ -200,8 +201,9 @@ class ApiPageSet extends ApiBase {
                                                break;
                                        case 'revids':
                                                if ( $this->mResolveRedirects ) {
-                                                       $this->setWarning( 'Redirect resolution cannot be used together with the revids= parameter. ' .
-                                                               'Any redirects the revids= point to have not been resolved.' );
+                                                       $this->setWarning( 'Redirect resolution cannot be used ' .
+                                                               'together with the revids= parameter. Any redirects ' .
+                                                               'the revids= point to have not been resolved.' );
                                                }
                                                $this->mResolveRedirects = false;
                                                $this->initFromRevIDs( $this->mParams['revids'] );
@@ -244,6 +246,7 @@ class ApiPageSet extends ApiBase {
                if ( isset( $this->mParams['revids'] ) ) {
                        return 'revids';
                }
+
                return null;
        }
 
@@ -289,6 +292,7 @@ class ApiPageSet extends ApiBase {
                $this->mRequestedPageFields = array_diff_key( $this->mRequestedPageFields, $pageFlds );
 
                $pageFlds = array_merge( $pageFlds, $this->mRequestedPageFields );
+
                return array_keys( $pageFlds );
        }
 
@@ -391,6 +395,7 @@ class ApiPageSet extends ApiBase {
                if ( !empty( $values ) && $result ) {
                        $result->setIndexedTagName( $values, 'r' );
                }
+
                return $values;
        }
 
@@ -421,6 +426,7 @@ class ApiPageSet extends ApiBase {
                if ( !empty( $values ) && $result ) {
                        $result->setIndexedTagName( $values, 'n' );
                }
+
                return $values;
        }
 
@@ -451,6 +457,7 @@ class ApiPageSet extends ApiBase {
                if ( !empty( $values ) && $result ) {
                        $result->setIndexedTagName( $values, 'c' );
                }
+
                return $values;
        }
 
@@ -487,6 +494,7 @@ class ApiPageSet extends ApiBase {
                if ( !empty( $values ) && $result ) {
                        $result->setIndexedTagName( $values, 'i' );
                }
+
                return $values;
        }
 
@@ -522,6 +530,7 @@ class ApiPageSet extends ApiBase {
                if ( !empty( $values ) && $result ) {
                        $result->setIndexedTagName( $values, 'rev' );
                }
+
                return $values;
        }
 
@@ -642,7 +651,7 @@ class ApiPageSet extends ApiBase {
                // Get pageIDs data from the `page` table
                $this->profileDBIn();
                $res = $db->select( 'page', $this->getPageTableFields(), $set,
-                                       __METHOD__ );
+                       __METHOD__ );
                $this->profileDBOut();
 
                // Hack: get the ns:titles stored in array(ns => array(titles)) format
@@ -676,7 +685,7 @@ class ApiPageSet extends ApiBase {
                        // Get pageIDs data from the `page` table
                        $this->profileDBIn();
                        $res = $db->select( 'page', $this->getPageTableFields(), $set,
-                                               __METHOD__ );
+                               __METHOD__ );
                        $this->profileDBOut();
                }
 
@@ -863,7 +872,12 @@ class ApiPageSet extends ApiBase {
                foreach ( $res as $row ) {
                        $rdfrom = intval( $row->rd_from );
                        $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
-                       $to = Title::makeTitle( $row->rd_namespace, $row->rd_title, $row->rd_fragment, $row->rd_interwiki );
+                       $to = Title::makeTitle(
+                               $row->rd_namespace,
+                               $row->rd_title,
+                               $row->rd_fragment,
+                               $row->rd_interwiki
+                       );
                        unset( $this->mPendingRedirectIDs[$rdfrom] );
                        if ( !$to->isExternal() && !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
                                $lb->add( $row->rd_namespace, $row->rd_title );
@@ -886,6 +900,7 @@ class ApiPageSet extends ApiBase {
                                unset( $this->mPendingRedirectIDs[$id] );
                        }
                }
+
                return $lb;
        }
 
@@ -941,8 +956,9 @@ class ApiPageSet extends ApiBase {
                                // Variants checking
                                global $wgContLang;
                                if ( $this->mConvertTitles &&
-                                               count( $wgContLang->getVariants() ) > 1 &&
-                                               !$titleObj->exists() ) {
+                                       count( $wgContLang->getVariants() ) > 1 &&
+                                       !$titleObj->exists()
+                               ) {
                                        // Language::findVariantLink will modify titleText and titleObj into
                                        // the canonical variant if possible
                                        $titleText = is_string( $title ) ? $title : $titleObj->getPrefixedText();
@@ -1040,6 +1056,7 @@ class ApiPageSet extends ApiBase {
                                $result['generator'] = null;
                        }
                }
+
                return $result;
        }
 
@@ -1067,6 +1084,7 @@ class ApiPageSet extends ApiBase {
                        sort( $gens );
                        self::$generators = $gens;
                }
+
                return self::$generators;
        }
 
@@ -1075,19 +1093,34 @@ class ApiPageSet extends ApiBase {
                        'titles' => 'A list of titles to work on',
                        'pageids' => 'A list of page IDs to work on',
                        'revids' => 'A list of revision IDs to work on',
-                       'generator' => array( 'Get the list of pages to work on by executing the specified query module.',
-                               'NOTE: generator parameter names must be prefixed with a \'g\', see examples' ),
+                       'generator' => array(
+                               'Get the list of pages to work on by executing the specified query module.',
+                               'NOTE: generator parameter names must be prefixed with a \'g\', see examples'
+                       ),
                        'redirects' => 'Automatically resolve redirects',
-                       'converttitles' => array( 'Convert titles to other variants if necessary. Only works if the wiki\'s content language supports variant conversion.',
-                               'Languages that support variant conversion include ' . implode( ', ', LanguageConverter::$languagesWithVariants ) ),
+                       'converttitles' => array(
+                               'Convert titles to other variants if necessary. Only works if ' .
+                                       'the wiki\'s content language supports variant conversion.',
+                               'Languages that support variant conversion include ' .
+                                       implode( ', ', LanguageConverter::$languagesWithVariants )
+                       ),
                );
        }
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'multisource', 'info' => "Cannot use 'pageids' at the same time as 'dataSource'" ),
-                       array( 'code' => 'multisource', 'info' => "Cannot use 'revids' at the same time as 'dataSource'" ),
-                       array( 'code' => 'badgenerator', 'info' => 'Module $generatorName cannot be used as a generator' ),
+                       array(
+                               'code' => 'multisource',
+                               'info' => "Cannot use 'pageids' at the same time as 'dataSource'"
+                       ),
+                       array(
+                               'code' => 'multisource',
+                               'info' => "Cannot use 'revids' at the same time as 'dataSource'"
+                       ),
+                       array(
+                               'code' => 'badgenerator',
+                               'info' => 'Module $generatorName cannot be used as a generator'
+                       ),
                ) );
        }
 }
index 3e1a753..2b4710a 100644 (file)
@@ -226,7 +226,8 @@ class ApiParamInfo extends ApiBase {
                        if ( isset( $p[ApiBase::PARAM_TYPE] ) ) {
                                $a['type'] = $p[ApiBase::PARAM_TYPE];
                                if ( is_array( $a['type'] ) ) {
-                                       $a['type'] = array_values( $a['type'] ); // to prevent sparse arrays from being serialized to JSON as objects
+                                       // To prevent sparse arrays from being serialized to JSON as objects
+                                       $a['type'] = array_values( $a['type'] );
                                        $result->setIndexedTagName( $a['type'], 't' );
                                }
                        }
@@ -317,6 +318,7 @@ class ApiParamInfo extends ApiBase {
                sort( $querymodules );
                $formatmodules = $this->getMain()->getModuleManager()->getNames( 'format' );
                sort( $formatmodules );
+
                return array(
                        'modules' => array(
                                ApiBase::PARAM_ISMULTI => true,
@@ -340,7 +342,8 @@ class ApiParamInfo extends ApiBase {
                        'modules' => 'List of module names (value of the action= parameter)',
                        'querymodules' => 'List of query module names (value of prop=, meta= or list= parameter)',
                        'mainmodule' => 'Get information about the main (top-level) module as well',
-                       'pagesetmodule' => 'Get information about the pageset module (providing titles= and friends) as well',
+                       'pagesetmodule' => 'Get information about the pageset module ' .
+                               '(providing titles= and friends) as well',
                        'formatmodules' => 'List of format module names (value of format= parameter)',
                );
        }
index 301affb..3e2e5a8 100644 (file)
@@ -60,7 +60,10 @@ class ApiParse extends ApiBase {
                $format = $params['contentformat'];
 
                if ( !is_null( $page ) && ( !is_null( $text ) || $titleProvided ) ) {
-                       $this->dieUsage( 'The page parameter cannot be used together with the text and title parameters', 'params' );
+                       $this->dieUsage(
+                               'The page parameter cannot be used together with the text and title parameters',
+                               'params'
+                       );
                }
 
                $prop = array_flip( $params['prop'] );
@@ -76,9 +79,12 @@ class ApiParse extends ApiBase {
                // TODO: Does this still need $wgTitle?
                global $wgParser, $wgTitle;
 
-               // Currently unnecessary, code to act as a safeguard against any change in current behavior of uselang
+               // Currently unnecessary, code to act as a safeguard against any change
+               // in current behavior of uselang
                $oldLang = null;
-               if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
+               if ( isset( $params['uselang'] )
+                       && $params['uselang'] != $this->getContext()->getLanguage()->getCode()
+               ) {
                        $oldLang = $this->getContext()->getLanguage(); // Backup language
                        $this->getContext()->setLanguage( Language::factory( $params['uselang'] ) );
                }
@@ -125,7 +131,7 @@ class ApiParse extends ApiBase {
                                                'action' => 'query',
                                                'redirects' => '',
                                        );
-                                       if ( !is_null ( $pageid ) ) {
+                                       if ( !is_null( $pageid ) ) {
                                                $reqParams['pageids'] = $pageid;
                                        } else { // $page
                                                $reqParams['titles'] = $page;
@@ -219,6 +225,7 @@ class ApiParse extends ApiBase {
                                        ApiResult::setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
                                }
                                $result->addValue( null, $this->getModuleName(), $result_array );
+
                                return;
                        }
 
@@ -249,7 +256,10 @@ class ApiParse extends ApiBase {
 
                if ( !is_null( $params['summary'] ) ) {
                        $result_array['parsedsummary'] = array();
-                       ApiResult::setContent( $result_array['parsedsummary'], Linker::formatComment( $params['summary'], $titleObj ) );
+                       ApiResult::setContent(
+                               $result_array['parsedsummary'],
+                               Linker::formatComment( $params['summary'], $titleObj )
+                       );
                }
 
                if ( isset( $prop['langlinks'] ) || isset( $prop['languageshtml'] ) ) {
@@ -300,8 +310,8 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['displaytitle'] ) ) {
                        $result_array['displaytitle'] = $p_result->getDisplayTitle() ?
-                                                       $p_result->getDisplayTitle() :
-                                                       $titleObj->getPrefixedText();
+                               $p_result->getDisplayTitle() :
+                               $titleObj->getPrefixedText();
                }
 
                if ( isset( $prop['headitems'] ) || isset( $prop['headhtml'] ) ) {
@@ -321,7 +331,10 @@ class ApiParse extends ApiBase {
 
                        if ( isset( $prop['headhtml'] ) ) {
                                $result_array['headhtml'] = array();
-                               ApiResult::setContent( $result_array['headhtml'], $context->getOutput()->headElement( $context->getSkin() ) );
+                               ApiResult::setContent(
+                                       $result_array['headhtml'],
+                                       $context->getOutput()->headElement( $context->getSkin() )
+                               );
                        }
                }
 
@@ -395,6 +408,7 @@ class ApiParse extends ApiBase {
                $popts->setIsSectionPreview( $params['sectionpreview'] );
 
                wfProfileOut( __METHOD__ );
+
                return $popts;
        }
 
@@ -425,6 +439,7 @@ class ApiParse extends ApiBase {
                        if ( $getWikitext ) {
                                $this->content = $page->getContent( Revision::RAW );
                        }
+
                        return $pout;
                }
        }
@@ -439,6 +454,7 @@ class ApiParse extends ApiBase {
                        $this->dieUsage( "Sections are not supported by " . $what, 'nosuchsection' );
                        $section = false;
                }
+
                return $section;
        }
 
@@ -456,6 +472,7 @@ class ApiParse extends ApiBase {
                        ApiResult::setContent( $entry, $bits[1] );
                        $result[] = $entry;
                }
+
                return $result;
        }
 
@@ -502,11 +519,13 @@ class ApiParse extends ApiBase {
        private function categoriesHtml( $categories ) {
                $context = $this->getContext();
                $context->getOutput()->addCategoryLinks( $categories );
+
                return $context->getSkin()->getCategories();
        }
 
        /**
-        * @deprecated since 1.18 No modern skin generates language links this way, please use language links
+        * @deprecated since 1.18 No modern skin generates language links this way,
+        * please use language links
         *                        data to generate your own HTML.
         * @param $languages array
         * @return string
@@ -520,7 +539,8 @@ class ApiParse extends ApiBase {
                        return '';
                }
 
-               $s = htmlspecialchars( wfMessage( 'otherlanguages' )->text() . wfMessage( 'colon-separator' )->text() );
+               $s = htmlspecialchars( wfMessage( 'otherlanguages' )->text() .
+                       wfMessage( 'colon-separator' )->text() );
 
                $langs = array();
                foreach ( $languages as $l ) {
@@ -554,6 +574,7 @@ class ApiParse extends ApiBase {
                                $result[] = $entry;
                        }
                }
+
                return $result;
        }
 
@@ -573,6 +594,7 @@ class ApiParse extends ApiBase {
                                $result[] = $entry;
                        }
                }
+
                return $result;
        }
 
@@ -584,6 +606,7 @@ class ApiParse extends ApiBase {
                        ApiResult::setContent( $entry, $content );
                        $result[] = $entry;
                }
+
                return $result;
        }
 
@@ -595,6 +618,7 @@ class ApiParse extends ApiBase {
                        ApiResult::setContent( $entry, $value );
                        $result[] = $entry;
                }
+
                return $result;
        }
 
@@ -606,6 +630,7 @@ class ApiParse extends ApiBase {
                        ApiResult::setContent( $entry, $link );
                        $result[] = $entry;
                }
+
                return $result;
        }
 
@@ -631,7 +656,8 @@ class ApiParse extends ApiBase {
                                ApiBase::PARAM_TYPE => 'integer',
                        ),
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle|iwlinks|properties',
+                               ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|' .
+                                       'images|externallinks|sections|revid|displaytitle|iwlinks|properties',
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'text',
@@ -674,6 +700,7 @@ class ApiParse extends ApiBase {
        public function getParamDescription() {
                $p = $this->getModulePrefix();
                $wikitext = CONTENT_MODEL_WIKITEXT;
+
                return array(
                        'text' => "Text to parse. Use {$p}title or {$p}contentmodel to control the content model",
                        'summary' => 'Summary to parse',
@@ -736,9 +763,11 @@ class ApiParse extends ApiBase {
 
        public function getDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'Parses content and returns parser output',
-                       'See the various prop-Modules of action=query to get information from the current version of a page',
+                       'See the various prop-Modules of action=query to get information from the current' .
+                               'version of a page',
                        'There are several ways to specify the text to parse:',
                        "1) Specify a page or revision, using {$p}page, {$p}pageid, or {$p}oldid.",
                        "2) Specify content explicitly, using {$p}text, {$p}title, and {$p}contentmodel.",
@@ -748,15 +777,24 @@ class ApiParse extends ApiBase {
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'params', 'info' => 'The page parameter cannot be used together with the text and title parameters' ),
+                       array(
+                               'code' => 'params',
+                               'info' => 'The page parameter cannot be used together with the text and title parameters'
+                       ),
                        array( 'code' => 'missingrev', 'info' => 'There is no revision ID oldid' ),
-                       array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revisions' ),
+                       array(
+                               'code' => 'permissiondenied',
+                               'info' => 'You don\'t have permission to view deleted revisions'
+                       ),
                        array( 'code' => 'missingtitle', 'info' => 'The page you specified doesn\'t exist' ),
                        array( 'code' => 'nosuchsection', 'info' => 'There is no section sectionnumber in page' ),
                        array( 'nosuchpageid' ),
                        array( 'invalidtitle', 'title' ),
                        array( 'code' => 'parseerror', 'info' => 'Failed to parse the given text.' ),
-                       array( 'code' => 'notwikitext', 'info' => 'The requested operation is only supported on wikitext content.' ),
+                       array(
+                               'code' => 'notwikitext',
+                               'info' => 'The requested operation is only supported on wikitext content.'
+                       ),
                        array( 'code' => 'pagecannotexist', 'info' => "Namespace doesn't allow actual pages" ),
                ) );
        }
@@ -765,7 +803,8 @@ class ApiParse extends ApiBase {
                return array(
                        'api.php?action=parse&page=Project:Sandbox' => 'Parse a page',
                        'api.php?action=parse&text={{Project:Sandbox}}' => 'Parse wikitext',
-                       'api.php?action=parse&text={{PAGENAME}}&title=Test' => 'Parse wikitext, specifying the page title',
+                       'api.php?action=parse&text={{PAGENAME}}&title=Test'
+                               => 'Parse wikitext, specifying the page title',
                        'api.php?action=parse&summary=Some+[[link]]&prop=' => 'Parse a summary',
                );
        }
index bd2fde2..46bd94e 100644 (file)
@@ -123,7 +123,8 @@ class ApiPatrol extends ApiBase {
                                        'code' => 'notpatrollable',
                                        'info' => "The revision can't be patrolled as it's too old"
                                )
-               ) );
+                       )
+               );
        }
 
        public function needsToken() {
index 428eef3..80c76b3 100644 (file)
@@ -28,7 +28,6 @@
  * @ingroup API
  */
 class ApiProtect extends ApiBase {
-
        public function execute() {
                global $wgRestrictionLevels;
                $params = $this->extractRequestParams();
@@ -47,7 +46,11 @@ class ApiProtect extends ApiBase {
                        if ( count( $expiry ) == 1 ) {
                                $expiry = array_fill( 0, count( $params['protections'] ), $expiry[0] );
                        } else {
-                               $this->dieUsageMsg( array( 'toofewexpiries', count( $expiry ), count( $params['protections'] ) ) );
+                               $this->dieUsageMsg( array(
+                                       'toofewexpiries',
+                                       count( $expiry ),
+                                       count( $params['protections'] )
+                               ) );
                        }
                }
 
@@ -90,9 +93,9 @@ class ApiProtect extends ApiBase {
                                $expiryarray[$p[0]] = $exp;
                        }
                        $resultProtections[] = array( $p[0] => $protections[$p[0]],
-                                       'expiry' => ( $expiryarray[$p[0]] == $db->getInfinity() ?
-                                                               'infinite' :
-                                                               wfTimestamp( TS_ISO_8601, $expiryarray[$p[0]] ) ) );
+                               'expiry' => ( $expiryarray[$p[0]] == $db->getInfinity() ?
+                                       'infinite' :
+                                       wfTimestamp( TS_ISO_8601, $expiryarray[$p[0]] ) ) );
                }
 
                $cascade = $params['cascade'];
@@ -100,7 +103,13 @@ class ApiProtect extends ApiBase {
                $watch = $params['watch'] ? 'watch' : $params['watchlist'];
                $this->setWatch( $watch, $titleObj, 'watchdefault' );
 
-               $status = $pageObj->doUpdateRestrictions( $protections, $expiryarray, $cascade, $params['reason'], $this->getUser() );
+               $status = $pageObj->doUpdateRestrictions(
+                       $protections,
+                       $expiryarray,
+                       $cascade,
+                       $params['reason'],
+                       $this->getUser()
+               );
 
                if ( !$status->isOK() ) {
                        $this->dieStatus( $status );
@@ -167,18 +176,25 @@ class ApiProtect extends ApiBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'title' => "Title of the page you want to (un)protect. Cannot be used together with {$p}pageid",
                        'pageid' => "ID of the page you want to (un)protect. Cannot be used together with {$p}title",
                        'token' => 'A protect token previously retrieved through prop=info',
                        'protections' => 'List of protection levels, formatted action=group (e.g. edit=sysop)',
-                       'expiry' => array( 'Expiry timestamps. If only one timestamp is set, it\'ll be used for all protections.',
-                                       'Use \'infinite\', \'indefinite\' or \'never\', for a never-expiring protection.' ),
+                       'expiry' => array(
+                               'Expiry timestamps. If only one timestamp is ' .
+                                       'set, it\'ll be used for all protections.',
+                               'Use \'infinite\', \'indefinite\' or \'never\', for a never-expiring protection.'
+                       ),
                        'reason' => 'Reason for (un)protecting',
-                       'cascade' => array( 'Enable cascading protection (i.e. protect pages included in this page)',
-                                       'Ignored if not all protection levels are \'sysop\' or \'protect\'' ),
+                       'cascade' => array(
+                               'Enable cascading protection (i.e. protect pages included in this page)',
+                               'Ignored if not all protection levels are \'sysop\' or \'protect\''
+                       ),
                        'watch' => 'If set, add the page being (un)protected to your watchlist',
-                       'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
+                       'watchlist' => 'Unconditionally add or remove the page from your ' .
+                               'watchlist, use preferences or do not change watch',
                );
        }
 
@@ -221,8 +237,10 @@ class ApiProtect extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=protect&title=Main%20Page&token=123ABC&protections=edit=sysop|move=sysop&cascade=&expiry=20070901163000|never',
-                       'api.php?action=protect&title=Main%20Page&token=123ABC&protections=edit=all|move=all&reason=Lifting%20restrictions'
+                       'api.php?action=protect&title=Main%20Page&token=123ABC&' .
+                               'protections=edit=sysop|move=sysop&cascade=&expiry=20070901163000|never',
+                       'api.php?action=protect&title=Main%20Page&token=123ABC&' .
+                               'protections=edit=all|move=all&reason=Lifting%20restrictions'
                );
        }
 
index 0812ba5..c0dd808 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup API
  */
 class ApiPurge extends ApiBase {
-
        private $mPageSet;
 
        /**
@@ -91,7 +90,12 @@ class ApiPurge extends ApiBase {
 
                                        # Parse content; note that HTML generation is only needed if we want to cache the result.
                                        $content = $page->getContent( Revision::RAW );
-                                       $p_result = $content->getParserOutput( $title, $page->getLatest(), $popts, $wgEnableParserCache );
+                                       $p_result = $content->getParserOutput(
+                                               $title,
+                                               $page->getLatest(),
+                                               $popts,
+                                               $wgEnableParserCache
+                                       );
 
                                        # Update the links tables
                                        $updates = $content->getSecondaryDataUpdates(
@@ -139,6 +143,7 @@ class ApiPurge extends ApiBase {
                if ( !isset( $this->mPageSet ) ) {
                        $this->mPageSet = new ApiPageSet( $this );
                }
+
                return $this->mPageSet;
        }
 
@@ -159,6 +164,7 @@ class ApiPurge extends ApiBase {
                if ( $flags ) {
                        $result += $this->getPageSet()->getFinalParams( $flags );
                }
+
                return $result;
        }
 
index e03837f..79a3b05 100644 (file)
@@ -163,6 +163,7 @@ class ApiQuery extends ApiBase {
                        $this->mNamedDB[$name] = wfGetDB( $db, $groups );
                        $this->profileDBOut();
                }
+
                return $this->mNamedDB[$name];
        }
 
@@ -181,6 +182,7 @@ class ApiQuery extends ApiBase {
         */
        public function getModules() {
                wfDeprecated( __METHOD__, '1.21' );
+
                return $this->getModuleManager()->getNamesWithClasses();
        }
 
@@ -197,6 +199,7 @@ class ApiQuery extends ApiBase {
                                $gens[$name] = $class;
                        }
                }
+
                return $gens;
        }
 
@@ -216,8 +219,8 @@ class ApiQuery extends ApiBase {
        public function getCustomPrinter() {
                // If &exportnowrap is set, use the raw formatter
                if ( $this->getParameter( 'export' ) &&
-                               $this->getParameter( 'exportnowrap' ) )
-               {
+                       $this->getParameter( 'exportnowrap' )
+               {
                        return new ApiFormatRaw( $this->getMain(),
                                $this->getMain()->createPrinterByName( 'xml' ) );
                } else {
@@ -407,6 +410,7 @@ class ApiQuery extends ApiBase {
                        }
                }
                $this->dieContinueUsageIf( $completeModules !== null && count( $tmp ) !== 0 );
+
                return $modules;
        }
 
@@ -429,6 +433,7 @@ class ApiQuery extends ApiBase {
                } else { // private
                        $cacheMode = 'private';
                }
+
                return $cacheMode;
        }
 
@@ -514,10 +519,12 @@ class ApiQuery extends ApiBase {
                        ApiQueryBase::addTitleInfo( $vals, $title );
                        $vals['special'] = '';
                        if ( $title->isSpecialPage() &&
-                                       !SpecialPageFactory::exists( $title->getDBkey() ) ) {
+                               !SpecialPageFactory::exists( $title->getDBkey() )
+                       ) {
                                $vals['missing'] = '';
                        } elseif ( $title->getNamespace() == NS_MEDIA &&
-                                       !wfFindFile( $title ) ) {
+                               !wfFindFile( $title )
+                       ) {
                                $vals['missing'] = '';
                        }
                        $pages[$fakeId] = $vals;
@@ -566,6 +573,7 @@ class ApiQuery extends ApiBase {
                        $this->mGeneratorContinue = array();
                }
                $this->mGeneratorContinue[$paramName] = $paramValue;
+
                return true;
        }
 
@@ -638,6 +646,7 @@ class ApiQuery extends ApiBase {
                if ( $flags ) {
                        $result += $this->getPageSet()->getFinalParams( $flags );
                }
+
                return $result;
        }
 
@@ -699,25 +708,32 @@ class ApiQuery extends ApiBase {
 
        public function getParamDescription() {
                return $this->getPageSet()->getFinalParamDescription() + array(
-                       'prop' => 'Which properties to get for the titles/revisions/pageids. Module help is available below',
+                       'prop' => 'Which properties to get for the titles/revisions/pageids. ' .
+                               'Module help is available below',
                        'list' => 'Which lists to get. Module help is available below',
                        'meta' => 'Which metadata to get about the site. Module help is available below',
                        'indexpageids' => 'Include an additional pageids section listing all returned page IDs',
                        'export' => 'Export the current revisions of all given or generated pages',
-                       'exportnowrap' => 'Return the export XML without wrapping it in an XML result (same format as Special:Export). Can only be used with export',
+                       'exportnowrap' => 'Return the export XML without wrapping it in an '.
+                               'XML result (same format as Special:Export). Can only be used with export',
                        'iwurl' => 'Whether to get the full URL if the title is an interwiki link',
                        'continue' => array(
-                               'When present, formats query-continue as key-value pairs that should simply be merged into the original request.',
+                               'When present, formats query-continue as key-value pairs that ' .
+                                       'should simply be merged into the original request.',
                                'This parameter must be set to an empty string in the initial query.',
-                               'This parameter is recommended for all new development, and will be made default in the next API version.' ),
+                               'This parameter is recommended for all new development, and ' .
+                                       'will be made default in the next API version.'
+                       ),
                );
        }
 
        public function getDescription() {
                return array(
-                       'Query API module allows applications to get needed pieces of data from the MediaWiki databases,',
+                       'Query API module allows applications to get needed pieces of data ' .
+                               'from the MediaWiki databases,',
                        'and is loosely based on the old query.php interface.',
-                       'All data modifications will first have to use query to acquire a token to prevent abuse from malicious sites'
+                       'All data modifications will first have to use query to acquire a ' .
+                               'token to prevent abuse from malicious sites'
                );
        }
 
@@ -730,7 +746,8 @@ class ApiQuery extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment&continue=',
+                       'api.php?action=query&prop=revisions&meta=siteinfo&' .
+                               'titles=Main%20Page&rvprop=user|comment&continue=',
                        'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions&continue=',
                );
        }
index 3f5c6ee..d0ab59e 100644 (file)
@@ -80,7 +80,8 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                }
 
                if ( isset( $params['prefix'] ) ) {
-                       $this->addWhere( 'cat_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+                       $this->addWhere( 'cat_title' .
+                               $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
                }
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
@@ -109,8 +110,9 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                $result = $this->getResult();
                $count = 0;
                foreach ( $res as $row ) {
-                       if ( ++ $count > $params['limit'] ) {
-                               // We've reached the one extra which shows that there are additional cats to be had. Stop here...
+                       if ( ++$count > $params['limit'] ) {
+                               // We've reached the one extra which shows that there are
+                               // additional cats to be had. Stop here...
                                $this->setContinueEnumParameter( 'continue', $row->cat_title );
                                break;
                        }
index ccc7a3a..9f97cac 100644 (file)
@@ -32,7 +32,6 @@
  * @ingroup API
  */
 class ApiQueryAllImages extends ApiQueryGeneratorBase {
-
        protected $mRepo;
 
        public function __construct( $query, $moduleName ) {
@@ -65,7 +64,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
         */
        public function executeGenerator( $resultPageSet ) {
                if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage( 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator', 'params' );
+                       $this->dieUsage(
+                               'Use "gaifilterredir=nonredirects" option instead of "redirects" ' .
+                                       'when using allimages as a generator',
+                               'params'
+                       );
                }
 
                $this->run( $resultPageSet );
@@ -78,7 +81,10 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        private function run( $resultPageSet = null ) {
                $repo = $this->mRepo;
                if ( !$repo instanceof LocalRepo ) {
-                       $this->dieUsage( 'Local file repository does not support querying all images', 'unsupportedrepo' );
+                       $this->dieUsage(
+                               'Local file repository does not support querying all images',
+                               'unsupportedrepo'
+                       );
                }
 
                $prefix = $this->getModulePrefix();
@@ -103,11 +109,17 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        $disallowed = array( 'start', 'end', 'user' );
                        foreach ( $disallowed as $pname ) {
                                if ( isset( $params[$pname] ) ) {
-                                       $this->dieUsage( "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=timestamp", 'badparams' );
+                                       $this->dieUsage(
+                                               "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=timestamp",
+                                               'badparams'
+                                       );
                                }
                        }
                        if ( $params['filterbots'] != 'all' ) {
-                                       $this->dieUsage( "Parameter '{$prefix}filterbots' can only be used with {$prefix}sort=timestamp", 'badparams' );
+                               $this->dieUsage(
+                                       "Parameter '{$prefix}filterbots' can only be used with {$prefix}sort=timestamp",
+                                       'badparams'
+                               );
                        }
 
                        // Pagination
@@ -125,23 +137,36 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        $this->addWhereRange( 'img_name', ( $ascendingOrder ? 'newer' : 'older' ), $from, $to );
 
                        if ( isset( $params['prefix'] ) ) {
-                               $this->addWhere( 'img_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+                               $this->addWhere( 'img_name' .
+                                       $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
                        }
                } else {
                        // Check mutually exclusive params
                        $disallowed = array( 'from', 'to', 'prefix' );
                        foreach ( $disallowed as $pname ) {
                                if ( isset( $params[$pname] ) ) {
-                                       $this->dieUsage( "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=name", 'badparams' );
+                                       $this->dieUsage(
+                                               "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=name",
+                                               'badparams'
+                                       );
                                }
                        }
                        if ( !is_null( $params['user'] ) && $params['filterbots'] != 'all' ) {
-                               // Since filterbots checks if each user has the bot right, it doesn't make sense to use it with user
-                               $this->dieUsage( "Parameters '{$prefix}user' and '{$prefix}filterbots' cannot be used together", 'badparams' );
+                               // Since filterbots checks if each user has the bot right, it
+                               // doesn't make sense to use it with user
+                               $this->dieUsage(
+                                       "Parameters '{$prefix}user' and '{$prefix}filterbots' cannot be used together",
+                                       'badparams'
+                               );
                        }
 
                        // Pagination
-                       $this->addTimestampWhereRange( 'img_timestamp', ( $ascendingOrder ? 'newer' : 'older' ), $params['start'], $params['end'] );
+                       $this->addTimestampWhereRange(
+                               'img_timestamp',
+                               $ascendingOrder ? 'newer' : 'older',
+                               $params['start'],
+                               $params['end']
+                       );
 
                        // Image filters
                        if ( !is_null( $params['user'] ) ) {
@@ -156,7 +181,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                                'ug_user = img_user'
                                        )
                                ) ) );
-                               $groupCond = ( $params['filterbots'] == 'nobots' ? 'NULL': 'NOT NULL' );
+                               $groupCond = ( $params['filterbots'] == 'nobots' ? 'NULL' : 'NOT NULL' );
                                $this->addWhere( "ug_group IS $groupCond" );
                        }
                }
@@ -222,8 +247,9 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                $count = 0;
                $result = $this->getResult();
                foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                       if ( ++$count > $limit ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                if ( $params['sort'] == 'name' ) {
                                        $this->setContinueEnumParameter( 'continue', $row->img_name );
                                } else {
@@ -326,6 +352,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'sort' => 'Property to sort by',
                        'dir' => 'The direction in which to list',
@@ -335,13 +362,16 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        'start' => "The timestamp to start enumerating from. Can only be used with {$p}sort=timestamp",
                        'end' => "The timestamp to end enumerating. Can only be used with {$p}sort=timestamp",
                        'prop' => ApiQueryImageInfo::getPropertyDescriptions( $this->propertyFilter ),
-                       'prefix' => "Search for all image titles that begin with this value. Can only be used with {$p}sort=name",
+                       'prefix' => "Search for all image titles that begin with this " .
+                               "value. Can only be used with {$p}sort=name",
                        'minsize' => 'Limit to images with at least this many bytes',
                        'maxsize' => 'Limit to images with at most this many bytes',
                        'sha1' => "SHA1 hash of image. Overrides {$p}sha1base36",
                        'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)',
-                       'user' => "Only return files uploaded by this user. Can only be used with {$p}sort=timestamp. Cannot be used together with {$p}filterbots",
-                       'filterbots' => "How to filter files uploaded by bots. Can only be used with {$p}sort=timestamp. Cannot be used together with {$p}user",
+                       'user' => "Only return files uploaded by this user. Can only be used " .
+                               "with {$p}sort=timestamp. Cannot be used together with {$p}filterbots",
+                       'filterbots' => "How to filter files uploaded by bots. Can only be " .
+                               "used with {$p}sort=timestamp. Cannot be used together with {$p}user",
                        'mime' => 'What MIME type to search for. e.g. image/jpeg. Disabled in Miser Mode',
                        'limit' => 'How many images in total to return',
                );
@@ -368,20 +398,54 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
        public function getPossibleErrors() {
                $p = $this->getModulePrefix();
+
                return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'params', 'info' => 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator' ),
-                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}start' can only be used with {$p}sort=timestamp" ),
-                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}end' can only be used with {$p}sort=timestamp" ),
-                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}user' can only be used with {$p}sort=timestamp" ),
-                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}filterbots' can only be used with {$p}sort=timestamp" ),
-                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}from' can only be used with {$p}sort=name" ),
-                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}to' can only be used with {$p}sort=name" ),
-                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}prefix' can only be used with {$p}sort=name" ),
-                       array( 'code' => 'badparams', 'info' => "Parameters '{$p}user' and '{$p}filterbots' cannot be used together" ),
-                       array( 'code' => 'unsupportedrepo', 'info' => 'Local file repository does not support querying all images' ),
+                       array(
+                               'code' => 'params',
+                               'info' => 'Use "gaifilterredir=nonredirects" option instead ' .
+                                       'of "redirects" when using allimages as a generator'
+                       ),
+                       array(
+                               'code' => 'badparams',
+                               'info' => "Parameter'{$p}start' can only be used with {$p}sort=timestamp"
+                       ),
+                       array(
+                               'code' => 'badparams',
+                               'info' => "Parameter'{$p}end' can only be used with {$p}sort=timestamp"
+                       ),
+                       array(
+                               'code' => 'badparams',
+                               'info' => "Parameter'{$p}user' can only be used with {$p}sort=timestamp"
+                       ),
+                       array(
+                               'code' => 'badparams',
+                               'info' => "Parameter'{$p}filterbots' can only be used with {$p}sort=timestamp"
+                       ),
+                       array(
+                               'code' => 'badparams',
+                               'info' => "Parameter'{$p}from' can only be used with {$p}sort=name"
+                       ),
+                       array(
+                               'code' => 'badparams',
+                               'info' => "Parameter'{$p}to' can only be used with {$p}sort=name"
+                       ),
+                       array(
+                               'code' => 'badparams',
+                               'info' => "Parameter'{$p}prefix' can only be used with {$p}sort=name"
+                       ),
+                       array(
+                               'code' => 'badparams',
+                               'info' => "Parameters '{$p}user' and '{$p}filterbots' cannot be used together"
+                       ),
+                       array(
+                               'code' => 'unsupportedrepo',
+                               'info' => 'Local file repository does not support querying all images' ),
                        array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ),
                        array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
-                       array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
+                       array(
+                               'code' => 'invalidsha1base36hash',
+                               'info' => 'The SHA1Base36 hash provided is not valid'
+                       ),
                ) );
        }
 
@@ -391,11 +455,13 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                'Simple Use',
                                'Show a list of files starting at the letter "B"',
                        ),
-                       'api.php?action=query&list=allimages&aiprop=user|timestamp|url&aisort=timestamp&aidir=older' => array(
+                       'api.php?action=query&list=allimages&aiprop=user|timestamp|url&' .
+                               'aisort=timestamp&aidir=older' => array(
                                'Simple Use',
                                'Show a list of recently uploaded files similar to Special:NewFiles',
                        ),
-                       'api.php?action=query&generator=allimages&gailimit=4&gaifrom=T&prop=imageinfo' => array(
+                       'api.php?action=query&generator=allimages&gailimit=4&' .
+                               'gaifrom=T&prop=imageinfo' => array(
                                'Using as Generator',
                                'Show info about 4 files starting at the letter "T"',
                        ),
index 47d1bce..ff53d0f 100644 (file)
@@ -54,7 +54,8 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                                $this->dfltNamespace = NS_TEMPLATE;
                                $this->hasNamespace = true;
                                $this->indexTag = 't';
-                               $this->description = 'List all transclusions (pages embedded using {{x}}), including non-existing';
+                               $this->description =
+                                       'List all transclusions (pages embedded using {{x}}), including non-existing';
                                $this->descriptionWhat = 'transclusion';
                                $this->descriptionTargets = 'transcluded titles';
                                $this->descriptionLinking = 'transcluding';
@@ -113,8 +114,10 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                if ( $params['unique'] ) {
                        if ( $fld_ids ) {
                                $this->dieUsage(
-                                       "{$this->getModuleName()} cannot return corresponding page ids in unique {$this->descriptionWhat}s mode",
-                                       'params' );
+                                       "{$this->getModuleName()} cannot return corresponding page " .
+                                               "ids in unique {$this->descriptionWhat}s mode",
+                                       'params'
+                               );
                        }
                        $this->addOption( 'DISTINCT' );
                }
@@ -145,12 +148,15 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                }
 
                // 'continue' always overrides 'from'
-               $from = ( $continue || is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
+               $from = $continue || is_null( $params['from'] )
+                       ? null
+                       : $this->titlePartToKey( $params['from'] );
                $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
                $this->addWhereRange( $pfx . $fieldTitle, 'newer', $from, $to );
 
                if ( isset( $params['prefix'] ) ) {
-                       $this->addWhere( $pfx . $fieldTitle . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+                       $this->addWhere( $pfx . $fieldTitle .
+                               $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
                }
 
                $this->addFields( array( 'pl_title' => $pfx . $fieldTitle ) );
@@ -177,8 +183,9 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                $count = 0;
                $result = $this->getResult();
                foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                       if ( ++$count > $limit ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                if ( $params['unique'] ) {
                                        $this->setContinueEnumParameter( 'continue', $row->pl_title );
                                } else {
@@ -258,6 +265,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                if ( !$this->hasNamespace ) {
                        unset( $allowedParams['namespace'] );
                }
+
                return $allowedParams;
        }
 
@@ -287,6 +295,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                if ( !$this->hasNamespace ) {
                        unset( $paramDescription['namespace'] );
                }
+
                return $paramDescription;
        }
 
@@ -309,8 +318,12 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
        public function getPossibleErrors() {
                $m = $this->getModuleName();
                $what = $this->descriptionWhat;
+
                return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'params', 'info' => "{$m} cannot return corresponding page ids in unique {$what}s mode" ),
+                       array(
+                               'code' => 'params',
+                               'info' => "{$m} cannot return corresponding page ids in unique {$what}s mode"
+                       ),
                ) );
        }
 
@@ -319,20 +332,22 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                $name = $this->getModuleName();
                $what = $this->descriptionWhat;
                $targets = $this->descriptionTargets;
+
                return array(
                        "api.php?action=query&list={$name}&{$p}from=B&{$p}prop=ids|title"
-                                       => "List $targets with page ids they are from, including missing ones. Start at B",
+                               => "List $targets with page ids they are from, including missing ones. Start at B",
                        "api.php?action=query&list={$name}&{$p}unique=&{$p}from=B"
-                                       => "List unique $targets",
+                               => "List unique $targets",
                        "api.php?action=query&generator={$name}&g{$p}unique=&g{$p}from=B"
-                                       => "Gets all $targets, marking the missing ones",
+                               => "Gets all $targets, marking the missing ones",
                        "api.php?action=query&generator={$name}&g{$p}from=B"
-                                       => "Gets pages containing the {$what}s",
+                               => "Gets pages containing the {$what}s",
                );
        }
 
        public function getHelpUrls() {
                $name = ucfirst( $this->getModuleName() );
+
                return "https://www.mediawiki.org/wiki/API:{$name}";
        }
 }
index d47c7b7..6b1d5a2 100644 (file)
@@ -241,10 +241,10 @@ class ApiQueryAllMessages extends ApiQueryBase {
                        'messages' => 'Which messages to output. "*" (default) means all messages',
                        'prop' => 'Which properties to get',
                        'enableparser' => array( 'Set to enable parser, will preprocess the wikitext of message',
-                                                       'Will substitute magic words, handle templates etc.' ),
+                               'Will substitute magic words, handle templates etc.' ),
                        'nocontent' => 'If set, do not include the content of the messages in the output.',
                        'includelocal' => array( "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.",
-                                                       "This lists all MediaWiki: pages, so it will also list those that aren't 'really' messages such as Common.js",
+                               "This lists all MediaWiki: pages, so it will also list those that aren't 'really' messages such as Common.js",
                        ),
                        'title' => 'Page name to use as context when parsing message (for enableparser option)',
                        'args' => 'Arguments to be substituted into message',
index d95980c..363d657 100644 (file)
@@ -49,7 +49,11 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
         */
        public function executeGenerator( $resultPageSet ) {
                if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage( 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params' );
+                       $this->dieUsage(
+                               'Use "gapfilterredir=nonredirects" option instead of "redirects" ' .
+                                       'when using allpages as a generator',
+                               'params'
+                       );
                }
 
                $this->run( $resultPageSet );
@@ -88,7 +92,8 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                $this->addWhereRange( 'page_title', $dir, $from, $to );
 
                if ( isset( $params['prefix'] ) ) {
-                       $this->addWhere( 'page_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+                       $this->addWhere( 'page_title' .
+                               $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
                }
 
                if ( is_null( $resultPageSet ) ) {
@@ -145,7 +150,6 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        }
 
                        $this->addOption( 'DISTINCT' );
-
                } elseif ( isset( $params['prlevel'] ) ) {
                        $this->dieUsage( 'prlevel may not be used without prtype', 'params' );
                }
@@ -186,8 +190,9 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                $count = 0;
                $result = $this->getResult();
                foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                       if ( ++$count > $limit ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                $this->setContinueEnumParameter( 'continue', $row->page_title );
                                break;
                        }
@@ -291,6 +296,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'from' => 'The page title to start enumerating from',
                        'continue' => 'When more results are available, use this to continue',
@@ -303,7 +309,8 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        'maxsize' => 'Limit to pages with at most this many bytes',
                        'prtype' => 'Limit to protected pages only',
                        'prlevel' => "The protection level (must be used with {$p}prtype= parameter)",
-                       'prfiltercascade' => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)",
+                       'prfiltercascade'
+                               => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)",
                        'filterlanglinks' => array(
                                'Filter based on whether a page has langlinks',
                                'Note that this may not consider langlinks added by extensions.',
@@ -334,7 +341,11 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'params', 'info' => 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator' ),
+                       array(
+                               'code' => 'params',
+                               'info' => 'Use "gapfilterredir=nonredirects" option instead of ' .
+                                       '"redirects" when using allpages as a generator'
+                       ),
                        array( 'code' => 'params', 'info' => 'prlevel may not be used without prtype' ),
                ) );
        }
@@ -349,9 +360,9 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                'Using as Generator',
                                'Show info about 4 pages starting at the letter "T"',
                        ),
-                       'api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content' => array(
-                               'Show content of first 2 non-redirect pages beginning at "Re"',
-                       )
+                       'api.php?action=query&generator=allpages&gaplimit=2&' .
+                               'gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content'
+                               => array( 'Show content of first 2 non-redirect pages beginning at "Re"' )
                );
        }
 
index 1948a51..748dbaf 100644 (file)
@@ -58,7 +58,8 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $fld_registration = isset( $prop['registration'] );
                        $fld_implicitgroups = isset( $prop['implicitgroups'] );
                } else {
-                       $fld_blockinfo = $fld_editcount = $fld_groups = $fld_registration = $fld_rights = $fld_implicitgroups = false;
+                       $fld_blockinfo = $fld_editcount = $fld_groups = $fld_registration =
+                               $fld_rights = $fld_implicitgroups = false;
                }
 
                $limit = $params['limit'];
@@ -90,6 +91,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        // no group with the given right(s) exists, no need for a query
                        if ( !count( $groups ) ) {
                                $this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), '' );
+
                                return;
                        }
 
@@ -111,7 +113,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        // Filter only users that belong to a given group
                        $this->addTables( 'user_groups', 'ug1' );
                        $this->addJoinConds( array( 'ug1' => array( 'INNER JOIN', array( 'ug1.ug_user=user_id',
-                                       'ug1.ug_group' => $params['group'] ) ) ) );
+                               'ug1.ug_group' => $params['group'] ) ) ) );
                }
 
                if ( !is_null( $params['excludegroup'] ) && count( $params['excludegroup'] ) ) {
@@ -122,12 +124,14 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        if ( count( $params['excludegroup'] ) == 1 ) {
                                $exclude = array( 'ug1.ug_group' => $params['excludegroup'][0] );
                        } else {
-                               $exclude = array( $db->makeList( array( 'ug1.ug_group' => $params['excludegroup'] ), LIST_OR ) );
+                               $exclude = array( $db->makeList(
+                                       array( 'ug1.ug_group' => $params['excludegroup'] ),
+                                       LIST_OR
+                               ) );
                        }
                        $this->addJoinConds( array( 'ug1' => array( 'LEFT OUTER JOIN',
                                array_merge( array( 'ug1.ug_user=user_id' ), $exclude )
-                               )
-                       ) );
+                       ) ) );
                        $this->addWhere( 'ug1.ug_user IS NULL' );
                }
 
@@ -187,12 +191,12 @@ class ApiQueryAllUsers extends ApiQueryBase {
                $lastUser = false;
                $result = $this->getResult();
 
-               //
-               // This loop keeps track of the last entry.
-               // For each new row, if the new row is for different user then the last, the last entry is added to results.
-               // Otherwise, the group of the new row is appended to the last entry.
-               // The setContinue... is more complex because of this, and takes into account the higher sql limit
-               // to make sure all rows that belong to the same user are received.
+               // This loop keeps track of the last entry. For each new row, if the
+               // new row is for different user then the last, the last entry is added
+               // to results. Otherwise, the group of the new row is appended to the
+               // last entry. The setContinue... is more complex because of this, and
+               // takes into account the higher sql limit to make sure all rows that
+               // belong to the same user are received.
 
                foreach ( $res as $row ) {
                        $count++;
@@ -201,7 +205,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                // Save the last pass's user data
                                if ( is_array( $lastUserData ) ) {
                                        $fit = $result->addValue( array( 'query', $this->getModuleName() ),
-                                                       null, $lastUserData );
+                                               null, $lastUserData );
 
                                        $lastUserData = null;
 
@@ -212,7 +216,8 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                }
 
                                if ( $count > $limit ) {
-                                       // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                                       // We've reached the one extra which shows that there are
+                                       // additional pages to be had. Stop here...
                                        $this->setContinueEnumParameter( 'from', $row->user_name );
                                        break;
                                }
@@ -246,10 +251,13 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        }
 
                        if ( $sqlLimit == $count ) {
-                               // BUG!  database contains group name that User::getAllGroups() does not return
-                               // TODO: should handle this more gracefully
-                               ApiBase::dieDebug( __METHOD__,
-                                       'MediaWiki configuration error: the database contains more user groups than known to User::getAllGroups() function' );
+                               // @todo BUG!  database contains group name that User::getAllGroups() does not return
+                               // Should handle this more gracefully
+                               ApiBase::dieDebug(
+                                       __METHOD__,
+                                       'MediaWiki configuration error: The database contains more ' .
+                                               'user groups than known to User::getAllGroups() function'
+                               );
                        }
 
                        $lastUserObj = User::newFromId( $row->user_id );
@@ -312,6 +320,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
        public function getAllowedParams() {
                $userGroups = User::getAllGroups();
+
                return array(
                        'from' => null,
                        'to' => null,
@@ -360,6 +369,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
        public function getParamDescription() {
                global $wgActiveUserDays;
+
                return array(
                        'from' => 'The user name to start enumerating from',
                        'to' => 'The user name to stop enumerating at',
@@ -367,16 +377,18 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        'dir' => 'Direction to sort in',
                        'group' => 'Limit users to given group name(s)',
                        'excludegroup' => 'Exclude users in given group name(s)',
-                       'rights' => 'Limit users to given right(s) (does not include rights granted by implicit or auto-promoted groups like *, user, or autoconfirmed)',
+                       'rights' => 'Limit users to given right(s) (does not include rights ' .
+                               'granted by implicit or auto-promoted groups like *, user, or autoconfirmed)',
                        'prop' => array(
                                'What pieces of information to include.',
                                ' blockinfo      - Adds the information about a current block on the user',
-                               ' groups         - Lists groups that the user is in. This uses more server resources and may return fewer results than the limit',
+                               ' groups         - Lists groups that the user is in. This uses ' .
+                                       'more server resources and may return fewer results than the limit',
                                ' implicitgroups - Lists all the groups the user is automatically in',
                                ' rights         - Lists rights that the user has',
                                ' editcount      - Adds the edit count of the user',
                                ' registration   - Adds the timestamp of when the user registered if available (may be blank)',
-                               ),
+                       ),
                        'limit' => 'How many total user names to return',
                        'witheditsonly' => 'Only list users who have made edits',
                        'activeusers' => "Only list users active in the last {$wgActiveUserDays} days(s)"
@@ -431,7 +443,10 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'group-excludegroup', 'info' => 'group and excludegroup cannot be used together' ),
+                       array(
+                               'code' => 'group-excludegroup',
+                               'info' => 'group and excludegroup cannot be used together'
+                       ),
                ) );
        }
 
index 2d1089a..bda1e03 100644 (file)
@@ -149,7 +149,8 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                if ( $this->params['filterredir'] == 'redirects' ) {
                        $this->addWhereFld( 'page_is_redirect', 1 );
                } elseif ( $this->params['filterredir'] == 'nonredirects' && !$this->redirect ) {
-                       // bug 22245 - Check for !redirect, as filtering nonredirects, when getting what links to them is contradictory
+                       // bug 22245 - Check for !redirect, as filtering nonredirects, when
+                       // getting what links to them is contradictory
                        $this->addWhereFld( 'page_is_redirect', 0 );
                }
 
@@ -193,7 +194,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        $redirNs = $t->getNamespace();
                        $redirDBkey = $t->getDBkey();
                        $titleWhere[] = "{$this->bl_title} = " . $db->addQuotes( $redirDBkey ) .
-                                       ( $this->hasNS ? " AND {$this->bl_ns} = {$redirNs}" : '' );
+                               ( $this->hasNS ? " AND {$this->bl_ns} = {$redirNs}" : '' );
                        $allRedirNs[] = $redirNs;
                        $allRedirDBkey[] = $redirDBkey;
                }
@@ -209,14 +210,14 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        $from = $this->redirID;
                        if ( $this->hasNS ) {
                                $this->addWhere( "{$this->bl_ns} $op $ns OR " .
-                                               "({$this->bl_ns} = $ns AND " .
-                                               "({$this->bl_title} $op $title OR " .
-                                               "({$this->bl_title} = $title AND " .
-                                               "{$this->bl_from} $op= $from)))" );
+                                       "({$this->bl_ns} = $ns AND " .
+                                       "({$this->bl_title} $op $title OR " .
+                                       "({$this->bl_title} = $title AND " .
+                                       "{$this->bl_from} $op= $from)))" );
                        } else {
                                $this->addWhere( "{$this->bl_title} $op $title OR " .
-                                               "({$this->bl_title} = $title AND " .
-                                               "{$this->bl_from} $op= $from)" );
+                                       "({$this->bl_title} = $title AND " .
+                                       "{$this->bl_from} $op= $from)" );
                        }
                }
                if ( $this->params['filterredir'] == 'redirects' ) {
@@ -268,8 +269,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                $count = 0;
 
                foreach ( $res as $row ) {
-                       if ( ++ $count > $this->params['limit'] ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                       if ( ++$count > $this->params['limit'] ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                // Continue string preserved in case the redirect query doesn't pass the limit
                                $this->continueStr = $this->getContinueStr( $row->page_id );
                                break;
@@ -294,7 +296,8 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        $count = 0;
                        foreach ( $res as $row ) {
                                if ( ++$count > $this->params['limit'] ) {
-                                       // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                                       // We've reached the one extra which shows that there are
+                                       // additional pages to be had. Stop here...
                                        // We need to keep the parent page of this redir in
                                        if ( $this->hasNS ) {
                                                $parentID = $this->pageMap[$row->{$this->bl_ns}][$row->{$this->bl_title}];
@@ -384,7 +387,10 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                $parentID = $this->pageMap[$ns][$row->{$this->bl_title}];
                // Put all the results in an array first
                $this->resultArr[$parentID]['redirlinks'][] = $a;
-               $this->getResult()->setIndexedTagName( $this->resultArr[$parentID]['redirlinks'], $this->bl_code );
+               $this->getResult()->setIndexedTagName(
+                       $this->resultArr[$parentID]['redirlinks'],
+                       $this->bl_code
+               );
        }
 
        protected function processContinue() {
@@ -396,7 +402,10 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
 
                // only image titles are allowed for the root in imageinfo mode
                if ( !$this->hasNS && $this->rootTitle->getNamespace() !== NS_FILE ) {
-                       $this->dieUsage( "The title for {$this->getModuleName()} query must be an image", 'bad_image_title' );
+                       $this->dieUsage(
+                               "The title for {$this->getModuleName()} query must be an image",
+                               'bad_image_title'
+                       );
                }
        }
 
@@ -428,7 +437,6 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        return;
                }
                $this->redirID = $redirID;
-
        }
 
        protected function getContinueStr( $lastPageID ) {
@@ -481,6 +489,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        return $retval;
                }
                $retval['redirect'] = false;
+
                return $retval;
        }
 
@@ -494,11 +503,17 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                );
                if ( $this->getModuleName() != 'embeddedin' ) {
                        return array_merge( $retval, array(
-                               'redirect' => 'If linking page is a redirect, find all pages that link to that redirect as well. Maximum limit is halved.',
-                               'filterredir' => "How to filter for redirects. If set to nonredirects when {$this->bl_code}redirect is enabled, this is only applied to the second level",
-                               'limit' => "How many total pages to return. If {$this->bl_code}redirect is enabled, limit applies to each level separately (which means you may get up to 2 * limit results)."
+                               'redirect' => 'If linking page is a redirect, find all pages ' .
+                                       'that link to that redirect as well. Maximum limit is halved.',
+                               'filterredir' => 'How to filter for redirects. If set to ' .
+                                       "nonredirects when {$this->bl_code}redirect is enabled, " .
+                                       'this is only applied to the second level',
+                               'limit' => 'How many total pages to return. If ' .
+                                       "{$this->bl_code}redirect is enabled, limit applies to each " .
+                                       'level separately (which means you may get up to 2 * limit results).'
                        ) );
                }
+
                return array_merge( $retval, array(
                        'filterredir' => 'How to filter for redirects',
                        'limit' => 'How many total pages to return'
@@ -533,7 +548,10 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                return array_merge( parent::getPossibleErrors(),
                        $this->getTitleOrPageIdErrorMessage(),
                        array(
-                               array( 'code' => 'bad_image_title', 'info' => "The title for {$this->getModuleName()} query must be an image" ),
+                               array(
+                                       'code' => 'bad_image_title',
+                                       'info' => "The title for {$this->getModuleName()} query must be an image"
+                               ),
                        )
                );
        }
index 8668e04..cfc2244 100644 (file)
@@ -131,8 +131,10 @@ abstract class ApiQueryBase extends ApiBase {
        protected function addFieldsIf( $value, $condition ) {
                if ( $condition ) {
                        $this->addFields( $value );
+
                        return true;
                }
+
                return false;
        }
 
@@ -168,8 +170,10 @@ abstract class ApiQueryBase extends ApiBase {
        protected function addWhereIf( $value, $condition ) {
                if ( $condition ) {
                        $this->addWhere( $value );
+
                        return true;
                }
+
                return false;
        }
 
@@ -215,7 +219,9 @@ abstract class ApiQueryBase extends ApiBase {
                if ( $sort ) {
                        $order = $field . ( $isDirNewer ? '' : ' DESC' );
                        // Append ORDER BY
-                       $optionOrderBy = isset( $this->options['ORDER BY'] ) ? (array)$this->options['ORDER BY'] : array();
+                       $optionOrderBy = isset( $this->options['ORDER BY'] )
+                               ? (array)$this->options['ORDER BY']
+                               : array();
                        $optionOrderBy[] = $order;
                        $this->addOption( 'ORDER BY', $optionOrderBy );
                }
@@ -256,16 +262,37 @@ abstract class ApiQueryBase extends ApiBase {
         * @param string $method Function the query should be attributed to.
         *  You should usually use __METHOD__ here
         * @param array $extraQuery Query data to add but not store in the object
-        *  Format is array( 'tables' => ..., 'fields' => ..., 'where' => ..., 'options' => ..., 'join_conds' => ... )
+        *  Format is array(
+        *    'tables' => ...,
+        *    'fields' => ...,
+        *    'where' => ...,
+        *    'options' => ...,
+        *    'join_conds' => ...
+        *  )
         * @return ResultWrapper
         */
        protected function select( $method, $extraQuery = array() ) {
 
-               $tables = array_merge( $this->tables, isset( $extraQuery['tables'] ) ? (array)$extraQuery['tables'] : array() );
-               $fields = array_merge( $this->fields, isset( $extraQuery['fields'] ) ? (array)$extraQuery['fields'] : array() );
-               $where = array_merge( $this->where, isset( $extraQuery['where'] ) ? (array)$extraQuery['where'] : array() );
-               $options = array_merge( $this->options, isset( $extraQuery['options'] ) ? (array)$extraQuery['options'] : array() );
-               $join_conds = array_merge( $this->join_conds, isset( $extraQuery['join_conds'] ) ? (array)$extraQuery['join_conds'] : array() );
+               $tables = array_merge(
+                       $this->tables,
+                       isset( $extraQuery['tables'] ) ? (array)$extraQuery['tables'] : array()
+               );
+               $fields = array_merge(
+                       $this->fields,
+                       isset( $extraQuery['fields'] ) ? (array)$extraQuery['fields'] : array()
+               );
+               $where = array_merge(
+                       $this->where,
+                       isset( $extraQuery['where'] ) ? (array)$extraQuery['where'] : array()
+               );
+               $options = array_merge(
+                       $this->options,
+                       isset( $extraQuery['options'] ) ? (array)$extraQuery['options'] : array()
+               );
+               $join_conds = array_merge(
+                       $this->join_conds,
+                       isset( $extraQuery['join_conds'] ) ? (array)$extraQuery['join_conds'] : array()
+               );
 
                // getDB has its own profileDBIn/Out calls
                $db = $this->getDB();
@@ -285,13 +312,20 @@ abstract class ApiQueryBase extends ApiBase {
        protected function checkRowCount() {
                $db = $this->getDB();
                $this->profileDBIn();
-               $rowcount = $db->estimateRowCount( $this->tables, $this->fields, $this->where, __METHOD__, $this->options );
+               $rowcount = $db->estimateRowCount(
+                       $this->tables,
+                       $this->fields,
+                       $this->where,
+                       __METHOD__,
+                       $this->options
+               );
                $this->profileDBOut();
 
                global $wgAPIMaxDBRows;
                if ( $rowcount > $wgAPIMaxDBRows ) {
                        return false;
                }
+
                return true;
        }
 
@@ -332,6 +366,7 @@ abstract class ApiQueryBase extends ApiBase {
        protected function addPageSubItems( $pageId, $data ) {
                $result = $this->getResult();
                $result->setIndexedTagName( $data, $this->getModulePrefix() );
+
                return $result->addValue( array( 'query', 'pages', intval( $pageId ) ),
                        $this->getModuleName(),
                        $data );
@@ -356,7 +391,8 @@ abstract class ApiQueryBase extends ApiBase {
                        return false;
                }
                $result->setIndexedTagName_internal( array( 'query', 'pages', $pageId,
-                               $this->getModuleName() ), $elemname );
+                       $this->getModuleName() ), $elemname );
+
                return true;
        }
 
@@ -382,6 +418,7 @@ abstract class ApiQueryBase extends ApiBase {
                if ( is_null( $this->mDb ) ) {
                        $this->mDb = $this->getQuery()->getDB();
                }
+
                return $this->mDb;
        }
 
@@ -419,6 +456,7 @@ abstract class ApiQueryBase extends ApiBase {
                if ( !$t ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $title ) );
                }
+
                return $t->getPrefixedDBkey();
        }
 
@@ -437,6 +475,7 @@ abstract class ApiQueryBase extends ApiBase {
                if ( !$t ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $key ) );
                }
+
                return $t->getPrefixedText();
        }
 
@@ -446,7 +485,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return string Title part with underscores
         */
        public function titlePartToKey( $titlePart ) {
-               return substr( $this->titleToKey( $titlePart . 'x' ), 0, - 1 );
+               return substr( $this->titleToKey( $titlePart . 'x' ), 0, -1 );
        }
 
        /**
@@ -455,7 +494,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return string Key part with underscores
         */
        public function keyPartToTitle( $keyPart ) {
-               return substr( $this->keyToTitle( $keyPart . 'x' ), 0, - 1 );
+               return substr( $this->keyToTitle( $keyPart . 'x' ), 0, -1 );
        }
 
        /**
@@ -467,10 +506,10 @@ abstract class ApiQueryBase extends ApiBase {
         */
        public function getDirectionDescription( $p = '', $extraDirText = '' ) {
                return array(
-                               "In which direction to enumerate{$extraDirText}",
-                               " newer          - List oldest first. Note: {$p}start has to be before {$p}end.",
-                               " older          - List newest first (default). Note: {$p}start has to be later than {$p}end.",
-                       );
+                       "In which direction to enumerate{$extraDirText}",
+                       " newer          - List oldest first. Note: {$p}start has to be before {$p}end.",
+                       " older          - List newest first (default). Note: {$p}start has to be later than {$p}end.",
+               );
        }
 
        /**
@@ -491,6 +530,7 @@ abstract class ApiQueryBase extends ApiBase {
                        }
 
                        $likeQuery = LinkFilter::keepOneWildcard( $likeQuery );
+
                        return 'el_index ' . $db->buildLike( $likeQuery );
                } elseif ( !is_null( $protocol ) ) {
                        return 'el_index ' . $db->buildLike( "$protocol", $db->anyString() );
@@ -553,6 +593,7 @@ abstract class ApiQueryBase extends ApiBase {
                        array( 'invalidtitle', 'title' ),
                        array( 'invalidtitle', 'key' ),
                ) );
+
                return $errors;
        }
 }
@@ -587,6 +628,7 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
                if ( $this->mGeneratorPageSet !== null ) {
                        return $this->mGeneratorPageSet;
                }
+
                return parent::getPageSet();
        }
 
index e3c27f5..57f76bc 100644 (file)
@@ -72,11 +72,16 @@ class ApiQueryBlocks extends ApiQueryBase {
                $this->addFieldsIf( 'ipb_reason', $fld_reason );
                $this->addFieldsIf( array( 'ipb_range_start', 'ipb_range_end' ), $fld_range );
                $this->addFieldsIf( array( 'ipb_anon_only', 'ipb_create_account', 'ipb_enable_autoblock',
-                                                                       'ipb_block_email', 'ipb_deleted', 'ipb_allow_usertalk' ),
-                                                       $fld_flags );
+                       'ipb_block_email', 'ipb_deleted', 'ipb_allow_usertalk' ),
+                       $fld_flags );
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
-               $this->addTimestampWhereRange( 'ipb_timestamp', $params['dir'], $params['start'], $params['end'] );
+               $this->addTimestampWhereRange(
+                       'ipb_timestamp',
+                       $params['dir'],
+                       $params['start'],
+                       $params['end']
+               );
 
                $db = $this->getDB();
 
@@ -107,7 +112,10 @@ class ApiQueryBlocks extends ApiQueryBase {
                        # Check range validity, if it's a CIDR
                        list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
                        if ( $ip !== false && $range !== false && $range < $cidrLimit ) {
-                               $this->dieUsage( "$type CIDR ranges broader than /$cidrLimit are not accepted", 'cidrtoobroad' );
+                               $this->dieUsage(
+                                       "$type CIDR ranges broader than /$cidrLimit are not accepted",
+                                       'cidrtoobroad'
+                               );
                        }
 
                        # Let IP::parseRange handle calculating $upper, instead of duplicating the logic here.
@@ -134,9 +142,9 @@ class ApiQueryBlocks extends ApiQueryBase {
 
                        /* Check for conflicting parameters. */
                        if ( ( isset( $show['account'] ) && isset( $show['!account'] ) )
-                                       || ( isset( $show['ip'] ) && isset( $show['!ip'] ) )
-                                       || ( isset( $show['range'] ) && isset( $show['!range'] ) )
-                                       || ( isset( $show['temp'] ) && isset( $show['!temp'] ) )
+                               || ( isset( $show['ip'] ) && isset( $show['!ip'] ) )
+                               || ( isset( $show['range'] ) && isset( $show['!range'] ) )
+                               || ( isset( $show['temp'] ) && isset( $show['!temp'] ) )
                        ) {
                                $this->dieUsageMsg( 'show' );
                        }
@@ -145,8 +153,10 @@ class ApiQueryBlocks extends ApiQueryBase {
                        $this->addWhereIf( 'ipb_user != 0', isset( $show['account'] ) );
                        $this->addWhereIf( 'ipb_user != 0 OR ipb_range_end > ipb_range_start', isset( $show['!ip'] ) );
                        $this->addWhereIf( 'ipb_user = 0 AND ipb_range_end = ipb_range_start', isset( $show['ip'] ) );
-                       $this->addWhereIf( 'ipb_expiry = ' . $db->addQuotes( $db->getInfinity() ), isset( $show['!temp'] ) );
-                       $this->addWhereIf( 'ipb_expiry != ' . $db->addQuotes( $db->getInfinity() ), isset( $show['temp'] ) );
+                       $this->addWhereIf( 'ipb_expiry = ' .
+                               $db->addQuotes( $db->getInfinity() ), isset( $show['!temp'] ) );
+                       $this->addWhereIf( 'ipb_expiry != ' .
+                               $db->addQuotes( $db->getInfinity() ), isset( $show['temp'] ) );
                        $this->addWhereIf( 'ipb_range_end = ipb_range_start', isset( $show['!range'] ) );
                        $this->addWhereIf( 'ipb_range_end > ipb_range_start', isset( $show['range'] ) );
                }
@@ -309,6 +319,7 @@ class ApiQueryBlocks extends ApiQueryBase {
        public function getParamDescription() {
                global $wgBlockCIDRLimit;
                $p = $this->getModulePrefix();
+
                return array(
                        'start' => 'The timestamp to start enumerating from',
                        'end' => 'The timestamp to stop enumerating at',
@@ -402,6 +413,7 @@ class ApiQueryBlocks extends ApiQueryBase {
 
        public function getPossibleErrors() {
                global $wgBlockCIDRLimit;
+
                return array_merge( parent::getPossibleErrors(),
                        $this->getRequireOnlyOneParameterErrorMessages( array( 'users', 'ip' ) ),
                        array(
index 5d714f5..c5b12b3 100644 (file)
@@ -98,8 +98,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                if ( isset( $show['hidden'] ) && isset( $show['!hidden'] ) ) {
                        $this->dieUsageMsg( 'show' );
                }
-               if ( isset( $show['hidden'] ) || isset( $show['!hidden'] ) || isset( $prop['hidden'] ) )
-               {
+               if ( isset( $show['hidden'] ) || isset( $show['!hidden'] ) || isset( $prop['hidden'] ) ) {
                        $this->addOption( 'STRAIGHT_JOIN' );
                        $this->addTables( array( 'page', 'page_props' ) );
                        $this->addFieldsIf( 'pp_propname', isset( $prop['hidden'] ) );
@@ -126,9 +125,9 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                        $this->addOption( 'ORDER BY', 'cl_to' . $sort );
                } else {
                        $this->addOption( 'ORDER BY', array(
-                                               'cl_from' . $sort,
-                                               'cl_to' . $sort
-                       ));
+                               'cl_from' . $sort,
+                               'cl_to' . $sort
+                       ) );
                }
 
                $res = $this->select( __METHOD__ );
@@ -221,14 +220,16 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                return array(
                        'prop' => array(
                                'Which additional properties to get for each category',
-                               ' sortkey    - Adds the sortkey (hexadecimal string) and sortkey prefix (human-readable part) for the category',
+                               ' sortkey    - Adds the sortkey (hexadecimal string) and sortkey prefix',
+                               '              (human-readable part) for the category',
                                ' timestamp  - Adds timestamp of when the category was added',
                                ' hidden     - Tags categories that are hidden with __HIDDENCAT__',
                        ),
                        'limit' => 'How many categories to return',
                        'show' => 'Which kind of categories to show',
                        'continue' => 'When more results are available, use this to continue',
-                       'categories' => 'Only list these categories. Useful for checking whether a certain page is in a certain category',
+                       'categories' => 'Only list these categories. Useful for checking ' .
+                               'whether a certain page is in a certain category',
                        'dir' => 'The direction in which to list',
                );
        }
@@ -264,8 +265,10 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=query&prop=categories&titles=Albert%20Einstein' => 'Get a list of categories [[Albert Einstein]] belongs to',
-                       'api.php?action=query&generator=categories&titles=Albert%20Einstein&prop=info' => 'Get information about all categories used in the [[Albert Einstein]]',
+                       'api.php?action=query&prop=categories&titles=Albert%20Einstein'
+                               => 'Get a list of categories [[Albert Einstein]] belongs to',
+                       'api.php?action=query&generator=categories&titles=Albert%20Einstein&prop=info'
+                               => 'Get information about all categories used in the [[Albert Einstein]]',
                );
        }
 
index a889272..574ef6e 100644 (file)
@@ -45,7 +45,7 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
                $categories = $alltitles[NS_CATEGORY];
 
                $titles = $this->getPageSet()->getGoodTitles() +
-                                       $this->getPageSet()->getMissingTitles();
+                       $this->getPageSet()->getMissingTitles();
                $cattitles = array();
                foreach ( $categories as $c ) {
                        /** @var $t Title */
@@ -63,7 +63,13 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
                                'pp_propname' => 'hiddencat' ) ),
                ) );
 
-               $this->addFields( array( 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files', 'cat_hidden' => 'pp_propname' ) );
+               $this->addFields( array(
+                       'cat_title',
+                       'cat_pages',
+                       'cat_subcats',
+                       'cat_files',
+                       'cat_hidden' => 'pp_propname'
+               ) );
                $this->addWhere( array( 'cat_title' => $cattitles ) );
 
                if ( !is_null( $params['continue'] ) ) {
index 704d108..271558b 100644 (file)
@@ -180,9 +180,11 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                $result = $this->getResult();
                $count = 0;
                foreach ( $rows as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
+                       if ( ++$count > $limit ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
+                               // @todo Security issue - if the user has no right to view next
+                               // title, it will still be shown
                                if ( $params['sort'] == 'timestamp' ) {
                                        $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->cl_timestamp ) );
                                } else {
@@ -224,7 +226,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->cl_timestamp );
                                }
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ),
-                                               null, $vals );
+                                       null, $vals );
                                if ( !$fit ) {
                                        if ( $params['sort'] == 'timestamp' ) {
                                                $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->cl_timestamp ) );
@@ -324,14 +326,16 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                global $wgMiserMode;
                $p = $this->getModulePrefix();
                $desc = array(
-                       'title' => "Which category to enumerate (required). Must include Category: prefix. Cannot be used together with {$p}pageid",
+                       'title' => "Which category to enumerate (required). Must include ' .
+                               'Category: prefix. Cannot be used together with {$p}pageid",
                        'pageid' => "Page ID of the category to enumerate. Cannot be used together with {$p}title",
                        'prop' => array(
                                'What pieces of information to include',
                                ' ids           - Adds the page ID',
                                ' title         - Adds the title and namespace ID of the page',
                                ' sortkey       - Adds the sortkey used for sorting in the category (hexadecimal string)',
-                               ' sortkeyprefix - Adds the sortkey prefix used for sorting in the category (human-readable part of the sortkey)',
+                               ' sortkeyprefix - Adds the sortkey prefix used for sorting in the ' .
+                                       'category (human-readable part of the sortkey)',
                                ' type          - Adds the type that the page has been categorised as (page, subcat or file)',
                                ' timestamp     - Adds the timestamp of when the page was included',
                        ),
@@ -341,10 +345,15 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                        'dir' => 'In which direction to sort',
                        'start' => "Timestamp to start listing from. Can only be used with {$p}sort=timestamp",
                        'end' => "Timestamp to end listing at. Can only be used with {$p}sort=timestamp",
-                       'startsortkey' => "Sortkey to start listing from. Must be given in binary format. Can only be used with {$p}sort=sortkey",
-                       'endsortkey' => "Sortkey to end listing at. Must be given in binary format. Can only be used with {$p}sort=sortkey",
-                       'startsortkeyprefix' => "Sortkey prefix to start listing from. Can only be used with {$p}sort=sortkey. Overrides {$p}startsortkey",
-                       'endsortkeyprefix' => "Sortkey prefix to end listing BEFORE (not at, if this value occurs it will not be included!). Can only be used with {$p}sort=sortkey. Overrides {$p}endsortkey",
+                       'startsortkey' => "Sortkey to start listing from. Must be given in ' .
+                               'binary format. Can only be used with {$p}sort=sortkey",
+                       'endsortkey' => "Sortkey to end listing at. Must be given in binary ' .
+                               'format. Can only be used with {$p}sort=sortkey",
+                       'startsortkeyprefix' => "Sortkey prefix to start listing from. Can ' .
+                               'only be used with {$p}sort=sortkey. Overrides {$p}startsortkey",
+                       'endsortkeyprefix' => "Sortkey prefix to end listing BEFORE (not at, ' .
+                               'if this value occurs it will not be included!). Can only be used with ' .
+                               '{$p}sort=sortkey. Overrides {$p}endsortkey",
                        'continue' => 'For large categories, give the value returned from previous query',
                        'limit' => 'The maximum number of pages to return.',
                );
@@ -357,6 +366,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                "Note that you can use {$p}type=subcat or {$p}type=file instead of {$p}namespace=14 or 6.",
                        );
                }
+
                return $desc;
        }
 
@@ -405,8 +415,10 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=query&list=categorymembers&cmtitle=Category:Physics' => 'Get first 10 pages in [[Category:Physics]]',
-                       'api.php?action=query&generator=categorymembers&gcmtitle=Category:Physics&prop=info' => 'Get page info about first 10 pages in [[Category:Physics]]',
+                       'api.php?action=query&list=categorymembers&cmtitle=Category:Physics'
+                               => 'Get first 10 pages in [[Category:Physics]]',
+                       'api.php?action=query&generator=categorymembers&gcmtitle=Category:Physics&prop=info'
+                               => 'Get page info about first 10 pages in [[Category:Physics]]',
                );
        }
 
index 8273313..35e78ac 100644 (file)
@@ -39,7 +39,10 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                $user = $this->getUser();
                // Before doing anything at all, let's check permissions
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $this->dieUsage( 'You don\'t have permission to view deleted revision information', 'permissiondenied' );
+                       $this->dieUsage(
+                               'You don\'t have permission to view deleted revision information',
+                               'permissiondenied'
+                       );
                }
 
                $db = $this->getDB();
@@ -116,7 +119,10 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
                        // This also means stricter restrictions
                        if ( !$user->isAllowed( 'undelete' ) ) {
-                               $this->dieUsage( 'You don\'t have permission to view deleted revision content', 'permissiondenied' );
+                               $this->dieUsage(
+                                       'You don\'t have permission to view deleted revision content',
+                                       'permissiondenied'
+                               );
                        }
                }
                // Check limits
@@ -152,7 +158,8 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        $this->addWhereRange( 'ar_title', $dir, $from, $to );
 
                        if ( isset( $params['prefix'] ) ) {
-                               $this->addWhere( 'ar_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+                               $this->addWhere( 'ar_title' .
+                                       $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
                        }
                }
 
@@ -172,14 +179,17 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        $ts = $db->addQuotes( $db->timestamp( $cont[2] ) );
                        $op = ( $dir == 'newer' ? '>' : '<' );
                        $this->addWhere( "ar_namespace $op $ns OR " .
-                                       "(ar_namespace = $ns AND " .
-                                       "(ar_title $op $title OR " .
-                                       "(ar_title = $title AND " .
-                                       "ar_timestamp $op= $ts)))" );
+                               "(ar_namespace = $ns AND " .
+                               "(ar_title $op $title OR " .
+                               "(ar_title = $title AND " .
+                               "ar_timestamp $op= $ts)))" );
                }
 
                $this->addOption( 'LIMIT', $limit + 1 );
-               $this->addOption( 'USE INDEX', array( 'archive' => ( $mode == 'user' ? 'usertext_timestamp' : 'name_title_timestamp' ) ) );
+               $this->addOption(
+                       'USE INDEX',
+                       array( 'archive' => ( $mode == 'user' ? 'usertext_timestamp' : 'name_title_timestamp' ) )
+               );
                if ( $mode == 'all' ) {
                        if ( $params['unique'] ) {
                                $this->addOption( 'GROUP BY', 'ar_title' );
@@ -188,7 +198,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                $this->addOption( 'ORDER BY', array(
                                        'ar_title' . $sort,
                                        'ar_timestamp' . $sort
-                               ));
+                               ) );
                        }
                } else {
                        if ( $mode == 'revs' ) {
@@ -385,12 +395,14 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
        public function getDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'List deleted revisions.',
                        'Operates in three modes:',
                        ' 1) List deleted revisions for the given title(s), sorted by timestamp',
                        ' 2) List deleted contributions for the given user, sorted by timestamp (no titles specified)',
-                       " 3) List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, {$p}user not set)",
+                       " 3) List all deleted revisions in the given namespace, sorted by title and timestamp',
+                       '    (no titles specified, {$p}user not set)",
                        'Certain parameters only apply to some modes and are ignored in others.',
                        'For instance, a parameter marked (1) only applies to mode 1 and is ignored in modes 2 and 3',
                );
@@ -398,12 +410,22 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revision information' ),
-                       array( 'code' => 'badparams', 'info' => 'user and excludeuser cannot be used together' ),
-                       array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revision content' ),
+                       array(
+                               'code' => 'permissiondenied',
+                               'info' => 'You don\'t have permission to view deleted revision information'
+                       ),
+                       array( 'code' => 'badparams', 'info' => 'user and excludeuser cannot be used together'
+                       ),
+                       array(
+                               'code' => 'permissiondenied',
+                               'info' => 'You don\'t have permission to view deleted revision content'
+                       ),
                        array( 'code' => 'badparams', 'info' => "The 'from' parameter cannot be used in modes 1 or 2" ),
                        array( 'code' => 'badparams', 'info' => "The 'to' parameter cannot be used in modes 1 or 2" ),
-                       array( 'code' => 'badparams', 'info' => "The 'prefix' parameter cannot be used in modes 1 or 2" ),
+                       array(
+                               'code' => 'badparams',
+                               'info' => "The 'prefix' parameter cannot be used in modes 1 or 2"
+                       ),
                        array( 'code' => 'badparams', 'info' => "The 'start' parameter cannot be used in mode 3" ),
                        array( 'code' => 'badparams', 'info' => "The 'end' parameter cannot be used in mode 3" ),
                ) );
@@ -411,7 +433,8 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&drprop=user|comment|content'
+                       'api.php?action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&' .
+                               'drprop=user|comment|content'
                                => 'List the last deleted revisions of Main Page and Talk:Main Page, with content (mode 1)',
                        'api.php?action=query&list=deletedrevs&druser=Bob&drlimit=50'
                                => 'List the last 50 deleted contributions by Bob (mode 2)',
index 0311fa7..1854694 100644 (file)
@@ -95,7 +95,8 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                        $sha1s[$file->getName()] = $file->getSha1();
                }
 
-               // find all files with the hashes, result format is: array( hash => array( dup1, dup2 ), hash1 => ... )
+               // find all files with the hashes, result format is:
+               // array( hash => array( dup1, dup2 ), hash1 => ... )
                $filesToFindBySha1s = array_unique( array_values( $sha1s ) );
                if ( $params['localonly'] ) {
                        $filesBySha1s = RepoGroup::singleton()->getLocalRepo()->findBySha1s( $filesToFindBySha1s );
index 456e87b..d220817 100644 (file)
@@ -101,8 +101,9 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                $result = $this->getResult();
                $count = 0;
                foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                       if ( ++$count > $limit ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                $this->setContinueEnumParameter( 'offset', $offset + $limit );
                                break;
                        }
@@ -140,7 +141,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
 
                if ( is_null( $resultPageSet ) ) {
                        $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ),
-                                       $this->getModulePrefix() );
+                               $this->getModulePrefix() );
                }
        }
 
@@ -186,6 +187,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                                $protocols[] = substr( $p, 0, strpos( $p, ':' ) );
                        }
                }
+
                return $protocols;
        }
 
@@ -221,7 +223,8 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                                "Protocol of the URL. If empty and {$p}query set, the protocol is http.",
                                "Leave both this and {$p}query empty to list all external links"
                        ),
-                       'query' => 'Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links',
+                       'query' => 'Search string without protocol. See [[Special:LinkSearch]]. ' .
+                               'Leave empty to list all external links',
                        'namespace' => 'The page namespace(s) to enumerate.',
                        'limit' => 'How many pages to return.',
                        'expandurl' => 'Expand protocol-relative URLs with the canonical protocol',
index 583ef69..5803ea7 100644 (file)
@@ -127,6 +127,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'limit' => 'How many links to return',
                        'offset' => 'When more results are available, use this to continue',
@@ -134,7 +135,8 @@ class ApiQueryExternalLinks extends ApiQueryBase {
                                "Protocol of the URL. If empty and {$p}query set, the protocol is http.",
                                "Leave both this and {$p}query empty to list all external links"
                        ),
-                       'query' => 'Search string without protocol. Useful for checking whether a certain page contains a certain external url',
+                       'query' => 'Search string without protocol. Useful for checking ' .
+                               'whether a certain page contains a certain external url',
                        'expandurl' => 'Expand protocol-relative URLs with the canonical protocol',
                );
        }
@@ -159,7 +161,8 @@ class ApiQueryExternalLinks extends ApiQueryBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=query&prop=extlinks&titles=Main%20Page' => 'Get a list of external links on the [[Main Page]]',
+                       'api.php?action=query&prop=extlinks&titles=Main%20Page'
+                               => 'Get a list of external links on the [[Main Page]]',
                );
        }
 
index 3a35353..3d4d38f 100644 (file)
@@ -86,16 +86,21 @@ class ApiQueryFileRepoInfo extends ApiQueryBase {
                        $props = array_merge( $props, array_keys( $repo->getInfo() ) );
                } );
 
-               return array_values( array_unique( array_merge( $props, array_keys( $repoGroup->localRepo->getInfo() ) ) ) );
+               return array_values( array_unique( array_merge(
+                       $props,
+                       array_keys( $repoGroup->localRepo->getInfo() )
+               ) ) );
        }
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'prop' => array(
                                'Which repository properties to get (there may be more available on some wikis):',
                                ' apiurl      - URL to the repository API - helpful for getting image info from the host.',
-                               ' name        - The key of the repository - used in e.g. $wgForeignFileRepos and imageinfo return values.',
+                               ' name        - The key of the repository - used in e.g. ' .
+                               '$wgForeignFileRepos and imageinfo return values.',
                                ' displayname - The human-readable name of the repository wiki.',
                                ' rooturl     - Root URL for image paths.',
                                ' local       - Whether that repository is the local one or not.',
index f53cd38..f8f4558 100644 (file)
@@ -41,7 +41,10 @@ class ApiQueryFilearchive extends ApiQueryBase {
                $user = $this->getUser();
                // Before doing anything at all, let's check permissions
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $this->dieUsage( 'You don\'t have permission to view deleted file information', 'permissiondenied' );
+                       $this->dieUsage(
+                               'You don\'t have permission to view deleted file information',
+                               'permissiondenied'
+                       );
                }
 
                $db = $this->getDB();
@@ -92,7 +95,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
                $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
                $this->addWhereRange( 'fa_name', $dir, $from, $to );
                if ( isset( $params['prefix'] ) ) {
-                       $this->addWhere( 'fa_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+                       $this->addWhere( 'fa_name' .
+                               $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
                }
 
                $sha1Set = isset( $params['sha1'] );
@@ -137,7 +141,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
                $result = $this->getResult();
                foreach ( $res as $row ) {
                        if ( ++$count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                $this->setContinueEnumParameter( 'continue', $row->fa_name );
                                break;
                        }
@@ -180,8 +185,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        }
                        if ( $fld_metadata ) {
                                $file['metadata'] = $row->fa_metadata
-                                               ? ApiQueryImageInfo::processMetaData( unserialize( $row->fa_metadata ), $result )
-                                               : null;
+                                       ? ApiQueryImageInfo::processMetaData( unserialize( $row->fa_metadata ), $result )
+                                       : null;
                        }
                        if ( $fld_bitdepth ) {
                                $file['bitdepth'] = $row->fa_bits;
@@ -275,7 +280,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                ' sha1              - Adds SHA-1 hash for the image',
                                ' timestamp         - Adds timestamp for the uploaded version',
                                ' user              - Adds user who uploaded the image version',
-                               ' size              - Adds the size of the image in bytes and the height, width and page count (if applicable)',
+                               ' size              - Adds the size of the image in bytes and the height, ' .
+                                       'width and page count (if applicable)',
                                ' dimensions        - Alias for size',
                                ' description       - Adds description the image version',
                                ' parseddescription - Parse the description on the version',
@@ -358,10 +364,16 @@ class ApiQueryFilearchive extends ApiQueryBase {
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted file information' ),
+                       array(
+                               'code' => 'permissiondenied',
+                               'info' => 'You don\'t have permission to view deleted file information'
+                       ),
                        array( 'code' => 'hashsearchdisabled', 'info' => 'Search by hash disabled in Miser Mode' ),
-                       array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
-                       array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
+                       array( 'code' => 'invalidsha1hash', 'info' => 'The SHA-1 hash provided is not valid' ),
+                       array(
+                               'code' => 'invalidsha1base36hash',
+                               'info' => 'The SHA1Base36 hash provided is not valid'
+                       ),
                ) );
        }
 
index ebae3e7..03a72a6 100644 (file)
@@ -92,14 +92,14 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                                $this->addOption( 'ORDER BY', array(
                                        'iwl_title' . $sort,
                                        'iwl_from' . $sort
-                               ));
+                               ) );
                        }
                } else {
                        $this->addOption( 'ORDER BY', array(
                                'iwl_prefix' . $sort,
                                'iwl_title' . $sort,
                                'iwl_from' . $sort
-                       ));
+                       ) );
                }
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
@@ -111,10 +111,15 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                $count = 0;
                $result = $this->getResult();
                foreach ( $res as $row ) {
-                       if ( ++ $count > $params['limit'] ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // Continue string preserved in case the redirect query doesn't pass the limit
-                               $this->setContinueEnumParameter( 'continue', "{$row->iwl_prefix}|{$row->iwl_title}|{$row->iwl_from}" );
+                       if ( ++$count > $params['limit'] ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
+                               // Continue string preserved in case the redirect query doesn't
+                               // pass the limit
+                               $this->setContinueEnumParameter(
+                                       'continue',
+                                       "{$row->iwl_prefix}|{$row->iwl_title}|{$row->iwl_from}"
+                               );
                                break;
                        }
 
@@ -140,7 +145,10 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
 
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $entry );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'continue', "{$row->iwl_prefix}|{$row->iwl_title}|{$row->iwl_from}" );
+                                       $this->setContinueEnumParameter(
+                                               'continue',
+                                               "{$row->iwl_prefix}|{$row->iwl_title}|{$row->iwl_from}"
+                                       );
                                        break;
                                }
                        }
index be53931..be64d36 100644 (file)
@@ -81,9 +81,9 @@ class ApiQueryIWLinks extends ApiQueryBase {
                                $this->addOption( 'ORDER BY', 'iwl_from' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                               'iwl_from' . $sort,
-                                               'iwl_title' . $sort
-                               ));
+                                       'iwl_from' . $sort,
+                                       'iwl_title' . $sort
+                               ) );
                        }
                } else {
                        // Don't order by iwl_from if it's constant in the WHERE clause
@@ -91,10 +91,10 @@ class ApiQueryIWLinks extends ApiQueryBase {
                                $this->addOption( 'ORDER BY', 'iwl_prefix' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                               'iwl_from' . $sort,
-                                               'iwl_prefix' . $sort,
-                                               'iwl_title' . $sort
-                               ));
+                                       'iwl_from' . $sort,
+                                       'iwl_prefix' . $sort,
+                                       'iwl_title' . $sort
+                               ) );
                        }
                }
 
@@ -106,7 +106,10 @@ class ApiQueryIWLinks extends ApiQueryBase {
                        if ( ++$count > $params['limit'] ) {
                                // We've reached the one extra which shows that
                                // there are additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'continue', "{$row->iwl_from}|{$row->iwl_prefix}|{$row->iwl_title}" );
+                               $this->setContinueEnumParameter(
+                                       'continue',
+                                       "{$row->iwl_from}|{$row->iwl_prefix}|{$row->iwl_title}"
+                               );
                                break;
                        }
                        $entry = array( 'prefix' => $row->iwl_prefix );
@@ -121,7 +124,10 @@ class ApiQueryIWLinks extends ApiQueryBase {
                        ApiResult::setContent( $entry, $row->iwl_title );
                        $fit = $this->addPageSubItem( $row->iwl_from, $entry );
                        if ( !$fit ) {
-                               $this->setContinueEnumParameter( 'continue', "{$row->iwl_from}|{$row->iwl_prefix}|{$row->iwl_title}" );
+                               $this->setContinueEnumParameter(
+                                       'continue',
+                                       "{$row->iwl_from}|{$row->iwl_prefix}|{$row->iwl_title}"
+                               );
                                break;
                        }
                }
@@ -190,7 +196,8 @@ class ApiQueryIWLinks extends ApiQueryBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=query&prop=iwlinks&titles=Main%20Page' => 'Get interwiki links from the [[Main Page]]',
+                       'api.php?action=query&prop=iwlinks&titles=Main%20Page'
+                               => 'Get interwiki links from the [[Main Page]]',
                );
        }
 
index 81c9faf..9981ec1 100644 (file)
@@ -34,8 +34,9 @@ class ApiQueryImageInfo extends ApiQueryBase {
        private static $transformCount = 0;
 
        public function __construct( $query, $moduleName, $prefix = 'ii' ) {
-               // We allow a subclass to override the prefix, to create a related API module.
-               // Some other parts of MediaWiki construct this with a null $prefix, which used to be ignored when this only took two arguments
+               // We allow a subclass to override the prefix, to create a related API
+               // module. Some other parts of MediaWiki construct this with a null
+               // $prefix, which used to be ignored when this only took two arguments
                if ( is_null( $prefix ) ) {
                        $prefix = 'ii';
                }
@@ -53,6 +54,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        'version' => $params['metadataversion'],
                        'language' => $params['extmetadatalanguage'],
                        'multilang' => $params['extmetadatamultilang'],
+                       'extmetadatafilter' => $params['extmetadatafilter'],
                );
 
                $pageIds = $this->getPageSet()->getAllTitlesByNamespace();
@@ -175,7 +177,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                /** @var $oldie File */
                                foreach ( $oldies as $oldie ) {
                                        if ( ++$count > $params['limit'] ) {
-                                               // We've reached the extra one which shows that there are additional pages to be had. Stop here...
+                                               // We've reached the extra one which shows that there are
+                                               // additional pages to be had. Stop here...
                                                // Only set a query-continue if there was only one title
                                                if ( count( $pageIds[NS_FILE] ) == 1 ) {
                                                        $this->setContinueEnumParameter( 'start',
@@ -267,6 +270,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                if ( !$h ) {
                        $this->setWarning( 'Could not create thumbnail because ' .
                                $image->getName() . ' does not have an associated image handler' );
+
                        return $thumbParams;
                }
 
@@ -278,13 +282,15 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        // handlers.
                        $this->setWarning( "Could not parse {$p}urlparam for " . $image->getName()
                                . '. Using only width and height' );
+
                        return $thumbParams;
                }
 
                if ( isset( $paramList['width'] ) ) {
                        if ( intval( $paramList['width'] ) != intval( $thumbParams['width'] ) ) {
                                $this->setWarning( "Ignoring width value set in {$p}urlparam ({$paramList['width']}) "
-                                       . "in favor of width value derived from {$p}urlwidth/{$p}urlheight ({$thumbParams['width']})" );
+                                       . "in favor of width value derived from {$p}urlwidth/{$p}urlheight "
+                                       . "({$thumbParams['width']})" );
                        }
                }
 
@@ -319,6 +325,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                'version' => $metadataOpts ?: 'latest',
                                'language' => $wgContLang,
                                'multilang' => false,
+                               'extmetadatafilter' => array(),
                        );
                }
                $version = $metadataOpts['version'];
@@ -389,7 +396,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
                $uploadwarning = isset( $prop['uploadwarning'] );
 
                if ( ( $url || $sha1 || $meta || $mime || $mediatype || $archive || $bitdepth )
-                               && $file->isDeleted( File::DELETED_FILE ) ) {
+                       && $file->isDeleted( File::DELETED_FILE )
+               ) {
                        $vals['filehidden'] = '';
 
                        //Early return, tidier than indenting all following things one level
@@ -448,6 +456,11 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        $format->setSingleLanguage( !$metadataOpts['multilang'] );
                        $format->getContext()->setLanguage( $metadataOpts['language'] );
                        $extmetaArray = $format->fetchExtendedMetadata( $file );
+                       if ( $metadataOpts['extmetadatafilter'] ) {
+                               $extmetaArray = array_intersect_key(
+                                       $extmetaArray, array_flip( $metadataOpts['extmetadatafilter'] )
+                               );
+                       }
                        $vals['extmetadata'] = $extmetaArray;
                }
 
@@ -505,6 +518,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        }
                }
                $result->setIndexedTagName( $retval, 'metadata' );
+
                return $retval;
        }
 
@@ -521,11 +535,13 @@ class ApiQueryImageInfo extends ApiQueryBase {
                if ( $start === null ) {
                        $start = $img->getTimestamp();
                }
+
                return $img->getOriginalTitle()->getDBkey() . '|' . $start;
        }
 
        public function getAllowedParams() {
                global $wgContLang;
+
                return array(
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
@@ -565,6 +581,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                ApiBase::PARAM_TYPE => 'boolean',
                                ApiBase::PARAM_DFLT => false,
                        ),
+                       'extmetadatafilter' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
                        'urlparam' => array(
                                ApiBase::PARAM_DFLT => '',
                                ApiBase::PARAM_TYPE => 'string',
@@ -599,18 +619,22 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        'comment' =>        ' comment       - Comment on the version',
                        'parsedcomment' =>  ' parsedcomment - Parse the comment on the version',
                        'url' =>            ' url           - Gives URL to the image and the description page',
-                       'size' =>           ' size          - Adds the size of the image in bytes and the height, width and page count (if applicable)',
-                       'dimensions' =>     ' dimensions    - Alias for size', // For backwards compatibility with Allimages
+                       'size' =>           ' size          - Adds the size of the image in bytes ' .
+                               'and the height, width and page count (if applicable)',
+                       'dimensions' =>     ' dimensions    - Alias for size', // B/C with Allimages
                        'sha1' =>           ' sha1          - Adds SHA-1 hash for the image',
                        'mime' =>           ' mime          - Adds MIME type of the image',
                        'thumbmime' =>      ' thumbmime     - Adds MIME type of the image thumbnail' .
                                ' (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',
+                       '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',
+                       'uploadwarning' =>  ' uploadwarning - Used by the Special:Upload page to ' .
+                               'get information about an existing file. Not intended for use outside MediaWiki core',
                );
        }
 
@@ -634,23 +658,32 @@ class ApiQueryImageInfo extends ApiQueryBase {
         */
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'prop' => self::getPropertyDescriptions( array(), $p ),
-                       'urlwidth' => array( "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.",
+                       'urlwidth' => array(
+                               "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.",
                                'For performance reasons if this option is used, ' .
-                                       'no more than ' . self::TRANSFORM_LIMIT . ' scaled images will be returned.' ),
+                                       'no more than ' . self::TRANSFORM_LIMIT . ' scaled images will be returned.'
+                       ),
                        'urlheight' => "Similar to {$p}urlwidth.",
                        'urlparam' => array( "A handler specific parameter string. For example, pdf's ",
                                "might use 'page15-100px'. {$p}urlwidth must be used and be consistent with {$p}urlparam" ),
                        'limit' => 'How many image revisions to return per image',
                        'start' => 'Timestamp to start listing from',
                        '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.',
+                       '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.',
+                       'extmetadatafilter'
+                               => "If specified and non-empty, only these keys will be returned for {$p}prop=extmetadata",
                        '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',
                );
@@ -773,6 +806,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                )
                        ),
                );
+
                return array_diff_key( $props, array_flip( $filter ) );
        }
 
@@ -786,6 +820,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
        public function getPossibleErrors() {
                $p = $this->getModulePrefix();
+
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'code' => "{$p}urlwidth", 'info' => "{$p}urlheight cannot be used without {$p}urlwidth" ),
                        array( 'code' => 'urlparam', 'info' => "Invalid value for {$p}urlparam" ),
@@ -796,7 +831,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
        public function getExamples() {
                return array(
                        'api.php?action=query&titles=File:Albert%20Einstein%20Head.jpg&prop=imageinfo',
-                       'api.php?action=query&titles=File:Test.jpg&prop=imageinfo&iilimit=50&iiend=20071231235959&iiprop=timestamp|user|url',
+                       'api.php?action=query&titles=File:Test.jpg&prop=imageinfo&iilimit=50&' .
+                               'iiend=20071231235959&iiprop=timestamp|user|url',
                );
        }
 
index f2bf0a7..a32fb9e 100644 (file)
@@ -79,9 +79,9 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                        $this->addOption( 'ORDER BY', 'il_to' . $sort );
                } else {
                        $this->addOption( 'ORDER BY', array(
-                                               'il_from' . $sort,
-                                               'il_to' . $sort
-                       ));
+                               'il_from' . $sort,
+                               'il_to' . $sort
+                       ) );
                }
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
 
@@ -164,7 +164,8 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                return array(
                        'limit' => 'How many images to return',
                        'continue' => 'When more results are available, use this to continue',
-                       'images' => 'Only list these images. Useful for checking whether a certain page has a certain Image.',
+                       'images' => 'Only list these images. Useful for checking whether a ' .
+                               'certain page has a certain Image.',
                        'dir' => 'The direction in which to list',
                );
        }
@@ -184,8 +185,10 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=query&prop=images&titles=Main%20Page' => 'Get a list of images used in the [[Main Page]]',
-                       'api.php?action=query&generator=images&titles=Main%20Page&prop=info' => 'Get information about all images used in the [[Main Page]]',
+                       'api.php?action=query&prop=images&titles=Main%20Page'
+                               => 'Get a list of images used in the [[Main Page]]',
+                       'api.php?action=query&generator=images&titles=Main%20Page&prop=info'
+                               => 'Get information about all images used in the [[Main Page]]',
                );
        }
 
index 017684e..43b8c0c 100644 (file)
@@ -42,7 +42,8 @@ class ApiQueryInfo extends ApiQueryBase {
        private $pageRestrictions, $pageIsRedir, $pageIsNew, $pageTouched,
                $pageLatest, $pageLength;
 
-       private $protections, $watched, $watchers, $notificationtimestamps, $talkids, $subjectids, $displaytitles;
+       private $protections, $watched, $watchers, $notificationtimestamps,
+               $talkids, $subjectids, $displaytitles;
        private $showZeroWatchers = false;
 
        private $tokenFunctions;
@@ -104,10 +105,11 @@ class ApiQueryInfo extends ApiQueryBase {
                        'watch' => array( 'ApiQueryInfo', 'getWatchToken' ),
                );
                wfRunHooks( 'APIQueryInfoTokens', array( &$this->tokenFunctions ) );
+
                return $this->tokenFunctions;
        }
 
-       static $cachedTokens = array();
+       static protected $cachedTokens = array();
 
        public static function resetTokenCache() {
                ApiQueryInfo::$cachedTokens = array();
@@ -333,8 +335,8 @@ class ApiQueryInfo extends ApiQueryBase {
                        ), $pageid, $pageInfo );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'continue',
-                                               $title->getNamespace() . '|' .
-                                               $title->getText() );
+                                       $title->getNamespace() . '|' .
+                                       $title->getText() );
                                break;
                        }
                }
@@ -348,7 +350,8 @@ class ApiQueryInfo extends ApiQueryBase {
         */
        private function extractPageInfo( $pageid, $title ) {
                $pageInfo = array();
-               $titleExists = $pageid > 0; //$title->exists() needs pageid, which is not set for all title objects
+               // $title->exists() needs pageid, which is not set for all title objects
+               $titleExists = $pageid > 0;
                $ns = $title->getNamespace();
                $dbkey = $title->getDBkey();
 
@@ -410,7 +413,8 @@ class ApiQueryInfo extends ApiQueryBase {
                if ( $this->fld_notificationtimestamp ) {
                        $pageInfo['notificationtimestamp'] = '';
                        if ( isset( $this->notificationtimestamps[$ns][$dbkey] ) ) {
-                               $pageInfo['notificationtimestamp'] = wfTimestamp( TS_ISO_8601, $this->notificationtimestamps[$ns][$dbkey] );
+                               $pageInfo['notificationtimestamp'] =
+                                       wfTimestamp( TS_ISO_8601, $this->notificationtimestamps[$ns][$dbkey] );
                        }
                }
 
@@ -465,7 +469,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        $this->resetQueryParams();
                        $this->addTables( 'page_restrictions' );
                        $this->addFields( array( 'pr_page', 'pr_type', 'pr_level',
-                                       'pr_expiry', 'pr_cascade' ) );
+                               'pr_expiry', 'pr_cascade' ) );
                        $this->addWhereFld( 'pr_page', array_keys( $this->titles ) );
 
                        $res = $this->select( __METHOD__ );
@@ -556,8 +560,8 @@ class ApiQueryInfo extends ApiQueryBase {
                        $this->resetQueryParams();
                        $this->addTables( array( 'page_restrictions', 'page', 'templatelinks' ) );
                        $this->addFields( array( 'pr_type', 'pr_level', 'pr_expiry',
-                                       'page_title', 'page_namespace',
-                                       'tl_title', 'tl_namespace' ) );
+                               'page_title', 'page_namespace',
+                               'tl_title', 'tl_namespace' ) );
                        $this->addWhere( $lb->constructSet( 'tl', $db ) );
                        $this->addWhere( 'pr_page = page_id' );
                        $this->addWhere( 'pr_page = tl_from' );
@@ -580,7 +584,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        $this->resetQueryParams();
                        $this->addTables( array( 'page_restrictions', 'page', 'imagelinks' ) );
                        $this->addFields( array( 'pr_type', 'pr_level', 'pr_expiry',
-                                       'page_title', 'page_namespace', 'il_to' ) );
+                               'page_title', 'page_namespace', 'il_to' ) );
                        $this->addWhere( 'pr_page = page_id' );
                        $this->addWhere( 'pr_page = il_from' );
                        $this->addWhereFld( 'pr_cascade', 1 );
@@ -633,10 +637,10 @@ class ApiQueryInfo extends ApiQueryBase {
                foreach ( $res as $row ) {
                        if ( MWNamespace::isTalk( $row->page_namespace ) ) {
                                $this->talkids[MWNamespace::getSubject( $row->page_namespace )][$row->page_title] =
-                                               intval( $row->page_id );
+                                       intval( $row->page_id );
                        } else {
                                $this->subjectids[MWNamespace::getTalk( $row->page_namespace )][$row->page_title] =
-                                               intval( $row->page_id );
+                                       intval( $row->page_id );
                        }
                }
        }
@@ -697,7 +701,8 @@ class ApiQueryInfo extends ApiQueryBase {
                                $this->watched[$row->wl_namespace][$row->wl_title] = true;
                        }
                        if ( $this->fld_notificationtimestamp ) {
-                               $this->notificationtimestamps[$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp;
+                               $this->notificationtimestamps[$row->wl_namespace][$row->wl_title] =
+                                       $row->wl_notificationtimestamp;
                        }
                }
        }
@@ -761,6 +766,7 @@ class ApiQueryInfo extends ApiQueryBase {
                if ( !is_null( $params['token'] ) ) {
                        return 'private';
                }
+
                return 'public';
        }
 
index 5bd451b..e6280c8 100644 (file)
@@ -92,14 +92,14 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                                $this->addOption( 'ORDER BY', array(
                                        'll_title' . $sort,
                                        'll_from' . $sort
-                               ));
+                               ) );
                        }
                } else {
                        $this->addOption( 'ORDER BY', array(
                                'll_lang' . $sort,
                                'll_title' . $sort,
                                'll_from' . $sort
-                       ));
+                       ) );
                }
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
@@ -111,10 +111,14 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                $count = 0;
                $result = $this->getResult();
                foreach ( $res as $row ) {
-                       if ( ++ $count > $params['limit'] ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // Continue string preserved in case the redirect query doesn't pass the limit
-                               $this->setContinueEnumParameter( 'continue', "{$row->ll_lang}|{$row->ll_title}|{$row->ll_from}" );
+                       if ( ++$count > $params['limit'] ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here... Continue string
+                               // preserved in case the redirect query doesn't pass the limit.
+                               $this->setContinueEnumParameter(
+                                       'continue',
+                                       "{$row->ll_lang}|{$row->ll_title}|{$row->ll_from}"
+                               );
                                break;
                        }
 
@@ -140,7 +144,10 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
 
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $entry );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'continue', "{$row->ll_lang}|{$row->ll_title}|{$row->ll_from}" );
+                                       $this->setContinueEnumParameter(
+                                               'continue',
+                                               "{$row->ll_lang}|{$row->ll_title}|{$row->ll_from}"
+                                       );
                                        break;
                                }
                        }
index aa796e3..a20b855 100644 (file)
@@ -86,9 +86,9 @@ class ApiQueryLangLinks extends ApiQueryBase {
                                $this->addOption( 'ORDER BY', 'll_lang' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                                       'll_from' . $sort,
-                                                       'll_lang' . $sort
-                               ));
+                                       'll_from' . $sort,
+                                       'll_lang' . $sort
+                               ) );
                        }
                }
 
@@ -182,7 +182,8 @@ class ApiQueryLangLinks extends ApiQueryBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=query&prop=langlinks&titles=Main%20Page&redirects=' => 'Get interlanguage links from the [[Main Page]]',
+                       'api.php?action=query&prop=langlinks&titles=Main%20Page&redirects='
+                               => 'Get interlanguage links from the [[Main Page]]',
                );
        }
 
index 937f4f1..3157a7b 100644 (file)
@@ -43,7 +43,8 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                                $this->prefix = 'pl';
                                $this->description = 'link';
                                $this->titlesParam = 'titles';
-                               $this->titlesParamDescription = 'Only list links to these titles. Useful for checking whether a certain page links to a certain title.';
+                               $this->titlesParamDescription = 'Only list links to these titles. Useful ' .
+                                       'for checking whether a certain page links to a certain title.';
                                $this->helpUrl = 'https://www.mediawiki.org/wiki/API:Properties#links_.2F_pl';
                                break;
                        case self::TEMPLATES:
@@ -51,7 +52,8 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                                $this->prefix = 'tl';
                                $this->description = 'template';
                                $this->titlesParam = 'templates';
-                               $this->titlesParamDescription = 'Only list these templates. Useful for checking whether a certain page uses a certain template.';
+                               $this->titlesParamDescription = 'Only list these templates. Useful ' .
+                                       'for checking whether a certain page uses a certain template.';
                                $this->helpUrl = 'https://www.mediawiki.org/wiki/API:Properties#templates_.2F_tl';
                                break;
                        default:
@@ -212,6 +214,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
 
        public function getParamDescription() {
                $desc = $this->description;
+
                return array(
                        'namespace' => "Show {$desc}s in this namespace(s) only",
                        'limit' => "How many {$desc}s to return",
@@ -237,10 +240,13 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
        public function getExamples() {
                $desc = $this->description;
                $name = $this->getModuleName();
+
                return array(
                        "api.php?action=query&prop={$name}&titles=Main%20Page" => "Get {$desc}s from the [[Main Page]]",
-                       "api.php?action=query&generator={$name}&titles=Main%20Page&prop=info" => "Get information about the {$desc} pages in the [[Main Page]]",
-                       "api.php?action=query&prop={$name}&titles=Main%20Page&{$this->prefix}namespace=2|10" => "Get {$desc}s from the Main Page in the User and Template namespaces",
+                       "api.php?action=query&generator={$name}&titles=Main%20Page&prop=info"
+                               => "Get information about the {$desc} pages in the [[Main Page]]",
+                       "api.php?action=query&prop={$name}&titles=Main%20Page&{$this->prefix}namespace=2|10"
+                               => "Get {$desc}s from the Main Page in the User and Template namespaces",
                );
        }
 
index 1a2719e..0d2f475 100644 (file)
@@ -84,7 +84,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $this->addFieldsIf( array( 'log_id', 'page_id' ), $this->fld_ids );
                $this->addFieldsIf( array( 'log_user', 'log_user_text', 'user_name' ), $this->fld_user );
                $this->addFieldsIf( 'log_user', $this->fld_userid );
-               $this->addFieldsIf( array( 'log_namespace', 'log_title' ), $this->fld_title || $this->fld_parsedcomment );
+               $this->addFieldsIf(
+                       array( 'log_namespace', 'log_title' ),
+                       $this->fld_title || $this->fld_parsedcomment
+               );
                $this->addFieldsIf( 'log_comment', $this->fld_comment || $this->fld_parsedcomment );
                $this->addFieldsIf( 'log_params', $this->fld_details );
 
@@ -96,7 +99,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
                if ( !is_null( $params['tag'] ) ) {
                        $this->addTables( 'change_tag' );
-                       $this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'log_id=ct_log_id' ) ) ) );
+                       $this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN',
+                               array( 'log_id=ct_log_id' ) ) ) );
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                        $index['change_tag'] = 'change_tag_tag_id';
                }
@@ -110,7 +114,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $index['logging'] = 'type_time';
                }
 
-               $this->addTimestampWhereRange( 'log_timestamp', $params['dir'], $params['start'], $params['end'] );
+               $this->addTimestampWhereRange(
+                       'log_timestamp',
+                       $params['dir'],
+                       $params['start'],
+                       $params['end']
+               );
 
                $limit = $params['limit'];
                $this->addOption( 'LIMIT', $limit + 1 );
@@ -168,8 +177,9 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $res = $this->select( __METHOD__ );
                $result = $this->getResult();
                foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                       if ( ++$count > $limit ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->log_timestamp ) );
                                break;
                        }
@@ -197,7 +207,9 @@ class ApiQueryLogEvents extends ApiQueryBase {
         * @param $legacy bool
         * @return array
         */
-       public static function addLogParams( $result, &$vals, $params, $type, $action, $ts, $legacy = false ) {
+       public static function addLogParams( $result, &$vals, $params, $type,
+               $action, $ts, $legacy = false
+       ) {
                switch ( $type ) {
                        case 'move':
                                if ( $legacy ) {
@@ -285,6 +297,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $result->setIndexedTagName_recursive( $logParams, 'param' );
                        $vals = array_merge( $vals, $logParams );
                }
+
                return $vals;
        }
 
@@ -392,6 +405,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
        public function getAllowedParams() {
                global $wgLogTypes, $wgLogActions, $wgLogActionsHandlers;
+
                return array(
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
@@ -444,6 +458,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'prop' => array(
                                'Which properties to get',
@@ -473,6 +488,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
        public function getResultProperties() {
                global $wgLogTypes;
+
                return array(
                        'ids' => array(
                                'logid' => 'integer',
index a23ff06..469b297 100644 (file)
@@ -104,7 +104,7 @@ abstract class ApiQueryORM extends ApiQueryBase {
        protected function getParams() {
                return array_filter(
                        $this->extractRequestParams(),
-                       function( $prop ) {
+                       function ( $prop ) {
                                return isset( $prop );
                        }
                );
@@ -260,5 +260,4 @@ abstract class ApiQueryORM extends ApiQueryBase {
 
                return array_merge( $this->getTable()->getFieldDescriptions(), $descriptions );
        }
-
 }
index 08c883d..5438175 100644 (file)
@@ -63,7 +63,8 @@ class ApiQueryPagePropNames extends ApiQueryBase {
                $count = 0;
                foreach ( $this->select( __METHOD__ ) as $row ) {
                        if ( ++$count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                $this->setContinueEnumParameter( 'continue', $row->pp_propname );
                                break;
                        }
index 2de5710..e51c7ab 100644 (file)
@@ -115,6 +115,7 @@ class ApiQueryPageProps extends ApiQueryBase {
                if ( !$fit ) {
                        $this->setContinueEnumParameter( 'continue', $page );
                }
+
                return $fit;
        }
 
@@ -134,7 +135,8 @@ class ApiQueryPageProps extends ApiQueryBase {
        public function getParamDescription() {
                return array(
                        'continue' => 'When more results are available, use this to continue',
-                       'prop' => 'Only list these props. Useful for checking whether a certain page uses a certain page prop',
+                       'prop' => 'Only list these props. Useful for checking whether a ' .
+                               'certain page uses a certain page prop',
                );
        }
 
index 6f2f02e..e68eb56 100644 (file)
@@ -92,7 +92,8 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
                $count = 0;
                foreach ( $this->select( __METHOD__ ) as $row ) {
                        if ( ++$count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                $this->setContinueEnumParameter( 'continue', $row->page_id );
                                break;
                        }
@@ -178,8 +179,10 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=query&list=pageswithprop&pwppropname=displaytitle&pwpprop=ids|title|value' => 'Get first 10 pages using {{DISPLAYTITLE:}}',
-                       'api.php?action=query&generator=pageswithprop&gpwppropname=notoc&prop=info' => 'Get page info about first 10 pages using __NOTOC__',
+                       'api.php?action=query&list=pageswithprop&pwppropname=displaytitle&pwpprop=ids|title|value'
+                               => 'Get first 10 pages using {{DISPLAYTITLE:}}',
+                       'api.php?action=query&generator=pageswithprop&gpwppropname=notoc&prop=info'
+                               => 'Get page info about first 10 pages using __NOTOC__',
                );
        }
 
index 222ad07..ea350ad 100644 (file)
@@ -80,8 +80,9 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                $titles = array();
 
                foreach ( $res as $row ) {
-                       if ( ++ $count > $params['limit'] ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                       if ( ++$count > $params['limit'] ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->pt_timestamp ) );
                                break;
                        }
@@ -131,7 +132,10 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), $this->getModulePrefix() );
+                       $result->setIndexedTagName_internal(
+                               array( 'query', $this->getModuleName() ),
+                               $this->getModulePrefix()
+                       );
                } else {
                        $resultPageSet->populateFromTitles( $titles );
                }
@@ -148,6 +152,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
 
        public function getAllowedParams() {
                global $wgRestrictionLevels;
+
                return array(
                        'namespace' => array(
                                ApiBase::PARAM_ISMULTI => true,
@@ -216,6 +221,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
 
        public function getResultProperties() {
                global $wgRestrictionLevels;
+
                return array(
                        '' => array(
                                'ns' => 'namespace',
index 79fe049..88af62b 100644 (file)
@@ -126,7 +126,10 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                        }
                }
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName(), 'results' ), 'page' );
+                       $result->setIndexedTagName_internal(
+                               array( 'query', $this->getModuleName(), 'results' ),
+                               'page'
+                       );
                } else {
                        $resultPageSet->populateFromTitles( $titles );
                }
@@ -138,6 +141,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                if ( $qp->getRestriction() != '' ) {
                        return 'private';
                }
+
                return 'public';
        }
 
index fae3377..e990386 100644 (file)
@@ -30,9 +30,7 @@
  *
  * @ingroup API
  */
-
 class ApiQueryRandom extends ApiQueryGeneratorBase {
-
        private $pageIDs;
 
        public function __construct( $query, $moduleName ) {
@@ -83,8 +81,8 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
                                // Prevent duplicates
                                if ( !in_array( $row->page_id, $this->pageIDs ) ) {
                                        $fit = $this->getResult()->addValue(
-                                                       array( 'query', $this->getModuleName() ),
-                                                       null, $this->extractRowInfo( $row ) );
+                                               array( 'query', $this->getModuleName() ),
+                                               null, $this->extractRowInfo( $row ) );
                                        if ( !$fit ) {
                                                // We can't really query-continue a random list.
                                                // Return an insanely high value so
@@ -110,14 +108,26 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
                $result = $this->getResult();
                $this->pageIDs = array();
 
-               $this->prepareQuery( wfRandom(), $params['limit'], $params['namespace'], $resultPageSet, $params['redirect'] );
+               $this->prepareQuery(
+                       wfRandom(),
+                       $params['limit'],
+                       $params['namespace'],
+                       $resultPageSet,
+                       $params['redirect']
+               );
                $count = $this->runQuery( $resultPageSet );
                if ( $count < $params['limit'] ) {
                        /* We got too few pages, we probably picked a high value
                         * for page_random. We'll just take the lowest ones, see
                         * also the comment in Title::getRandomTitle()
                         */
-                       $this->prepareQuery( 0, $params['limit'] - $count, $params['namespace'], $resultPageSet, $params['redirect'] );
+                       $this->prepareQuery(
+                               0,
+                               $params['limit'] - $count,
+                               $params['namespace'],
+                               $resultPageSet,
+                               $params['redirect']
+                       );
                        $this->runQuery( $resultPageSet );
                }
 
@@ -131,6 +141,7 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
                $vals = array();
                $vals['id'] = intval( $row->page_id );
                ApiQueryBase::addTitleInfo( $vals, $title );
+
                return $vals;
        }
 
@@ -176,9 +187,12 @@ 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',
-                       '      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'
+                       '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'
                );
        }
 
index 8d969fc..7848853 100644 (file)
@@ -37,9 +37,9 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        }
 
        private $fld_comment = false, $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
-                       $fld_flags = false, $fld_timestamp = false, $fld_title = false, $fld_ids = false,
-                       $fld_sizes = false, $fld_redirect = false, $fld_patrolled = false, $fld_loginfo = false,
-                       $fld_tags = false, $fld_sha1 = false, $token = array();
+               $fld_flags = false, $fld_timestamp = false, $fld_title = false, $fld_ids = false,
+               $fld_sizes = false, $fld_redirect = false, $fld_patrolled = false, $fld_loginfo = false,
+               $fld_tags = false, $fld_sha1 = false, $token = array();
 
        private $tokenFunctions;
 
@@ -64,6 +64,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        'patrol' => array( 'ApiQueryRecentChanges', 'getPatrolToken' )
                );
                wfRunHooks( 'APIQueryRecentChangesTokens', array( &$this->tokenFunctions ) );
+
                return $this->tokenFunctions;
        }
 
@@ -80,8 +81,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                if ( $rc ) {
                        if ( ( $wgUser->useRCPatrol() && $rc->getAttribute( 'rc_type' ) == RC_EDIT ) ||
-                               ( $wgUser->useNPPatrol() && $rc->getAttribute( 'rc_type' ) == RC_NEW ) )
-                       {
+                               ( $wgUser->useNPPatrol() && $rc->getAttribute( 'rc_type' ) == RC_NEW )
+                       {
                                $validTokenUser = true;
                        }
                } else {
@@ -96,11 +97,11 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        if ( is_null( $cachedPatrolToken ) ) {
                                $cachedPatrolToken = $wgUser->getEditToken( 'patrol' );
                        }
+
                        return $cachedPatrolToken;
                } else {
                        return false;
                }
-
        }
 
        /**
@@ -155,7 +156,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $cont = explode( '|', $params['continue'] );
                        if ( count( $cont ) != 2 ) {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
-                                                               'original value returned by the previous query', '_badcontinue' );
+                                       'original value returned by the previous query', '_badcontinue' );
                        }
 
                        $timestamp = $this->getDB()->addQuotes( wfTimestamp( TS_MW, $cont[0] ) );
@@ -187,10 +188,10 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                        /* Check for conflicting parameters. */
                        if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
-                                       || ( isset( $show['bot'] ) && isset( $show['!bot'] ) )
-                                       || ( isset( $show['anon'] ) && isset( $show['!anon'] ) )
-                                       || ( isset( $show['redirect'] ) && isset( $show['!redirect'] ) )
-                                       || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
+                               || ( isset( $show['bot'] ) && isset( $show['!bot'] ) )
+                               || ( isset( $show['anon'] ) && isset( $show['!anon'] ) )
+                               || ( isset( $show['redirect'] ) && isset( $show['!redirect'] ) )
+                               || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
                        ) {
                                $this->dieUsageMsg( 'show' );
                        }
@@ -198,7 +199,10 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        // Check permissions
                        if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) {
                                if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                                       $this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
+                                       $this->dieUsage(
+                                               'You need the patrol right to request the patrolled flag',
+                                               'permissiondenied'
+                                       );
                                }
                        }
 
@@ -214,7 +218,10 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $this->addWhereIf( 'page_is_redirect = 1', isset( $show['redirect'] ) );
 
                        // Don't throw log entries out the window here
-                       $this->addWhereIf( 'page_is_redirect = 0 OR page_is_redirect IS NULL', isset( $show['!redirect'] ) );
+                       $this->addWhereIf(
+                               'page_is_redirect = 0 OR page_is_redirect IS NULL',
+                               isset( $show['!redirect'] )
+                       );
                }
 
                if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
@@ -252,7 +259,10 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $this->initProperties( $prop );
 
                        if ( $this->fld_patrolled && !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                               $this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
+                               $this->dieUsage(
+                                       'You need the patrol right to request the patrolled flag',
+                                       'permissiondenied'
+                               );
                        }
 
                        $this->addFields( 'rc_id' );
@@ -264,8 +274,12 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $this->addFieldsIf( array( 'rc_minor', 'rc_type', 'rc_bot' ), $this->fld_flags );
                        $this->addFieldsIf( array( 'rc_old_len', 'rc_new_len' ), $this->fld_sizes );
                        $this->addFieldsIf( 'rc_patrolled', $this->fld_patrolled );
-                       $this->addFieldsIf( array( 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ), $this->fld_loginfo );
-                       $showRedirects = $this->fld_redirect || isset( $show['redirect'] ) || isset( $show['!redirect'] );
+                       $this->addFieldsIf(
+                               array( 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ),
+                               $this->fld_loginfo
+                       );
+                       $showRedirects = $this->fld_redirect || isset( $show['redirect'] )
+                               || isset( $show['!redirect'] );
                }
 
                if ( $this->fld_tags ) {
@@ -276,13 +290,15 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                if ( $this->fld_sha1 ) {
                        $this->addTables( 'revision' );
-                       $this->addJoinConds( array( 'revision' => array( 'LEFT JOIN', array( 'rc_this_oldid=rev_id' ) ) ) );
+                       $this->addJoinConds( array( 'revision' => array( 'LEFT JOIN',
+                               array( 'rc_this_oldid=rev_id' ) ) ) );
                        $this->addFields( array( 'rev_sha1', 'rev_deleted' ) );
                }
 
                if ( $params['toponly'] || $showRedirects ) {
                        $this->addTables( 'page' );
-                       $this->addJoinConds( array( 'page' => array( 'LEFT JOIN', array( 'rc_namespace=page_namespace', 'rc_title=page_title' ) ) ) );
+                       $this->addJoinConds( array( 'page' => array( 'LEFT JOIN',
+                               array( 'rc_namespace=page_namespace', 'rc_title=page_title' ) ) ) );
                        $this->addFields( 'page_is_redirect' );
 
                        if ( $params['toponly'] ) {
@@ -311,9 +327,13 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                /* Iterate through the rows, adding data extracted from them to our query result. */
                foreach ( $res as $row ) {
-                       if ( ++ $count > $params['limit'] ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'continue', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id );
+                       if ( ++$count > $params['limit'] ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
+                               $this->setContinueEnumParameter(
+                                       'continue',
+                                       wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id
+                               );
                                break;
                        }
 
@@ -327,7 +347,10 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                }
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'continue', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id );
+                                       $this->setContinueEnumParameter(
+                                               'continue',
+                                               wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id
+                                       );
                                        break;
                                }
                        } else {
@@ -520,6 +543,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        foreach ( $type as $t ) {
                                $retval[] = $this->parseRCType( $t );
                        }
+
                        return $retval;
                }
                switch ( $type ) {
@@ -549,6 +573,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        // formatComment() calls wfMessage() among other things
                        return 'anon-public-user-private';
                }
+
                return 'public';
        }
 
@@ -640,6 +665,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'start' => 'The timestamp to start enumerating from',
                        'end' => 'The timestamp to end enumerating',
@@ -786,7 +812,10 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'show' ),
-                       array( 'code' => 'permissiondenied', 'info' => 'You need the patrol right to request the patrolled flag' ),
+                       array(
+                               'code' => 'permissiondenied',
+                               'info' => 'You need the patrol right to request the patrolled flag'
+                       ),
                        array( 'code' => 'user-excludeuser', 'info' => 'user and excludeuser cannot be used together' ),
                ) );
        }
index 415288e..86351c0 100644 (file)
  */
 
 /**
- * A query action to enumerate revisions of a given page, or show top revisions of multiple pages.
- * Various pieces of information may be shown - flags, comments, and the actual wiki markup of the rev.
- * In the enumeration mode, ranges of revisions may be requested and filtered.
+ * A query action to enumerate revisions of a given page, or show top revisions
+ * of multiple pages. Various pieces of information may be shown - flags,
+ * comments, and the actual wiki markup of the rev. In the enumeration mode,
+ * ranges of revisions may be requested and filtered.
  *
  * @ingroup API
  */
@@ -40,9 +41,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                parent::__construct( $query, $moduleName, 'rv' );
        }
 
-       private $fld_ids = false, $fld_flags = false, $fld_timestamp = false, $fld_size = false, $fld_sha1 = false,
-                       $fld_comment = false, $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
-                       $fld_content = false, $fld_tags = false, $fld_contentmodel = false;
+       private $fld_ids = false, $fld_flags = false, $fld_timestamp = false,
+               $fld_size = false, $fld_sha1 = false, $fld_comment = false,
+               $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
+               $fld_content = false, $fld_tags = false, $fld_contentmodel = false;
 
        private $tokenFunctions;
 
@@ -65,6 +67,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                        'rollback' => array( 'ApiQueryRevisions', 'getRollbackToken' )
                );
                wfRunHooks( 'APIQueryRevisionsTokens', array( &$this->tokenFunctions ) );
+
                return $this->tokenFunctions;
        }
 
@@ -79,6 +82,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                if ( !$wgUser->isAllowed( 'rollback' ) ) {
                        return false;
                }
+
                return $wgUser->getEditToken(
                        array( $title->getPrefixedText(), $rev->getUserText() ) );
        }
@@ -91,9 +95,9 @@ class ApiQueryRevisions extends ApiQueryBase {
                // Enumerating revisions on multiple pages make it extremely
                // difficult to manage continuations and require additional SQL indexes
                $enumRevMode = ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ||
-                               !is_null( $params['limit'] ) || !is_null( $params['startid'] ) ||
-                               !is_null( $params['endid'] ) || $params['dir'] === 'newer' ||
-                               !is_null( $params['start'] ) || !is_null( $params['end'] ) );
+                       !is_null( $params['limit'] ) || !is_null( $params['startid'] ) ||
+                       !is_null( $params['endid'] ) || $params['dir'] === 'newer' ||
+                       !is_null( $params['start'] ) || !is_null( $params['end'] ) );
 
                $pageSet = $this->getPageSet();
                $pageCount = $pageSet->getGoodTitleCount();
@@ -105,11 +109,20 @@ class ApiQueryRevisions extends ApiQueryBase {
                }
 
                if ( $revCount > 0 && $enumRevMode ) {
-                       $this->dieUsage( 'The revids= parameter may not be used with the list options (limit, startid, endid, dirNewer, start, end).', 'revids' );
+                       $this->dieUsage(
+                               'The revids= parameter may not be used with the list options ' .
+                                       '(limit, startid, endid, dirNewer, start, end).',
+                               'revids'
+                       );
                }
 
                if ( $pageCount > 1 && $enumRevMode ) {
-                       $this->dieUsage( 'titles, pageids or a generator was used to supply multiple pages, but the limit, startid, endid, dirNewer, user, excludeuser, start and end parameters may only be used on a single page.', 'multpages' );
+                       $this->dieUsage(
+                               'titles, pageids or a generator was used to supply multiple pages, ' .
+                                       'but the limit, startid, endid, dirNewer, user, excludeuser, start ' .
+                                       'and end parameters may only be used on a single page.',
+                               'multpages'
+                       );
                }
 
                if ( !is_null( $params['difftotext'] ) ) {
@@ -119,8 +132,12 @@ class ApiQueryRevisions extends ApiQueryBase {
                                $params['diffto'] = 0;
                        }
                        if ( ( !ctype_digit( $params['diffto'] ) || $params['diffto'] < 0 )
-                                       && $params['diffto'] != 'prev' && $params['diffto'] != 'next' ) {
-                               $this->dieUsage( 'rvdiffto must be set to a non-negative number, "prev", "next" or "cur"', 'diffto' );
+                               && $params['diffto'] != 'prev' && $params['diffto'] != 'next'
+                       ) {
+                               $this->dieUsage(
+                                       'rvdiffto must be set to a non-negative number, "prev", "next" or "cur"',
+                                       'diffto'
+                               );
                        }
                        // Check whether the revision exists and is readable,
                        // DifferenceEngine returns a rather ambiguous empty
@@ -181,13 +198,17 @@ class ApiQueryRevisions extends ApiQueryBase {
                if ( isset( $prop['tags'] ) ) {
                        $this->fld_tags = true;
                        $this->addTables( 'tag_summary' );
-                       $this->addJoinConds( array( 'tag_summary' => array( 'LEFT JOIN', array( 'rev_id=ts_rev_id' ) ) ) );
+                       $this->addJoinConds(
+                               array( 'tag_summary' => array( 'LEFT JOIN', array( 'rev_id=ts_rev_id' ) ) )
+                       );
                        $this->addFields( 'ts_tags' );
                }
 
                if ( !is_null( $params['tag'] ) ) {
                        $this->addTables( 'change_tag' );
-                       $this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'rev_id=ct_rev_id' ) ) ) );
+                       $this->addJoinConds(
+                               array( 'change_tag' => array( 'INNER JOIN', array( 'rev_id=ct_rev_id' ) ) )
+                       );
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                        $index['change_tag'] = 'change_tag_tag_id';
                }
@@ -349,7 +370,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                        $this->addOption( 'ORDER BY', array(
                                'rev_page',
                                'rev_id'
-                       ));
+                       ) );
 
                        // assumption testing -- we should never get more then $pageCount rows.
                        $limit = $pageCount;
@@ -364,8 +385,9 @@ class ApiQueryRevisions extends ApiQueryBase {
                $res = $this->select( __METHOD__ );
 
                foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                       if ( ++$count > $limit ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                if ( !$enumRevMode ) {
                                        ApiBase::dieDebug( __METHOD__, 'Got more rows then expected' ); // bug report
                                }
@@ -497,7 +519,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                        if ( $content && $this->section !== false ) {
                                $content = $content->getSection( $this->section, false );
                                if ( !$content ) {
-                                       $this->dieUsage( "There is no section {$this->section} in r" . $revision->getId(), 'nosuchsection' );
+                                       $this->dieUsage(
+                                               "There is no section {$this->section} in r" . $revision->getId(),
+                                               'nosuchsection'
+                                       );
                                }
                        }
                }
@@ -508,7 +533,11 @@ class ApiQueryRevisions extends ApiQueryBase {
                                if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
                                        $t = $content->getNativeData(); # note: don't set $text
 
-                                       $wgParser->startExternalParse( $title, ParserOptions::newFromContext( $this->getContext() ), OT_PREPROCESS );
+                                       $wgParser->startExternalParse(
+                                               $title,
+                                               ParserOptions::newFromContext( $this->getContext() ),
+                                               OT_PREPROCESS
+                                       );
                                        $dom = $wgParser->preprocessToDom( $t );
                                        if ( is_callable( array( $dom, 'saveXML' ) ) ) {
                                                $xml = $dom->saveXML();
@@ -518,8 +547,8 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        $vals['parsetree'] = $xml;
                                } else {
                                        $this->setWarning( "Conversion to XML is supported for wikitext only, " .
-                                                                               $title->getPrefixedDBkey() .
-                                                                               " uses content model " . $content->getModel() );
+                                               $title->getPrefixedDBkey() .
+                                               " uses content model " . $content->getModel() );
                                }
                        }
 
@@ -528,7 +557,11 @@ class ApiQueryRevisions extends ApiQueryBase {
                                if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
                                        $text = $content->getNativeData();
 
-                                       $text = $wgParser->preprocess( $text, $title, ParserOptions::newFromContext( $this->getContext() ) );
+                                       $text = $wgParser->preprocess(
+                                               $text,
+                                               $title,
+                                               ParserOptions::newFromContext( $this->getContext() )
+                                       );
                                } else {
                                        $this->setWarning( "Template expansion is supported for wikitext only, " .
                                                $title->getPrefixedDBkey() .
@@ -538,7 +571,11 @@ class ApiQueryRevisions extends ApiQueryBase {
                                }
                        }
                        if ( $this->parseContent ) {
-                               $po = $content->getParserOutput( $title, $revision->getId(), ParserOptions::newFromContext( $this->getContext() ) );
+                               $po = $content->getParserOutput(
+                                       $title,
+                                       $revision->getId(),
+                                       ParserOptions::newFromContext( $this->getContext() )
+                               );
                                $text = $po->getText();
                        }
 
@@ -550,7 +587,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        $name = $title->getPrefixedDBkey();
 
                                        $this->dieUsage( "The requested format {$this->contentFormat} is not supported " .
-                                                                       "for content model $model used by $name", 'badformat' );
+                                               "for content model $model used by $name", 'badformat' );
                                }
 
                                $text = $content->serialize( $format );
@@ -588,15 +625,21 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        $model = $title->getContentModel();
 
                                        if ( $this->contentFormat
-                                               && !ContentHandler::getForModelID( $model )->isSupportedFormat( $this->contentFormat ) ) {
+                                               && !ContentHandler::getForModelID( $model )->isSupportedFormat( $this->contentFormat )
+                                       ) {
 
                                                $name = $title->getPrefixedDBkey();
 
                                                $this->dieUsage( "The requested format {$this->contentFormat} is not supported for " .
-                                                                                       "content model $model used by $name", 'badformat' );
+                                                       "content model $model used by $name", 'badformat' );
                                        }
 
-                                       $difftocontent = ContentHandler::makeContent( $this->difftotext, $title, $model, $this->contentFormat );
+                                       $difftocontent = ContentHandler::makeContent(
+                                               $this->difftotext,
+                                               $title,
+                                               $model,
+                                               $this->contentFormat
+                                       );
 
                                        $engine = $handler->createDifferenceEngine( $context );
                                        $engine->setContent( $content, $difftocontent );
@@ -614,6 +657,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                $vals['diff']['notcached'] = '';
                        }
                }
+
                return $vals;
        }
 
@@ -625,6 +669,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                        // formatComment() calls wfMessage() among other things
                        return 'anon-public-user-private';
                }
+
                return 'public';
        }
 
@@ -700,6 +745,7 @@ class ApiQueryRevisions extends ApiQueryBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'prop' => array(
                                'Which properties to get for each revision:',
@@ -733,8 +779,11 @@ class ApiQueryRevisions extends ApiQueryBase {
                        'continue' => 'When more results are available, use this to continue',
                        'diffto' => array( 'Revision ID to diff each revision to.',
                                'Use "prev", "next" and "cur" for the previous, next and current revision respectively' ),
-                       'difftotext' => array( 'Text to diff each revision to. Only diffs a limited number of revisions.',
-                               "Overrides {$p}diffto. If {$p}section is set, only that section will be diffed against this text" ),
+                       'difftotext' => array(
+                               'Text to diff each revision to. Only diffs a limited number of revisions.',
+                               "Overrides {$p}diffto. If {$p}section is set, only that section will be",
+                               'diffed against this text',
+                       ),
                        'tag' => 'Only list revisions tagged with this tag',
                        'contentformat' => 'Serialization format used for difftotext and expected for output of content',
                );
@@ -818,35 +867,50 @@ class ApiQueryRevisions extends ApiQueryBase {
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'nosuchrevid', 'diffto' ),
-                       array( 'code' => 'revids', 'info' => 'The revids= parameter may not be used with the list options '
-                                       . '(limit, startid, endid, dirNewer, start, end).' ),
-                       array( 'code' => 'multpages', 'info' => 'titles, pageids or a generator was used to supply multiple pages, '
+                       array(
+                               'code' => 'revids',
+                               'info' => 'The revids= parameter may not be used with the list options '
+                                       . '(limit, startid, endid, dirNewer, start, end).'
+                       ),
+                       array(
+                               'code' => 'multpages',
+                               'info' => 'titles, pageids or a generator was used to supply multiple pages, '
                                        . ' but the limit, startid, endid, dirNewer, user, excludeuser, '
-                                       . 'start and end parameters may only be used on a single page.' ),
-                       array( 'code' => 'diffto', 'info' => 'rvdiffto must be set to a non-negative number, "prev", "next" or "cur"' ),
+                                       . 'start and end parameters may only be used on a single page.'
+                       ),
+                       array(
+                               'code' => 'diffto',
+                               'info' => 'rvdiffto must be set to a non-negative number, "prev", "next" or "cur"'
+                       ),
                        array( 'code' => 'badparams', 'info' => 'start and startid cannot be used together' ),
                        array( 'code' => 'badparams', 'info' => 'end and endid cannot be used together' ),
                        array( 'code' => 'badparams', 'info' => 'user and excludeuser cannot be used together' ),
                        array( 'code' => 'nosuchsection', 'info' => 'There is no section section in rID' ),
                        array( 'code' => 'badformat', 'info' => 'The requested serialization format can not be applied '
-                                                                                                       . ' to the page\'s content model' ),
+                               . ' to the page\'s content model' ),
                ) );
        }
 
        public function getExamples() {
                return array(
                        'Get data with content for the last revision of titles "API" and "Main Page"',
-                       '  api.php?action=query&prop=revisions&titles=API|Main%20Page&rvprop=timestamp|user|comment|content',
+                       '  api.php?action=query&prop=revisions&titles=API|Main%20Page&' .
+                               'rvprop=timestamp|user|comment|content',
                        'Get last 5 revisions of the "Main Page"',
-                       '  api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&rvprop=timestamp|user|comment',
+                       '  api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' .
+                               'rvprop=timestamp|user|comment',
                        'Get first 5 revisions of the "Main Page"',
-                       '  api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&rvprop=timestamp|user|comment&rvdir=newer',
+                       '  api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' .
+                               'rvprop=timestamp|user|comment&rvdir=newer',
                        'Get first 5 revisions of the "Main Page" made after 2006-05-01',
-                       '  api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&rvprop=timestamp|user|comment&rvdir=newer&rvstart=20060501000000',
+                       '  api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' .
+                               'rvprop=timestamp|user|comment&rvdir=newer&rvstart=20060501000000',
                        'Get first 5 revisions of the "Main Page" that were not made made by anonymous user "127.0.0.1"',
-                       '  api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&rvprop=timestamp|user|comment&rvexcludeuser=127.0.0.1',
+                       '  api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' .
+                               'rvprop=timestamp|user|comment&rvexcludeuser=127.0.0.1',
                        'Get first 5 revisions of the "Main Page" that were made by the user "MediaWiki default"',
-                       '  api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&rvprop=timestamp|user|comment&rvuser=MediaWiki%20default',
+                       '  api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' .
+                               'rvprop=timestamp|user|comment&rvuser=MediaWiki%20default',
                );
        }
 
index 36b5597..4fedebc 100644 (file)
@@ -112,12 +112,12 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        $totalhits = $matches->getTotalHits();
                        if ( $totalhits !== null ) {
                                $apiResult->addValue( array( 'query', 'searchinfo' ),
-                                               'totalhits', $totalhits );
+                                       'totalhits', $totalhits );
                        }
                }
                if ( isset( $searchInfo['suggestion'] ) && $matches->hasSuggestion() ) {
                        $apiResult->addValue( array( 'query', 'searchinfo' ),
-                                               'suggestion', $matches->getSuggestionQuery() );
+                               'suggestion', $matches->getSuggestionQuery() );
                }
 
                // Add the search results to the result
@@ -127,8 +127,9 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                $result = $matches->next();
 
                while ( $result ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional items to be had. Stop here...
+                       if ( ++$count > $limit ) {
+                               // We've reached the one extra which shows that there are
+                               // additional items to be had. Stop here...
                                $this->setContinueEnumParameter( 'offset', $params['offset'] + $params['limit'] );
                                break;
                        }
@@ -184,7 +185,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
 
                                // Add item to results and see whether it fits
                                $fit = $apiResult->addValue( array( 'query', $this->getModuleName() ),
-                                               null, $vals );
+                                       null, $vals );
                                if ( !$fit ) {
                                        $this->setContinueEnumParameter( 'offset', $params['offset'] + $count - 1 );
                                        break;
@@ -198,8 +199,8 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
 
                if ( is_null( $resultPageSet ) ) {
                        $apiResult->setIndexedTagName_internal( array(
-                                               'query', $this->getModuleName()
-                                       ), 'p' );
+                               'query', $this->getModuleName()
+                       ), 'p' );
                } else {
                        $resultPageSet->populateFromTitles( $titles );
                }
index ebd3fc0..1c188da 100644 (file)
@@ -106,7 +106,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                // Abuse siprop as a query-continue parameter
                                // and set it to all unprocessed props
                                $this->setContinueEnumParameter( 'prop', implode( '|',
-                                               array_diff( $params['prop'], $done ) ) );
+                                       array_diff( $params['prop'], $done ) ) );
                                break;
                        }
                        $done[] = $p;
@@ -114,9 +114,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendGeneralInfo( $property ) {
-               global $wgContLang,
-                       $wgDisableLangConversion,
-                       $wgDisableTitleConversion;
+               global $wgContLang, $wgDisableLangConversion, $wgDisableTitleConversion;
 
                $data = array();
                $mainPage = Title::newMainPage();
@@ -280,6 +278,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
 
                $this->getResult()->setIndexedTagName( $data, 'ns' );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
@@ -303,6 +302,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                sort( $data );
 
                $this->getResult()->setIndexedTagName( $data, 'ns' );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
@@ -318,6 +318,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        }
                }
                $this->getResult()->setIndexedTagName( $data, 'specialpage' );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
@@ -334,6 +335,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data[] = $arr;
                }
                $this->getResult()->setIndexedTagName( $data, 'magicword' );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
@@ -379,6 +381,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
 
                $this->getResult()->setIndexedTagName( $data, 'iw' );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
@@ -388,7 +391,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $lb = wfGetLB();
                if ( $includeAll ) {
                        if ( !$wgShowHostnames ) {
-                               $this->dieUsage( 'Cannot view all servers info unless $wgShowHostnames is true', 'includeAllDenied' );
+                               $this->dieUsage(
+                                       'Cannot view all servers info unless $wgShowHostnames is true',
+                                       'includeAllDenied'
+                               );
                        }
 
                        $lags = $lb->getLagTimes();
@@ -410,6 +416,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                $result = $this->getResult();
                $result->setIndexedTagName( $data, 'db' );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
@@ -450,7 +457,6 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                                if ( $group == 'user' ) {
                                        $arr['number'] = SiteStats::users();
-
                                // '*' and autopromote groups have no size
                                } elseif ( $group !== '*' && !isset( $wgAutopromote[$group] ) ) {
                                        $arr['number'] = SiteStats::numberInGroup( $group );
@@ -476,6 +482,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
 
                $result->setIndexedTagName( $data, 'group' );
+
                return $result->addValue( 'query', $property, $data );
        }
 
@@ -487,6 +494,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data[] = array( 'ext' => $ext );
                }
                $this->getResult()->setIndexedTagName( $data, 'fe' );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
@@ -521,18 +529,19 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        $ret['url'] = $ext['url'];
                                }
                                if ( isset( $ext['version'] ) ) {
-                                               $ret['version'] = $ext['version'];
+                                       $ret['version'] = $ext['version'];
                                } elseif ( isset( $ext['svn-revision'] ) &&
                                        preg_match( '/\$(?:Rev|LastChangedRevision|Revision): *(\d+)/',
-                                               $ext['svn-revision'], $m ) )
-                               {
-                                               $ret['version'] = 'r' . $m[1];
+                                               $ext['svn-revision'], $m )
+                               {
+                                       $ret['version'] = 'r' . $m[1];
                                }
                                $data[] = $ret;
                        }
                }
 
                $this->getResult()->setIndexedTagName( $data, 'ext' );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
@@ -566,6 +575,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data[] = $lang;
                }
                $this->getResult()->setIndexedTagName( $data, 'lang' );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
@@ -585,6 +595,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data[] = $skin;
                }
                $this->getResult()->setIndexedTagName( $data, 'skin' );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
@@ -593,6 +604,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $wgParser->firstCallInit();
                $tags = array_map( array( $this, 'formatParserTags' ), $wgParser->getTags() );
                $this->getResult()->setIndexedTagName( $tags, 't' );
+
                return $this->getResult()->addValue( 'query', $property, $tags );
        }
 
@@ -601,12 +613,14 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $wgParser->firstCallInit();
                $hooks = $wgParser->getFunctionHooks();
                $this->getResult()->setIndexedTagName( $hooks, 'h' );
+
                return $this->getResult()->addValue( 'query', $property, $hooks );
        }
 
        public function appendVariables( $property ) {
                $variables = MagicWord::getVariableIDs();
                $this->getResult()->setIndexedTagName( $variables, 'v' );
+
                return $this->getResult()->addValue( 'query', $property, $variables );
        }
 
@@ -615,6 +629,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                // Make a copy of the global so we don't try to set the _element key of it - bug 45130
                $protocols = array_values( $wgUrlProtocols );
                $this->getResult()->setIndexedTagName( $protocols, 'p' );
+
                return $this->getResult()->addValue( 'query', $property, $protocols );
        }
 
@@ -639,6 +654,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
 
                $this->getResult()->setIndexedTagName( $data, 'hook' );
+
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
@@ -687,6 +703,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'prop' => array(
                                'Which sysinfo properties to get:',
@@ -696,14 +713,14 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                ' specialpagealiases    - List of special page aliases',
                                ' magicwords            - List of magic words and their aliases',
                                ' statistics            - Returns site statistics',
-                               " interwikimap          - Returns interwiki map " .
+                               ' interwikimap          - Returns interwiki map ' .
                                        "(optionally filtered, (optionally localised by using {$p}inlanguagecode))",
                                ' dbrepllag             - Returns database server with the highest replication lag',
                                ' usergroups            - Returns user groups and the associated permissions',
                                ' extensions            - Returns extensions installed on the wiki',
                                ' fileextensions        - Returns list of file extensions allowed to be uploaded',
                                ' rightsinfo            - Returns wiki rights (license) information if available',
-                               " languages             - Returns a list of languages MediaWiki supports" .
+                               ' languages             - Returns a list of languages MediaWiki supports' .
                                        "(optionally localised by using {$p}inlanguagecode)",
                                ' skins                 - Returns a list of all enabled skins',
                                ' extensiontags         - Returns a list of parser extension tags',
@@ -715,7 +732,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        'filteriw' => 'Return only local or only nonlocal entries of the interwiki map',
                        'showalldb' => 'List all database servers, not just the one lagging the most',
                        'numberingroup' => 'Lists the number of users in user groups',
-                       'inlanguagecode' => 'Language code for localised language names (best effort, use CLDR extension)',
+                       'inlanguagecode' => 'Language code for localised language names ' .
+                               '(best effort, use CLDR extension)',
                );
        }
 
index 6899375..248b3d8 100644 (file)
@@ -60,7 +60,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                                $result->addValue( array( 'query', $this->getModuleName() ), null, $imageInfo );
                                $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), $modulePrefix );
                        }
-               //TODO: update exception handling here to understand current getFile exceptions
+               // @todo Update exception handling here to understand current getFile exceptions
                } catch ( UploadStashNotAvailableException $e ) {
                        $this->dieUsage( "Session not available: " . $e->getMessage(), "nosession" );
                } catch ( UploadStashFileNotFoundException $e ) {
@@ -112,6 +112,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
         */
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'prop' => self::getPropertyDescriptions( $this->propertyFilter, $p ),
                        'filekey' => 'Key that identifies a previous upload that was stashed temporarily.',
@@ -134,8 +135,8 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
        public function getExamples() {
                return array(
                        'api.php?action=query&prop=stashimageinfo&siifilekey=124sd34rsdf567',
-                       'api.php?action=query&prop=stashimageinfo&siifilekey=b34edoe3|bceffd4&siiurlwidth=120&siiprop=url',
+                       'api.php?action=query&prop=stashimageinfo&siifilekey=b34edoe3|bceffd4&' .
+                               'siiurlwidth=120&siiprop=url',
                );
        }
-
 }
index 732df9a..33116ce 100644 (file)
@@ -38,7 +38,7 @@ class ApiQueryTags extends ApiQueryBase {
 
        private $limit;
        private $fld_displayname = false, $fld_description = false,
-                       $fld_hitcount = false;
+               $fld_hitcount = false;
 
        public function __construct( $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'tg' );
@@ -97,6 +97,7 @@ class ApiQueryTags extends ApiQueryBase {
 
                if ( ++$count > $this->limit ) {
                        $this->setContinueEnumParameter( 'continue', $tagName );
+
                        return false;
                }
 
@@ -121,6 +122,7 @@ class ApiQueryTags extends ApiQueryBase {
                $fit = $this->result->addValue( array( 'query', $this->getModuleName() ), null, $tag );
                if ( !$fit ) {
                        $this->setContinueEnumParameter( 'continue', $tagName );
+
                        return false;
                }
 
index 9a9be7b..6c7a57d 100644 (file)
@@ -37,8 +37,8 @@ class ApiQueryContributions extends ApiQueryBase {
 
        private $params, $prefixMode, $userprefix, $multiUserMode, $usernames, $parentLens;
        private $fld_ids = false, $fld_title = false, $fld_timestamp = false,
-                       $fld_comment = false, $fld_parsedcomment = false, $fld_flags = false,
-                       $fld_patrolled = false, $fld_tags = false, $fld_size = false, $fld_sizediff = false;
+               $fld_comment = false, $fld_parsedcomment = false, $fld_flags = false,
+               $fld_patrolled = false, $fld_tags = false, $fld_size = false, $fld_sizediff = false;
 
        public function execute() {
                // Parse some parameters
@@ -100,8 +100,9 @@ class ApiQueryContributions extends ApiQueryBase {
 
                // Fetch each row
                foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                       if ( ++$count > $limit ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                if ( $this->multiUserMode ) {
                                        $this->setContinueEnumParameter( 'continue', $this->continueStr( $row ) );
                                } else {
@@ -122,7 +123,10 @@ class ApiQueryContributions extends ApiQueryBase {
                        }
                }
 
-               $this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'item' );
+               $this->getResult()->setIndexedTagName_internal(
+                       array( 'query', $this->getModuleName() ),
+                       'item'
+               );
        }
 
        /**
@@ -177,7 +181,8 @@ class ApiQueryContributions extends ApiQueryBase {
                }
                // We only want pages by the specified users.
                if ( $this->prefixMode ) {
-                       $this->addWhere( 'rev_user_text' . $this->getDB()->buildLike( $this->userprefix, $this->getDB()->anyString() ) );
+                       $this->addWhere( 'rev_user_text' .
+                               $this->getDB()->buildLike( $this->userprefix, $this->getDB()->anyString() ) );
                } else {
                        $this->addWhereFld( 'rev_user_text', $this->usernames );
                }
@@ -195,7 +200,8 @@ class ApiQueryContributions extends ApiQueryBase {
                if ( !is_null( $show ) ) {
                        $show = array_flip( $show );
                        if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
-                                       || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) ) ) {
+                               || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
+                       ) {
                                $this->dieUsageMsg( 'show' );
                        }
 
@@ -220,9 +226,13 @@ class ApiQueryContributions extends ApiQueryBase {
                ) );
 
                if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ||
-                               $this->fld_patrolled ) {
+                       $this->fld_patrolled
+               ) {
                        if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                               $this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
+                               $this->dieUsage(
+                                       'You need the patrol right to request the patrolled flag',
+                                       'permissiondenied'
+                               );
                        }
 
                        // Use a redundant join condition on both
@@ -260,13 +270,17 @@ class ApiQueryContributions extends ApiQueryBase {
 
                if ( $this->fld_tags ) {
                        $this->addTables( 'tag_summary' );
-                       $this->addJoinConds( array( 'tag_summary' => array( 'LEFT JOIN', array( 'rev_id=ts_rev_id' ) ) ) );
+                       $this->addJoinConds(
+                               array( 'tag_summary' => array( 'LEFT JOIN', array( 'rev_id=ts_rev_id' ) ) )
+                       );
                        $this->addFields( 'ts_tags' );
                }
 
                if ( isset( $this->params['tag'] ) ) {
                        $this->addTables( 'change_tag' );
-                       $this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'rev_id=ct_rev_id' ) ) ) );
+                       $this->addJoinConds(
+                               array( 'change_tag' => array( 'INNER JOIN', array( 'rev_id=ct_rev_id' ) ) )
+                       );
                        $this->addWhereFld( 'ct_tag', $this->params['tag'] );
                        $index['change_tag'] = 'change_tag_tag_id';
                }
@@ -346,8 +360,13 @@ class ApiQueryContributions extends ApiQueryBase {
                        $vals['size'] = intval( $row->rev_len );
                }
 
-               if ( $this->fld_sizediff && !is_null( $row->rev_len ) && !is_null( $row->rev_parent_id ) ) {
-                       $parentLen = isset( $this->parentLens[$row->rev_parent_id] ) ? $this->parentLens[$row->rev_parent_id] : 0;
+               if ( $this->fld_sizediff
+                       && !is_null( $row->rev_len )
+                       && !is_null( $row->rev_parent_id )
+               ) {
+                       $parentLen = isset( $this->parentLens[$row->rev_parent_id] )
+                               ? $this->parentLens[$row->rev_parent_id]
+                               : 0;
                        $vals['sizediff'] = intval( $row->rev_len - $parentLen );
                }
 
@@ -439,13 +458,17 @@ class ApiQueryContributions extends ApiQueryBase {
        public function getParamDescription() {
                global $wgRCMaxAge;
                $p = $this->getModulePrefix();
+
                return array(
                        'limit' => 'The maximum number of contributions to return',
                        'start' => 'The start timestamp to return from',
                        'end' => 'The end timestamp to return to',
                        'continue' => 'When more results are available, use this to continue',
                        'user' => 'The users to retrieve contributions for',
-                       'userprefix' => "Retrieve contributions for all users whose names begin with this value. Overrides {$p}user",
+                       'userprefix' => array(
+                               "Retrieve contributions for all users whose names begin with this value.",
+                               "Overrides {$p}user",
+                       ),
                        'dir' => $this->getDirectionDescription( $p ),
                        'namespace' => 'Only list contributions in these namespaces',
                        'prop' => array(
@@ -461,8 +484,11 @@ class ApiQueryContributions extends ApiQueryBase {
                                ' patrolled      - Tags patrolled edits',
                                ' tags           - Lists tags for the edit',
                        ),
-                       'show' => array( "Show only items that meet this criteria, e.g. non minor edits only: {$p}show=!minor",
-                                       "NOTE: if {$p}show=patrolled or {$p}show=!patrolled is set, revisions older than \$wgRCMaxAge ($wgRCMaxAge) won't be shown", ),
+                       'show' => array(
+                               "Show only items that meet thse criteria, e.g. non minor edits only: {$p}show=!minor",
+                               "NOTE: If {$p}show=patrolled or {$p}show=!patrolled is set, revisions older than",
+                               "\$wgRCMaxAge ($wgRCMaxAge) won't be shown",
+                       ),
                        'tag' => 'Only list revisions tagged with this tag',
                        'toponly' => 'Only list changes which are the latest revision',
                );
@@ -536,7 +562,10 @@ class ApiQueryContributions extends ApiQueryBase {
                        array( 'code' => 'param_user', 'info' => 'User parameter may not be empty.' ),
                        array( 'code' => 'param_user', 'info' => 'User name user is not valid' ),
                        array( 'show' ),
-                       array( 'code' => 'permissiondenied', 'info' => 'You need the patrol right to request the patrolled flag' ),
+                       array(
+                               'code' => 'permissiondenied',
+                               'info' => 'You need the patrol right to request the patrolled flag'
+                       ),
                ) );
        }
 
index 3c85ea6..37cf483 100644 (file)
@@ -152,6 +152,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        $result->setIndexedTagName( $acceptLang, 'lang' );
                        $vals['acceptlang'] = $acceptLang;
                }
+
                return $vals;
        }
 
@@ -188,6 +189,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                }
                        }
                }
+
                return $retval;
        }
 
@@ -232,7 +234,8 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                '  ratelimits       - Lists all rate limits applying to the current user',
                                '  realname         - Adds the user\'s real name',
                                '  email            - Adds the user\'s email address and email authentication date',
-                               '  acceptlang       - Echoes the Accept-Language header sent by the client in a structured format',
+                               '  acceptlang       - Echoes the Accept-Language header sent by ' .
+                                       'the client in a structured format',
                                '  registrationdate - Adds the user\'s registration date',
                        )
                );
index dccfee6..f22140a 100644 (file)
@@ -58,6 +58,7 @@ class ApiQueryUsers extends ApiQueryBase {
                        'userrights' => array( 'ApiQueryUsers', 'getUserrightsToken' ),
                );
                wfRunHooks( 'APIQueryUsersTokens', array( &$this->tokenFunctions ) );
+
                return $this->tokenFunctions;
        }
 
@@ -67,6 +68,7 @@ class ApiQueryUsers extends ApiQueryBase {
         */
        public static function getUserrightsToken( $user ) {
                global $wgUser;
+
                // Since the permissions check for userrights is non-trivial,
                // don't bother with it here
                return $wgUser->getEditToken( $user->getName() );
@@ -90,10 +92,10 @@ class ApiQueryUsers extends ApiQueryBase {
                        if ( $n === false || $n === '' ) {
                                $vals = array( 'name' => $u, 'invalid' => '' );
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ),
-                                               null, $vals );
+                                       null, $vals );
                                if ( !$fit ) {
                                        $this->setContinueEnumParameter( 'users',
-                                                       implode( '|', array_diff( $users, $done ) ) );
+                                               implode( '|', array_diff( $users, $done ) ) );
                                        $goodNames = array();
                                        break;
                                }
@@ -244,10 +246,10 @@ class ApiQueryUsers extends ApiQueryBase {
                        }
 
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ),
-                                       null, $data[$u] );
+                               null, $data[$u] );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'users',
-                                               implode( '|', array_diff( $users, $done ) ) );
+                                       implode( '|', array_diff( $users, $done ) ) );
                                break;
                        }
                        $done[] = $u;
@@ -312,7 +314,8 @@ class ApiQueryUsers extends ApiQueryBase {
                                '  rights         - Lists all the rights the user(s) has',
                                '  editcount      - Adds the user\'s edit count',
                                '  registration   - Adds the user\'s registration timestamp',
-                               '  emailable      - Tags if the user can and wants to receive email through [[Special:Emailuser]]',
+                               '  emailable      - Tags if the user can and wants to receive ' .
+                                       'email through [[Special:Emailuser]]',
                                '  gender         - Tags the gender of the user. Returns "male", "female", or "unknown"',
                        ),
                        'users' => 'A list of users to obtain the same information for',
index 22843f5..f9af75a 100644 (file)
@@ -44,9 +44,11 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                $this->run( $resultPageSet );
        }
 
-       private $fld_ids = false, $fld_title = false, $fld_patrol = false, $fld_flags = false,
-                       $fld_timestamp = false, $fld_user = false, $fld_comment = false, $fld_parsedcomment = false, $fld_sizes = false,
-                       $fld_notificationtimestamp = false, $fld_userid = false, $fld_loginfo = false;
+       private $fld_ids = false, $fld_title = false, $fld_patrol = false,
+               $fld_flags = false, $fld_timestamp = false, $fld_user = false,
+               $fld_comment = false, $fld_parsedcomment = false, $fld_sizes = false,
+               $fld_notificationtimestamp = false, $fld_userid = false,
+               $fld_loginfo = false;
 
        /**
         * @param $resultPageSet ApiPageSet
@@ -103,7 +105,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $this->addFieldsIf( 'rc_patrolled', $this->fld_patrol );
                        $this->addFieldsIf( array( 'rc_old_len', 'rc_new_len' ), $this->fld_sizes );
                        $this->addFieldsIf( 'wl_notificationtimestamp', $this->fld_notificationtimestamp );
-                       $this->addFieldsIf( array( 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ), $this->fld_loginfo );
+                       $this->addFieldsIf(
+                               array( 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ),
+                               $this->fld_loginfo
+                       );
                } elseif ( $params['allrev'] ) {
                        $this->addFields( 'rc_this_oldid' );
                } else {
@@ -121,7 +126,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                'wl_user' => $userId,
                                'wl_namespace=rc_namespace',
                                'wl_title=rc_title'
-               ) ) ) );
+                       )
+               ) ) );
 
                $this->addWhere( array(
                        'rc_deleted' => 0,
@@ -144,9 +150,9 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                        /* Check for conflicting parameters. */
                        if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
-                                       || ( isset( $show['bot'] ) && isset( $show['!bot'] ) )
-                                       || ( isset( $show['anon'] ) && isset( $show['!anon'] ) )
-                                       || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
+                               || ( isset( $show['bot'] ) && isset( $show['!bot'] ) )
+                               || ( isset( $show['anon'] ) && isset( $show['!anon'] ) )
+                               || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
                        ) {
                                $this->dieUsageMsg( 'show' );
                        }
@@ -155,7 +161,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) {
                                $user = $this->getUser();
                                if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
-                                       $this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
+                                       $this->dieUsage(
+                                               'You need the patrol right to request the patrolled flag',
+                                               'permissiondenied'
+                                       );
                                }
                        }
 
@@ -185,7 +194,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                }
 
                // This is an index optimization for mysql, as done in the Special:Watchlist page
-               $this->addWhereIf( "rc_timestamp > ''", !isset( $params['start'] ) && !isset( $params['end'] ) && $db->getType() == 'mysql' );
+               $this->addWhereIf(
+                       "rc_timestamp > ''",
+                       !isset( $params['start'] ) && !isset( $params['end'] ) && $db->getType() == 'mysql'
+               );
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
 
@@ -194,9 +206,13 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                $res = $this->select( __METHOD__ );
 
                foreach ( $res as $row ) {
-                       if ( ++ $count > $params['limit'] ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
+                       if ( ++$count > $params['limit'] ) {
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
+                               $this->setContinueEnumParameter(
+                                       'start',
+                                       wfTimestamp( TS_ISO_8601, $row->rc_timestamp )
+                               );
                                break;
                        }
 
@@ -205,7 +221,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                $fit = $this->getResult()->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                                if ( !$fit ) {
                                        $this->setContinueEnumParameter( 'start',
-                                                       wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
+                                               wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
                                        break;
                                }
                        } else {
@@ -218,7 +234,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'item' );
+                       $this->getResult()->setIndexedTagName_internal(
+                               array( 'query', $this->getModuleName() ),
+                               'item'
+                       );
                } elseif ( $params['allrev'] ) {
                        $resultPageSet->populateFromRevisionIDs( $ids );
                } else {
@@ -348,6 +367,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        foreach ( $type as $t ) {
                                $retval[] = $this->parseRCType( $t );
                        }
+
                        return $retval;
                }
                switch ( $type ) {
@@ -446,6 +466,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
                        'allrev' => 'Include multiple revisions of the same page within given timeframe',
                        'start' => 'The timestamp to start enumerating from',
@@ -482,12 +503,14 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                ' log            - Log entries',
                        ),
                        'owner' => 'The name of the user whose watchlist you\'d like to access',
-                       'token' => 'Give a security token (settable in preferences) to allow access to another user\'s watchlist'
+                       'token' => 'Give a security token (settable in preferences) to ' .
+                               'allow access to another user\'s watchlist'
                );
        }
 
        public function getResultProperties() {
                global $wgLogTypes;
+
                return array(
                        '' => array(
                                'type' => array(
@@ -574,11 +597,18 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'code' => 'bad_wlowner', 'info' => 'Specified user does not exist' ),
-                       array( 'code' => 'bad_wltoken', 'info' => 'Incorrect watchlist token provided -- please set a correct token in Special:Preferences' ),
+                       array(
+                               'code' => 'bad_wltoken',
+                               'info' => 'Incorrect watchlist token provided -- ' .
+                                       'please set a correct token in Special:Preferences'
+                       ),
                        array( 'code' => 'notloggedin', 'info' => 'You must be logged-in to have a watchlist' ),
                        array( 'code' => 'patrol', 'info' => 'patrol property is not available' ),
                        array( 'show' ),
-                       array( 'code' => 'permissiondenied', 'info' => 'You need the patrol right to request the patrolled flag' ),
+                       array(
+                               'code' => 'permissiondenied',
+                               'info' => 'You need the patrol right to request the patrolled flag'
+                       ),
                        array( 'code' => 'user-excludeuser', 'info' => 'user and excludeuser cannot be used together' ),
                ) );
        }
index ea4e724..b53bea1 100644 (file)
@@ -91,7 +91,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                        $this->addOption( 'ORDER BY', array(
                                'wl_namespace' . $sort,
                                'wl_title' . $sort
-                       ));
+                       ) );
                }
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
                $res = $this->select( __METHOD__ );
@@ -100,7 +100,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                $count = 0;
                foreach ( $res as $row ) {
                        if ( ++$count > $params['limit'] ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               // We've reached the one extra which shows that there are
+                               // additional pages to be had. Stop here...
                                $this->setContinueEnumParameter( 'continue', $row->wl_namespace . '|' . $row->wl_title );
                                break;
                        }
@@ -109,8 +110,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                        if ( is_null( $resultPageSet ) ) {
                                $vals = array();
                                ApiQueryBase::addTitleInfo( $vals, $t );
-                               if ( isset( $prop['changed'] ) && !is_null( $row->wl_notificationtimestamp ) )
-                               {
+                               if ( isset( $prop['changed'] ) && !is_null( $row->wl_notificationtimestamp ) ) {
                                        $vals['changed'] = wfTimestamp( TS_ISO_8601, $row->wl_notificationtimestamp );
                                }
                                $fit = $this->getResult()->addValue( $this->getModuleName(), null, $vals );
@@ -183,7 +183,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                        ),
                        'show' => 'Only list items that meet these criteria',
                        'owner' => 'The name of the user whose watchlist you\'d like to access',
-                       'token' => 'Give a security token (settable in preferences) to allow access to another user\'s watchlist',
+                       'token' => 'Give a security token (settable in preferences) to allow ' .
+                               'access to another user\'s watchlist',
                        'dir' => 'Direction to sort the titles and namespaces in',
                );
        }
@@ -212,7 +213,11 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                        array( 'code' => 'notloggedin', 'info' => 'You must be logged-in to have a watchlist' ),
                        array( 'show' ),
                        array( 'code' => 'bad_wlowner', 'info' => 'Specified user does not exist' ),
-                       array( 'code' => 'bad_wltoken', 'info' => 'Incorrect watchlist token provided -- please set a correct token in Special:Preferences' ),
+                       array(
+                               'code' => 'bad_wltoken',
+                               'info' => 'Incorrect watchlist token provided -- ' .
+                                       'please set a correct token in Special:Preferences'
+                       ),
                ) );
        }
 
index 39c114b..e922020 100644 (file)
@@ -26,9 +26,9 @@
 
 /**
  * This class represents the result of the API operations.
- * It simply wraps a nested array() structure, adding some functions to simplify array's modifications.
- * As various modules execute, they add different pieces of information to this result,
- * structuring it as it will be given to the client.
+ * It simply wraps a nested array() structure, adding some functions to simplify
+ * array's modifications. As various modules execute, they add different pieces
+ * of information to this result, structuring it as it will be given to the client.
  *
  * Each subarray may either be a dictionary - key-value pairs with unique keys,
  * or lists, where the items are added using $data[] = $value notation.
@@ -117,6 +117,7 @@ class ApiResult extends ApiBase {
                        // Objects can't always be cast to string
                        $s = strlen( $value );
                }
+
                return $s;
        }
 
@@ -150,14 +151,17 @@ class ApiResult extends ApiBase {
         * @param array $arr to add $value to
         * @param string $name Index of $arr to add $value at
         * @param $value mixed
-        * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. This parameter used to be
-        *        boolean, and the value of OVERRIDE=1 was specifically chosen so that it would be backwards
-        *        compatible with the new method signature.
+        * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
+        *    This parameter used to be boolean, and the value of OVERRIDE=1 was
+        *    specifically chosen so that it would be backwards compatible with the
+        *    new method signature.
         *
         * @since 1.21 int $flags replaced boolean $override
         */
        public static function setElement( &$arr, $name, $value, $flags = 0 ) {
-               if ( $arr === null || $name === null || $value === null || !is_array( $arr ) || is_array( $name ) ) {
+               if ( $arr === null || $name === null || $value === null
+                       || !is_array( $arr ) || is_array( $name )
+               ) {
                        ApiBase::dieDebug( __METHOD__, 'Bad parameter' );
                }
 
@@ -176,7 +180,10 @@ class ApiResult extends ApiBase {
                                ApiBase::dieDebug( __METHOD__, "Attempting to merge element $name" );
                        }
                } else {
-                       ApiBase::dieDebug( __METHOD__, "Attempting to add element $name=$value, existing value is {$arr[$name]}" );
+                       ApiBase::dieDebug(
+                               __METHOD__,
+                               "Attempting to add element $name=$value, existing value is {$arr[$name]}"
+                       );
                }
        }
 
@@ -271,9 +278,10 @@ class ApiResult extends ApiBase {
         * @param $path array|string|null
         * @param $name string
         * @param $value mixed
-        * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. This parameter used to be
-        *        boolean, and the value of OVERRIDE=1 was specifically chosen so that it would be backwards
-        *        compatible with the new method signature.
+        * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. This
+        *    parameter used to be boolean, and the value of OVERRIDE=1 was specifically
+        *    chosen so that it would be backwards compatible with the new method
+        *    signature.
         * @return bool True if $value fits in the result, false if not
         *
         * @since 1.21 int $flags replaced boolean $override
@@ -287,7 +295,8 @@ class ApiResult extends ApiBase {
                        if ( $newsize > $wgAPIMaxResultSize ) {
                                $this->setWarning(
                                        "This result was truncated because it would otherwise be larger than the " .
-                                                       "limit of {$wgAPIMaxResultSize} bytes" );
+                                               "limit of {$wgAPIMaxResultSize} bytes" );
+
                                return false;
                        }
                        $this->mSize = $newsize;
@@ -322,6 +331,7 @@ class ApiResult extends ApiBase {
                        // Add named element
                        self::setElement( $data, $name, $value, $flags );
                }
+
                return true;
        }
 
@@ -394,6 +404,7 @@ class ApiResult extends ApiBase {
                        $result[] = $error;
                }
                $this->setIndexedTagName( $result, $errorType );
+
                return $result;
        }
 
index b9873f4..2a372e4 100644 (file)
@@ -47,7 +47,14 @@ class ApiRollback extends ApiBase {
                $pageObj = WikiPage::factory( $titleObj );
                $summary = $params['summary'];
                $details = array();
-               $retval = $pageObj->doRollback( $this->getRbUser(), $summary, $params['token'], $params['markbot'], $details, $this->getUser() );
+               $retval = $pageObj->doRollback(
+                       $this->getRbUser(),
+                       $summary,
+                       $params['token'],
+                       $params['markbot'],
+                       $details,
+                       $this->getUser()
+               );
 
                if ( $retval ) {
                        // We don't care about multiple errors, just report one of them
@@ -107,11 +114,14 @@ class ApiRollback extends ApiBase {
        public function getParamDescription() {
                return array(
                        'title' => 'Title of the page you want to rollback.',
-                       'user' => 'Name of the user whose edits are to be rolled back. If set incorrectly, you\'ll get a badtoken error.',
-                       'token' => "A rollback token previously retrieved through {$this->getModulePrefix()}prop=revisions",
+                       'user' => 'Name of the user whose edits are to be rolled back. If ' .
+                               'set incorrectly, you\'ll get a badtoken error.',
+                       'token' => 'A rollback token previously retrieved through ' .
+                               "{$this->getModulePrefix()}prop=revisions",
                        'summary' => 'Custom edit summary. If empty, default summary will be used',
                        'markbot' => 'Mark the reverted edits and the revert as bot edits',
-                       'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
+                       'watchlist' => 'Unconditionally add or remove the page from your watchlist, ' .
+                               'use preferences or do not change watch',
                );
        }
 
@@ -130,8 +140,8 @@ class ApiRollback extends ApiBase {
 
        public function getDescription() {
                return array(
-                       'Undo the last edit to the page. If the last user who edited the page made multiple edits in a row,',
-                       'they will all be rolled back'
+                       'Undo the last edit to the page. If the last user who edited the page made',
+                       'multiple edits in a row, they will all be rolled back'
                );
        }
 
@@ -194,7 +204,8 @@ class ApiRollback extends ApiBase {
        public function getExamples() {
                return array(
                        'api.php?action=rollback&title=Main%20Page&user=Catrope&token=123ABC',
-                       'api.php?action=rollback&title=Main%20Page&user=217.121.114.116&token=123ABC&summary=Reverting%20vandalism&markbot=1'
+                       'api.php?action=rollback&title=Main%20Page&user=217.121.114.116&' .
+                               'token=123ABC&summary=Reverting%20vandalism&markbot=1'
                );
        }
 
index d219c91..e01f0fa 100644 (file)
@@ -107,6 +107,7 @@ class ApiRsd extends ApiBase {
                        ),
                );
                wfRunHooks( 'ApiRsdServiceApis', array( &$apis ) );
+
                return $apis;
        }
 
@@ -149,6 +150,7 @@ class ApiRsd extends ApiBase {
                        }
                        $outputData[] = $data;
                }
+
                return $outputData;
        }
 }
index 53a68fd..dc593e5 100644 (file)
@@ -48,7 +48,10 @@ class ApiSetNotificationTimestamp extends ApiBase {
 
                $pageSet = $this->getPageSet();
                if ( $params['entirewatchlist'] && $pageSet->getDataSource() !== null ) {
-                       $this->dieUsage( "Cannot use 'entirewatchlist' at the same time as '{$pageSet->getDataSource()}'", 'multisource' );
+                       $this->dieUsage(
+                               "Cannot use 'entirewatchlist' at the same time as '{$pageSet->getDataSource()}'",
+                               'multisource'
+                       );
                }
 
                $dbw = wfGetDB( DB_MASTER, 'api' );
@@ -95,7 +98,9 @@ class ApiSetNotificationTimestamp extends ApiBase {
                                __METHOD__
                        );
 
-                       $result['notificationtimestamp'] = ( is_null( $timestamp ) ? '' : wfTimestamp( TS_ISO_8601, $timestamp ) );
+                       $result['notificationtimestamp'] = is_null( $timestamp )
+                               ? ''
+                               : wfTimestamp( TS_ISO_8601, $timestamp );
                } else {
                        // First, log the invalid titles
                        foreach ( $pageSet->getInvalidTitles() as $title ) {
@@ -128,7 +133,9 @@ class ApiSetNotificationTimestamp extends ApiBase {
 
                        // Query the results of our update
                        $timestamps = array();
-                       $res = $dbw->select( 'watchlist', array( 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ),
+                       $res = $dbw->select(
+                               'watchlist',
+                               array( 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ),
                                array( 'wl_user' => $user->getID(), $lb->constructSet( 'wl', $dbw ) ),
                                __METHOD__
                        );
@@ -172,6 +179,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                if ( !isset( $this->mPageSet ) ) {
                        $this->mPageSet = new ApiPageSet( $this );
                }
+
                return $this->mPageSet;
        }
 
@@ -210,8 +218,8 @@ class ApiSetNotificationTimestamp extends ApiBase {
                if ( $flags ) {
                        $result += $this->getPageSet()->getFinalParams( $flags );
                }
-               return $result;
 
+               return $result;
        }
 
        public function getParamDescription() {
@@ -271,6 +279,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
 
        public function getPossibleErrors() {
                $ps = $this->getPageSet();
+
                return array_merge(
                        parent::getPossibleErrors(),
                        $ps->getFinalPossibleErrors(),
@@ -279,7 +288,8 @@ class ApiSetNotificationTimestamp extends ApiBase {
                        $this->getRequireOnlyOneParameterErrorMessages(
                                array_merge( array( 'entirewatchlist' ), array_keys( $ps->getFinalParams() ) ) ),
                        array(
-                               array( 'code' => 'notloggedin', 'info' => 'Anonymous users cannot use watchlist change notifications' ),
+                               array( 'code' => 'notloggedin', 'info'
+                               => 'Anonymous users cannot use watchlist change notifications' ),
                                array( 'code' => 'multpages', 'info' => 'torevid may only be used with a single page' ),
                                array( 'code' => 'multpages', 'info' => 'newerthanrevid may only be used with a single page' ),
                        )
@@ -288,9 +298,14 @@ class ApiSetNotificationTimestamp extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=setnotificationtimestamp&entirewatchlist=&token=123ABC' => 'Reset the notification status for the entire watchlist',
-                       'api.php?action=setnotificationtimestamp&titles=Main_page&token=123ABC' => 'Reset the notification status for "Main page"',
-                       'api.php?action=setnotificationtimestamp&titles=Main_page&timestamp=2012-01-01T00:00:00Z&token=123ABC' => 'Set the notification timestamp for "Main page" so all edits since 1 January 2012 are unviewed',
+                       'api.php?action=setnotificationtimestamp&entirewatchlist=&token=123ABC'
+                               => 'Reset the notification status for the entire watchlist',
+                       'api.php?action=setnotificationtimestamp&titles=Main_page&token=123ABC'
+                               => 'Reset the notification status for "Main page"',
+                       'api.php?action=setnotificationtimestamp&titles=Main_page&' .
+                               'timestamp=2012-01-01T00:00:00Z&token=123ABC'
+                               => 'Set the notification timestamp for "Main page" so all edits ' .
+                                       'since 1 January 2012 are unviewed',
                );
        }
 
index d220a5e..6862668 100644 (file)
@@ -67,6 +67,7 @@ class ApiTokens extends ApiBase {
                wfRunHooks( 'ApiTokensGetTokenTypes', array( &$types ) );
                ksort( $types );
                wfProfileOut( __METHOD__ );
+
                return $types;
        }
 
index 6a739a2..dabb8da 100644 (file)
@@ -96,9 +96,12 @@ class ApiUnblock extends ApiBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+
                return array(
-                       'id' => "ID of the block you want to unblock (obtained through list=blocks). Cannot be used together with {$p}user",
-                       'user' => "Username, IP address or IP range you want to unblock. Cannot be used together with {$p}id",
+                       'id' => "ID of the block you want to unblock (obtained through list=blocks). ' .
+                               'Cannot be used together with {$p}user",
+                       'user' => "Username, IP address or IP range you want to unblock. ' .
+                               'Cannot be used together with {$p}id",
                        'token' => "An unblock token previously obtained through prop=info",
                        'reason' => 'Reason for unblock',
                );
index 4bbe568..93cefef 100644 (file)
@@ -122,8 +122,10 @@ class ApiUndelete extends ApiBase {
                        'title' => 'Title of the page you want to restore',
                        'token' => 'An undelete token previously retrieved through list=deletedrevs',
                        'reason' => 'Reason for restoring',
-                       'timestamps' => 'Timestamps of the revisions to restore. If not set, all revisions will be restored.',
-                       'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
+                       'timestamps' => 'Timestamps of the revisions to restore. If not set, all ' .
+                               'revisions will be restored.',
+                       'watchlist' => 'Unconditionally add or remove the page from your ' .
+                               'watchlist, use preferences or do not change watch',
                );
        }
 
@@ -140,8 +142,8 @@ class ApiUndelete extends ApiBase {
 
        public function getDescription() {
                return array(
-                       'Restore certain revisions of a deleted page. A list of deleted revisions (including timestamps) can be',
-                       'retrieved through list=deletedrevs'
+                       'Restore certain revisions of a deleted page. A list of deleted revisions ',
+                       '(including timestamps) can be retrieved through list=deletedrevs'
                );
        }
 
index 5839edc..01e0f6e 100644 (file)
@@ -141,6 +141,7 @@ class ApiUpload extends ApiBase {
                        // Stash the file and get stash result
                        return $this->getStashResult( $warnings );
                }
+
                // This is the most common case -- a normal upload with no warnings
                // performUpload will return a formatted properly for the API with status
                return $this->performUpload( $warnings );
@@ -165,6 +166,7 @@ class ApiUpload extends ApiBase {
                } catch ( MWException $e ) {
                        $this->dieUsage( $e->getMessage(), 'stashfailed' );
                }
+
                return $result;
        }
 
@@ -185,6 +187,7 @@ class ApiUpload extends ApiBase {
                } catch ( MWException $e ) {
                        $result['warnings']['stashfailed'] = $e->getMessage();
                }
+
                return $result;
        }
 
@@ -217,6 +220,7 @@ class ApiUpload extends ApiBase {
                                $chunkPath, $chunkSize, $this->mParams['offset'] );
                        if ( !$status->isGood() ) {
                                $this->dieUsage( $status->getWikiText(), 'stashfailed' );
+
                                return array();
                        }
                }
@@ -252,6 +256,7 @@ class ApiUpload extends ApiBase {
                                $status = $this->mUpload->concatenateChunks();
                                if ( !$status->isGood() ) {
                                        $this->dieUsage( $status->getWikiText(), 'stashfailed' );
+
                                        return array();
                                }
 
@@ -265,6 +270,7 @@ class ApiUpload extends ApiBase {
                }
                $result['filekey'] = $filekey;
                $result['offset'] = $this->mParams['offset'] + $chunkSize;
+
                return $result;
        }
 
@@ -287,6 +293,7 @@ class ApiUpload extends ApiBase {
                        wfDebug( __METHOD__ . ' ' . $message . "\n" );
                        throw new MWException( $message );
                }
+
                return $fileKey;
        }
 
@@ -341,6 +348,7 @@ class ApiUpload extends ApiBase {
                        }
                        unset( $progress['status'] ); // remove Status object
                        $this->getResult()->addValue( null, $this->getModuleName(), $progress );
+
                        return false;
                }
 
@@ -357,6 +365,7 @@ class ApiUpload extends ApiBase {
                                $sessionData['sessionkey'] = $this->mParams['statuskey'];
                        }
                        $this->getResult()->addValue( null, $this->getModuleName(), $sessionData );
+
                        return false;
                }
 
@@ -481,7 +490,7 @@ class ApiUpload extends ApiBase {
                                break;
                        case UploadBase::ILLEGAL_FILENAME:
                                $this->dieRecoverableError( 'illegal-filename', 'filename',
-                                               array( 'filename' => $verification['filtered'] ) );
+                                       array( 'filename' => $verification['filtered'] ) );
                                break;
                        case UploadBase::FILENAME_TOO_LONG:
                                $this->dieRecoverableError( 'filename-toolong', 'filename' );
@@ -521,15 +530,15 @@ class ApiUpload extends ApiBase {
                        case UploadBase::VERIFICATION_ERROR:
                                $this->getResult()->setIndexedTagName( $verification['details'], 'detail' );
                                $this->dieUsage( 'This file did not pass file verification', 'verification-error',
-                                               0, array( 'details' => $verification['details'] ) );
+                                       0, array( 'details' => $verification['details'] ) );
                                break;
                        case UploadBase::HOOK_ABORTED:
                                $this->dieUsage( "The modification you tried to make was aborted by an extension hook",
-                                               'hookaborted', 0, array( 'error' => $verification['error'] ) );
+                                       'hookaborted', 0, array( 'error' => $verification['error'] ) );
                                break;
                        default:
                                $this->dieUsage( 'An unknown error occurred', 'unknown-error',
-                                               0, array( 'code' => $verification['status'] ) );
+                                       0, array( 'code' => $verification['status'] ) );
                                break;
                }
        }
@@ -565,10 +574,13 @@ class ApiUpload extends ApiBase {
                        if ( isset( $warnings['exists'] ) ) {
                                $warning = $warnings['exists'];
                                unset( $warnings['exists'] );
-                               $localFile = isset( $warning['normalizedFile'] ) ? $warning['normalizedFile'] : $warning['file'];
+                               $localFile = isset( $warning['normalizedFile'] )
+                                       ? $warning['normalizedFile']
+                                       : $warning['file'];
                                $warnings[$warning['warning']] = $localFile->getName();
                        }
                }
+
                return $warnings;
        }
 
@@ -741,16 +753,19 @@ class ApiUpload extends ApiBase {
                $params = array(
                        'filename' => 'Target filename',
                        'token' => 'Edit token. You can get one of these through prop=info',
-                       'comment' => 'Upload comment. Also used as the initial page text for new files if "text" is not specified',
+                       'comment' => 'Upload comment. Also used as the initial page text for new ' .
+                               'files if "text" is not specified',
                        'text' => 'Initial page text for new files',
                        'watch' => 'Watch the page',
-                       'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
+                       'watchlist' => 'Unconditionally add or remove the page from your watchlist, ' .
+                               'use preferences or do not change watch',
                        'ignorewarnings' => 'Ignore any warnings',
                        'file' => 'File contents',
                        'url' => 'URL to fetch the file from',
                        'filekey' => 'Key that identifies a previous upload that was stashed temporarily.',
                        'sessionkey' => 'Same as filekey, maintained for backward compatibility.',
-                       'stash' => 'If set, the server will not add the file to the repository and stash it temporarily.',
+                       'stash' => 'If set, the server will not add the file to the repository ' .
+                               'and stash it temporarily.',
 
                        'chunk' => 'Chunk contents',
                        'offset' => 'Offset of chunk in bytes',
@@ -764,7 +779,6 @@ class ApiUpload extends ApiBase {
                );
 
                return $params;
-
        }
 
        public function getResultProperties() {
@@ -849,7 +863,8 @@ class ApiUpload extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=upload&filename=Wiki.png&url=http%3A//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png'
+                       'api.php?action=upload&filename=Wiki.png' .
+                       '&url=http%3A//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png'
                                => 'Upload from a URL',
                        'api.php?action=upload&filename=Wiki.png&filekey=filekey&ignorewarnings=1'
                                => 'Complete an upload that failed due to warnings',
index 7d30828..5e068cb 100644 (file)
@@ -72,6 +72,7 @@ class ApiUserrights extends ApiBase {
                }
 
                $this->mUser = $user;
+
                return $user;
        }
 
index c7d636a..7ad286f 100644 (file)
@@ -49,21 +49,26 @@ class ApiWatch extends ApiBase {
 
                $res = array( 'title' => $title->getPrefixedText() );
 
-               // Currently unnecessary, code to act as a safeguard against any change in current behavior of uselang
+               // Currently unnecessary, code to act as a safeguard against any change
+               // in current behavior of uselang.
                // Copy from ApiParse
                $oldLang = null;
-               if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
+               if ( isset( $params['uselang'] ) &&
+                       $params['uselang'] != $this->getContext()->getLanguage()->getCode()
+               ) {
                        $oldLang = $this->getContext()->getLanguage(); // Backup language
                        $this->getContext()->setLanguage( Language::factory( $params['uselang'] ) );
                }
 
                if ( $params['unwatch'] ) {
                        $res['unwatched'] = '';
-                       $res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
+                       $res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )
+                               ->title( $title )->parseAsBlock();
                        $status = UnwatchAction::doUnwatch( $title, $user );
                } else {
                        $res['watched'] = '';
-                       $res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
+                       $res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )
+                               ->title( $title )->parseAsBlock();
                        $status = WatchAction::doWatch( $title, $user );
                }
 
index 193f20f..4775b96 100644 (file)
@@ -48,6 +48,7 @@ class BacklinkCache {
        /**
         * Multi dimensions array representing batches. Keys are:
         *  > (string) links table name
+        *   > (int) batch size
         *    > 'numRows' : Number of rows for this link table
         *    > 'batches' : array( $start, $end )
         *
@@ -169,9 +170,10 @@ class BacklinkCache {
         * @param $startId Integer|false
         * @param $endId Integer|false
         * @param $max Integer|INF
+        * @param $select string 'all' or 'ids'
         * @return ResultWrapper
         */
-       protected function queryLinks( $table, $startId, $endId, $max ) {
+       protected function queryLinks( $table, $startId, $endId, $max, $select = 'all' ) {
                wfProfileIn( __METHOD__ );
 
                $fromField = $this->getPrefix( $table ) . '_from';
@@ -192,18 +194,32 @@ class BacklinkCache {
                        if ( $endId ) {
                                $conds[] = "$fromField <= " . intval( $endId );
                        }
-                       $options = array( 'STRAIGHT_JOIN', 'ORDER BY' => $fromField );
+                       $options = array( 'ORDER BY' => $fromField );
                        if ( is_finite( $max ) && $max > 0 ) {
                                $options['LIMIT'] = $max;
                        }
 
-                       $res = $this->getDB()->select(
-                               array( $table, 'page' ),
-                               array( 'page_namespace', 'page_title', 'page_id' ),
-                               $conds,
-                               __METHOD__,
-                               $options
-                       );
+                       if ( $select === 'ids' ) {
+                               // Just select from the backlink table and ignore the page JOIN
+                               $res = $this->getDB()->select(
+                                       $table,
+                                       array( $this->getPrefix( $table ) . '_from AS page_id' ),
+                                       array_filter( $conds, function( $clause ) { // kind of janky
+                                               return !preg_match( '/(\b|=)page_id(\b|=)/', $clause );
+                                       } ),
+                                       __METHOD__,
+                                       $options
+                               );
+                       } else {
+                               // Select from the backlink table and JOIN with page title information
+                               $res = $this->getDB()->select(
+                                       array( $table, 'page' ),
+                                       array( 'page_namespace', 'page_title', 'page_id' ),
+                                       $conds,
+                                       __METHOD__,
+                                       array_merge( array( 'STRAIGHT_JOIN' ), $options )
+                               );
+                       }
 
                        if ( !$startId && !$endId && $res->numRows() < $max ) {
                                // The full results fit within the limit, so cache them
@@ -280,13 +296,13 @@ class BacklinkCache {
                        case 'imagelinks':
                                $conds = array(
                                        'il_to' => $this->title->getDBkey(),
-                                       'page_id=il_from'
+                                       "page_id={$prefix}_from"
                                );
                                break;
                        case 'categorylinks':
                                $conds = array(
                                        'cl_to' => $this->title->getDBkey(),
-                                       'page_id=cl_from',
+                                       "page_id={$prefix}_from"
                                );
                                break;
                        default:
@@ -316,7 +332,7 @@ class BacklinkCache {
         * @return integer
         */
        public function getNumLinks( $table, $max = INF ) {
-               global $wgMemc;
+               global $wgMemc, $wgUpdateRowsPerJob;
 
                // 1) try partition cache ...
                if ( isset( $this->partitionCache[$table] ) ) {
@@ -338,9 +354,17 @@ class BacklinkCache {
                }
 
                // 4) fetch from the database ...
-               $count = $this->getLinks( $table, false, false, $max )->count();
-               if ( $count < $max ) { // full count
-                       $wgMemc->set( $memcKey, $count, self::CACHE_EXPIRY );
+               if ( is_infinite( $max ) ) { // no limit at all
+                       // Use partition() since it will batch the query and skip the JOIN.
+                       // Use $wgUpdateRowsPerJob just to encourage cache reuse for jobs.
+                       $this->partition( $table, $wgUpdateRowsPerJob ); // updates $this->partitionCache
+                       return $this->partitionCache[$table][$wgUpdateRowsPerJob]['numRows'];
+               } else { // probably some sane limit
+                       // Fetch the full title info, since the caller will likely need it next
+                       $count = $this->getLinks( $table, false, false, $max )->count();
+                       if ( $count < $max ) { // full count
+                               $wgMemc->set( $memcKey, $count, self::CACHE_EXPIRY );
+                       }
                }
 
                return min( $max, $count );
@@ -396,7 +420,7 @@ class BacklinkCache {
                $selectSize = max( $batchSize, 200000 - ( 200000 % $batchSize ) );
                $start = false;
                do {
-                       $res = $this->queryLinks( $table, $start, false, $selectSize );
+                       $res = $this->queryLinks( $table, $start, false, $selectSize, 'ids' );
                        $partitions = $this->partitionResult( $res, $batchSize, false );
                        // Merge the link count and range partitions for this chunk
                        $cacheEntry['numRows'] += $partitions['numRows'];
index 8d4c9c1..48a8d03 100644 (file)
@@ -26,7 +26,6 @@
  * mAttribs:
  *  rc_id           id of the row in the recentchanges table
  *  rc_timestamp    time the entry was made
- *  rc_cur_time     timestamp on the cur row
  *  rc_namespace    namespace #
  *  rc_title        non-prefixed db key
  *  rc_type         is new entry, used to determine whether updating is necessary
@@ -155,7 +154,6 @@ class RecentChange {
                return array(
                        'rc_id',
                        'rc_timestamp',
-                       'rc_cur_time',
                        'rc_user',
                        'rc_user_text',
                        'rc_namespace',
@@ -254,7 +252,6 @@ class RecentChange {
 
                # 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
@@ -495,7 +492,6 @@ class RecentChange {
                $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,
@@ -555,7 +551,6 @@ class RecentChange {
                $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,
@@ -665,7 +660,6 @@ class RecentChange {
                $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,
@@ -721,7 +715,6 @@ class RecentChange {
                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,
index c8e98a7..6cf7376 100644 (file)
@@ -285,9 +285,16 @@ class RedisConnectionPool {
        }
 
        /**
-        * Resend an AUTH request to the redis server (useful after disconnects)
+        * Re-send an AUTH request to the redis server (useful after disconnects).
         *
-        * This method is for internal use only
+        * This works around an upstream bug in phpredis. phpredis hides disconnects by transparently
+        * reconnecting, but it neglects to re-authenticate the new connection. To the user of the
+        * phpredis client API this manifests as a seemingly random tendency of connections to lose
+        * their authentication status.
+        *
+        * This method is for internal use only.
+        *
+        * @see https://github.com/nicolasff/phpredis/issues/403
         *
         * @param string $server
         * @param Redis $conn
@@ -317,6 +324,7 @@ class RedisConnRef {
        protected $conn;
 
        protected $server; // string
+       protected $lastError; // string
 
        /**
         * @param $pool RedisConnectionPool
@@ -329,8 +337,29 @@ class RedisConnRef {
                $this->conn = $conn;
        }
 
+       public function getLastError() {
+               return $this->lastError;
+       }
+
+       public function clearLastError() {
+               $this->lastError = null;
+       }
+
        public function __call( $name, $arguments ) {
-               return call_user_func_array( array( $this->conn, $name ), $arguments );
+               $conn = $this->conn; // convenience
+
+               $conn->clearLastError();
+               $res = call_user_func_array( array( $conn, $name ), $arguments );
+               if ( preg_match( '/^ERR operation not permitted\b/', $conn->getLastError() ) ) {
+                       $this->pool->reauthenticateConnection( $this->server, $conn );
+                       $conn->clearLastError();
+                       $res = call_user_func_array( array( $conn, $name ), $arguments );
+                       wfDebugLog( 'redis', "Used automatic re-authentication for method '$name'." );
+               }
+
+               $this->lastError = $conn->getLastError() ?: $this->lastError;
+
+               return $res;
        }
 
        /**
@@ -369,6 +398,8 @@ class RedisConnRef {
                        wfDebugLog( 'redis', "Lua script error on server $server: " . $conn->getLastError() );
                }
 
+               $this->lastError = $conn->getLastError() ?: $this->lastError;
+
                return $res;
        }
 
index 8991290..89ef4e4 100644 (file)
@@ -354,6 +354,8 @@ abstract class ContentHandler {
         * @throws MWException if the model id isn't known.
         */
        public static function getLocalizedName( $name ) {
+               // Messages: content-model-wikitext, content-model-text,
+               // content-model-javascript, content-model-css
                $key = "content-model-$name";
 
                $msg = wfMessage( $key );
index 30e92e5..c677d74 100644 (file)
@@ -243,7 +243,6 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        protected $mTablePrefix;
        protected $mFlags;
        protected $mForeign;
-       protected $mTrxLevel = 0;
        protected $mErrorCount = 0;
        protected $mLBInfo = array();
        protected $mFakeSlaveLag = null, $mFakeMaster = false;
@@ -256,6 +255,14 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        protected $delimiter = ';';
 
+       /**
+        * Either 1 if a transaction is active or 0 otherwise.
+        * The other Trx fields may not be meaningfull if this is 0.
+        *
+        * @var int
+        */
+       protected $mTrxLevel = 0;
+
        /**
         * Remembers the function name given for starting the most recent transaction via begin().
         * Used to provide additional context for error reporting.
@@ -391,16 +398,15 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * Gets or sets the current transaction level.
+        * Gets the current transaction level.
         *
         * Historically, transactions were allowed to be "nested". This is no
         * longer supported, so this function really only returns a boolean.
         *
-        * @param int $level An integer (0 or 1), or omitted to leave it unchanged.
         * @return int The previous value
         */
-       public function trxLevel( $level = null ) {
-               return wfSetVar( $this->mTrxLevel, $level );
+       public function trxLevel() {
+               return $this->mTrxLevel;
        }
 
        /**
@@ -706,7 +712,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $tablePrefix = $params['tablePrefix'];
                        $foreign = $params['foreign'];
                } else { // legacy calling pattern
-                       wfDeprecated( __METHOD__ . " method called without parameter array.", "1.22" );
+                       wfDeprecated( __METHOD__ . " method called without parameter array.", "1.23" );
                        $args = func_get_args();
                        $server = isset( $args[0] ) ? $args[0] : false;
                        $user = isset( $args[1] ) ? $args[1] : false;
@@ -1038,9 +1044,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                # Try reconnecting if the connection was lost
                if ( false === $ret && $this->wasErrorReissuable() ) {
                        # Transaction is gone, like it or not
+                       $hadTrx = $this->mTrxLevel; // possible lost transaction
+                       wfDebug( "Connection lost, reconnecting...\n" );
                        $this->mTrxLevel = 0;
-                       $this->mTrxIdleCallbacks = array(); // cancel
-                       $this->mTrxPreCommitCallbacks = array(); // cancel
                        wfDebug( "Connection lost, reconnecting...\n" );
 
                        if ( $this->ping() ) {
@@ -1053,7 +1059,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                                        # Not a database error to lose a transaction after a minute or two
                                        wfLogDBError( "Connection lost and reconnected after {$elapsed}s, query: $sqlx\n" );
                                }
-                               $ret = $this->doQuery( $commentedSql );
+                               if ( !$hadTrx ) {
+                                       # Should be safe to silently retry
+                                       $ret = $this->doQuery( $commentedSql );
+                               }
                        } else {
                                wfDebug( "Failed\n" );
                        }
@@ -3238,6 +3247,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * @since 1.23
         * @param string $fname
+        * @throws DBError
         */
        final public function startAtomic( $fname = __METHOD__ ) {
                if ( !$this->mTrxLevel ) {
@@ -3249,6 +3259,32 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                $this->mTrxAtomicLevels->push( $fname );
        }
 
+       /**
+        * Ends an atomic section of SQL statements
+        *
+        * Ends the next section of atomic SQL statements and commits the transaction
+        * if necessary.
+        *
+        * @since 1.23
+        * @see DatabaseBase::startAtomic
+        * @param string $fname
+        * @throws DBError
+        */
+       final public function endAtomic( $fname = __METHOD__ ) {
+               if ( !$this->mTrxLevel ) {
+                       throw new DBUnexpectedError( $this, 'No atomic transaction is open.' );
+               }
+               if ( $this->mTrxAtomicLevels->isEmpty() ||
+                       $this->mTrxAtomicLevels->pop() !== $fname
+               ) {
+                       throw new DBUnexpectedError( $this, 'Invalid atomic section ended.' );
+               }
+
+               if ( $this->mTrxAtomicLevels->isEmpty() && $this->mTrxAutomaticAtomic ) {
+                       $this->commit( $fname, 'flush' );
+               }
+       }
+
        /**
         * Begin a transaction. If a transaction is already in progress, that transaction will be committed before the
         * new transaction is started.
@@ -3260,6 +3296,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * transaction was started automatically because of the DBO_TRX flag.
         *
         * @param $fname string
+        * @throws DBError
         */
        final public function begin( $fname = __METHOD__ ) {
                global $wgDebugDBTransactions;
@@ -3302,6 +3339,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                $this->mTrxAutomatic = false;
                $this->mTrxAutomaticAtomic = false;
                $this->mTrxAtomicLevels = new SplStack;
+               $this->mTrxIdleCallbacks = array();
+               $this->mTrxPreCommitCallbacks = array();
        }
 
        /**
@@ -3315,28 +3354,6 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                $this->mTrxLevel = 1;
        }
 
-       /**
-        * Ends an atomic section of SQL statements
-        *
-        * Ends the next section of atomic SQL statements and commits the transaction
-        * if necessary.
-        *
-        * @since 1.23
-        * @see DatabaseBase::startAtomic
-        * @param string $fname
-        */
-       final public function endAtomic( $fname = __METHOD__ ) {
-               if ( $this->mTrxAtomicLevels->isEmpty() ||
-                       $this->mTrxAtomicLevels->pop() !== $fname
-               ) {
-                       throw new DBUnexpectedError( $this, 'Invalid atomic section ended.' );
-               }
-
-               if ( $this->mTrxAtomicLevels->isEmpty() && $this->mTrxAutomaticAtomic ) {
-                       $this->commit( $fname, 'flush' );
-               }
-       }
-
        /**
         * Commits a transaction previously started using begin().
         * If no transaction is in progress, a warning is issued.
@@ -3374,7 +3391,6 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                if ( $this->mTrxDoneWrites ) {
                        Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
                }
-               $this->mTrxDoneWrites = false;
                $this->runOnTransactionIdleCallbacks();
        }
 
@@ -3410,7 +3426,6 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                if ( $this->mTrxDoneWrites ) {
                        Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
                }
-               $this->mTrxDoneWrites = false;
        }
 
        /**
index 26c9d24..cdfa769 100644 (file)
@@ -76,6 +76,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                } catch ( Exception $ex ) {
                        wfProfileOut( "dbconnect-$server" );
                        wfProfileOut( __METHOD__ );
+                       $this->restoreErrorHandler();
                        throw $ex;
                }
                $error = $this->restoreErrorHandler();
index e564a16..72371a2 100644 (file)
@@ -370,7 +370,14 @@ class DatabasePostgres extends DatabaseBase {
                $this->connectString = $this->makeConnectionString( $connectVars, PGSQL_CONNECT_FORCE_NEW );
                $this->close();
                $this->installErrorHandler();
-               $this->mConn = pg_connect( $this->connectString );
+
+               try {
+                       $this->mConn = pg_connect( $this->connectString );
+               } catch ( Exception $ex ) {
+                       $this->restoreErrorHandler();
+                       throw $ex;
+               }
+
                $phpError = $this->restoreErrorHandler();
 
                if ( !$this->mConn ) {
index 28f8889..cf78ce0 100644 (file)
  * @ingroup DifferenceEngine
  */
 
+/**
+ * Constant to indicate diff cache compatibility.
+ * Bump this when changing the diff formatting in a way that
+ * fixes important bugs or such to force cached diff views to
+ * clear.
+ */
+define( 'MW_DIFF_VERSION', '1.11a' );
+
 /**
  * @todo document
  * @ingroup DifferenceEngine
  */
 class DifferenceEngine extends ContextSource {
-       /**
-        * Constant to indicate diff cache compatibility.
-        * Bump this when changing the diff formatting in a way that
-        * fixes important bugs or such to force cached diff views to
-        * clear.
-        */
-       const CACHE_VERSION ='1.11a';
+       public $mOldid;
+       public $mNewid;
+       private $mOldTags;
+       private $mNewTags;
 
-       /**#@+
-        * @private
-        */
-       public $oldId;
-       public $newId;
-       private $oldTags;
-       private $newTags;
        /**
         * @var Content
         */
-       public $oldContent;
-       /**
-        * @var Content
-        */
-       public $newContent;
-       protected $diffLang;
+       public $mOldContent;
+       public $mNewContent;
+       protected $mDiffLang;
 
        /**
         * @var Title
         */
-       public $oldPage;
-       /**
-        * @var Title
-        */
-       public $newPage;
+       public $mOldPage;
+       public $mNewPage;
 
        /**
         * @var Revision
         */
-       public $oldRev;
-       /**
-        * @var Revision
-        */
-       public $newRev;
-       private $revisionsIdsLoaded = false; // Have the revisions IDs been loaded
-       public $revisionsLoaded = false; // Have the revisions been loaded
-       public $textLoaded = 0; // How many text blobs have been loaded, 0, 1 or 2?
-       public $cacheHit = false; // Was the diff fetched from cache?
+       public $mOldRev;
+       public $mNewRev;
+       private $mRevisionsIdsLoaded = false; // Have the revisions IDs been loaded
+       public $mRevisionsLoaded = false; // Have the revisions been loaded
+       public $mTextLoaded = 0; // How many text blobs have been loaded, 0, 1 or 2?
+       public $mCacheHit = false; // Was the diff fetched from cache?
 
        /**
         * Set this to true to add debug info to the HTML output.
@@ -82,13 +71,12 @@ class DifferenceEngine extends ContextSource {
 
        // If true, line X is not displayed when X is 1, for example to increase
        // readability and conserve space with many small diffs.
-       protected $reducedLineNumbers = false;
+       protected $mReducedLineNumbers = false;
 
        // Link to action=markpatrolled
-       protected $markPatrolledLink = null;
+       protected $mMarkPatrolledLink = null;
 
        protected $unhide = false; # show rev_deleted content if allowed
-       private $refreshCache;
        /**#@-*/
 
        /**
@@ -109,9 +97,9 @@ class DifferenceEngine extends ContextSource {
 
                wfDebug( "DifferenceEngine old '$old' new '$new' rcid '$rcid'\n" );
 
-               $this->oldId = $old;
-               $this->newId = $new;
-               $this->refreshCache = $refreshCache;
+               $this->mOldid = $old;
+               $this->mNewid = $new;
+               $this->mRefreshCache = $refreshCache;
                $this->unhide = $unhide;
        }
 
@@ -119,25 +107,25 @@ class DifferenceEngine extends ContextSource {
         * @param $value bool
         */
        function setReducedLineNumbers( $value = true ) {
-               $this->reducedLineNumbers = $value;
+               $this->mReducedLineNumbers = $value;
        }
 
        /**
         * @return Language
         */
        function getDiffLang() {
-               if ( $this->diffLang === null ) {
+               if ( $this->mDiffLang === null ) {
                        # Default language in which the diff text is written.
-                       $this->diffLang = $this->getTitle()->getPageLanguage();
+                       $this->mDiffLang = $this->getTitle()->getPageLanguage();
                }
-               return $this->diffLang;
+               return $this->mDiffLang;
        }
 
        /**
         * @return bool
         */
        function wasCacheHit() {
-               return $this->cacheHit;
+               return $this->mCacheHit;
        }
 
        /**
@@ -145,7 +133,7 @@ class DifferenceEngine extends ContextSource {
         */
        function getOldid() {
                $this->loadRevisionIds();
-               return $this->oldId;
+               return $this->mOldid;
        }
 
        /**
@@ -153,7 +141,7 @@ class DifferenceEngine extends ContextSource {
         */
        function getNewid() {
                $this->loadRevisionIds();
-               return $this->newId;
+               return $this->mNewid;
        }
 
        /**
@@ -200,15 +188,15 @@ class DifferenceEngine extends ContextSource {
                $out = $this->getOutput();
 
                $missing = array();
-               if ( $this->oldRev === null ||
-                       ( $this->oldRev && $this->oldContent === null )
+               if ( $this->mOldRev === null ||
+                       ( $this->mOldRev && $this->mOldContent === null )
                ) {
-                       $missing[] = $this->deletedIdMarker( $this->oldId );
+                       $missing[] = $this->deletedIdMarker( $this->mOldid );
                }
-               if ( $this->newRev === null ||
-                       ( $this->newRev && $this->newContent === null )
+               if ( $this->mNewRev === null ||
+                       ( $this->mNewRev && $this->mNewContent === null )
                ) {
-                       $missing[] = $this->deletedIdMarker( $this->newId );
+                       $missing[] = $this->deletedIdMarker( $this->mNewid );
                }
 
                $out->setPageTitle( $this->msg( 'errorpagetitle' ) );
@@ -231,10 +219,10 @@ class DifferenceEngine extends ContextSource {
                }
 
                $user = $this->getUser();
-               $permErrors = $this->newPage->getUserPermissionsErrors( 'read', $user );
-               if ( $this->oldPage ) { # oldPage might not be set, see below.
+               $permErrors = $this->mNewPage->getUserPermissionsErrors( 'read', $user );
+               if ( $this->mOldPage ) { # mOldPage might not be set, see below.
                        $permErrors = wfMergeErrorArrays( $permErrors,
-                               $this->oldPage->getUserPermissionsErrors( 'read', $user ) );
+                               $this->mOldPage->getUserPermissionsErrors( 'read', $user ) );
                }
                if ( count( $permErrors ) ) {
                        wfProfileOut( __METHOD__ );
@@ -255,47 +243,47 @@ class DifferenceEngine extends ContextSource {
 
                # Check if one of the revisions is deleted/suppressed
                $deleted = $suppressed = false;
-               $allowed = $this->newRev->userCan( Revision::DELETED_TEXT, $user );
+               $allowed = $this->mNewRev->userCan( Revision::DELETED_TEXT, $user );
 
                $revisionTools = array();
 
-               # oldRev is false if the difference engine is called with a "vague" query for
+               # mOldRev is false if the difference engine is called with a "vague" query for
                # a diff between a version V and its previous version V' AND the version V
                # is the first version of that article. In that case, V' does not exist.
-               if ( $this->oldRev === false ) {
-                       $out->setPageTitle( $this->msg( 'difference-title', $this->newPage->getPrefixedText() ) );
+               if ( $this->mOldRev === false ) {
+                       $out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) );
                        $samePage = true;
                        $oldHeader = '';
                } else {
-                       wfRunHooks( 'DiffViewHeader', array( $this, $this->oldRev, $this->newRev ) );
+                       wfRunHooks( 'DiffViewHeader', array( $this, $this->mOldRev, $this->mNewRev ) );
 
-                       if ( $this->newPage->equals( $this->oldPage ) ) {
-                               $out->setPageTitle( $this->msg( 'difference-title', $this->newPage->getPrefixedText() ) );
+                       if ( $this->mNewPage->equals( $this->mOldPage ) ) {
+                               $out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) );
                                $samePage = true;
                        } else {
                                $out->setPageTitle( $this->msg( 'difference-title-multipage',
-                                       $this->oldPage->getPrefixedText(), $this->newPage->getPrefixedText() ) );
+                                       $this->mOldPage->getPrefixedText(), $this->mNewPage->getPrefixedText() ) );
                                $out->addSubtitle( $this->msg( 'difference-multipage' ) );
                                $samePage = false;
                        }
 
-                       if ( $samePage && $this->newPage->quickUserCan( 'edit', $user ) ) {
-                               if ( $this->newRev->isCurrent() && $this->newPage->userCan( 'rollback', $user ) ) {
-                                       $rollbackLink = Linker::generateRollback( $this->newRev, $this->getContext() );
+                       if ( $samePage && $this->mNewPage->quickUserCan( 'edit', $user ) ) {
+                               if ( $this->mNewRev->isCurrent() && $this->mNewPage->userCan( 'rollback', $user ) ) {
+                                       $rollbackLink = Linker::generateRollback( $this->mNewRev, $this->getContext() );
                                        if ( $rollbackLink ) {
                                                $out->preventClickjacking();
                                                $rollback = '&#160;&#160;&#160;' . $rollbackLink;
                                        }
                                }
 
-                               if ( !$this->oldRev->isDeleted( Revision::DELETED_TEXT ) &&
-                                       !$this->newRev->isDeleted( Revision::DELETED_TEXT )
+                               if ( !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) &&
+                                       !$this->mNewRev->isDeleted( Revision::DELETED_TEXT )
                                ) {
                                        $undoLink = Html::element( 'a', array(
-                                                       'href' => $this->newPage->getLocalURL( array(
+                                                       'href' => $this->mNewPage->getLocalURL( array(
                                                                'action' => 'edit',
-                                                               'undoafter' => $this->oldId,
-                                                               'undo' => $this->newId ) ),
+                                                               'undoafter' => $this->mOldid,
+                                                               'undo' => $this->mNewid ) ),
                                                        'title' => Linker::titleAttrib( 'undo' )
                                                ),
                                                $this->msg( 'editundo' )->text()
@@ -305,92 +293,92 @@ class DifferenceEngine extends ContextSource {
                        }
 
                        # Make "previous revision link"
-                       if ( $samePage && $this->oldRev->getPrevious() ) {
+                       if ( $samePage && $this->mOldRev->getPrevious() ) {
                                $prevlink = Linker::linkKnown(
-                                       $this->oldPage,
+                                       $this->mOldPage,
                                        $this->msg( 'previousdiff' )->escaped(),
                                        array( 'id' => 'differences-prevlink' ),
-                                       array( 'diff' => 'prev', 'oldid' => $this->oldId ) + $query
+                                       array( 'diff' => 'prev', 'oldid' => $this->mOldid ) + $query
                                );
                        } else {
                                $prevlink = '&#160;';
                        }
 
-                       if ( $this->oldRev->isMinor() ) {
+                       if ( $this->mOldRev->isMinor() ) {
                                $oldminor = ChangesList::flag( 'minor' );
                        } else {
                                $oldminor = '';
                        }
 
-                       $ldel = $this->revisionDeleteLink( $this->oldRev );
-                       $oldRevisionHeader = $this->getRevisionHeader( $this->oldRev, 'complete' );
-                       $oldChangeTags = ChangeTags::formatSummaryRow( $this->oldTags, 'diff' );
+                       $ldel = $this->revisionDeleteLink( $this->mOldRev );
+                       $oldRevisionHeader = $this->getRevisionHeader( $this->mOldRev, 'complete' );
+                       $oldChangeTags = ChangeTags::formatSummaryRow( $this->mOldTags, 'diff' );
 
                        $oldHeader = '<div id="mw-diff-otitle1"><strong>' . $oldRevisionHeader . '</strong></div>' .
                                '<div id="mw-diff-otitle2">' .
-                                       Linker::revUserTools( $this->oldRev, !$this->unhide ) . '</div>' .
+                                       Linker::revUserTools( $this->mOldRev, !$this->unhide ) . '</div>' .
                                '<div id="mw-diff-otitle3">' . $oldminor .
-                                       Linker::revComment( $this->oldRev, !$diffOnly, !$this->unhide ) . $ldel . '</div>' .
+                                       Linker::revComment( $this->mOldRev, !$diffOnly, !$this->unhide ) . $ldel . '</div>' .
                                '<div id="mw-diff-otitle5">' . $oldChangeTags[0] . '</div>' .
                                '<div id="mw-diff-otitle4">' . $prevlink . '</div>';
 
-                       if ( $this->oldRev->isDeleted( Revision::DELETED_TEXT ) ) {
+                       if ( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) {
                                $deleted = true; // old revisions text is hidden
-                               if ( $this->oldRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
+                               if ( $this->mOldRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
                                        $suppressed = true; // also suppressed
                                }
                        }
 
                        # Check if this user can see the revisions
-                       if ( !$this->oldRev->userCan( Revision::DELETED_TEXT, $user ) ) {
+                       if ( !$this->mOldRev->userCan( Revision::DELETED_TEXT, $user ) ) {
                                $allowed = false;
                        }
                }
 
                # Make "next revision link"
                # Skip next link on the top revision
-               if ( $samePage && !$this->newRev->isCurrent() ) {
+               if ( $samePage && !$this->mNewRev->isCurrent() ) {
                        $nextlink = Linker::linkKnown(
-                               $this->newPage,
+                               $this->mNewPage,
                                $this->msg( 'nextdiff' )->escaped(),
                                array( 'id' => 'differences-nextlink' ),
-                               array( 'diff' => 'next', 'oldid' => $this->newId ) + $query
+                               array( 'diff' => 'next', 'oldid' => $this->mNewid ) + $query
                        );
                } else {
                        $nextlink = '&#160;';
                }
 
-               if ( $this->newRev->isMinor() ) {
+               if ( $this->mNewRev->isMinor() ) {
                        $newminor = ChangesList::flag( 'minor' );
                } else {
                        $newminor = '';
                }
 
                # Handle RevisionDelete links...
-               $rdel = $this->revisionDeleteLink( $this->newRev );
+               $rdel = $this->revisionDeleteLink( $this->mNewRev );
 
                # Allow extensions to define their own revision tools
-               wfRunHooks( 'DiffRevisionTools', array( $this->newRev, &$revisionTools ) );
+               wfRunHooks( 'DiffRevisionTools', array( $this->mNewRev, &$revisionTools ) );
                $formattedRevisionTools = array();
                // Put each one in parentheses (poor man's button)
                foreach ( $revisionTools as $tool ) {
                        $formattedRevisionTools[] = $this->msg( 'parentheses' )->rawParams( $tool )->escaped();
                }
-               $newRevisionHeader = $this->getRevisionHeader( $this->newRev, 'complete' ) .
+               $newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) .
                        ' ' . implode( ' ', $formattedRevisionTools );
-               $newChangeTags = ChangeTags::formatSummaryRow( $this->newTags, 'diff' );
+               $newChangeTags = ChangeTags::formatSummaryRow( $this->mNewTags, 'diff' );
 
                $newHeader = '<div id="mw-diff-ntitle1"><strong>' . $newRevisionHeader . '</strong></div>' .
-                       '<div id="mw-diff-ntitle2">' . Linker::revUserTools( $this->newRev, !$this->unhide ) .
+                       '<div id="mw-diff-ntitle2">' . Linker::revUserTools( $this->mNewRev, !$this->unhide ) .
                                " $rollback</div>" .
                        '<div id="mw-diff-ntitle3">' . $newminor .
-                               Linker::revComment( $this->newRev, !$diffOnly, !$this->unhide ) . $rdel . '</div>' .
+                               Linker::revComment( $this->mNewRev, !$diffOnly, !$this->unhide ) . $rdel . '</div>' .
                        '<div id="mw-diff-ntitle5">' . $newChangeTags[0] . '</div>' .
                        '<div id="mw-diff-ntitle4">' . $nextlink . $this->markPatrolledLink() . '</div>';
 
-               if ( $this->newRev->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
                        $deleted = true; // new revisions text is hidden
-                       if ( $this->newRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
+                       if ( $this->mNewRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
                                $suppressed = true; // also suppressed
                        }
                }
@@ -446,22 +434,22 @@ class DifferenceEngine extends ContextSource {
                global $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
                $user = $this->getUser();
 
-               if ( $this->markPatrolledLink === null ) {
+               if ( $this->mMarkPatrolledLink === null ) {
                        // Prepare a change patrol link, if applicable
                        if (
                                // Is patrolling enabled and the user allowed to?
-                               $wgUseRCPatrol && $this->newPage->quickUserCan( 'patrol', $user ) &&
+                               $wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $user ) &&
                                // Only do this if the revision isn't more than 6 hours older
                                // than the Max RC age (6h because the RC might not be cleaned out regularly)
-                               RecentChange::isInRCLifespan( $this->newRev->getTimestamp(), 21600 )
+                               RecentChange::isInRCLifespan( $this->mNewRev->getTimestamp(), 21600 )
                        ) {
                                // Look for an unpatrolled change corresponding to this diff
 
                                $db = wfGetDB( DB_SLAVE );
                                $change = RecentChange::newFromConds(
                                        array(
-                                               'rc_timestamp' => $db->timestamp( $this->newRev->getTimestamp() ),
-                                               'rc_this_oldid' => $this->newId,
+                                               'rc_timestamp' => $db->timestamp( $this->mNewRev->getTimestamp() ),
+                                               'rc_this_oldid' => $this->mNewid,
                                                'rc_patrolled' => 0
                                        ),
                                        __METHOD__,
@@ -485,8 +473,8 @@ class DifferenceEngine extends ContextSource {
                                        }
 
                                        $token = $user->getEditToken( $rcid );
-                                       $this->markPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
-                                               $this->newPage,
+                                       $this->mMarkPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
+                                               $this->mNewPage,
                                                $this->msg( 'markaspatrolleddiff' )->escaped(),
                                                array(),
                                                array(
@@ -496,14 +484,14 @@ class DifferenceEngine extends ContextSource {
                                                )
                                        ) . ']</span>';
                                } else {
-                                       $this->markPatrolledLink = '';
+                                       $this->mMarkPatrolledLink = '';
                                }
                        } else {
-                               $this->markPatrolledLink = '';
+                               $this->mMarkPatrolledLink = '';
                        }
                }
 
-               return $this->markPatrolledLink;
+               return $this->mMarkPatrolledLink;
        }
 
        /**
@@ -524,7 +512,7 @@ class DifferenceEngine extends ContextSource {
        function renderNewRevision() {
                wfProfileIn( __METHOD__ );
                $out = $this->getOutput();
-               $revHeader = $this->getRevisionHeader( $this->newRev );
+               $revHeader = $this->getRevisionHeader( $this->mNewRev );
                # Add "current version as of X" title
                $out->addHTML( "<hr class='diff-hr' />
                <h2 class='diff-currentversion-title'>{$revHeader}</h2>\n" );
@@ -532,47 +520,47 @@ class DifferenceEngine extends ContextSource {
                # @codingStandardsIgnoreStart Ignoring long lines.
                if ( wfRunHooks( 'ArticleContentOnDiff', array( $this, $out ) ) ) {
                        $this->loadNewText();
-                       $out->setRevisionId( $this->newId );
-                       $out->setRevisionTimestamp( $this->newRev->getTimestamp() );
+                       $out->setRevisionId( $this->mNewid );
+                       $out->setRevisionTimestamp( $this->mNewRev->getTimestamp() );
                        $out->setArticleFlag( true );
 
                        // NOTE: only needed for B/C: custom rendering of JS/CSS via hook
-                       if ( $this->newPage->isCssJsSubpage() || $this->newPage->isCssOrJsPage() ) {
+                       if ( $this->mNewPage->isCssJsSubpage() || $this->mNewPage->isCssOrJsPage() ) {
                                // Stolen from Article::view --AG 2007-10-11
                                // Give hooks a chance to customise the output
                                // @todo standardize this crap into one function
-                               if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->newContent, $this->newPage, $out ) ) ) {
+                               if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
                                        // NOTE: deprecated hook, B/C only
                                        // use the content object's own rendering
-                                       $cnt = $this->newRev->getContent();
-                                       $po = $cnt ? $cnt->getParserOutput( $this->newRev->getTitle(), $this->newRev->getId() ) : null;
+                                       $cnt = $this->mNewRev->getContent();
+                                       $po = $cnt ? $cnt->getParserOutput( $this->mNewRev->getTitle(), $this->mNewRev->getId() ) : null;
                                        $txt = $po ? $po->getText() : '';
                                        $out->addHTML( $txt );
                                }
-                       } elseif ( !wfRunHooks( 'ArticleContentViewCustom', array( $this->newContent, $this->newPage, $out ) ) ) {
+                       } elseif ( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
                                // Handled by extension
-                       } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', array( $this->newContent, $this->newPage, $out ) ) ) {
+                       } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
                                // NOTE: deprecated hook, B/C only
                                // Handled by extension
                        } else {
                                // Normal page
-                               if ( $this->getTitle()->equals( $this->newPage ) ) {
+                               if ( $this->getTitle()->equals( $this->mNewPage ) ) {
                                        // If the Title stored in the context is the same as the one
                                        // of the new revision, we can use its associated WikiPage
                                        // object.
                                        $wikiPage = $this->getWikiPage();
                                } else {
                                        // Otherwise we need to create our own WikiPage object
-                                       $wikiPage = WikiPage::factory( $this->newPage );
+                                       $wikiPage = WikiPage::factory( $this->mNewPage );
                                }
 
-                               $parserOutput = $this->getParserOutput( $wikiPage, $this->newRev );
+                               $parserOutput = $this->getParserOutput( $wikiPage, $this->mNewRev );
 
                                # Also try to load it as a redirect
-                               $rt = $this->newContent ? $this->newContent->getRedirectTarget() : null;
+                               $rt = $this->mNewContent ? $this->mNewContent->getRedirectTarget() : null;
 
                                if ( $rt ) {
-                                       $article = Article::newFromTitle( $this->newPage, $this->getContext() );
+                                       $article = Article::newFromTitle( $this->mNewPage, $this->getContext() );
                                        $out->addHTML( $article->viewRedirect( $rt ) );
 
                                        # WikiPage::getParserOutput() should not return false, but just in case
@@ -666,36 +654,36 @@ class DifferenceEngine extends ContextSource {
        public function getDiffBody() {
                global $wgMemc;
                wfProfileIn( __METHOD__ );
-               $this->cacheHit = true;
+               $this->mCacheHit = true;
                // Check if the diff should be hidden from this user
                if ( !$this->loadRevisionData() ) {
                        wfProfileOut( __METHOD__ );
                        return false;
-               } elseif ( $this->oldRev &&
-                       !$this->oldRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
+               } elseif ( $this->mOldRev &&
+                       !$this->mOldRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
                ) {
                        wfProfileOut( __METHOD__ );
                        return false;
-               } elseif ( $this->newRev &&
-                       !$this->newRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
+               } elseif ( $this->mNewRev &&
+                       !$this->mNewRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
                ) {
                        wfProfileOut( __METHOD__ );
                        return false;
                }
                // Short-circuit
-               if ( $this->oldRev === false || ( $this->oldRev && $this->newRev
-                       && $this->oldRev->getID() == $this->newRev->getID() ) )
+               if ( $this->mOldRev === false || ( $this->mOldRev && $this->mNewRev
+                       && $this->mOldRev->getID() == $this->mNewRev->getID() ) )
                {
                        wfProfileOut( __METHOD__ );
                        return '';
                }
                // Cacheable?
                $key = false;
-               if ( $this->oldId && $this->newId ) {
+               if ( $this->mOldid && $this->mNewid ) {
                        $key = $this->getDiffBodyCacheKey();
 
                        // Try cache
-                       if ( !$this->refreshCache ) {
+                       if ( !$this->mRefreshCache ) {
                                $difftext = $wgMemc->get( $key );
                                if ( $difftext ) {
                                        wfIncrStats( 'diff_cache_hit' );
@@ -706,7 +694,7 @@ class DifferenceEngine extends ContextSource {
                                }
                        } // don't try to load but save the result
                }
-               $this->cacheHit = false;
+               $this->mCacheHit = false;
 
                // Loadtext is permission safe, this just clears out the diff
                if ( !$this->loadText() ) {
@@ -714,7 +702,7 @@ class DifferenceEngine extends ContextSource {
                        return false;
                }
 
-               $difftext = $this->generateContentDiffBody( $this->oldContent, $this->newContent );
+               $difftext = $this->generateContentDiffBody( $this->mOldContent, $this->mNewContent );
 
                // Save to cache for 7 days
                if ( !wfRunHooks( 'AbortDiffCache', array( &$this ) ) ) {
@@ -741,12 +729,12 @@ class DifferenceEngine extends ContextSource {
         * @throws MWException
         */
        protected function getDiffBodyCacheKey() {
-               if ( !$this->oldId || !$this->newId ) {
-                       throw new MWException( 'oldId and newId must be set to get diff cache key.' );
+               if ( !$this->mOldid || !$this->mNewid ) {
+                       throw new MWException( 'mOldid and mNewid must be set to get diff cache key.' );
                }
 
-               return wfMemcKey( 'diff', 'version', self::CACHE_VERSION,
-                       'oldid', $this->oldId, 'newid', $this->newId );
+               return wfMemcKey( 'diff', 'version', MW_DIFF_VERSION,
+                       'oldid', $this->mOldid, 'newid', $this->mNewid );
        }
 
        /**
@@ -916,7 +904,7 @@ class DifferenceEngine extends ContextSource {
        }
 
        function localiseLineNumbersCb( $matches ) {
-               if ( $matches[1] === '1' && $this->reducedLineNumbers ) {
+               if ( $matches[1] === '1' && $this->mReducedLineNumbers ) {
                        return '';
                }
                return $this->msg( 'lineno' )->numParams( $matches[1] )->escaped();
@@ -927,25 +915,25 @@ class DifferenceEngine extends ContextSource {
         * @return string
         */
        function getMultiNotice() {
-               if ( !is_object( $this->oldRev ) || !is_object( $this->newRev ) ) {
+               if ( !is_object( $this->mOldRev ) || !is_object( $this->mNewRev ) ) {
                        return '';
-               } elseif ( !$this->oldPage->equals( $this->newPage ) ) {
+               } elseif ( !$this->mOldPage->equals( $this->mNewPage ) ) {
                        // Comparing two different pages? Count would be meaningless.
                        return '';
                }
 
-               if ( $this->oldRev->getTimestamp() > $this->newRev->getTimestamp() ) {
-                       $oldRev = $this->newRev; // flip
-                       $newRev = $this->oldRev; // flip
+               if ( $this->mOldRev->getTimestamp() > $this->mNewRev->getTimestamp() ) {
+                       $oldRev = $this->mNewRev; // flip
+                       $newRev = $this->mOldRev; // flip
                } else { // normal case
-                       $oldRev = $this->oldRev;
-                       $newRev = $this->newRev;
+                       $oldRev = $this->mOldRev;
+                       $newRev = $this->mNewRev;
                }
 
-               $nEdits = $this->newPage->countRevisionsBetween( $oldRev, $newRev );
+               $nEdits = $this->mNewPage->countRevisionsBetween( $oldRev, $newRev );
                if ( $nEdits > 0 ) {
                        $limit = 100; // use diff-multi-manyusers if too many users
-                       $numUsers = $this->newPage->countAuthorsBetween( $oldRev, $newRev, $limit );
+                       $numUsers = $this->mNewPage->countAuthorsBetween( $oldRev, $newRev, $limit );
                        return self::intermediateEditsMsg( $nEdits, $numUsers, $limit );
                }
                return ''; // nothing
@@ -1098,11 +1086,11 @@ class DifferenceEngine extends ContextSource {
         * @since 1.21
         */
        function setContent( Content $oldContent, Content $newContent ) {
-               $this->oldContent = $oldContent;
-               $this->newContent = $newContent;
+               $this->mOldContent = $oldContent;
+               $this->mNewContent = $newContent;
 
-               $this->textLoaded = 2;
-               $this->revisionsLoaded = true;
+               $this->mTextLoaded = 2;
+               $this->mRevisionsLoaded = true;
        }
 
        /**
@@ -1111,7 +1099,7 @@ class DifferenceEngine extends ContextSource {
         * @since 1.19
         */
        function setTextLanguage( $lang ) {
-               $this->diffLang = wfGetLangObj( $lang );
+               $this->mDiffLang = wfGetLangObj( $lang );
        }
 
        /**
@@ -1145,23 +1133,23 @@ class DifferenceEngine extends ContextSource {
         * Load revision IDs
         */
        private function loadRevisionIds() {
-               if ( $this->revisionsIdsLoaded ) {
+               if ( $this->mRevisionsIdsLoaded ) {
                        return;
                }
 
-               $this->revisionsIdsLoaded = true;
+               $this->mRevisionsIdsLoaded = true;
 
-               $old = $this->oldId;
-               $new = $this->newId;
+               $old = $this->mOldid;
+               $new = $this->mNewid;
 
-               list( $this->oldId, $this->newId ) = self::mapDiffPrevNext( $old, $new );
-               if ( $new === 'next' && $this->newId === false ) {
+               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->newId = 0;
+                       $this->mNewid = 0;
                }
 
-               wfRunHooks( 'NewDifferenceEngine', array( $this->getTitle(), &$this->oldId, &$this->newId, $old, $new ) );
+               wfRunHooks( 'NewDifferenceEngine', array( $this->getTitle(), &$this->mOldid, &$this->mNewid, $old, $new ) );
        }
 
        /**
@@ -1177,74 +1165,74 @@ class DifferenceEngine extends ContextSource {
         * @return bool
         */
        function loadRevisionData() {
-               if ( $this->revisionsLoaded ) {
+               if ( $this->mRevisionsLoaded ) {
                        return true;
                }
 
                // Whether it succeeds or fails, we don't want to try again
-               $this->revisionsLoaded = true;
+               $this->mRevisionsLoaded = true;
 
                $this->loadRevisionIds();
 
                // Load the new revision object
-               if ( $this->newId ) {
-                       $this->newRev = Revision::newFromId( $this->newId );
+               if ( $this->mNewid ) {
+                       $this->mNewRev = Revision::newFromId( $this->mNewid );
                } else {
-                       $this->newRev = Revision::newFromTitle(
+                       $this->mNewRev = Revision::newFromTitle(
                                $this->getTitle(),
                                false,
                                Revision::READ_NORMAL
                        );
                }
 
-               if ( !$this->newRev instanceof Revision ) {
+               if ( !$this->mNewRev instanceof Revision ) {
                        return false;
                }
 
                // Update the new revision ID in case it was 0 (makes life easier doing UI stuff)
-               $this->newId = $this->newRev->getId();
-               $this->newPage = $this->newRev->getTitle();
+               $this->mNewid = $this->mNewRev->getId();
+               $this->mNewPage = $this->mNewRev->getTitle();
 
                // Load the old revision object
-               $this->oldRev = false;
-               if ( $this->oldId ) {
-                       $this->oldRev = Revision::newFromId( $this->oldId );
-               } elseif ( $this->oldId === 0 ) {
-                       $rev = $this->newRev->getPrevious();
+               $this->mOldRev = false;
+               if ( $this->mOldid ) {
+                       $this->mOldRev = Revision::newFromId( $this->mOldid );
+               } elseif ( $this->mOldid === 0 ) {
+                       $rev = $this->mNewRev->getPrevious();
                        if ( $rev ) {
-                               $this->oldId = $rev->getId();
-                               $this->oldRev = $rev;
+                               $this->mOldid = $rev->getId();
+                               $this->mOldRev = $rev;
                        } else {
                                // No previous revision; mark to show as first-version only.
-                               $this->oldId = false;
-                               $this->oldRev = false;
+                               $this->mOldid = false;
+                               $this->mOldRev = false;
                        }
-               } /* elseif ( $this->oldId === false ) leave oldRev false; */
+               } /* elseif ( $this->mOldid === false ) leave mOldRev false; */
 
-               if ( is_null( $this->oldRev ) ) {
+               if ( is_null( $this->mOldRev ) ) {
                        return false;
                }
 
-               if ( $this->oldRev ) {
-                       $this->oldPage = $this->oldRev->getTitle();
+               if ( $this->mOldRev ) {
+                       $this->mOldPage = $this->mOldRev->getTitle();
                }
 
                // Load tags information for both revisions
                $dbr = wfGetDB( DB_SLAVE );
-               if ( $this->oldId !== false ) {
-                       $this->oldTags = $dbr->selectField(
+               if ( $this->mOldid !== false ) {
+                       $this->mOldTags = $dbr->selectField(
                                'tag_summary',
                                'ts_tags',
-                               array( 'ts_rev_id' => $this->oldId ),
+                               array( 'ts_rev_id' => $this->mOldid ),
                                __METHOD__
                        );
                } else {
-                       $this->oldTags = false;
+                       $this->mOldTags = false;
                }
-               $this->newTags = $dbr->selectField(
+               $this->mNewTags = $dbr->selectField(
                        'tag_summary',
                        'ts_tags',
-                       array( 'ts_rev_id' => $this->newId ),
+                       array( 'ts_rev_id' => $this->mNewid ),
                        __METHOD__
                );
 
@@ -1257,27 +1245,27 @@ class DifferenceEngine extends ContextSource {
         * @return bool
         */
        function loadText() {
-               if ( $this->textLoaded == 2 ) {
+               if ( $this->mTextLoaded == 2 ) {
                        return true;
                }
 
                // Whether it succeeds or fails, we don't want to try again
-               $this->textLoaded = 2;
+               $this->mTextLoaded = 2;
 
                if ( !$this->loadRevisionData() ) {
                        return false;
                }
 
-               if ( $this->oldRev ) {
-                       $this->oldContent = $this->oldRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
-                       if ( $this->oldContent === null ) {
+               if ( $this->mOldRev ) {
+                       $this->mOldContent = $this->mOldRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                       if ( $this->mOldContent === null ) {
                                return false;
                        }
                }
 
-               if ( $this->newRev ) {
-                       $this->newContent = $this->newRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
-                       if ( $this->newContent === null ) {
+               if ( $this->mNewRev ) {
+                       $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                       if ( $this->mNewContent === null ) {
                                return false;
                        }
                }
@@ -1291,17 +1279,17 @@ class DifferenceEngine extends ContextSource {
         * @return bool
         */
        function loadNewText() {
-               if ( $this->textLoaded >= 1 ) {
+               if ( $this->mTextLoaded >= 1 ) {
                        return true;
                }
 
-               $this->textLoaded = 1;
+               $this->mTextLoaded = 1;
 
                if ( !$this->loadRevisionData() ) {
                        return false;
                }
 
-               $this->newContent = $this->newRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+               $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
 
                return true;
        }
index 43d90e5..b4f2194 100644 (file)
@@ -243,7 +243,10 @@ abstract class DatabaseInstaller {
                if ( $status->isOK() ) {
                        $status->value->setSchemaVars( $this->getSchemaVars() );
                } else {
-                       throw new MWException( __METHOD__ . ': unexpected DB connection error' );
+                       $msg = __METHOD__ . ': unexpected error while establishing'
+                               . ' a database connection with message: '
+                               . $status->getMessage()->plain();
+                       throw new MWException( $msg );
                }
        }
 
index 53cb7dc..b37e6b3 100644 (file)
@@ -336,7 +336,12 @@ class WebInstaller extends Installer {
 
                $this->phpErrors = array();
                set_error_handler( array( $this, 'errorHandler' ) );
-               session_start();
+               try {
+                       session_start();
+               } catch ( Exception $e ) {
+                       restore_error_handler();
+                       throw $e;
+               }
                restore_error_handler();
 
                if ( $this->phpErrors ) {
index 0a1f3b1..418ab12 100644 (file)
@@ -23,7 +23,8 @@
 
 /**
  * ProfilerSimpleUDP class, that sends out messages for 'udpprofile' daemon
- * (the one from mediawiki/trunk/udpprofile SVN )
+ * (the one from 
+ *  http://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile)
  * @ingroup Profiler
  */
 class ProfilerSimpleUDP extends ProfilerSimple {
index 6380efc..91acd11 100644 (file)
@@ -68,7 +68,8 @@ class ResourceLoader {
         */
        public function preloadModuleInfo( array $modules, ResourceLoaderContext $context ) {
                if ( !count( $modules ) ) {
-                       return; // or else Database*::select() will explode, plus it's cheaper!
+                       // Or else Database*::select() will explode, plus it's cheaper!
+                       return;
                }
                $dbr = wfGetDB( DB_SLAVE );
                $skin = $context->getSkin();
@@ -451,7 +452,7 @@ class ResourceLoader {
                wfProfileIn( __METHOD__ );
                $errors = '';
 
-               // Split requested modules into two groups, modules and missing
+               // Find out which modules are missing and instantiate the others
                $modules = array();
                $missing = array();
                foreach ( $context->getModules() as $name ) {
@@ -527,7 +528,7 @@ class ResourceLoader {
                }
 
                // Save response to file cache unless there are errors
-               if ( isset( $fileCache ) && !$errors && !$missing ) {
+               if ( isset( $fileCache ) && !$errors && !count( $missing ) ) {
                        // Cache single modules...and other requests if there are enough hits
                        if ( ResourceFileCache::useFileCache( $context ) ) {
                                if ( $fileCache->isCacheWorthy() ) {
@@ -704,21 +705,24 @@ class ResourceLoader {
        /**
         * Generates code for a response
         *
-        * @param $context ResourceLoaderContext: Context in which to generate a response
+        * @param $context ResourceLoaderContext Context in which to generate a response
         * @param array $modules List of module objects keyed by module name
-        * @param array $missing List of unavailable modules (optional)
-        * @return String: Response data
+        * @param array $missing List of requested module names that are unregistered (optional)
+        * @return string Response data
         */
        public function makeModuleResponse( ResourceLoaderContext $context,
-               array $modules, $missing = array()
+               array $modules, array $missing = array()
        ) {
                $out = '';
                $exceptions = '';
-               if ( $modules === array() && $missing === array() ) {
+               $states = array();
+
+               if ( !count( $modules ) && !count( $missing ) ) {
                        return '/* No modules requested. Max made me put this here */';
                }
 
                wfProfileIn( __METHOD__ );
+
                // Pre-fetch blobs
                if ( $context->shouldIncludeMessages() ) {
                        try {
@@ -734,6 +738,11 @@ class ResourceLoader {
                        $blobs = array();
                }
 
+
+               foreach ( $missing as $name ) {
+                       $states[$name] = 'missing';
+               }
+
                // Generate output
                $isRaw = false;
                foreach ( $modules as $name => $module ) {
@@ -838,8 +847,8 @@ class ResourceLoader {
                                // Add exception to the output as a comment
                                $exceptions .= self::formatException( $e );
 
-                               // Register module as missing
-                               $missing[] = $name;
+                               // Respond to client with error-state instead of module implementation
+                               $states[$name] = 'error';
                                unset( $modules[$name] );
                        }
                        $isRaw |= $module->isRaw();
@@ -848,14 +857,17 @@ class ResourceLoader {
 
                // Update module states
                if ( $context->shouldIncludeScripts() && !$context->getRaw() && !$isRaw ) {
-                       // Set the state of modules loaded as only scripts to ready
                        if ( count( $modules ) && $context->getOnly() === 'scripts' ) {
-                               $out .= self::makeLoaderStateScript(
-                                       array_fill_keys( array_keys( $modules ), 'ready' ) );
+                               // Set the state of modules loaded as only scripts to ready as
+                               // they don't have an mw.loader.implement wrapper that sets the state
+                               foreach ( $modules as $name => $module ) {
+                                       $states[$name] = 'ready';
+                               }
                        }
-                       // Set the state of modules which were requested but unavailable as missing
-                       if ( is_array( $missing ) && count( $missing ) ) {
-                               $out .= self::makeLoaderStateScript( array_fill_keys( $missing, 'missing' ) );
+
+                       // Set the state of modules we didn't respond to with mw.loader.implement
+                       if ( count( $states ) ) {
+                               $out .= self::makeLoaderStateScript( $states );
                        }
                }
 
index 9ed181e..7b85001 100644 (file)
@@ -745,6 +745,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * recompiles as necessary.
         *
         * @since 1.22
+        * @throws Exception If Less encounters a parse error
+        * @throws MWException If Less compilation returns unexpection result
         * @param string $fileName File path of LESS source
         * @return string: CSS source
         */
index a082049..388705d 100644 (file)
@@ -49,6 +49,16 @@ class SpecialAllpages extends IncludableSpecialPage {
         */
        protected $maxPageLength = 70;
 
+       /**
+        * Maximum number of pages in a hierarchical ("top level") list.
+        *
+        * Traversal of the entire page list by spidering the top levels is thought
+        * to require O(N^3) DB CPU time where N is the number of pages on the wiki.
+        * See bug 56840. If this limit is exceeded, the behaviour becomes like a
+        * simple alphabetic pager.
+        */
+       protected $maxTopLevelPages = 50000;
+
        /**
         * Determines, which message describes the input field 'nsfrom'.
         *
@@ -201,6 +211,14 @@ class SpecialAllpages extends IncludableSpecialPage {
                $lines = $wgMemc->get( $key );
 
                $count = $dbr->estimateRowCount( 'page', '*', $where, __METHOD__ );
+
+               // Don't show a hierarchical list if the number of pages is very large,
+               // since generating it will cause a lot of scanning
+               if ( $count > $this->maxTopLevelPages ) {
+                       $this->showChunk( $namespace, $from, $to, $hideredirects );
+                       return;
+               }
+
                $maxPerSubpage = intval( $count / $this->maxLineCount );
                $maxPerSubpage = max( $maxPerSubpage, $this->maxPerPage );
 
index 2ffdd89..5265403 100644 (file)
@@ -98,6 +98,7 @@ class SpecialLog extends SpecialPage {
                # Some log types are only for a 'User:' title but we might have been given
                # only the username instead of the full title 'User:username'. This part try
                # to lookup for a user by that name and eventually fix user input. See bug 1697.
+               wfRunHooks( 'GetLogTypesOnUser', array( &$this->typeOnUser ) );
                if ( in_array( $opts->getValue( 'type' ), $this->typeOnUser ) ) {
                        # ok we have a type of log which expect a user title.
                        $target = Title::newFromText( $opts->getValue( 'page' ) );
index 51e7450..23203ea 100644 (file)
@@ -685,7 +685,6 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Creates the choose namespace selection
         *
-        * @todo Uses radio buttons (HASHAR)
         * @param FormOptions $opts
         * @return string
         */
index 87b6442..1373df1 100644 (file)
@@ -308,6 +308,8 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                header( "Content-Type: $contentType", true );
                header( 'Content-Transfer-Encoding: binary', true );
                header( 'Expires: Sun, 17-Jan-2038 19:14:07 GMT', true );
+               // Bug 53032 - It shouldn't be a problem here, but let's be safe and not cache
+               header( 'Cache-Control: private' );
                header( "Content-Length: $size", true );
        }
 
index c8944d2..9764c9f 100644 (file)
@@ -219,7 +219,7 @@ class LoginForm extends SpecialPage {
                        return;
                }
 
-               $status = $this->addNewaccountInternal();
+               $status = $this->addNewAccountInternal();
                if ( !$status->isGood() ) {
                        $error = $status->getMessage();
                        $this->mainLoginForm( $error->toString() );
@@ -409,16 +409,6 @@ class LoginForm extends SpecialPage {
                        return Status::newFatal( 'userexists' );
                }
 
-               $validateError = '';
-               // Make sure that our extensions like the input for this user
-               if ( !wfRunHooks( 'ValidateNewUser', array( $u, &$validateError ) ) ) {
-                       wfDebug( "New user failed hook validation.\n" );
-                       if ( !$validateError ) {
-                           return Status::newFatal( 'newuserfailedvalidation' );
-                       }
-                       return Status::newFatal( $validateError );
-               }
-
                if ( $this->mCreateaccountMail ) {
                        # do not force a password for account creation by email
                        # set invalid password, it will be replaced later by a random generated password
@@ -875,7 +865,7 @@ class LoginForm extends SpecialPage {
         * @return Status object
         */
        function mailPasswordInternal( $u, $throttle = true, $emailTitle = 'passwordremindertitle', $emailText = 'passwordremindertext' ) {
-               global $wgCanonicalServer, $wgScript, $wgNewPasswordExpiry;
+               global $wgNewPasswordExpiry;
 
                if ( $u->getEmail() == '' ) {
                        return Status::newFatal( 'noemail', $u->getName() );
@@ -892,7 +882,11 @@ class LoginForm extends SpecialPage {
                $u->setNewpassword( $np, $throttle );
                $u->saveSettings();
                $userLanguage = $u->getOption( 'language' );
-               $m = $this->msg( $emailText, $ip, $u->getName(), $np, '<' . $wgCanonicalServer . $wgScript . '>',
+
+               $mainPage = Title::newMainPage();
+               $mainPageUrl = $mainPage->getCanonicalURL();
+
+               $m = $this->msg( $emailText, $ip, $u->getName(), $np, '<' . $mainPageUrl . '>',
                        round( $wgNewPasswordExpiry / 86400 ) )->inLanguage( $userLanguage )->text();
                $result = $u->sendMail( $this->msg( $emailTitle )->inLanguage( $userLanguage )->text(), $m );
 
index c6de088..0995aed 100644 (file)
  * http://cr.yp.to/cdb.html
  */
 abstract class CdbReader {
+       /**
+        * The file handle
+        */
+       protected $handle;
+
        /**
         * Open a file and return a subclass instance
         *
@@ -34,13 +39,9 @@ abstract class CdbReader {
         * @return CdbReader
         */
        public static function open( $fileName ) {
-               if ( self::haveExtension() ) {
-                       return new CdbReaderDBA( $fileName );
-               } else {
-                       wfDebug( "Warning: no dba extension found, using emulation.\n" );
-
-                       return new CdbReaderPHP( $fileName );
-               }
+               return self::haveExtension() ?
+                       new CdbReaderDBA( $fileName ) :
+                       new CdbReaderPHP( $fileName );
        }
 
        /**
@@ -61,14 +62,16 @@ abstract class CdbReader {
        }
 
        /**
-        * Construct the object and open the file
+        * Create the object and open the file
+        *
+        * @param $fileName string
         */
-       abstract function __construct( $fileName );
+       abstract public function __construct( $fileName );
 
        /**
         * Close the file. Optional, you can just let the variable go out of scope.
         */
-       abstract function close();
+       abstract public function close();
 
        /**
         * Get a value with a given key. Only string values are supported.
@@ -83,6 +86,23 @@ abstract class CdbReader {
  * Native and pure PHP implementations are provided.
  */
 abstract class CdbWriter {
+       /**
+        * The file handle
+        */
+       protected $handle;
+
+       /**
+        * File we'll be writing to when we're done
+        * @var string
+        */
+       protected $realFileName;
+
+       /**
+        * File we write to temporarily until we're done
+        * @var string
+        */
+       protected $tmpFileName;
+
        /**
         * Open a writer and return a subclass instance.
         * The user must have write access to the directory, for temporary file creation.
@@ -92,13 +112,9 @@ abstract class CdbWriter {
         * @return CdbWriterDBA|CdbWriterPHP
         */
        public static function open( $fileName ) {
-               if ( CdbReader::haveExtension() ) {
-                       return new CdbWriterDBA( $fileName );
-               } else {
-                       wfDebug( "Warning: no dba extension found, using emulation.\n" );
-
-                       return new CdbWriterPHP( $fileName );
-               }
+               return CdbReader::haveExtension() ?
+                       new CdbWriterDBA( $fileName ) :
+                       new CdbWriterPHP( $fileName );
        }
 
        /**
@@ -106,7 +122,7 @@ abstract class CdbWriter {
         *
         * @param $fileName string
         */
-       abstract function __construct( $fileName );
+       abstract public function __construct( $fileName );
 
        /**
         * Set a key to a given value. The value will be converted to string.
@@ -120,68 +136,25 @@ abstract class CdbWriter {
         * goes out of scope, to write out the final hashtables.
         */
        abstract public function close();
-}
-
-/**
- * Reader class which uses the DBA extension
- */
-class CdbReaderDBA {
-       var $handle;
 
-       function __construct( $fileName ) {
-               $this->handle = dba_open( $fileName, 'r-', 'cdb' );
-               if ( !$this->handle ) {
-                       throw new MWException( 'Unable to open CDB file "' . $fileName . '"' );
-               }
-       }
-
-       function close() {
+       /**
+        * If the object goes out of scope, close it for sanity
+        */
+       public function __destruct() {
                if ( isset( $this->handle ) ) {
-                       dba_close( $this->handle );
+                       $this->close();
                }
-               unset( $this->handle );
        }
 
-       function get( $key ) {
-               return dba_fetch( $key, $this->handle );
+       /**
+        * Are we running on Windows?
+        */
+       protected function isWindows() {
+               return substr( php_uname(), 0, 7 ) == 'Windows';
        }
 }
 
 /**
- * Writer class which uses the DBA extension
+ * Exception for Cdb errors
  */
-class CdbWriterDBA {
-       var $handle, $realFileName, $tmpFileName;
-
-       function __construct( $fileName ) {
-               $this->realFileName = $fileName;
-               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
-               $this->handle = dba_open( $this->tmpFileName, 'n', 'cdb_make' );
-               if ( !$this->handle ) {
-                       throw new MWException( 'Unable to open CDB file for write "' . $fileName . '"' );
-               }
-       }
-
-       function set( $key, $value ) {
-               return dba_insert( $key, $value, $this->handle );
-       }
-
-       function close() {
-               if ( isset( $this->handle ) ) {
-                       dba_close( $this->handle );
-               }
-               if ( wfIsWindows() ) {
-                       unlink( $this->realFileName );
-               }
-               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
-                       throw new MWException( 'Unable to move the new CDB file into place.' );
-               }
-               unset( $this->handle );
-       }
-
-       function __destruct() {
-               if ( isset( $this->handle ) ) {
-                       $this->close();
-               }
-       }
-}
+class CdbException extends MWException {}
diff --git a/includes/utils/CdbDBA.php b/includes/utils/CdbDBA.php
new file mode 100644 (file)
index 0000000..efcaf21
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+/**
+ * DBA-based CDB reader/writer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Reader class which uses the DBA extension
+ */
+class CdbReaderDBA extends CdbReader {
+       public function __construct( $fileName ) {
+               $this->handle = dba_open( $fileName, 'r-', 'cdb' );
+               if ( !$this->handle ) {
+                       throw new CdbException( 'Unable to open CDB file "' . $fileName . '"' );
+               }
+       }
+
+       public function close() {
+               if ( isset( $this->handle ) ) {
+                       dba_close( $this->handle );
+               }
+               unset( $this->handle );
+       }
+
+       public function get( $key ) {
+               return dba_fetch( $key, $this->handle );
+       }
+}
+
+/**
+ * Writer class which uses the DBA extension
+ */
+class CdbWriterDBA extends CdbWriter {
+       public function __construct( $fileName ) {
+               $this->realFileName = $fileName;
+               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
+               $this->handle = dba_open( $this->tmpFileName, 'n', 'cdb_make' );
+               if ( !$this->handle ) {
+                       throw new CdbException( 'Unable to open CDB file for write "' . $fileName . '"' );
+               }
+       }
+
+       public function set( $key, $value ) {
+               return dba_insert( $key, $value, $this->handle );
+       }
+
+       public function close() {
+               if ( isset( $this->handle ) ) {
+                       dba_close( $this->handle );
+               }
+               if ( $this->isWindows() ) {
+                       unlink( $this->realFileName );
+               }
+               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
+                       throw new CdbException( 'Unable to move the new CDB file into place.' );
+               }
+               unset( $this->handle );
+       }
+}
index e7bb4bc..c178ffe 100644 (file)
@@ -69,7 +69,7 @@ class CdbFunctions {
         *
         * @param $s string
         *
-        * @return
+        * @return int
         */
        public static function hash( $s ) {
                $h = 5381;
@@ -103,9 +103,6 @@ class CdbReaderPHP extends CdbReader {
        /** The filename */
        var $fileName;
 
-       /** The file handle */
-       var $handle;
-
        /* number of hash slots searched under this key */
        var $loop;
 
@@ -129,18 +126,18 @@ class CdbReaderPHP extends CdbReader {
 
        /**
         * @param $fileName string
-        * @throws MWException
+        * @throws CdbException
         */
-       function __construct( $fileName ) {
+       public function __construct( $fileName ) {
                $this->fileName = $fileName;
                $this->handle = fopen( $fileName, 'rb' );
                if ( !$this->handle ) {
-                       throw new MWException( 'Unable to open CDB file "' . $this->fileName . '".' );
+                       throw new CdbException( 'Unable to open CDB file "' . $this->fileName . '".' );
                }
                $this->findStart();
        }
 
-       function close() {
+       public function close() {
                if ( isset( $this->handle ) ) {
                        fclose( $this->handle );
                }
@@ -176,7 +173,7 @@ class CdbReaderPHP extends CdbReader {
        }
 
        /**
-        * @throws MWException
+        * @throws CdbException
         * @param $length
         * @param $pos
         * @return string
@@ -184,7 +181,7 @@ class CdbReaderPHP extends CdbReader {
        protected function read( $length, $pos ) {
                if ( fseek( $this->handle, $pos ) == -1 ) {
                        // This can easily happen if the internal pointers are incorrect
-                       throw new MWException(
+                       throw new CdbException(
                                'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
                }
 
@@ -194,7 +191,7 @@ class CdbReaderPHP extends CdbReader {
 
                $buf = fread( $this->handle, $length );
                if ( $buf === false || strlen( $buf ) !== $length ) {
-                       throw new MWException(
+                       throw new CdbException(
                                'Read from CDB file failed, file "' . $this->fileName . '" may be corrupted.' );
                }
 
@@ -204,13 +201,13 @@ class CdbReaderPHP extends CdbReader {
        /**
         * Unpack an unsigned integer and throw an exception if it needs more than 31 bits
         * @param $s
-        * @throws MWException
+        * @throws CdbException
         * @return mixed
         */
        protected function unpack31( $s ) {
                $data = unpack( 'V', $s );
                if ( $data[1] > 0x7fffffff ) {
-                       throw new MWException(
+                       throw new CdbException(
                                'Error in CDB file "' . $this->fileName . '", integer too big.' );
                }
 
@@ -291,15 +288,13 @@ class CdbReaderPHP extends CdbReader {
  * CDB writer class
  */
 class CdbWriterPHP extends CdbWriter {
-       var $handle, $realFileName, $tmpFileName;
-
        var $hplist;
        var $numentries, $pos;
 
        /**
         * @param $fileName string
         */
-       function __construct( $fileName ) {
+       public function __construct( $fileName ) {
                $this->realFileName = $fileName;
                $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
                $this->handle = fopen( $this->tmpFileName, 'wb' );
@@ -315,16 +310,9 @@ class CdbWriterPHP extends CdbWriter {
                }
        }
 
-       function __destruct() {
-               if ( isset( $this->handle ) ) {
-                       $this->close();
-               }
-       }
-
        /**
-        * @param $key
-        * @param $value
-        * @return
+        * @param string $key
+        * @param string $value
         */
        public function set( $key, $value ) {
                if ( strval( $key ) === '' ) {
@@ -338,14 +326,14 @@ class CdbWriterPHP extends CdbWriter {
        }
 
        /**
-        * @throws MWException
+        * @throws CdbException
         */
        public function close() {
                $this->finish();
                if ( isset( $this->handle ) ) {
                        fclose( $this->handle );
                }
-               if ( wfIsWindows() && file_exists( $this->realFileName ) ) {
+               if ( $this->isWindows() && file_exists( $this->realFileName ) ) {
                        unlink( $this->realFileName );
                }
                if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
@@ -355,7 +343,7 @@ class CdbWriterPHP extends CdbWriter {
        }
 
        /**
-        * @throws MWException
+        * @throws CdbException
         * @param $buf
         */
        protected function write( $buf ) {
@@ -366,7 +354,7 @@ class CdbWriterPHP extends CdbWriter {
        }
 
        /**
-        * @throws MWException
+        * @throws CdbException
         * @param $len
         */
        protected function posplus( $len ) {
@@ -396,7 +384,7 @@ class CdbWriterPHP extends CdbWriter {
        }
 
        /**
-        * @throws MWException
+        * @throws CdbException
         * @param $keylen
         * @param $datalen
         */
@@ -412,7 +400,7 @@ class CdbWriterPHP extends CdbWriter {
        }
 
        /**
-        * @throws MWException
+        * @throws CdbException
         */
        protected function finish() {
                // Hack for DBA cross-check
@@ -491,13 +479,13 @@ class CdbWriterPHP extends CdbWriter {
         * Clean up the temp file and throw an exception
         *
         * @param $msg string
-        * @throws MWException
+        * @throws CdbException
         */
        protected function throwException( $msg ) {
                if ( $this->handle ) {
                        fclose( $this->handle );
                        unlink( $this->tmpFileName );
                }
-               throw new MWException( $msg );
+               throw new CdbException( $msg );
        }
 }
index 96a71a0..d4c38af 100644 (file)
@@ -70,7 +70,7 @@ class LanguageConverter {
        public $mMaxDepth = 10;
        public $mVarSeparatorPattern;
 
-       const CACHE_VERSION_KEY = 'VERSION 6';
+       const CACHE_VERSION_KEY = 'VERSION 7';
 
        /**
         * Constructor
index f54a35e..e62d025 100644 (file)
@@ -13,6 +13,7 @@
  * @author Ezagren
  * @author Fadli Idris
  * @author Meno25
+ * @author Rachmat.Wahidi
  * @author Sayed Muddasir
  * @author Si Gam Acèh
  */
@@ -304,7 +305,7 @@ $messages = array(
 'moredotdotdot' => 'Lom...',
 'morenotlisted' => 'Dapeuta nyoe hana leungkap',
 'mypage' => 'Laman',
-'mytalk' => 'Mariët',
+'mytalk' => 'Marit',
 'anontalk' => 'Peugah haba IP nyoë.',
 'navigation' => 'Keumudoë',
 'and' => '&#32;ngön',
@@ -316,13 +317,13 @@ $messages = array(
 'qbpageoptions' => 'Laman nyoe',
 'qbmyoptions' => 'Laman lôn',
 'qbspecialpages' => 'Laman kusuih',
-'faq' => 'FAQ',
+'faq' => 'Teunanyöng Umom',
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
 'vector-action-addsection' => 'Tamah bhaih',
 'vector-action-delete' => 'Sampôh',
-'vector-action-move' => 'Peupinah',
+'vector-action-move' => 'Pupinah',
 'vector-action-protect' => 'Peulindông',
 'vector-action-undelete' => 'Bateuë sampôh',
 'vector-action-unprotect' => 'Gantoe neulindông',
@@ -383,7 +384,7 @@ $messages = array(
 'templatepage' => 'Eu laman seunaleuëk',
 'viewhelppage' => 'Eu laman beunantu',
 'categorypage' => 'Eu laman kawan',
-'viewtalkpage' => 'Eu laman mariët',
+'viewtalkpage' => 'Eu laman marit',
 'otherlanguages' => 'Bahsa la’én',
 'redirectedfrom' => '(Geupeupinah nibak $1)',
 'redirectpagesub' => 'Laman peuninah',
@@ -425,7 +426,7 @@ $1",
 'badaccess-group0' => 'Droeneuh hana geupeuidin keu neupeulaku buët nyang neulakèë',
 'badaccess-groups' => 'Buët nyang neulakèë geupeubatah keu ureuëng ngui lam {{PLURAL:$2|kawan|salah saboh nibak kawan}}: $1.',
 
-'versionrequired' => 'Peureulèë MediaWiki versi $1',
+'versionrequired' => 'Peureulèë MediaWiki vèrsi $1',
 'versionrequiredtext' => "MediaWiki versi $1 geupeureulèë keu neungui laman nyoë. Neu'eu [[Special:Version|on versi]]",
 
 'ok' => 'Ka göt',
@@ -496,11 +497,12 @@ Dapeuta laman kusuih nyang sah jeuet neu'eu bak [[Special:SpecialPages|{{int:spe
 'readonlytext' => "Basis data hat nyoë geurôk keu teunamöng barô ngön geunantoë la'én, kadang keu peulara basis data rutin, lheuëh nyan barô lagèë biasa teuma.
 
 Ureueng urôh nyang rôk nyoe geupeutaba jeuneulaih nyoe: $1",
-'missing-article' => 'Basis data h’an jeuët jiteumèë naseukah nibak laman nyang sipatôtjih na, nakeuh "$1" $2.
+'missing-article' => 'Basis data hana jiteumèë naseukah nibak laman nyang sipatôtjih na, nyakni "$1" $2.
 
-Nyoë biasajih sabab hubông useuëng u geunantoë awai nyang ka teusampôh.
+Hai nyoë kayém jipeusabab lé peunawôt useuëng u laman nyang ka geusampôh.
 
-Meunyö kön nyoë sababjih, Droëneuh kadang ka neuteumèë saboh bug lam software. Neutulông peugah bhah nyoë bak salah sidroë [[Special:ListUsers/sysop|Nyang urôh]], ngön neupeugah alamat URL nyang neusaweuë.',
+Meunyö kön nyoë sababjih, droëneuh kadang ka neuteumeung saboh \'\'bug\'\' lam peukakaih leumiëk.
+Neutulông bri thèë hai nyoë keu salah sidroë [[Special:ListUsers/sysop|ureuëng urôih]], ngön neupeugah alamat URL-jih.',
 'missingarticle-rev' => '(revisi#: $1)',
 'missingarticle-diff' => '(Bida: $1, $2)',
 'readonly_lag' => 'Basis data ka geurôk otomatis silawét basis data sekunder teungöh geupeusinkron ngön basis data utama',
@@ -544,11 +546,21 @@ Neuci lom lam padum minèt.',
 Keu neuk tamah atawa ubah teujeumah keu ban dum wiki, neungui [//translatewiki.net/ translatewiki.net], proyek lokalisasi MediaWiki.',
 'mycustomcssprotected' => 'Droëneuh hana hak neuandam halaman CSS nyoe.',
 'mycustomjsprotected' => 'Droëneuh hana idin neuandam halaman JavaScript nyoe.',
+'mypreferencesprotected' => 'Droeneuh hana izin keu neuandam geunalak droeneuh.',
 'ns-specialprotected' => 'Laman khusuih bèk neuandam',
+'titleprotected' => 'Nan nyoe ka geupeulindông nibak neuandam lé [[User:$1|$1]].
+Dalèhjih nakeuh "\'\'$2\'\'".',
+'invalidtitle-knownnamespace' => 'Nan nyang hana sah ngön ruweueng nan "$2" ngön "$3"',
 'exception-nologin' => 'Hana tamöng lom',
 'exception-nologin-text' => 'halaman atawa buët nyoe beu neutamöng dilèë bak wiki nyoe.',
 
+# Virus scanner
+'virus-unknownscanner' => 'Antivirus hana meuturi:',
+
 # Login and logout pages
+'logouttext' => "'''Droeneuh ka neutubiet log.'''
+
+Beuneuteupue meunyoe na padum-padum laman nyang deuh lagèe na neutamöng log, sampoe ka lheuh neupeugléh ''cache''.",
 'welcomeuser' => 'Seulamat trôk teuka, $1 !',
 'welcomecreation-msg' => 'Nan droëneuh ka geupeugöt. 
 Bèk tuwo neuatô [[Special:Preferences|geunalak {{SITENAME}}]] droëneuh.',
@@ -615,6 +627,10 @@ Neupiléh nan nyang la'én.",
 'loginerror' => 'Salah bak tamöng',
 'createacct-error' => 'Peudapeuta nan barô hana meuhasé',
 'createaccounterror' => 'H‘an jeuët peudapeuta nan: $1',
+'nocookiesnew' => "Nan ureueng ngui nyoe ka meupeugöt, tapi goh meutamöng.
+{{SITENAME}} jingui ''cookies'' keu peutamöng ureueng ngui.
+''Cookies'' droeneuh hana meupeuudép.
+Neupeuudép ''cookies'' dilèe, lheuh nyan neutamöng ngön nan ureueng ngui ngön lageuem rahsia droeneuh.",
 'noname' => 'Nan ureuëng ngui nyang Droënueh peutamöng hana sah.',
 'loginsuccesstitle' => 'Meuhasé tamöng',
 'loginsuccess' => "'''Droëneuh  jinoë ka neutamöng di {{SITENAME}} sibagoë \"\$1\".'''",
@@ -639,10 +655,20 @@ Meunyö ureuëng la\'én nyang peugöt neulakèë nyoe, atawa meunyö droeneuh k
 'noemailcreate' => 'Droeneuh suwah neuseudia alamt surat-e nyang jeut ngui.',
 'passwordsent' => 'Lageuëm barô ka geupeu\'et u surat-e nyang geupeudapeuta keu "$1". Neutamöng teuma lheuëh neuteurimöng surat-e nyan.',
 'eauthentsent' => 'Saboh surat-e keu peunyö ka geukirém u alamat surat-e Droëneuh. Droëneuh beuneuseutöt préntah lam surat nyan keu neupeunyö meunyö alamat nyan nakeuh beutôi atra Droëneuh. {{SITENAME}} h‘an geupeuudép surat Droëneuh meunyö langkah nyoë hana neupeubuet lom.',
+'cannotchangeemail' => 'Alamat surat-e han jeut geugantoe bak wiki nyoe.',
+'emaildisabled' => 'Situs nyoe han jeut geukirém surat-e.',
 'accountcreated' => 'Ureuëng ngui ka teupeugöt',
 'accountcreatedtext' => 'Ureuëng ngui keu [[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|talk]]) ka teupeugöt.',
 'createaccount-title' => 'Peugöt ureuëng ngui keu {{SITENAME}}',
+'usernamehasherror' => 'Nan ureueng ngui han jeut na tanda pageue',
+'login-throttled' => 'Droeneuh ka lé that neuujoe tamöng.
+Neuprèh $1 sigohlom neuujoe lom.',
 'loginlanguagelabel' => 'Bahsa: $1',
+'createacct-another-realname-tip' => 'Nan aseuli hana meucéh neupasoe.
+Meunyö neupasoe, euntreuk nan droëneuh nyan geupeuleumah mangat jitupeue soe nyang tuléh.',
+
+# Email sending
+'user-mail-no-addy' => 'Ujoe kirém surat-e ngön hana alamat surat-e.',
 
 # Change password dialog
 'resetpass' => 'Gantoë lageuëm rahsia',
@@ -656,27 +682,45 @@ Meunyö ureuëng la\'én nyang peugöt neulakèë nyoe, atawa meunyö droeneuh k
 'resetpass-no-info' => "Droëneuh suwah neutamöng mangat jeuët neu'eu laman nyoë",
 'resetpass-submit-loggedin' => 'Gantoë lageuëm rahsia',
 'resetpass-submit-cancel' => 'Pubateuë',
+'resetpass-temp-password' => 'Lageuem rahsia keu siat:',
+
+# Special:PasswordReset
+'passwordreset-username' => 'Ureueng ngui:',
+'passwordreset-capture' => 'Eu hasé surat-e?',
+'passwordreset-email' => 'Alamat surat-e:',
+'passwordreset-emailtitle' => 'Teuneurang nan ureueng ngui bak {{SITENAME}}',
+
+# Special:ChangeEmail
+'changeemail' => 'Gantoe alamat surat-e',
+'changeemail-header' => 'Gantoe alamat surat-e',
+'changeemail-no-info' => "Droeneuh suwah neutamöng mangat jeuet neu'eu laman nyoe",
+'changeemail-oldemail' => 'Alamat surat-e jinoe:',
+'changeemail-newemail' => 'Alamat surat-e barô:',
+'changeemail-none' => '(hana)',
+'changeemail-password' => 'Lageuem rahsia {{SITENAME}} droeneuh:',
+'changeemail-submit' => 'Gantoe surat-e',
+'changeemail-cancel' => 'Peubateue',
 
 # Edit page toolbar
 'bold_sample' => 'Rakam teubai',
 'bold_tip' => 'Haraih teubai',
 'italic_sample' => 'Rakam singèt naseukah nyoë',
 'italic_tip' => 'Rakam singèt',
-'link_sample' => 'Nan hubông',
+'link_sample' => 'Nan peunawôt',
 'link_tip' => 'Peunawôt dalam',
-'extlink_sample' => 'http://www.example.com nan hubông',
+'extlink_sample' => 'http://www.example.com nan peunawôt',
 'extlink_tip' => 'Peunawôt luwa (neubôh http:// bak awai)',
 'headline_sample' => 'Naseukah nan',
 'headline_tip' => 'Aneuk beunagi tingkat 1',
 'nowiki_sample' => 'Bèk format naseukah nyoë',
 'nowiki_tip' => 'Bèk seutot beuntuk wiki',
 'image_tip' => 'Pasoë beureukaih',
-'media_tip' => 'Hubông beureukaih',
+'media_tip' => 'Peunawôt beureukaih',
 'sig_tip' => 'Tanda jaroë Droëneuh ngön tanda watèë',
 'hr_tip' => 'Garéh data',
 
 # Edit pages
-'summary' => 'Ehtisa:',
+'summary' => 'Éhtisa:',
 'subject' => 'Bhah/nan:',
 'minoredit' => 'Nyoë lôn andam bacut',
 'watchthis' => 'Kalön laman nyoë',
@@ -686,6 +730,7 @@ Meunyö ureuëng la\'én nyang peugöt neulakèë nyoe, atawa meunyö droeneuh k
 'showdiff' => 'Peuleumah neuubah',
 'anoneditwarning' => 'Droëneuh   hana teudapeuta tamong. Alamat IP Droëneuh   teucatat lam tarèh (riwayat away) ôn nyoë.',
 'summary-preview' => 'Eu dilèë neuringkaih:',
+'blockedtitle' => 'Ureueng ngui geutheun',
 'blockedtext' => "'''Nan ureuëng nguy atawa alamat IP Droëneuh  ka geutheun.'''
 
 Geutheun lé $1. Dalèh jih nakeuh ''$2''.
@@ -699,18 +744,49 @@ Droëneuh   jeuët neutanyong bak $1 atawa [[{{MediaWiki:Grouppage-sysop}}|nyang
 Droëneuh   h’an jeuët neunguy alat 'Kirém surat-e ureuëng nguy nyoë' keucuali ka neupasoë alamat surat-e nyang sah di [[Special:Preferences|Geunalak]] Droëneuh ngön Droëneuh ka geutheun keu nguy nyan.
 
 Alamat IP Droëneuh nakeuh $3, ngön ID neutheun nakeuh $5. Tulông peuseureuta salah saboh atawa ban duwa beurita nyoë bak tiëp teunanyöng nyang neupeugöt.",
+'autoblockedtext' => "'''Nan ureuëng nguy atawa alamat IP Droëneuh  ka geutheun.'''
+
+Geutheun lé $1. Dalèh jih nakeuh ''$2''.
+
+* Geutheun yôh: $8
+* Neutheun maté tanggay bak: $6
+* Nyang geutheun: $7
+
+Droëneuh   jeuët neutanyong bak $1 atawa [[{{MediaWiki:Grouppage-sysop}}|nyang urôh nyang la’én]] keu peugah haba bhah nyoë.
+
+Droëneuh   h’an jeuët neunguy alat 'Kirém surat-e ureuëng nguy nyoë' keucuali ka neupasoë alamat surat-e nyang sah di [[Special:Preferences|Geunalak]] Droëneuh ngön Droëneuh ka geutheun keu nguy nyan.
+
+Alamat IP Droëneuh nakeuh $3, ngön ID neutheun nakeuh $5. Tulông peuseureuta salah saboh atawa ban duwa beurita nyoë bak tiëp teunanyöng nyang neupeugöt.",
+'blockednoreason' => 'hana dalèh nyang geubri',
+'whitelistedittext' => 'Droeneuh suwah $1 keu neuandam ôn.',
+'nosuchsectiontitle' => 'Bideueng hana geutumèe',
+'loginreqtitle' => 'Droeneuh payah neutamöng log.',
+'loginreqlink' => 'tamöng',
+'loginreqpagetext' => "Droeneuh payah $1 keu neu'eu ôn-ôn la'én.",
+'accmailtitle' => 'Lageuem rahsia ka meukirém',
 'newarticle' => '(Barô)',
-'newarticletext' => "Droëneuh   ka neuseutot u laman nyang goh na. Keu peugöt laman nyan, neukeutik asoë ôn di  kutak di yup nyoë (ngiëng [[{{MediaWiki:Helppage}}|ôn bantu]] keu beurita leubèh lanjut). Meunyö Droëneuh  hana neusaja ka trôk keunoë, teugon '''back''' nyang na bak layeuë.",
+'newarticletext' => "Droëneuh ka neuseutöt peunawôt u laman nyang goh na.
+Keu neupeugöt laman nyan, neukeutik lam plôk di yup (eu [[{{MediaWiki:Helppage}}|laman beunantu]] keu haba leubèh le).
+Meunyö droëneuh trôk keunoë hana neusaja, neuteugön tèk '''back''' bak ''browser'''droëneuh.",
+'anontalkpagetext' => "----''Nyoe nakeuh ôn marit ureueng ngui nyang hana tamöng atawa hana geungui.''
+Saweub nyan, kamoe payah meukubah alamat IP-geuh keu meuparéksa. 
+Alamat IP mungkén jingui lé padum-padum droe ureueng.
+Meunyoe droeneuh ureueng nyang hana tamöng nyan, tulông [[Special:UserLogin/signup|peugöt nan ureueng ngui]] atawa [[Special:UserLogin|tamöng log]] mangat meuteugah nibak bhah nyang hana meuphôm bak uroe la'én.",
 'noarticletext' => 'Hana naseukah jinoë lam laman nyoë.
 Ji Droëneuh jeuët [[Special:Search/{{PAGENAME}}|neumita keu nan ôn nyoë]] bak ôn-ôn la’én, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} log nyang na hubôngan], atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} neu\'andam ôn nyoë]</span>.',
 'noarticletext-nopermission' => 'Hana asoë bak laman nyoë jinoë.
 Droëneuh jeuët [[Special:Search/{{PAGENAME}}|neumita keu nan ôn nyoë]] bak laman-laman la\'én,
 atawa <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} neumita log nyang na meuhubông]</span>, tapi Droëneuh hana idin keu neupeugöt laman nyoë',
+'userpage-userdoesnotexist-view' => 'Ureueng ngui "$1" hana teudapeuta.',
 'updated' => '(Seubarô)',
 'note' => "'''Hareutoë:'''",
 'previewnote' => "'''Beu neuingat meunyo laman nyoë goh lom neukeubah!'''",
 'editing' => 'Andam $1',
+'creating' => 'Teungöh meupeugöt $1',
 'editingsection' => 'Andam $1 (bideuëng)',
+'editingcomment' => 'Andam $1 (bideuëng)',
+'storedversion' => 'Riwayat meukubah',
+'yourdiff' => 'Bida',
 'copyrightwarning' => "Beu neuingat bahwa ban mandum nyang Droëneuh   tuléh keu {{SITENAME}} geukira geupeuteubiët di yup $2 (ngiëng $1 keu leubèh jeulah). Meunyoë Droëneuh h‘an neutém teunuléh Droëneuh  ji’andam ngön jiba ho ho la’én, bèk neupasoë teunuléh Droëneuh  keunoë.<br />Droëneuh  neumeujanji chit meunyoë teunuléh nyoë nakeuh atra neutuléh keudroë, atawa neucok nibak nè nè atra umôm atawa nè bibeuëh la’én.
 '''BÈK NEUPASOË TEUNULÉH NYANG GEUPEULINDÔNG HAK KARANG NYANG HANA IDIN'''",
 'templatesused' => '{{PLURAL:$1|Templat|Templates}} nyang geungui bak laman nyoë:',
@@ -719,6 +795,11 @@ atawa <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}
 'template-semiprotected' => '(siteungoh-lindông)',
 'hiddencategories' => 'Laman nyoë nakeuh anggèëta nibak {{PLURAL:$1|1 kawan teusom |$1 kawan teusom}}:',
 'nocreatetext' => '{{SITENAME}} ka jiköt bak peugöt laman barô. Ji Droëneuh   jeuët neuriwang teuma ngön neu’andam laman nyang ka na, atawa [[Special:UserLogin|neutamong atawa neudapeuta]].',
+'nocreate-loggedin' => 'Droeneuh hana khut keu neupeugöt laman-laman barô.',
+'sectioneditnotsupported-title' => 'Andam bideung hana meudukông',
+'sectioneditnotsupported-text' => 'Andam bideung hana meudukông bak ôn nyoe.',
+'permissionserrors' => 'Salah khut/hak tamöng',
+'permissionserrorstext' => 'Droëneuh hana hak tamöng keu $2, muroë {{PLURAL:$1|choë|choë}} nyoë:',
 'permissionserrorstext-withaction' => 'Droëneuh hana hak tamöng keu $2, muroë {{PLURAL:$1|choë|choë}} nyoë:',
 'recreate-moveddeleted-warn' => "'''Ingat: Droëneuh neupeugöt ulang saboh laman nyang ka tom geusampôh. ''',
 
@@ -726,6 +807,14 @@ Neutimang-timang dilèë peuë ék patôt neupeulanjut atra nyang teungöh neu
 Nyoë pat nakeuh log seunampôh nibak laman nyoë:",
 'moveddeleted-notice' => 'Laman nyoë ka geusampôh.
 Log seunampôh ngön log pinah laman nyoë geupeuseudia di yup nyoë keu keuneubah.',
+'log-fulllog' => 'Eu ban dum ceunatat',
+'edit-hook-aborted' => "Seunampôh geupeubateuë lé kaw'ét parser.
+Hana jeuneulaih.",
+'edit-gone-missing' => 'Han jeut peubarô ôn.
+Ôn nyoe mungkén ka geusampôh.',
+'postedit-confirmation' => 'Neuandam droeneuh ka meukubah.',
+'edit-already-exists' => 'Han jeut peugöt ôn barô.
+Ôn nyoe ka lheuh na.',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Ingat:''' Seunipat seunaleuëk nyang neunguy rayek that.
@@ -733,19 +822,27 @@ Ladôm seunaleuëk hana geupeurôh",
 'post-expand-template-inclusion-category' => 'Laman ngön seunipat seunaleuëk nyang leubèh bataih',
 'post-expand-template-argument-warning' => "'''Ingat:''' Laman nyoe na paléng h'an saboh alasan seunaleuëk nyang na sunipat èkspansi nyang raya that.
 Alasan-alasan nyan hana geupeureumeuën.",
-'post-expand-template-argument-category' => 'Laman ngön alasan seunaleuëk nyang hana geupeureumeuën',
+'post-expand-template-argument-category' => 'Laman ngön dalèh seunaleuëk nyang hana geupeureumeuën',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'Han jeut peugöt nan ureueng ngui',
+'cantcreateaccount-text' => "Peuneugöt nan ureueng ngui nibak alamat IP ('''$1''') ka geutheun lé [[User:$3|$3]].
+
+Dalèh $3 nyoe nakeuh ''$2''",
 
 # History pages
 'viewpagelogs' => 'Eu log laman nyoë',
+'nohistory' => 'Hana riwayat neuandam awai keu ôn nyoe.',
 'currentrev' => 'Geunantoë jinoë',
 'currentrev-asof' => 'Geunantoë barô bak $1',
 'revisionasof' => 'Geunantoë tiëp $1',
 'revision-info' => 'Geunantoë tiëp $1; $2',
-'previousrevision' => '←Geunantoë sigohlomjih',
+'previousrevision' => '← Geunantoë awai',
 'nextrevision' => 'Geunantoë lheuëh nyan→',
 'currentrevisionlink' => 'Geunantoë jinoë',
 'cur' => 'jin',
-'last' => 'akhé',
+'next' => 'u keu',
+'last' => 'sigohlom',
 'page_first' => 'phôn',
 'page_last' => 'keuneulheuëh',
 'histlegend' => "Piléh duwa teuneugön radiô, lheuëh nyan teugön teuneugön ''peubandéng'' keu peubandéng seunalén. Teugön saboh tanggay keu eu seunalén ôn bak tanggay nyan.<br />(skr) = bida ngön seunalén jinoë, (akhé) = bida ngön seunalén sigohlomjih. '''u''' = andam ubeut, '''b''' = andam bot, → = andam bideuëng, ← = ehtisa keudroë",
@@ -753,19 +850,38 @@ Alasan-alasan nyan hana geupeureumeuën.",
 'history-show-deleted' => 'Nyang geusampôh mantöng',
 'histfirst' => 'paléng trép',
 'histlast' => 'paléng barô',
+'historyempty' => '(soh)',
 
 # Revision feed
+'history-feed-title' => 'Riwayat neupeupah',
+'history-feed-description' => 'Riwayat neupeupah keu ôn nyoe bak wiki',
 'history-feed-item-nocomment' => '$1 bak $2',
 
 # Revision deletion
+'rev-deleted-comment' => '(mohtasa neuandam geusampôh)',
+'rev-deleted-user' => '(nan ureueng ngui geusampôh)',
+'rev-deleted-user-contribs' => '[nan ureueng ngui atawa alamat IP geusampôh - neuandam geupeusom bak dapeuta beuneuri]',
 'rev-delundel' => 'peuleumah/peusom',
-'revdel-restore' => 'Gantoë seuneudeuh',
+'rev-showdeleted' => 'peudeuh',
+'revdelete-show-file-submit' => 'Nyoe',
+'revdelete-hide-comment' => 'Mohtasa neuandam',
+'revdelete-radio-same' => '(bèk neugantoe)',
+'revdelete-radio-set' => 'Deuh',
+'revdelete-radio-unset' => 'Teusom',
+'revdelete-log' => 'Dalèh:',
+'revdel-restore' => 'Gantoë seuneudeuih',
 'revdel-restore-deleted' => 'geunantoe nyang ka geusampôh',
-'revdel-restore-visible' => 'geunantoë nyang deuh',
+'revdel-restore-visible' => 'geunantoë nyang deuih',
 'pagehist' => 'Taréh laman',
 'deletedhist' => 'Taréh nyang meusampôh',
 
+# History merging
+'mergehistory-from' => 'Asai ôn:',
+'mergehistory-invalid-source' => 'Asai ôn payah nan nyang beutôi.',
+'mergehistory-reason' => 'Dalèh:',
+
 # Merge log
+'mergelog' => 'Peugabông log',
 'revertmerge' => 'Hana jadèh peugabông',
 
 # Diffs
@@ -773,6 +889,7 @@ Alasan-alasan nyan hana geupeureumeuën.",
 'lineno' => 'Baréh $1:',
 'compareselectedversions' => 'Peubandéng curak teupiléh',
 'editundo' => 'pubateuë',
+'diff-empty' => '(Hana bida)',
 'diff-multi' => '({{PLURAL:$1|Saboh|$1}} geunantoë antara nyang geupeugot le {{PLURAL:$2|sidroe|$2}} ureueng nguy hana geupeuleumah)',
 
 # Search results
@@ -820,30 +937,136 @@ Neubaci puphôn neulakèë droëneuh ngön ''all:'' keu jak mita ban dum asoë (
 'powersearch-ns' => 'Mita bak ruweuëng nan:',
 'powersearch-redir' => 'Dapeuta peuninah',
 'powersearch-field' => 'Mita',
+'powersearch-toggleall' => 'Ban dum',
+'powersearch-togglenone' => 'Hana',
 
 # Preferences page
 'preferences' => 'Galak',
 'mypreferences' => 'Atô',
+'prefs-edits' => 'Jumeulah neuandam:',
+'prefsnologin' => 'Hana tamöng lom',
+'changepassword' => 'Gantoe lageuem rahsia',
+'prefs-skin' => 'Kulét',
+'skin-preview' => 'Eu dilèe',
+'datedefault' => 'Hana geunalak',
+'prefs-beta' => 'Fitur bèta',
+'prefs-datetime' => 'Uroe ngön jeum',
+'prefs-user-pages' => 'Laman ureueng ngui',
+'prefs-personal' => 'Profil ureueng ngui',
 'prefs-rc' => 'Ban meuubah',
+'prefs-watchlist' => 'Dapeuta keunalön',
+'prefs-watchlist-days' => 'Jumeulah uroe nyang meupeudeuh bak dapeuta keunalön:',
+'prefs-watchlist-days-max' => '{{PLURAL:$1|uroë}}',
+'prefs-misc' => "La'én-la'én",
+'prefs-resetpass' => 'Gantoe lageuem rahsia',
+'prefs-changeemail' => 'Gantoe alamat surat-e',
+'prefs-setemail' => 'Pasoe alamat surat-e',
 'prefs-email' => 'Peuniléh surat-e',
+'prefs-rendering' => 'Seuneudeuh',
+'saveprefs' => 'Kubah',
+'resetprefs' => 'Peugléh neuubah nyang goh meukubah',
+'prefs-editing' => 'Neuandam',
+'rows' => 'Baréh:',
 'searchresultshead' => 'Mita',
+'resultsperpage' => 'Hasé lam saboh laman:',
+'stub-threshold-disabled' => 'Geupeumaté',
+'timezoneuseoffset' => "La'én (peuteuntèe bidajih)",
+'timezoneoffset' => 'Bida:',
+'timezoneregion-america' => 'Amirika',
+'timezoneregion-antarctica' => 'Antartika',
+'timezoneregion-atlantic' => 'Laôt Atlantik',
+'timezoneregion-europe' => 'Ierupa',
+'timezoneregion-indian' => 'Laôt India',
+'timezoneregion-pacific' => 'Laôt Pasifik',
+'allowemail' => "Peuudép surat-e nibak ureueng ngui la'én",
 'prefs-searchoptions' => 'Mita',
 'prefs-namespaces' => 'Ruweuëng nan',
+'defaultns' => 'Atawa neumita lam ruweueng nan nyoe:',
+'default' => 'meuneumat',
 'prefs-files' => 'Beureukaih',
 'youremail' => 'Surat-e:',
+'prefs-registration' => 'Watèe neudapeuta:',
 'yourrealname' => 'Nan aseuli:',
 'yourlanguage' => 'Bahsa:',
+'yournick' => 'Tanda jaroe barô:',
+'prefs-help-signature' => 'Komèntar bak ôn marit suwah neubôh "<nowiki>~~~~</nowiki>", nyang eunteuk meugantoe keu tanda jaroe droeneuh ngön watèe jinoe.',
+'badsiglength' => 'Tanda jaroe droeneuh panyang that.
+Panyangjih bèk leubèh nibak $1 {{PLURAL:$1|haraih|haraih}}.',
+'gender-unknown' => 'Hana geupeunyata',
+'gender-male' => 'Ureueng agam',
+'gender-female' => 'Ureueng inöng',
 'email' => 'Surat-e',
 'prefs-help-realname' => '* Nan aseuli hana meucéh neupasoë.
 Meunyö neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë nyang tuléh.',
 'prefs-help-email' => 'Alamat surat-e hana meucéh na, tapi geupeureulèë keu seumeugöt ulang lageuem, meunyö droeneuh tuwö lageuëm.',
 'prefs-help-email-others' => "Droeneuh jeuet cit neupiléh neupubiyeuë ureuëng la'én geupeu'et surat keu droeneuh röt surat-e röt seunambat bak laman ureueng ngui atawa on mariët.
 Surat-e droeneuh h'an geupeugah keu ureuëng nyan.",
+'prefs-help-email-required' => 'Peureulèe alamat surat-e.',
+'prefs-signature' => 'Tanda jaroe',
+'prefs-dateformat' => 'Format uroe/watèe',
+'prefs-timeoffset' => 'Bida watèe',
+'prefs-advancedediting' => 'Peuniléh umom',
+'prefs-editor' => 'Ureueng andam',
+'prefs-preview' => 'Eu dilèe',
+'prefs-diffs' => 'Bida',
+'prefs-help-prefershttps' => 'Geunalak nyoe geupeudeuh watèe neutamöng lom.',
+
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'Alamat surat-e sah',
+'email-address-validity-invalid' => 'Pasoe alamat surat-e nyang sah',
+
+# User rights
+'userrights-user-editname' => 'Pasoe nan ureueng ngui:',
+'editusergroup' => 'Ubah kawan ureueng ngui',
+'editinguser' => "Gantoe khut ureueng ngui '''[[User:$1|$1]]''' $2",
+'userrights-editusergroup' => 'Ubah kawan ureueng ngui',
+'saveusergroups' => 'Ubah kawan ureueng ngui',
+'userrights-groupsmember' => 'Anggèeta nibak:',
+'userrights-reason' => 'Dalèh:',
+'userrights-no-interwiki' => "Droeneuh hana izin keu neuubah khut ureueng ngui bak wiki la'én.",
+'userrights-notallowed' => 'Droeneuh hana izin keu neutamah atawa neupeugadöh khut ureueng ngui.',
+'userrights-changeable-col' => 'Kawan nyang jeut neugantoe',
+'userrights-unchangeable-col' => 'Kawan nyang han jeut neugantoe',
 
 # Groups
+'group' => 'Kawan:',
+'group-user' => 'Ureueng-ureueng ngui',
+'group-autoconfirmed' => 'Ureueng ngui nyang meu-konfirmasi otomatis',
 'group-sysop' => 'Ureuëng urôh',
-
+'group-bureaucrat' => 'Birôkrat',
+'group-suppress' => 'Ureueng kalön',
+'group-all' => '(ban dum)',
+
+'group-user-member' => '{{GENDER:$1|ureueng ngui}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|ureueng ngui meu-konfirmasi otomatis}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|ureueng urôh}}',
+'group-bureaucrat-member' => '{{GENDER:$1|birôkrat}}',
+'group-suppress-member' => '{{GENDER:$1|ureueng kalön}}',
+
+'grouppage-user' => '{{ns:project}}:Ureueng ngui',
+'grouppage-autoconfirmed' => '{{ns:project}}:Ureueng ngui meu-konfirmasi otomatis',
+'grouppage-bot' => '{{ns:project}}:Bots',
 'grouppage-sysop' => '{{ns:project}}:Ureuëng urôh',
+'grouppage-bureaucrat' => '{{ns:project}}:Birôkrat',
+'grouppage-suppress' => '{{ns:project}}:Ureueng kalön',
+
+# Rights
+'right-read' => 'Beuet laman',
+'right-edit' => 'Andam laman',
+'right-createpage' => 'Peugöt laman barô (nyang kön laman marit)',
+'right-createtalk' => 'Peugöt ôn marit',
+'right-createaccount' => 'Peugöt nan ureueng ngui barô',
+'right-minoredit' => 'Bôh tanda seubagoe andam ubeut',
+'right-move' => 'Pinah laman',
+'right-move-subpages' => 'Pinah laman ngön ban dum aneuk laman',
+'right-move-rootuserpages' => 'Pinah laman ureueng ngui',
+'right-movefile' => 'Pinah beureukaih',
+'right-upload' => 'Peutamöng beureukaih',
+'right-upload_by_url' => 'Peutamöng beureukaih nibak URL',
+'right-delete' => 'Sampôh laman',
+'right-bigdelete' => 'Sampôh laman ngön ban dum riwayatjih',
+'right-browsearchive' => 'Mita laman nyang geusampôh',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Ureuëng ngui barô',
@@ -863,13 +1086,11 @@ Surat-e droeneuh h'an geupeugah keu ureuëng nyan.",
 'recentchanges' => 'Neuubah barô',
 'recentchanges-legend' => 'Peuniléh neuubah barô',
 'recentchanges-summary' => "Di yup nyoë nakeuh neuubah barô nyang na bak Wikipèdia nyoë.
-
-
-Hareutoë: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = laman barô, '''u''' = neuandam ubeut, '''b''' = neuandam bot, (± ''bit'') = jumeulah asoë meutamah/meukureuëng, → = neuandam beunagi, ← = mohtasa otomatis.
+Hareutoë: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = laman barô, '''u''' = neuandam ubeut, '''b''' = neuandam bot, (± ''bit'') = jeumeulah asoë meutamah/meukureuëng, → = neuandam bideuëng, ← = mohtasa otomatis.
 ----",
 'recentchanges-noresult' => 'Hana neuubah lam lheuëng watèë nyoë nyang paih ngön syarat',
 'recentchanges-feed-description' => 'Seutöt neuubah barô lam wiki bak umpeuën nyoë.',
-'recentchanges-label-newpage' => 'Neuandam nyoe jipeugöt laman barô',
+'recentchanges-label-newpage' => 'Neuandam nyoë jipeugöt laman barô',
 'recentchanges-label-minor' => 'Nyoe neuandam ubeut',
 'recentchanges-label-bot' => 'Neuandam nyoe geupubuet le bot',
 'recentchanges-label-unpatrolled' => 'Neuandam nyoe goh lom geukalon',
@@ -890,47 +1111,99 @@ Hareutoë: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = laman bar
 'minoreditletter' => 'b',
 'newpageletter' => 'B',
 'boteditletter' => 'b',
+'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|ureueng kalön|ureueng kalön}}]',
+'rc_categories_any' => 'Pue-pue mantöng',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bita|bita}} lheuh meuandam',
+'newsectionsummary' => '/* $1 */ bideung barô',
 'rc-enhanced-expand' => 'Peuleumah rincian',
 'rc-enhanced-hide' => 'Peusom rincian',
+'rc-old-title' => 'sigohlom nyan geupeugöt "$1"',
 
 # Recent changes linked
-'recentchangeslinked' => 'Neuubah meuhubông',
+'recentchangeslinked' => "Neuubah meukaw'èt",
 'recentchangeslinked-feed' => 'Neuubah meuhubông',
 'recentchangeslinked-toolbox' => "Neuubah teukaw'èt",
-'recentchangeslinked-title' => 'Neuubah nyang meuhubông ngön $1',
+'recentchangeslinked-title' => "Neuubah nyang meukaw'èt ngön $1",
 'recentchangeslinked-summary' => "Nyoë nakeuh dapeuta neuubah nyang geupeugèt ban-ban nyoë keu on-on nyang meuhubông nibak ôn ka kusuih (atawa keu anggèëta kawan kusuih).
 Ôn-ôn bak [[Special:Watchlist|keunalon droeneuh]] geucitak '''teubay'''.",
 'recentchangeslinked-page' => 'Nan laman:',
-'recentchangeslinked-to' => 'Peuleumah neu’ubah nibak laman-laman nyang meusambông ngön laman nyang geubri',
+'recentchangeslinked-to' => 'Peuleumah neuubah nibak laman-laman nyang mupawôt ngön laman nyang geubri',
 
 # Upload
 'upload' => 'Peutamöng beureukaih',
 'uploadbtn' => 'Peutamong beureukaih',
+'reuploaddesc' => 'Riwang u laman peutamöng',
+'uploadnologin' => 'Hana lom meutamöng',
+'uploadnologintext' => 'Droeneuh suwah $1 keu neupeutamöng beureukaih.',
+'uploadlog' => 'ceunatat peutamöng',
 'uploadlogpage' => 'Log peutamöng',
+'uploadlogpagetext' => 'Nyoe nakeuh dapeuta peutamöng barô.
+Eu [[Special:NewFiles|galeri beureukaih barô]] keu seuneudeuh barô.',
+'filename' => 'Nan beureukaih',
 'filedesc' => 'Ehtisa',
+'fileuploadsummary' => 'Éhtisa:',
+'filesource' => 'Nè',
+'uploadedfiles' => 'Beureukaih nyang meupeutamöng',
+'minlength1' => 'Nan beureukaih beuna saboh haraih.',
+'illegalfilename' => 'Nan beureukaih "$1" meuasoe seunurat nyang han jeut na bak nan. Tulông gantoe nan nyan sigohlom neupeutamöng lom.',
+'filename-toolong' => 'Nan beureukaih han jeut leubèh nibak 240 bita.',
+'badfilename' => 'Nan beureukaih ka meugantoe keu "$1".',
+'empty-file' => 'Beureukaih nyang neupeutamöng soh.',
+'file-too-large' => 'Beureukaih nyang neupeutamöng rayek that.',
+'filename-tooshort' => 'Nan beureukaih paneuk that.',
+'filetype-banned' => 'Jeunèh beureukaih nyoe geutheun.',
+'illegal-filename' => 'Nan beureukaih han jeut lagèe nyoe.',
+'savefile' => 'Kubah beureukaih',
 'uploadedimage' => 'peutamöng "[[$1]]"',
+'overwroteimage' => 'peutamöng vèrsi barô "[[$1]]"',
+'upload-source' => 'Asai beureukaih',
+'sourcefilename' => 'Asai nan beureukaih:',
+'sourceurl' => 'Asai URL:',
+'upload-maxfilesize' => 'Paléng rayek beureukaih: $1',
+'upload-description' => 'Teuneurang beureukaih',
+'watchthisupload' => 'Kalön beureukaih nyoe',
+'upload-success-subj' => 'Ka meupeutamöng',
+
+# img_auth script messages
+'img-auth-nofile' => 'Hana beureukaih "$1".',
 
 'license' => 'Jeunèh lisensi:',
 'license-header' => 'Jeunèh lisensi',
 
 # Special:ListFiles
+'imgfile' => 'beureukaih',
 'listfiles' => 'Dapeuta beureukah',
+'listfiles_thumb' => 'Beuntuk ubeut',
+'listfiles_date' => 'Uroe',
+'listfiles_name' => 'Nan',
+'listfiles_user' => 'Ureueng ngui',
+'listfiles_size' => 'Rayek',
+'listfiles_description' => 'Teuneurang',
+'listfiles_count' => 'Vèrsi',
+'listfiles-show-all' => 'Peurôh vèrsi awai gamba',
+'listfiles-latestversion' => 'Vèrsi jinoe',
+'listfiles-latestversion-yes' => 'Nyoe',
+'listfiles-latestversion-no' => 'Kön',
 
 # File description page
 'file-anchor-link' => 'Beureukaih',
 'filehist' => 'Riwayat beureukaih',
 'filehist-help' => "Neuteugon bak uroë buleuën/watèë keu neu'eu beureukaih nyoë ‘oh watèë nyan.",
+'filehist-deleteall' => 'sampôh ban dum',
+'filehist-deleteone' => 'sampôh',
 'filehist-revert' => 'peuriwang',
 'filehist-current' => 'jinoë hat',
 'filehist-datetime' => 'Uroë buleuën/Watèë',
 'filehist-thumb' => 'Beuntuk ubeut',
 'filehist-thumbtext' => 'Beuntuk ubeut keu seunalén tiëp $1',
+'filehist-nothumb' => 'Hana beuntuk ubeut',
 'filehist-user' => 'Ureuëng ngui',
 'filehist-dimensions' => 'Dimènsi',
 'filehist-filesize' => 'Rayek beureukah',
 'filehist-comment' => "Seuneu'ôt",
+'filehist-missing' => 'Beureukaih hana meutumèe',
 'imagelinks' => 'Seuneungui beureukaih',
-'linkstoimage' => 'Laman di yup nyoë na {{PLURAL:$1|hubông|$1 hubông}} u beureukah nyoë:',
+'linkstoimage' => '{{PLURAL:$1|laman}} di yup nyoë mupawôt u beureukaih nyoë:',
 'nolinkstoimage' => 'Hana laman nyang na meupawôt u beureukaih nyoë.',
 'sharedupload' => 'Beureukah nyoë dari $1 ngön kadang geunguy lé buët-buët la’én.',
 'sharedupload-desc-here' => "Beureukaih nyoe nejih nibak $1 ngon kadang geunguy le proyek-proyek la'en.
@@ -1019,25 +1292,75 @@ Teuneurang bak [$2 on teuneurangjih] geupeuleumah di yup nyoe.",
 'allpagesfrom' => 'Peuleumah laman peuphôn nibak:',
 'allpagesto' => 'Peuleumah laman geupeuakhé bak:',
 'allarticles' => 'Dapeuta teunuléh',
+'allpagesprev' => 'U likôt',
+'allpagesnext' => 'U keue',
 'allpagessubmit' => 'Mita',
 'allpagesprefix' => 'Peuleumah laman ngön harah phôn:',
+'allpages-hide-redirects' => 'Peusom peuninah',
 
 # Special:Categories
 'categories' => 'Dapeuta kawan',
+'special-categories-sort-count' => 'atôe meunurôt jumeulah',
+'special-categories-sort-abc' => 'atôe meunurôt seunurat',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'Beuneuri nyang geusampôh',
+'deletedcontributions-title' => 'Beuneuri nyang geusampôh',
+'sp-deletedcontributions-contribs' => 'beuneuri',
 
 # Special:LinkSearch
 'linksearch' => 'Mita seuneumat luwa',
+'linksearch-pat' => 'Pola mita:',
+'linksearch-ns' => 'Ruweueng nan:',
 'linksearch-ok' => 'Mita',
 'linksearch-line' => '$1 meupawôt nibak $2',
 
+# Special:ListUsers
+'listusersfrom' => 'Peuleumah ureueng ngui nyang neuawai ngön:',
+'listusers-submit' => 'Peuleumah',
+'listusers-noresult' => 'Hana ureueng ngui nyang meutumèe.',
+'listusers-blocked' => '(geutheun)',
+
+# Special:ActiveUsers
+'activeusers' => 'Dapeuta ureueng ngui udép',
+'activeusers-intro' => 'Nyoe nakeuh dapeuta ureueng ngui nyang na geuandam $1 {{PLURAL:$1|uroe|uroe}} u likôt.',
+'activeusers-count' => '$1 {{PLURAL:$1|buet|buet}} lam {{PLURAL:$3|uroe|$3 uroe}} u likôt',
+'activeusers-from' => 'Peuleumah ureueng ngui nyang neuawai ngön:',
+'activeusers-hidebots' => 'Peusom bot',
+'activeusers-hidesysops' => 'Peusom ureueng urôh',
+'activeusers-noresult' => 'Hana ureueng ngui nyang meutumèe.',
+
 # Special:ListGroupRights
+'listgrouprights' => 'Dapeuta khut ureueng ngui',
+'listgrouprights-key' => 'Teuneurang:
+* <span class="listgrouprights-granted">Khut nyang geubri</span>
+* <span class="listgrouprights-revoked">Khut nyang hana geubri</span>',
+'listgrouprights-group' => 'Kawan',
+'listgrouprights-rights' => 'Khut',
+'listgrouprights-helppage' => 'Beunantu:Khut kawan',
 'listgrouprights-members' => '(dapeuta anggèëta)',
+'listgrouprights-addgroup' => 'Tamah {{PLURAL:$2|kawan|kawan}}: $1',
+'listgrouprights-removegroup' => 'Sampôh {{PLURAL:$2|kawan|kawan}}: $1',
+'listgrouprights-addgroup-all' => 'Tamah ban dum kawan',
+'listgrouprights-removegroup-all' => 'Sampôh ban dum kawan',
 
 # Email user
 'emailuser' => 'Surat-e ureuëng ngui',
 'emailuser-title-target' => "Peu'ét surat-e keu {{GENDER:$1|ureuëng ngui}} nyoë",
 'emailuser-title-notarget' => "Peu'ét surat-e",
 'emailpage' => "Peu'ét surat-e keu ureuëng ngui",
+'emailusername' => 'Ureueng ngui:',
+'emailusernamesubmit' => 'Kirém',
+'email-legend' => "Kirém surat-e keu ureueng ngui {{SITENAME}} la'én",
+'emailfrom' => 'Ureueng kirém:',
+'emailto' => 'Ureueng teurimöng:',
+'emailsubject' => 'Bhah:',
+'emailmessage' => 'Peusan:',
+'emailsend' => 'Kirém',
+'emailccme' => 'Kubah saboh seunalén surat-e lôn.',
+'emailccsubject' => 'Salén peusan droeneuh keu $1: $2',
+'emailsent' => 'Surat-e meukirém',
+'emailsenttext' => 'Surat-e droeneuh ka meukirém.',
 
 # Watchlist
 'watchlist' => 'Dapeuta keunalön',
@@ -1111,7 +1434,7 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'blanknamespace' => '(Keuë)',
 
 # Contributions
-'contributions' => 'Beuneuri {{GENDER:$1|ureuëng nguy}}',
+'contributions' => 'Beuneuri {{GENDER:$1|ureuëng ngui}}',
 'contributions-title' => 'Beuneuri ureuëng ngui keu $1',
 'mycontris' => 'Beuneuri',
 'contribsub2' => 'Keu {{GENDER:$3|$1}} ($2)',
@@ -1126,32 +1449,32 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'sp-contributions-logs' => 'log',
 'sp-contributions-talk' => 'marit',
 'sp-contributions-search' => 'Mita soë nyang tuléh',
-'sp-contributions-username' => 'Alamat IP atawa nan ureuëng nguy:',
+'sp-contributions-username' => 'Alamat IP atawa nan ureuëng ngui:',
 'sp-contributions-toponly' => 'Peuleumah geunantoe nyang baro mantong',
 'sp-contributions-submit' => 'Mita',
 
 # What links here
 'whatlinkshere' => 'Peunawôt balék',
-'whatlinkshere-title' => 'Laman nyang na neuhubông u $1',
+'whatlinkshere-title' => 'Laman nyang mupawôt u $1',
 'whatlinkshere-page' => 'Laman:',
 'linkshere' => "Laman-laman nyoë meupawôt u '''[[:$1]]''':",
 'nolinkshere' => "Hana halaman nyang teukaw'et u '''[[:$1]]'''.",
-'isredirect' => 'laman peupinah',
+'isredirect' => 'laman peuninah',
 'istemplate' => 'ngön seunaleuëk',
-'isimage' => 'hubông beureukaih',
+'isimage' => 'peunawôt beureukaih',
 'whatlinkshere-prev' => '$1 {{PLURAL:$1|sigohlomjih|sigohlomjih}}',
 'whatlinkshere-next' => '$1 {{PLURAL:$1|lheuëh nyan|lheuëh nyan}}',
 'whatlinkshere-links' => '← peunawôt',
 'whatlinkshere-hideredirs' => '$1 peuninah',
 'whatlinkshere-hidetrans' => '$1 transklusi',
 'whatlinkshere-hidelinks' => '$1 peunawôt',
-'whatlinkshere-hideimages' => '$1 seuneumat beureukaih',
+'whatlinkshere-hideimages' => '$1 peunawôt beureukaih',
 'whatlinkshere-filters' => 'Saréng',
 
 # Block/unblock
 'blockip' => 'Theun ureuëng ngui',
 'ipboptions' => '2 jeum:2 hours,1 uroë:1 day,3 uroë:3 days,1 minggu:1 week,2 minggu:2 weeks,1 buleuën:1 month,3 buleuën:3 months,6 buleuën:6 months,1 thôn:1 year,sabé:infinite',
-'ipblocklist' => 'Ureuëng nguy teutheun',
+'ipblocklist' => 'Ureuëng ngui teutheun',
 'ipblocklist-submit' => 'Mita',
 'blocklink' => 'theun',
 'unblocklink' => 'peugadöh theun',
@@ -1189,7 +1512,7 @@ Lam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugab
 'revertmove' => 'peuriwang',
 
 # Export
-'export' => 'Èkspor laman',
+'export' => 'Peuteubiët laman',
 
 # Namespace 8 related
 'allmessages' => 'Peusan sistem',
@@ -1205,7 +1528,7 @@ Lam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugab
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Laman ureuëng ngui droëneuh',
-'tooltip-pt-mytalk' => 'Laman marit Droëneuh',
+'tooltip-pt-mytalk' => 'Laman marit droëneuh',
 'tooltip-pt-preferences' => 'Geunalak',
 'tooltip-pt-watchlist' => 'Dapeuta laman nyang lônkalön',
 'tooltip-pt-mycontris' => 'Dapeuta beuneuri Droëneuh',
@@ -1214,14 +1537,14 @@ Lam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugab
 'tooltip-ca-talk' => 'Marit laman asoë',
 'tooltip-ca-edit' => 'Droëneuh jeuët neuandam laman nyoë. Neungui tumbôi eu dilèë sigoh neukeubah.',
 'tooltip-ca-addsection' => 'Puphôn beunagi barô',
-'tooltip-ca-viewsource' => 'Laman nyoë geupeulindông.
-Droëneuh jeuët neu’eu nèjih.',
-'tooltip-ca-history' => 'Seunalén awai nibak laman nyoë',
+'tooltip-ca-viewsource' => 'Laman nyoë geulindông.
+Droëneuh jeuët neu’eu nèjih mantöng.',
+'tooltip-ca-history' => 'Geunantoë awai nibak laman nyoë',
 'tooltip-ca-protect' => 'Peulindông laman nyoë',
 'tooltip-ca-delete' => 'Sampôh laman nyoë',
-'tooltip-ca-move' => 'Peupinah laman nyoë',
-'tooltip-ca-watch' => 'Peutamah laman nyoë u dapeuta kalön Droëneuh',
-'tooltip-ca-unwatch' => 'Sampôh laman nyoë nibak dapeuta keunalön Droëneuh',
+'tooltip-ca-move' => 'Pupinah laman nyoë',
+'tooltip-ca-watch' => 'Tamah laman nyoë u dapeuta kalön droëneuh',
+'tooltip-ca-unwatch' => 'Sampôh laman nyoë nibak dapeuta kalön droëneuh',
 'tooltip-search' => 'Mita {{SITENAME}}',
 'tooltip-search-go' => 'Mita saboh laman ngon nan nyang peureuséh lagèë nyoë meunyo na',
 'tooltip-search-fulltext' => 'Mita laman nyang na asoë lagèë nyoë',
@@ -1237,7 +1560,7 @@ Droëneuh jeuët neu’eu nèjih.',
 'tooltip-t-recentchangeslinked' => 'Neuubah barô lam laman nyang meupawôt nibak laman nyoë',
 'tooltip-feed-rss' => 'Umpeuën RSS keu laman nyoë',
 'tooltip-feed-atom' => 'Umpeuën Atom keu laman nyoë',
-'tooltip-t-contributions' => 'Eu dapeuta nyang ka geutuléh lé ureuëng ngui nyoë',
+'tooltip-t-contributions' => 'Dapeuta beuneuri ureuëng ngui nyoë',
 'tooltip-t-emailuser' => "Peu'ét surat-e keu ureuëng ngui nyoë",
 'tooltip-t-upload' => 'Peutamong beureukaih',
 'tooltip-t-specialpages' => 'Dapeuta ban dum laman kusuih',
@@ -1255,11 +1578,12 @@ Droëneuh jeuët neu’eu nèjih.',
 'tooltip-save' => 'Keubah neuubah Droëneuh',
 'tooltip-preview' => 'Peuleumah neuubah Droëneuh, neungui nyoë sigohlom neukeubah!',
 'tooltip-diff' => 'Peuleumah neuubah nyang ka Droëneuh peugöt',
-'tooltip-compareselectedversions' => 'Ngiëng bida antara duwa curak laman nyang jipilèh.',
-'tooltip-watch' => 'Peutamah laman nyoë u dapeuta keunalön Droëneuh',
+'tooltip-compareselectedversions' => 'Ngiëng bida nibak duwa geunantoë laman nyang teupiléh',
+'tooltip-watch' => 'Tamah laman nyoë u dapeuta kalön droëneuh',
 'tooltip-rollback' => 'Peuriwang neu’andam-neu’andam bak laman nyoë u nyang tuléh keuneulheuëh lam sigo teugön',
 'tooltip-undo' => 'Peuriwang geunantoë nyoë ngön peuhah plôk neu’andam ngön cara eu dilèë. Choë jeuët geupeutamah bak plôk ehtisa.',
 'tooltip-summary' => 'Pasoë éhtisa paneuk',
+'interlanguage-link-title' => '$1 – $2',
 
 # Info page
 'pageinfo-toolboxlink' => 'Teuneurang laman',
@@ -1307,7 +1631,7 @@ Data nyang la'én eunteuk teupeusom keudroë.
 
 # External editor support
 'edit-externally' => 'Andam beureukah nyoë ngön aplikasi luwa',
-'edit-externally-help' => '(Ngiëng [//meta.wikimedia.org/wiki/Help:External_editors arah atô] keu beurita leubèh lanjôt)',
+'edit-externally-help' => '(Ngiëng [//meta.wikimedia.org/wiki/Help:External_editors peurintah atô] keu haba leubèh lanjôt)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'ban dum',
index 271ba5c..5d4a53a 100644 (file)
@@ -3042,6 +3042,7 @@ Die lêer is slegs gedeeltelik opgelaai.',
 U kan daar \'n wysigingsopsomming byvoeg.',
 'tooltip-preferences-save' => 'Stoor voorkeure',
 'tooltip-summary' => "Verskaf 'n kort opsomming",
+'interlanguage-link-title' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/** Gemeenskaplike CSS vir alle omslae */',
index 322dd28..2b8f3f7 100644 (file)
@@ -907,7 +907,7 @@ Gif se brūcend asifte hine. synderlīce sind ymelan geīwda þǣre þe se brūc
 # Delete
 'deletepage' => 'Forlēosan tramet',
 'excontent' => 'innung wæs: "$1"',
-'excontentauthor' => 'innung wæs: \'$1\' (and se āna forðiend wæs "[[Special:Contributions/$2|$2]")',
+'excontentauthor' => 'innung wæs: \'$1\' (and se āna forðiend wæs "[[Special:Contributions/$2|$2]]")',
 'exblank' => 'tramet wæs æmettig',
 'historywarning' => "'''Warnung''': Se tramet þe þū wilt forlēosan hafaþ stǣr mid nēan $1 {{PLURAL:$1|fadunge|fadunga}}:",
 'actioncomplete' => 'Dǣd  is fulfyled',
index d88c54c..233bbfb 100644 (file)
@@ -1464,8 +1464,8 @@ $2
 'revdelete-hide-user' => 'أخف اسم/آيبي المستخدم',
 'revdelete-hide-restricted' => 'أخف البيانات عن الإداريين إضافة إلى الآخرين',
 'revdelete-radio-same' => '(لا تغير)',
-'revdelete-radio-set' => 'Ù\86عÙ\85',
-'revdelete-radio-unset' => 'Ù\84ا',
+'revdelete-radio-set' => 'Ù\85Ø®Ù\81Ù\8a',
+'revdelete-radio-unset' => 'Ù\85رئÙ\8a',
 'revdelete-suppress' => 'أخف البيانات عن مديري النظام والبقية',
 'revdelete-unsuppress' => 'إزالة الضوابط من المراجعات المسترجعة',
 'revdelete-log' => 'السبب:',
index a39894c..5be4f13 100644 (file)
@@ -809,8 +809,8 @@ Mümkündür ki, bununla bağlı təfərrüatlar [{{fullurl:{{#Special:Log}}/del
 'revdelete-hide-user' => 'Redaktə müəllifinin istifadəçi adını/IP ünvanını gizlə',
 'revdelete-hide-restricted' => 'Məlumatları idarəçilərdən də gizlə',
 'revdelete-radio-same' => '(dəyişdirmə)',
-'revdelete-radio-set' => 'li',
-'revdelete-radio-unset' => 'Xeyr',
+'revdelete-radio-set' => 'Gizli',
+'revdelete-radio-unset' => 'Görünür',
 'revdelete-suppress' => 'Məlumatları idarəçilərdən də gizlə',
 'revdelete-unsuppress' => 'Bərpa olunan versiyalar üzərindən məhdudiyyətləri qaldır',
 'revdelete-log' => 'Səbəb:',
index 848e65b..e78e27e 100644 (file)
@@ -1060,10 +1060,10 @@ Ika puwedeng makakatanaw kaining diff; mga detalye puwedeng mananagboan sa [{{fu
 'revdelete-text' => "'''Pinagpurang mga pagbabago asin mga pangyayari mahihiling pa man sa historiyang pahina asin mga talaan, pero an mga parte kan saindang laman dae puwedeng magamit kan publiko.'''
 An ibang administrador sa {{SITENAME}} puwede pa man makagamit sa pinagtagong laman asin balewalaon an pagpura kaini giraray sa paagi nin kaparehong panlaog-olay, laen lang kun may kadagdagang pangilin an inilapat.",
 'revdelete-confirm' => 'Pakikumpirma tabi na ika tuyong gumibo kaini, na saimong naintindihan an mga konsekuwensiya, asin ta ika pinaghihimo ini na uyon sa [[{{MediaWiki:Policy-url}}|an palisiya]].',
-'revdelete-suppress-text' => "An paglulubog dapat '''sana''' makakagamit sana para sa minasunod na mga kaso:
+'revdelete-suppress-text' => "An paglulubog dapat '''sana''' magagamit para sa minasunod na mga kaso:
 *Potensiyal na libeloso an impormasyon
 *Bakong angay an personal na impormasyon
-*: ''mga address kan harong asin mga numero kan telepono, sosyal na seguridad, iba pa.''",
+*:''mga estada nin ini-erokan asin mga numero kan telepono, nasyunal na numero nin kabistohan, asin iba pa.''",
 'revdelete-legend' => 'Ilapat an mga restriksyon sa bisibilidad',
 'revdelete-hide-text' => 'Teksto nin rebisyon',
 'revdelete-hide-image' => 'Tagoon an laog kan file',
@@ -1072,8 +1072,8 @@ An ibang administrador sa {{SITENAME}} puwede pa man makagamit sa pinagtagong la
 'revdelete-hide-user' => 'Paraliwat na ngaran-paragamit/IP na estada',
 'revdelete-hide-restricted' => 'Ilubog an mga datos gikan sa mga administrador asin man kan iba',
 'revdelete-radio-same' => '(dae pagribayan)',
-'revdelete-radio-set' => 'Namamansayan',
-'revdelete-radio-unset' => 'Itinago',
+'revdelete-radio-set' => 'Itinago',
+'revdelete-radio-unset' => 'Hiling-hiling',
 'revdelete-suppress' => 'Dai ipahilíng an mga datos sa mga sysops asin sa mga iba pa',
 'revdelete-unsuppress' => 'Halîon an mga restriksyón sa mga ibinalík na pagpakarhay',
 'revdelete-log' => 'Rason:',
@@ -2933,6 +2933,7 @@ Ika makakatanaw kan pinaggikanan',
 'tooltip-undo' => '"Gibohang ibalik" an mga pinagbagong pagliliwat asin bukasi an porma nin pagliliwat sa modong patanaw. Ini minatugot na magdadagdag nin rason sa sumaryo.',
 'tooltip-preferences-save' => 'Itagama an mga kagustuhan',
 'tooltip-summary' => 'Magkaag nin sarong halipot na sumaryo',
+'interlanguage-link-title' => '$1 - $2',
 
 # Stylesheets
 'common.css' => '/** an CSS na pigbugtak digdi maiaaplikar sa gabos na mga skin */',
@@ -2981,6 +2982,7 @@ Giboha na '''DAE''' paglaogan digde!",
 'pageinfo-length' => 'Kalabaan kan pahina (yaon sa mga bayta)',
 'pageinfo-article-id' => 'ID kan pahina',
 'pageinfo-language' => 'Lengguwahe kan laog sa pahina',
+'pageinfo-content-model' => 'Modelo nin kalamnan nin pahina',
 'pageinfo-robot-policy' => 'Pinaghuhukdo sa paagi nin mga robot',
 'pageinfo-robot-index' => 'Pinagtutugotan',
 'pageinfo-robot-noindex' => 'Dae pinagtutugotan',
index 49ab94d..6e87208 100644 (file)
@@ -735,10 +735,10 @@ $2
 'userpage-userdoesnotexist-view' => 'Уліковы запіс удзельніка " $1 "не зарэгістраваны.',
 'blocked-notice-logextract' => 'Гэты карыстальнік у дадзены момант заблакаваны. 
  Апошні запіс журнала блакіровак прыводзіцца ніжэй для даведкі:',
-'clearyourcache' => "'''Заўвага:''' Пасля замацоўвання, вам можа спатрэбіцца ачыстка кэшу браўзера, каб пабачыць унесеныя змяненні. 
+'clearyourcache' => "'''Заўвага:''' Пасля замацоўвання, вам можа спатрэбіцца ачыстка кэшу браўзера, каб убачыць унесеныя змяненні. 
 *'''Firefox / Safari:''' націсніце '''Reload''', утрымліваючы ''Shift'', або націсніце ''Ctrl-F5'' ці ''Ctrl-R'' (''Cmd-R'' на Макінтошах)
 * '''Konqueror:''': націсніце ''Reload'' або ''F5''
-* '''Opera''': увайдзіце ў настаўленні карыстальніка (меню ''Tools'', падпункт ''Preferences''), там ачысціце кэш; * '''Internet Explorer:''' націсніце ''Refresh'', утрымліваючы ''Ctrl'', або націсніце ''Ctrl-F5''
+* '''Opera''': увайдзіце ў настройкі карыстальніка (меню ''Tools'', падпункт ''Preferences''), там ачысціце кэш; * '''Internet Explorer:''' націсніце ''Refresh'', утрымліваючы ''Ctrl'', або націсніце ''Ctrl-F5''
 * '''Google Chrome:''' Націсніце ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)",
 'usercssyoucanpreview' => "'''Парада:''' Карыстайцеся кнопкай \"''{{int:showpreview}}''\" для выпрабоўвання новага коду CSS ''перад тым'', як яго запісваць.",
 'userjsyoucanpreview' => "'''Парада:''' Карыстайцеся кнопкай \"''{{int:showpreview}}''\" для выпрабоўвання новага коду JS ''перад тым'', як яго запісваць.",
@@ -1192,7 +1192,7 @@ $1",
 'prefs-signature' => 'Подпіс',
 'prefs-dateformat' => 'Фармат даты',
 'prefs-timeoffset' => 'Часавы пояс',
-'prefs-advancedediting' => 'УÑ\81кладненÑ\8bÑ\8f Ð½Ð°Ñ\81Ñ\82аÑ\9eленні',
+'prefs-advancedediting' => 'Ð\90гÑ\83лÑ\8cнÑ\8bÑ\8f Ð½Ð°Ñ\81Ñ\82Ñ\80ойкі',
 'prefs-advancedrc' => 'Пашыраныя настройкі',
 'prefs-advancedrendering' => 'Пашыраныя настройкі',
 'prefs-advancedsearchoptions' => 'Пашыраныя настройкі',
@@ -2328,7 +2328,7 @@ $1',
 'noautoblockblock' => 'аўтаблок не дазволены',
 'createaccountblock' => 'стварэнне рахунку заблакавана',
 'emailblock' => 'эл.пошта заблакавана',
-'blocklist-nousertalk' => 'не мае дазволу правіць уласную старонку размоваў',
+'blocklist-nousertalk' => 'не мае дазволу правіць уласную старонку размоў',
 'ipblocklist-empty' => 'Спіс блокаў зараз пусты.',
 'ipblocklist-no-results' => 'Няма блокаў на такі адрас IP або на такое імя ўдзельніка.',
 'blocklink' => 'заблакаваць',
@@ -2604,7 +2604,7 @@ $1',
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ваша ўласная старонка',
 'tooltip-pt-anonuserpage' => 'Старонка ўдзельніка для таго IP, з якога вы зараз працуеце',
-'tooltip-pt-mytalk' => 'Ваша старонка размоваў',
+'tooltip-pt-mytalk' => 'Ваша старонка размоў',
 'tooltip-pt-anontalk' => 'Размовы аб праўках, зробленых з гэтага адрасу IP',
 'tooltip-pt-preferences' => 'Вашы настройкі',
 'tooltip-pt-watchlist' => 'Пералік старонак, за змяненнямі ў якіх вы сочыце',
index 9191af5..af8550f 100644 (file)
@@ -187,12 +187,12 @@ $messages = array(
 'tog-hidepatrolled' => "Kuzhat ar c'hemmoù evezhiet e-touez ar c'hemmoù diwezhañ",
 'tog-newpageshidepatrolled' => 'Kuzhat ar pajennoù evezhiet diouzh roll ar pajennoù nevez',
 'tog-extendwatchlist' => 'Astenn ar roll evezhiañ a-benn diskouez an holl gemmoù ha neket ar re ziwezhañ hepken.',
-'tog-usenewrc' => "Diskouez ar c'hemmoù nevez en ur feson kempennoc'h (rekis eo JavaScript)",
+'tog-usenewrc' => "Diskouez ar c'hemmoù nevez en ur feson kempennoc'h",
 'tog-numberheadings' => 'Niverenniñ emgefre an titloù',
 'tog-showtoolbar' => 'Diskouez ar varrenn ostilhoù aozañ',
 'tog-editondblclick' => 'Daouglikañ evit kemmañ pajennoù',
 'tog-editsection' => 'Kemmañ ur rann dre al liammoù [kemmañ]',
-'tog-editsectiononrightclick' => 'Kemmañ ur rann dre glikañ a-zehou<br /> war titl ar rann',
+'tog-editsectiononrightclick' => 'Kemmañ ur rann dre glikañ a-zehou war titl ar rann',
 'tog-showtoc' => 'Diskouez an daolenn<br /> (evit ar pennadoù zo ouzhpenn 3 rann enno)',
 'tog-rememberpassword' => "Derc'hel soñj eus ma ger-tremen war an urzhiataer-mañ (evit $1 devezh{{PLURAL:$1||}} d'ar muiañ)",
 'tog-watchcreations' => "Ouzhpennañ ar pajennoù krouet ganin da'm roll evezhiañ",
@@ -398,7 +398,7 @@ $messages = array(
 'articlepage' => 'Sellet ouzh ar pennad',
 'talk' => 'Kaozeadenn',
 'views' => 'Gweladennoù',
-'toolbox' => 'Boest ostilhoù',
+'toolbox' => 'Ostilhoù',
 'userpage' => 'Pajenn implijer',
 'projectpage' => 'Pajenn meta',
 'imagepage' => 'Gwelet pajenn ar restr',
@@ -633,7 +633,7 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
 'gotaccount' => "Ur gont zo ganeoc'h dija ? '''$1'''.",
 'gotaccountlink' => 'Kevreañ',
 'userlogin-resetlink' => "Ha disoñjet eo bet ho titouroù kevreañ ganeoc'h ?",
-'userlogin-resetpassword-link' => 'Adderaouekaat ho ker-tremen',
+'userlogin-resetpassword-link' => 'Ankouaet ho peus ho ker-tremen ?',
 'helplogin-url' => 'Help:Kevreañ',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Skoazell evit kevreañ]]',
 'createacct-join' => 'Skrivit ho titouroù amañ dindan.',
@@ -700,7 +700,8 @@ A-raok na vije kaset postel ebet d'ar gont-se e vo ret deoc'h heuliañ ar c'huzu
 'mailerror' => 'Fazi en ur gas ar postel : $1',
 'acct_creation_throttle_hit' => "{{PLURAL:$1|1 gont|$1 kont}} zo bet krouet c'hoazh nevez zo dre ho chomlec'h IP gant gweladennerien d'ar wiki-mañ, ar pezh zo an niver brasañ aotreet. Dre se, n'hall ket ket ar weladennerien a implij an IP-mañ krouiñ kontoù mui evit ar mare.",
 'emailauthenticated' => "Gwiriet eo bet ho chomlec'h postel d'an $2 da $3.",
-'emailnotauthenticated' => "N'eo ket bet gwiriekaet ho chomlec'h postel evit c'hoazh. Ne vo ket tu da gas postel ebet deoc'h evit hini ebet eus an dezverkoù dindan.",
+'emailnotauthenticated' => "N'eo ket bet gwiriekaet ho chomlec'h postel evit c'hoazh.
+Ne vo ket tu da gas postel ebet deoc'h evit hini ebet eus an dezverkoù dindan.",
 'noemailprefs' => "Merkit ur chomlec'h postel mar fell deoc'h ez afe an arc'hwelioù-mañ en-dro.",
 'emailconfirmlink' => "Kadarnait ho chomlec'h postel",
 'invalidemailaddress' => "N'haller ket degemer ar chomlec'h postel-mañ rak faziek eo e furmad evit doare.
@@ -877,9 +878,7 @@ Moarvat ez eo bet dilerc'hiet pe dilamet abaoe ma oa bet lennet ganeoc'h.",
 'loginreqlink' => 'kevreañ',
 'loginreqpagetext' => "Ret eo deoc'h $1 evit gwelet pajennoù all.",
 'accmailtitle' => 'Ger-tremen kaset.',
-'accmailtext' => "Kaset ez eus bet ur ger-tremen dargouezhek evit [[User talk:$1|$1]] da $2.
-
-Cheñchet e c'hall ar ger-tremen evit ar gont nevez-mañ bezañ war ar bajenn ''[[Special:ChangePassword|cheñch ger-tremen]]'', ur wezh kevreet.",
+'accmailtext' => "Kaset ez eus bet ur ger-tremen dargouezhek evit [[User talk:$1|$1]] da $2. Cheñchet e c'hall ar ger-tremen evit ar gont nevez-mañ bezañ war ar bajenn ''[[Special:ChangePassword|cheñch ger-tremen]]'', ur wezh kevreet.",
 'newarticle' => '(Nevez)',
 'newarticletext' => "Heuliet hoc'h eus ul liamm a gas d'ur bajenn n'eo ket bet savet evit c'hoazh.
 A-benn krouiñ ar bajenn-se, krogit da skrivañ er prenestr skridaozañ dindan (gwelet ar [[{{MediaWiki:Helppage}}|bajenn skoazell]] evit gouzout hiroc'h).
@@ -1129,15 +1128,15 @@ Gouest e vo merourien all {{SITENAME}} da dapout krog en testennoù kuzhet ha da
 * Titouroù personel dizere
 *: ''chomlec'hioù, niverennoù pellgomz pe surentez sokial personel, hag all''",
 'revdelete-legend' => 'Lakaat strishadurioù gwelet',
-'revdelete-hide-text' => 'Kuzhat testenn ar stumm',
+'revdelete-hide-text' => 'Testenn ar stumm',
 'revdelete-hide-image' => 'Kuzhat danvez ar restr',
 'revdelete-hide-name' => 'Kuzhat an ober hag ar vukadenn',
-'revdelete-hide-comment' => "Kuzhat notenn ar c'hemm",
-'revdelete-hide-user' => "Kuzhat anv implijer pe chomlec'h IP an aozer",
+'revdelete-hide-comment' => "Notenn ar c'hemm",
+'revdelete-hide-user' => "Anv implijer pe chomlec'h IP an aozer",
 'revdelete-hide-restricted' => "Diverkañ ar roadennoù kement d'ar verourien ha d'ar re all",
 'revdelete-radio-same' => '(arabat cheñch)',
-'revdelete-radio-set' => 'Ya',
-'revdelete-radio-unset' => 'Ket',
+'revdelete-radio-set' => 'Hewel',
+'revdelete-radio-unset' => 'Kuzhet',
 'revdelete-suppress' => 'Diverkañ roadennoù ar verourien hag ar re all',
 'revdelete-unsuppress' => 'Lemel ar strishadurioù war ar stummoù assavet',
 'revdelete-log' => 'Abeg :',
@@ -3924,14 +3923,14 @@ Sañset oc'h bezañ resevet [{{SERVER}}{{SCRIPTPATH}}/COPYING un eilskrid eus ar
 'logentry-delete-delete' => 'Diverket eo bet ar bajenn $3 gant $1',
 'logentry-delete-restore' => 'Assavet eo bet ar bajenn $3 gant $1',
 'logentry-delete-event' => "Kemmet eo bet gwelusted {{PLURAL:$5|un darvoud eus ar marilh|$5 darvoud eus ar marilh}} d'an $3 gant $1 : $4",
-'logentry-delete-revision' => 'Kemmet eo bet gwelusted {{PLURAL:$5|$5reizhadenn}} war ar bajenn $3 gant $1 : $4',
-'logentry-delete-event-legacy' => 'Kemmet eo bet gwelusted darvoudoù ar marilh $3 gant $1',
-'logentry-delete-revision-legacy' => 'Kemmet eo bet gwelusted ar reizhadennoù war ar bajenn $3 gant $1',
+'logentry-delete-revision' => '{{GENDER:$2|Kemmet}} eo bet gwelusted {{PLURAL:$5|reizhadenn|$5 reizhadenn}} war ar bajenn $3 gant $1 : $4',
+'logentry-delete-event-legacy' => '{{GENDER:$2|Kemmet}} eo bet gwelusted darvoudoù ar marilh $3 gant $1',
+'logentry-delete-revision-legacy' => '{{GENDER:$2|Kemmet}} eo bet gwelusted ar reizhadennoù war ar bajenn $3 gant $1',
 'logentry-suppress-delete' => '$1 {{GENDER:$2|en deus dilamet}} ar bajenn $3',
-'logentry-suppress-event' => "Kemmet eo bet dre guzh gwelusted {{PLURAL:$5|un darvoud eus ar marilh|$5 darvoud eus ar marilh}} d'an $3 gant $1 : $4",
+'logentry-suppress-event' => "{{GENDER:$2|Kemmet}} eo bet dre guzh gwelusted {{PLURAL:$5|un darvoud eus ar marilh|$5 darvoud eus ar marilh}} d'an $3 gant $1 : $4",
 'logentry-suppress-revision' => 'Kemmet eo bet dre guzh gwelusted {{PLURAL:$5|reizhadenn|$5 reizhadenn}} war ar bajenn $3 gant $1 : $4',
-'logentry-suppress-event-legacy' => "Kemmet eo bet dre guzh gwelusted darvoudoù ar marilh d'an $3 gant $1",
-'logentry-suppress-revision-legacy' => 'Kemmet eo bet dre guzh gwelusted ar reizhadennoù war ar bajenn $3 gant $1',
+'logentry-suppress-event-legacy' => "{{GENDER:$2|Kemmet}} eo bet dre guzh gwelusted darvoudoù ar marilh d'an $3 gant $1",
+'logentry-suppress-revision-legacy' => '{{GENDER:$2|Kemmet}} eo bet dre guzh gwelusted ar reizhadennoù war ar bajenn $3 gant $1',
 'revdelete-content-hid' => 'danvez kuzet',
 'revdelete-summary-hid' => 'kemmañ an diverrañ kuzhet',
 'revdelete-uname-hid' => 'anv implijer kuzhet',
@@ -3944,9 +3943,9 @@ Sañset oc'h bezañ resevet [{{SERVER}}{{SCRIPTPATH}}/COPYING un eilskrid eus ar
 'logentry-move-move-noredirect' => 'kaset ar bajenn $3 da $4 gant $1 hep adkas',
 'logentry-move-move_redir' => 'kaset ar bajenn $3 da $4 gant $1 dreist un adkas',
 'logentry-move-move_redir-noredirect' => 'kaset ar bajenn $3 da $4 gant $1 dreist un adkas hep lezel un adkas',
-'logentry-patrol-patrol' => 'Merket eo bet an adweladenn $4 eus ar bajenn $3 evel gwiriet gant $1',
-'logentry-patrol-patrol-auto' => 'Merket eo bet ent emgefre an adweladenn $4 eus ar bajenn $3 evel gwiriet gant $1',
-'logentry-newusers-newusers' => 'Krouet eo bet ar gont implijer $1',
+'logentry-patrol-patrol' => '{{GENDER:$2|Merket}} eo bet an adweladenn $4 eus ar bajenn $3 evel gwiriet gant $1',
+'logentry-patrol-patrol-auto' => '{{GENDER:$2|Merket}} eo bet ent emgefre an adweladenn $4 eus ar bajenn $3 evel gwiriet gant $1',
+'logentry-newusers-newusers' => '{{GENDER:$2|Krouet}} eo bet ar gont implijer $1',
 'logentry-newusers-create' => 'Krouet eo bet ar gont implijer $1',
 'logentry-newusers-create2' => 'Gant $1 eo bet krouet ar gont implijer $3',
 'logentry-newusers-byemail' => 'Krouet eo bet ar gont implijer $3 gant $1 ha kaset eo bet ar ger-tremen dre bostel',
index dc57112..c8e4359 100644 (file)
@@ -730,9 +730,11 @@ Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} pode
 'gotaccount' => 'Već imate korisnički račun? $1.',
 'gotaccountlink' => 'Prijavi se',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
-'userlogin-resetpassword-link' => 'Resetirajte svoju šifru/lozinku',
+'userlogin-resetpassword-link' => 'Zaboravili ste šifru/lozinku?',
 'helplogin-url' => 'Help:Prijavljivanje',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]',
+'userlogin-loggedin' => 'Već ste prijavljeni kao {{GENDER:$1|$1}}.
+Koristite donji obrazac da biste se prijavili kao drugi korisnik.',
 'userlogin-createanother' => 'Napravi još jedan račun',
 'createacct-join' => 'Unesite svoje podatke ispod.',
 'createacct-another-join' => 'Unesite informacije o novom računu ispod.',
@@ -790,16 +792,16 @@ Ako je neko drugi napravio ovaj zahtjev ili ako ste se sjetili vaše šifre i ne
 'passwordsent' => 'Nova šifra je poslata na adresu e-pošte korisnika "$1".
 Molimo Vas da se prijavite pošto je primite.',
 'blocked-mailpassword' => 'Da bi se spriječila nedozvoljena akcija, Vašoj IP adresi je onemogućeno uređivanje stranica kao i mogućnost zahtijevanje nove šifre.',
-'eauthentsent' => 'Na navedenu adresu poslan je e-mail s potvrdom.
-Prije nego što pošaljemo daljnje poruke, molimo vas da otvorite e-mail i slijedite u njemu sadržana uputstva da potvrdite da ste vi kreirali korisnički račun.',
+'eauthentsent' => 'Na navedenu adresu poslana je e-poruka s potvrdom.
+Prije nego što pošaljemo daljnje poruke, pratite uputstva s e-pošte da biste potvrdili da je račun zaista Vaša.',
 'throttled-mailpassword' => 'Već Vam je poslan e-mail za promjenu šifre u {{PLURAL:$1|zadnjih sat vremena|zadnja $1 sata|zadnjih $1 sati}}.
 Da bi se spriječila zloupotreba, može se poslati samo jedan e-mail za promjenu šifre {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.',
 'mailerror' => 'Greška pri slanju e-pošte: $1',
 'acct_creation_throttle_hit' => 'Posjetioci na ovoj wiki koji koriste Vašu IP adresu su već napravili {{PLURAL:$1|$1 račun|$1 računa}} u zadnjih nekoliko dana, što je najveći broj dopuštenih napravljenih računa za ovaj period.
 Kao rezultat, posjetioci koji koriste ovu IP adresu ne mogu trenutno praviti više računa.',
-'emailauthenticated' => 'Vaša e-mail adresa je autentificirana na $2 u $3.',
-'emailnotauthenticated' => 'Vaša e-mail adresa još nije autentificirana.
-Nijedan e-mail neće biti poslan za bilo koju uslugu od slijedećih.',
+'emailauthenticated' => 'Vaša adresa e-pošte je potvrđena $2 u $3.',
+'emailnotauthenticated' => 'Vaša adresa e-pošte još nije potvrđena.
+Nijedna e-poruka neće biti poslana za bilo koju uslugu od slijedećih.',
 'noemailprefs' => 'Unesite e-mail adresu za osposobljavanje slijedećih usluga.',
 'emailconfirmlink' => 'Potvrdite Vašu e-mail adresu',
 'invalidemailaddress' => 'Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.
@@ -4015,6 +4017,7 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'tags-tag' => 'Naziv oznake',
 'tags-display-header' => 'Vidljivost na spisku izmjena',
 'tags-description-header' => 'Puni opis značenja',
+'tags-active-header' => 'Aktivna?',
 'tags-hitcount-header' => 'Označene izmjene',
 'tags-active-yes' => 'Da',
 'tags-active-no' => 'Ne',
index 6e58102..0b6d975 100644 (file)
@@ -407,10 +407,10 @@ $messages = array(
 'undeletethispage' => "Desfés l'eliminació d'aquesta pàgina",
 'undelete_short' => "Restaura {{PLURAL:$1|l'edició eliminada|$1 edicions eliminades}}",
 'viewdeleted_short' => 'Mostra {{PLURAL:$1|una edició eliminada|$1 edicions eliminades}}',
-'protect' => 'Protecció',
+'protect' => 'Protegeix',
 'protect_change' => 'canvia',
-'protectthispage' => 'Protecció de la pàgina',
-'unprotect' => 'Desprotecció',
+'protectthispage' => 'Protegeix aquesta pàgina',
+'unprotect' => 'Desprotegeix',
 'unprotectthispage' => 'Desprotegeix aquesta pàgina',
 'newpage' => 'Pàgina nova',
 'talkpage' => 'Discussió',
@@ -539,6 +539,7 @@ Això pot indicar un error en el programari.",
 'databaseerror-textcl' => "S'ha produït un error en la consulta de la base de dades.",
 'databaseerror-query' => 'Consulta: $1',
 'databaseerror-function' => 'Funció: $1',
+'databaseerror-error' => 'Error:$1',
 'laggedslavemode' => 'Avís: La pàgina podria mancar de modificacions recents.',
 'readonly' => 'La base de dades es troba bloquejada',
 'enterlockreason' => 'Escriviu una raó pel bloqueig, així com una estimació de quan tindrà lloc el desbloqueig',
@@ -655,7 +656,7 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
 'gotaccount' => 'Ja teniu un compte? $1.',
 'gotaccountlink' => 'Inicia una sessió',
 'userlogin-resetlink' => "Heu oblidat les vostres dades d'accés?",
-'userlogin-resetpassword-link' => 'Reinicia la contrasenya',
+'userlogin-resetpassword-link' => 'Has oblidat la teva contrasenya?',
 'helplogin-url' => 'Help:Registrar-se',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda]]',
 'userlogin-loggedin' => 'Heu iniciat una sessió com {{GENDER:$1|$1}}.
@@ -3051,6 +3052,7 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 'pageinfo-length' => 'Mida de la pàgina (en bytes)',
 'pageinfo-article-id' => 'ID de la pàgina',
 'pageinfo-language' => 'Llengua del contingut de la pàgina',
+'pageinfo-content-model' => 'Plantilla de contingut de pàgina',
 'pageinfo-robot-policy' => 'Indexació per robots',
 'pageinfo-robot-index' => 'Permès',
 'pageinfo-robot-noindex' => 'No permès',
index f631a11..917a17c 100644 (file)
@@ -325,17 +325,17 @@ $messages = array(
 'tog-hidepatrolled' => 'Къайладаха гlаролладина нисдарш оц могlама керла нисдашкахь',
 'tog-newpageshidepatrolled' => 'Къайлайаха гlароллайина агlонаш оц могlама керла агlонашкахь',
 'tog-extendwatchlist' => 'Шорбина тlехьажарна могlам, ша беригге а хийцамаш чубогlуш, тlяхьабина боцурш а',
-'tog-usenewrc' => 'Лелабе дика могlам керла чу хийцамашна (оьшу JavaScript)',
+'tog-usenewrc' => 'Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)',
 'tog-numberheadings' => 'Ша шех хlитто терахь корташна',
-'tog-showtoolbar' => 'Гайта лакхара гlирсан дакъа нисйеш аттон оц тадар чохь (JavaScript)',
-'tog-editondblclick' => 'Нисйе агlонаш шозза тlетаlийча (JavaScript)',
+'tog-showtoolbar' => 'Гайта лакхара гӀирсан дакъа нисйеш аттон оц тадар чохь (JavaScript)',
+'tog-editondblclick' => 'Нисйе агӀонаш шозза тӀетаӀийча (JavaScript)',
 'tog-editsection' => 'Гайта хьажораг «нисйе» аьлла хӀора агӀона',
-'tog-editsectiononrightclick' => 'Нисде дакъа шозза бакъехьар дахка тlетаlийча оцу кортан (JavaScript)',
+'tog-editsectiononrightclick' => 'Нисде дакъа шозза бакъехьар дахка тӀетаӀийча оцу кортан (JavaScript)',
 'tog-showtoc' => 'Гойти коьртнаш (оцу агlонашна лаххара 3 коьртнашца)',
 'tog-rememberpassword' => 'Даглаца сан дӀаяздар хӀокху браузеран тӀяхь (цхьан $1 {{PLURAL:$1|де|ден|динахь}})',
-'tog-watchcreations' => 'Тlетоха ас кхоллина агlонаш тергаме могlам чу',
-'tog-watchdefault' => 'Тlетоха ас нисйина агlонаш тергаме могlам чу',
-'tog-watchmoves' => 'Тlетоха ас цlераш хийцина агlонаш тергаме могlам чу',
+'tog-watchcreations' => 'ТӀетоха ас кхоьллина агӀонаш тергаме могӀам чу',
+'tog-watchdefault' => 'ТӀетоха ас нисйина агӀонаш тергаме могӀам чу',
+'tog-watchmoves' => 'ТӀетоха ас цӀераш хийцина агӀонаш тергаме могӀам чу',
 'tog-watchdeletion' => 'Тlетоха ас дӀаяхина агlонаш тергаме могlам чу',
 'tog-minordefault' => 'Къастам бе нисйиначарн хlумцадеш кегийра долушсанна',
 'tog-previewontop' => 'Чуяккха хьалххьажар рéдоккхучу кора хьалха',
@@ -343,10 +343,10 @@ $messages = array(
 'tog-nocache' => 'Ма латае гойтучун къайлаха латториг',
 'tog-enotifwatchlistpages' => 'Хаам бо зlе чухул, тергаме могlаман хийцамах лаьцна',
 'tog-enotifusertalkpages' => 'Хаам бо зlе чухул, долахь йолу дийцаре агlон хийцамах лаьцна',
-'tog-enotifminoredits' => 'Хаам бо зlе чухул, цхьа жимма а хийцамаш биняхь',
+'tog-enotifminoredits' => 'Хаам бо зӀе чухул, цхьа жимма а хийцамаш биняхь',
 'tog-enotifrevealaddr' => 'Гайта сан зlе оцу хаамаш барехь',
 'tog-shownumberswatching' => 'Гайта декъашхойн терахь, агlо латийна болу шай тергаме могlам юкъа',
-'tog-oldsig' => 'Ð¥Ñ\8cалÑ\85Ñ\85Ñ\8cажаÑ\80 Ð´Ð¾Ð»Ñ\83Ñ\87Ñ\83 ÐºÑ\83Ñ\8cгÑ\82аlорна:',
+'tog-oldsig' => 'Ð\9aаÑ\80аÑ\80а ÐºÑ\83Ñ\8cгÑ\82аÓ\80орна:',
 'tog-fancysig' => 'Шен вики-къастаман куьгтаӀдар (ша шех хьажораг йоцуш)',
 'tog-uselivepreview' => 'Лелайа чехка хьалха хьажа (JavaScript, муха ю хьажарна)',
 'tog-forceeditsummary' => 'Дага даийта, нагахь нисйарх лаьцна чохь язйина яцахь',
@@ -550,7 +550,7 @@ $messages = array(
 'redirectedfrom' => '(ДӀасахьажийна кху $1)',
 'redirectpagesub' => 'АгӀо-дӀасахьажайар',
 'lastmodifiedat' => 'ХӀокху агӀон тӀаьххьаралера хийцам: $2, $1.',
-'viewcount' => 'ХӀокху агӀонга хьойсина $1 {{PLURAL:$1|за|за|за}}.',
+'viewcount' => 'ХӀокху агӀонга хьойсина $1 {{PLURAL:$1|за}}.',
 'protectedpage' => 'ГӀароллийца йолу агӀо',
 'jumpto' => 'Дехьа гӀо:',
 'jumptonavigation' => 'Навигаци',
@@ -615,7 +615,7 @@ $1',
 'collapsible-expand' => 'хьайаста',
 'thisisdeleted' => 'Хьажа йа меттахlоттайé $1?',
 'viewdeleted' => 'Хьалххьожи $1?',
-'restorelink' => '{{PLURAL:$1|$1 дӀадяккхина нийсдар|$1 дӀадяхна нийсдарш|$1 дӀадяхна нийсдарш}}',
+'restorelink' => '{{PLURAL:$1|$1 дӀадаьккхина нийсдар|$1 дӀадяхна нийсдарш}}',
 'feedlinks' => 'Оцу хатlаьхь:',
 'feed-invalid' => 'Тайпан нийсадоцу талол оцу куьгтаlорна.',
 'feed-unavailable' => 'Хаитарца йолу асанаш тlекхочучехь яц',
@@ -651,6 +651,9 @@ $1',
 # General errors
 'error' => 'Гlалат',
 'databaseerror' => 'Гlалат хаамийн бухера',
+'databaseerror-query' => 'Дехар: $1',
+'databaseerror-function' => 'Функци: $1',
+'databaseerror-error' => 'ГӀалат: $1',
 'laggedslavemode' => 'Тергам бе: агӀона чохь керла йаьхинарш ца хила мега.',
 'readonly' => 'Блоктоьхна дӀайаздар хаамийн бухе',
 'enterlockreason' => 'Билгал де блоктохаран бахьна а и чекх йолу хан а.',
@@ -702,6 +705,8 @@ $1',
 'customjsprotected' => 'Хьан бакъо яц хӀара JavaScript-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.',
 'mycustomcssprotected' => 'Хьан бакъо яц хӀара CSS агӀо тая.',
 'mycustomjsprotected' => 'Хьан бакъо яц JavaScript агӀо тая.',
+'myprivateinfoprotected' => 'Хьайн долара хаамна хийцам ба хьа йиш яц',
+'mypreferencesprotected' => 'Хьай гӀирс нисбан хьа бакъо яц.',
 'exception-nologin' => 'Ахьа хӀой вовзийтина/йовзийтина вац/яц',
 
 # Virus scanner
@@ -716,6 +721,7 @@ $1',
 'yourname' => 'Декъашхочун цӀе:',
 'userlogin-yourname' => 'Декъашхочун цӀе',
 'userlogin-yourname-ph' => 'Язъе декъашхочун цӀе',
+'createacct-another-username-ph' => 'Язъе декъашхочун цӀе',
 'yourpassword' => 'Пароль:',
 'userlogin-yourpassword' => 'Пароль',
 'userlogin-yourpassword-ph' => 'Язъе хьай пароль',
@@ -751,17 +757,20 @@ $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' => '{{PLURAL:$1|агӀо|агӀонаш}}‎',
+'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|яззам|яззамаш}}',
@@ -1277,7 +1286,7 @@ $1',
 'right-nominornewtalk' => 'агӀонашкахь къезиг нисдарш цахиларо хуьлуьйту керла хаамийн хӀоттам',
 'right-apihighlimits' => 'API-дехарш кхочушдан кӀезиг дихкар',
 'right-writeapi' => 'дӀаяздеш лелойо API',
-'right-delete' => 'агӀош дӀаяхар',
+'right-delete' => 'агӀонаш дӀаяхар',
 'right-bigdelete' => 'еха хийцаман истори йолу агӀонаш дӀаяхар',
 'right-deletelogentry' => 'тептар чура билгала дӀаяздарш дӀадахар а меттахӀиттадар а.',
 'right-deleterevision' => 'агӀонийн билгала версеш дӀаяхар а меттахӀиттаяр а',
@@ -1488,6 +1497,7 @@ PICT # тайп тайпан
 'filerevert-success' => "Юхаерзина файл '''[[Media:$1|$1]]''' оцу [$4 верси $3, $2].",
 
 # File deletion
+'filedelete' => '$1 — дӀаяккхар',
 'filedelete-legend' => 'ДӀаяккха файл',
 'filedelete-intro' => "Хьо файл '''[[Media:$1|$1]]''' дӀаяккха гӀерта цунна массо истори цхьан.",
 'filedelete-comment' => 'Бахьан:',
@@ -1695,6 +1705,8 @@ PICT # тайп тайпан
 'emailuser' => 'Декъашхочун хааман кехат',
 'emailuser-title-target' => 'Декъашхочунга кехат яздар',
 'emailuser-title-notarget' => 'Декъашхочунга кехат яздар',
+'emailpagetext' => 'ХӀокху агӀона гӀоьнца йиш ю {{GENDER:$1|декъашхочун}} электронан почте хаам бахьийта.
+Хьоьга жоп лур ду ахьа [[Special:Preferences|хьайн гӀирса чу]] дӀаяздина долу адрес тӀе.',
 'defemailsubject' => 'Хаам {{grammar:genitive|{{SITENAME}}}} чура бу',
 'emailusername' => 'Декъашхочун цӀе:',
 'emailusernamesubmit' => 'ДӀадахьийта',
@@ -1702,6 +1714,8 @@ PICT # тайп тайпан
 'emailfrom' => 'Хьаьнгара',
 'emailto' => 'Хьаьнга:',
 'emailmessage' => 'Хаам:',
+'emailsend' => 'ДӀадахьийта',
+'emailccme' => 'Соьга а кхосса хааман копи.',
 'emailsent' => 'Кехат дӏадахьийтина',
 'emailsenttext' => 'Хьан электроннан хаам дӏабахьийтина.',
 
@@ -1772,7 +1786,7 @@ PICT # тайп тайпан
 'protectedarticle' => 'гlаролла дина агlо «[[$1]]»',
 'modifiedarticleprotection' => 'агlонан гlаролли локхалла хийцина «[[$1]]»',
 'unprotectedarticle' => 'ГӀоролла дӀадаьстина «[[$1]]»',
-'movedarticleprotection' => '«[[$2]]» Ð³Ó\80аÑ\80олла Ñ\81еÑ\85Ñ\8cадаккÑ\85а Â«[[$1]]»',
+'movedarticleprotection' => '«[[$2]]» Ð°Ð³Ó\80она Ñ\82Ó\80еÑ\80а Ð³Ó\80аÑ\80олла Â«[[$1]]» Ð°Ð³Ó\80она Ñ\82Ó\80е Ð´Ð°Ñ\8cккÑ\85ина',
 'protect-title' => 'Оцунна «$1» гӀоралла дар',
 'prot_1movedto2' => '«[[$1]]» цlе хийцина оцу «[[$2]]»',
 'protect-legend' => 'Бакъде гӀоралла дар',
index a5cedec..b47591c 100644 (file)
@@ -1325,8 +1325,8 @@ pokud nebyla nastavena další omezení.",
 'revdelete-hide-user' => 'Uživatelské jméno / IP adresa',
 'revdelete-hide-restricted' => 'Utajit data i před správci',
 'revdelete-radio-same' => '(neměnit)',
-'revdelete-radio-set' => 'Viditelný',
-'revdelete-radio-unset' => 'Skrytý',
+'revdelete-radio-set' => 'Skrytý',
+'revdelete-radio-unset' => 'Viditelný',
 'revdelete-suppress' => 'Utajit data i před správci',
 'revdelete-unsuppress' => 'Odstranit omezení na vrácené verze',
 'revdelete-log' => 'Důvod:',
@@ -3165,6 +3165,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'tooltip-undo' => '„Zrušit editaci“ otevře okno editace, které neobsahuje změny provedené v rušené editaci. Je možné doplnit zdůvodnění do shrnutí editace.',
 'tooltip-preferences-save' => 'Uložit nastavení',
 'tooltip-summary' => 'Zadejte stručné shrnutí',
+'interlanguage-link-title' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/* Zde uvedené CSS bude ovlivňovat všechny styly */',
@@ -3228,6 +3229,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'pageinfo-length' => 'Velikost stránky (v bajtech)',
 'pageinfo-article-id' => 'ID stránky',
 'pageinfo-language' => 'Jazyk obsahu stránky',
+'pageinfo-content-model' => 'Model obsahu stránky',
 'pageinfo-robot-policy' => 'Indexování roboty',
 'pageinfo-robot-index' => 'Dovoleno',
 'pageinfo-robot-noindex' => 'Zakázáno',
@@ -3881,6 +3883,7 @@ Opravdu si přejete znovu tuto stránku založit?',
 # Separators for various lists, etc.
 'ellipsis' => '…',
 'percent' => '$1&#160;%',
+'quotation-marks' => '„$1“',
 
 # Multipage image navigation
 'imgmultipageprev' => '← předchozí stránka',
index 23948f3..4d62a1a 100644 (file)
@@ -2451,7 +2451,7 @@ $1',
 
 # Contributions
 'contributions' => "{{GENDER:$1|Cyfraniadau'r defnyddiwr}}",
-'contributions-title' => "Cyfraniadau'r defnyddiwr am $1",
+'contributions-title' => "Cyfraniadau'r defnyddiwr $1",
 'mycontris' => 'Cyfraniadau',
 'contribsub2' => 'Gan {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "Heb ddod o hyd i newidiadau gyda'r meini prawf hyn.",
@@ -2931,7 +2931,7 @@ Mae ffolder dros dro yn eisiau.',
 Gellir ychwanegu rheswm dros y dadwneud yn y crynodeb.',
 'tooltip-preferences-save' => 'Rhodder y dewisiadau ar gadw',
 'tooltip-summary' => 'Rhowch grynodeb byr',
-'tooltip-iwiki' => '$1 - $2',
+'interlanguage-link-title' => '$1 - $2',
 
 # Metadata
 'notacceptable' => "Dydy gweinydd y wici ddim yn medru rhoi'r data mewn fformat darllenadwy i'ch cleient.",
index 162fee0..bdf1e63 100644 (file)
@@ -2664,7 +2664,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' => 'ændre blokering',
+'change-blocklink' => 'ændr blokering',
 'contribslink' => 'bidrag',
 'emaillink' => 'send e-mail',
 'autoblocker' => 'Du er automatisk blokeret, fordi du deler IP-adresse med "[[User:$1|$1]]".
index 3392d38..6915b32 100644 (file)
@@ -1375,6 +1375,7 @@ Du kannst diesen Versionsunterschied einsehen, sofern du möchtest. Nähere Anga
 Andere Administratoren auf {{SITENAME}} haben Zugriff auf den versteckten Inhalt und können ihn mit der gleichen Seite wiederherstellen, sofern nicht zusätzliche Einschränkungen bestehen.",
 'revdelete-confirm' => 'Bitte bestätige, dass du beabsichtigst, dies zu tun, die Konsequenzen verstehst und es in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]] tust.',
 'revdelete-suppress-text' => "Unterdrückungen sollten '''nur''' in den folgenden Fällen vorgenommen werden:
+* Potentiell beleidigende Informationen
 * Unangebrachte persönliche Informationen
 *: ''Adressen, Telefonnummern, Sozialversicherungsnummern etc.''",
 'revdelete-legend' => 'Setzen der Sichtbarkeitseinschränkungen',
@@ -1385,8 +1386,8 @@ Andere Administratoren auf {{SITENAME}} haben Zugriff auf den versteckten Inhalt
 'revdelete-hide-user' => 'Benutzername/IP-Adresse des Bearbeiters',
 'revdelete-hide-restricted' => 'Daten sowohl vor Administratoren als auch anderen Benutzern unterdrücken',
 'revdelete-radio-same' => '(nicht ändern)',
-'revdelete-radio-set' => 'Sichtbar',
-'revdelete-radio-unset' => 'Versteckt',
+'revdelete-radio-set' => 'Versteckt',
+'revdelete-radio-unset' => 'Sichtbar',
 'revdelete-suppress' => 'Grund der Löschung auch vor Administratoren verstecken',
 'revdelete-unsuppress' => 'Einschränkungen für wiederhergestellte Versionen aufheben',
 'revdelete-log' => 'Grund:',
@@ -3233,7 +3234,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 'tooltip-undo' => 'Macht lediglich diese eine Änderung rückgängig und zeigt das Resultat in der Vorschau an, damit in der Zusammenfassungszeile eine Begründung angegeben werden kann.',
 'tooltip-preferences-save' => 'Einstellungen speichern',
 'tooltip-summary' => 'Gib eine kurze Zusammenfassung ein.',
-'tooltip-iwiki' => '$1 – $2',
+'interlanguage-link-title' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */',
@@ -3298,6 +3299,7 @@ Hier '''NICHTS''' eintragen!",
 'pageinfo-length' => 'Seitenlänge (in Bytes)',
 'pageinfo-article-id' => 'Seitenkennnummer',
 'pageinfo-language' => 'Seiteninhaltssprache',
+'pageinfo-content-model' => 'Seiteninhaltsmodell',
 'pageinfo-robot-policy' => 'Indexierung durch Robots',
 'pageinfo-robot-index' => 'Erlaubt',
 'pageinfo-robot-noindex' => 'Nicht erlaubt',
@@ -3952,6 +3954,7 @@ Bitte bestätige, dass du diese Seite wirklich neu erstellen möchten.",
 # Separators for various lists, etc.
 'ellipsis' => '…',
 'percent' => '$1&#160;%',
+'quotation-marks' => '„$1“',
 
 # Multipage image navigation
 'imgmultipageprev' => '← vorherige Seite',
index ab87bab..83e0b01 100644 (file)
@@ -374,50 +374,50 @@ $messages = array(
 'editfont-serif' => 'Babetê serifi',
 
 # Dates
-'sunday' => 'Kırê',
-'monday' => 'Dışeme',
-'tuesday' => 'Sêşeme',
-'wednesday' => 'Çeharşeme',
-'thursday' => 'Pancşeme',
-'friday' => 'Ã\8ane',
-'saturday' => 'Şeme',
-'sun' => 'Krê',
-'mon' => 'Dış',
-'tue' => 'Sêş',
+'sunday' => 'Bazar',
+'monday' => 'Berarek',
+'tuesday' => 'Telete',
+'wednesday' => 'Çarşeme',
+'thursday' => 'Panşeme',
+'friday' => 'Ã\89ne',
+'saturday' => 'Bahdé éni',
+'sun' => 'Baz',
+'mon' => 'Bbz',
+'tue' => 'Tlt',
 'wed' => 'Çrş',
 'thu' => 'Pşm',
 'fri' => 'Êne',
-'sat' => 'Şem',
+'sat' => 'Bdé',
 'january' => 'Çele',
-'february' => 'Sıbate',
-'march' => 'Adar',
-'april' => 'Nisane',
-'may_long' => 'Gulane',
+'february' => 'Zemherı',
+'march' => 'Mert',
+'april' => 'Lisan',
+'may_long' => 'Gúlan',
 'june' => 'Heziran',
-'july' => 'Temuze',
-'august' => 'Tebaxe',
+'july' => 'Temuz',
+'august' => 'Ağustos',
 'september' => 'Keşkelun',
-'october' => 'Tışrino Verên',
-'november' => 'Tışrino Peyên',
-'december' => 'Kanun',
+'october' => 'Cetan',
+'november' => 'Kelverdan',
+'december' => 'Gağand',
 'january-gen' => 'Çele',
-'february-gen' => 'Sıbate',
-'march-gen' => 'Adar',
-'april-gen' => 'Nisane',
-'may-gen' => 'Gulane',
+'february-gen' => 'Zemherı',
+'march-gen' => 'Mert',
+'april-gen' => 'Lisan',
+'may-gen' => 'Gúlan',
 'june-gen' => 'Heziran',
-'july-gen' => 'Temuze',
-'august-gen' => 'Tebaxe',
+'july-gen' => 'Temuz',
+'august-gen' => 'Ağustos',
 'september-gen' => 'Keşkelun',
-'october-gen' => 'Tışrino Verên',
-'november-gen' => 'Tışrino Peyên',
-'december-gen' => 'Kanun',
+'october-gen' => 'Cetan',
+'november-gen' => 'Kelverdan',
+'december-gen' => 'Gağand',
 'jan' => 'Çel',
 'feb' => 'Sbt',
 'mar' => 'Adr',
 'apr' => 'Nsn',
 'may' => 'Gln',
-'jun' => 'Hzr',
+'jun' => 'Hez',
 'jul' => 'Tmz',
 'aug' => 'Tbx',
 'sep' => 'Kşk',
@@ -438,8 +438,8 @@ $messages = array(
 'december-date' => 'Kanun $1',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategoriye|Kategoriy}}',
-'category_header' => 'Pelê ke kategoriya "$1" derê',
+'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriy}}',
+'category_header' => 'Perré ke kategori da "$1" de yé',
 'subcategories' => 'Kategoriyê bınêni',
 'category-media-header' => 'Dosyeyê ke kategoriya "$1" derê',
 'category-empty' => "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
@@ -452,30 +452,30 @@ $messages = array(
 'category-file-count' => '<noinclude>{{PLURAL:$2|Na kategoriye tenya dosyayanê cêrênan muhtewa kena.}}</noinclude>
 *Na kategoriye de $2 dosyayan ra {{PLURAL:$1|yew dosya tenêka esta| $1 dosyey asenê}}.',
 'category-file-count-limited' => '{{PLURAL:$1|Dosya cêrêne|$1 Dosyê cêrêni}} na kategoriye derê.',
-'listingcontinuesabbrev' => '(dewam)',
+'listingcontinuesabbrev' => 'dewam...',
 'index-category' => 'Pelê endeksıni',
 'noindex-category' => 'Pelê ke zerrekê cı çıniyo',
 'broken-file-category' => 'Peleye ke gıreyê dosyeyanê ğeletan muhtewa kenê',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'about' => 'Heqa cı de',
+'about' => 'Heqdé cı',
 'article' => 'Wesiqe',
 'newwindow' => '(pençereyê newey de beno a)',
-'cancel' => 'Bıtexelne',
+'cancel' => 'Bıterkne',
 'moredotdotdot' => 'Vêşi...',
 'morenotlisted' => 'Vêşi lista nêbi...',
-'mypage' => 'Pele',
-'mytalk' => 'Werênayış',
+'mypage' => 'Per',
+'mytalk' => 'Vaten',
 'anontalk' => 'Pela werênayışê nê IPy',
-'navigation' => 'Geyrayış',
+'navigation' => 'Pusula',
 'and' => '&#32;u',
 
 # Cologne Blue skin
 'qbfind' => 'Bıvêne',
 'qbbrowse' => 'Rovete',
-'qbedit' => 'Bıvurne',
+'qbedit' => 'Timar ke',
 'qbpageoptions' => 'Ena pele',
-'qbmyoptions' => 'Pe mı',
+'qbmyoptions' => 'Pe mı',
 'qbspecialpages' => 'Pelê xısusiy',
 'faq' => 'PZP (Persê ke zehf persiyenê)',
 'faqpage' => 'Project: PZP',
@@ -483,25 +483,25 @@ $messages = array(
 # Vector skin
 'vector-action-addsection' => 'Mewzu vıraze',
 'vector-action-delete' => 'Bestere',
-'vector-action-move' => 'Berê',
-'vector-action-protect' => 'Bıpawe',
+'vector-action-move' => 'Beré',
+'vector-action-protect' => 'Star ke',
 'vector-action-undelete' => 'Esterıtışi peyser bıgê',
 'vector-action-unprotect' => 'Starkerdışi bıvurne',
 'vector-simplesearch-preference' => 'Çuweya cı geyreyış de rehater aktiv ke (Tenya vector skin de)',
-'vector-view-create' => 'Vıraze',
-'vector-view-edit' => 'Bıvurne',
+'vector-view-create' => 'İycad ke',
+'vector-view-edit' => 'Timar ke',
 'vector-view-history' => 'Vurnayışê verêni',
 'vector-view-view' => 'Bıwane',
 'vector-view-viewsource' => 'Çımey bıvêne',
-'actions' => 'Kerdışi',
+'actions' => 'Hereketi',
 'namespaces' => 'Cayê namey',
 'variants' => 'Varyanti',
 
 'navigation-heading' => 'Menuya Navigasyoni',
-'errorpagetitle' => 'Xırab',
+'errorpagetitle' => 'Ğeta',
 'returnto' => 'Peyser şo $1.',
 'tagline' => '{{SITENAME}} ra',
-'help' => 'Peşti',
+'help' => 'Desteg',
 'search' => 'Cı geyre',
 'searchbutton' => 'Cı geyre',
 'go' => 'Şo',
@@ -514,7 +514,7 @@ $messages = array(
 'print' => 'Nusten ke',
 'view' => 'Bıvin',
 'edit' => 'Bıvurnên',
-'create' => 'Vıraze',
+'create' => 'İycad ke',
 'editthispage' => 'Ena pele bıvurne',
 'create-this-page' => 'Na pele bınuse',
 'delete' => 'Bestere',
@@ -522,14 +522,14 @@ $messages = array(
 'undeletethispage' => 'Na perer mebesterne',
 'undelete_short' => '{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere',
 'viewdeleted_short' => '{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne',
-'protect' => 'Bıpawe',
+'protect' => 'Star ke',
 'protect_change' => 'bıvurne',
 'protectthispage' => 'Ena pele bıpawe',
 'unprotect' => 'Starkerdışi bıvurne',
 'unprotectthispage' => 'Starkerdışe ena peler bıvurne',
 'newpage' => 'Pera newiye',
 'talkpage' => 'Ena pele sero werêne',
-'talkpagelinktext' => 'Mesac',
+'talkpagelinktext' => 'Vaten',
 'specialpage' => 'Pela xısusiye',
 'personaltools' => 'Hacetê şexsiy',
 'postcomment' => 'Qısımo newe',
@@ -552,7 +552,7 @@ $messages = array(
 'viewcount' => 'Ena pele {{PLURAL:$1|rae|$1 rey}} vêniya.',
 'protectedpage' => 'Pela pawıtiye',
 'jumpto' => 'Şo:',
-'jumptonavigation' => 'karfiyê',
+'jumptonavigation' => 'Pusula',
 'jumptosearch' => 'cı geyre',
 'view-pool-error' => 'Qaytê qısuri mekerên, serverê ma enıka zêde bar gırewto xo ser.
 Hedê xo ra zêde karberi kenê ke seyrê na pele bıkerê.
@@ -564,7 +564,7 @@ $1',
 'pool-errorunknown' => 'Xeta nêzanıtiye',
 
 # 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' => 'Heqa {{SITENAME}}i de',
+'aboutsite' => 'Heqdé {{SITENAME}}',
 'aboutpage' => 'Project:Heqdê cı',
 'copyright' => 'Zerrekacı $1 bındı not biya.',
 'copyrightpage' => '{{ns:project}}:Heqa telifi',
@@ -573,9 +573,9 @@ $1',
 'disclaimers' => 'Redê mesuliyeti',
 'disclaimerpage' => 'Project:Reddê mesuliyetê bıngey',
 'edithelp' => 'Peştdariya vurnayışi',
-'helppage' => 'Help:Estêni',
+'helppage' => 'Help:Zerrek',
 'mainpage' => 'Pera Seri',
-'mainpage-description' => 'Pela Seri',
+'mainpage-description' => 'Pera Seri',
 'policy-url' => 'Project:Terzê hereketi',
 'portal' => 'Portalê cemaeti',
 'portal-url' => 'Project:Portalê cemaeti',
@@ -631,16 +631,16 @@ $1',
 'sort-ascending' => 'Ratnayışê Zeydnayışi',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Pele',
+'nstab-main' => 'Wesiqe',
 'nstab-user' => 'Pera Karberi',
-'nstab-media' => 'Pela Medya',
-'nstab-special' => 'Pela xısusiye',
+'nstab-media' => 'Pera Medya',
+'nstab-special' => 'Pera bağsi',
 'nstab-project' => 'Pera proci',
 'nstab-image' => 'Dosya',
 'nstab-mediawiki' => 'Mesac',
-'nstab-template' => 'Şablon',
+'nstab-template' => 'Tewre',
 'nstab-help' => 'Pela peşti',
-'nstab-category' => 'Kategoriye',
+'nstab-category' => 'Kategori',
 
 # Main script and global functions
 'nosuchaction' => 'Fealiyeto wınasi çıniyo',
@@ -653,8 +653,8 @@ Keyepelê {{SITENAME}} eşkeno xeta eşkera bıkero.',
 Seba lista pelanê xasanê vêrdeyan reca kena: [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error' => 'Xırab',
-'databaseerror' => 'Xeta serveri',
+'error' => 'Ğeta',
+'databaseerror' => 'Ğetay ardoği',
 'databaseerror-query' => 'Perskerdış:$1',
 'databaseerror-function' => 'Fonksiyon: $1',
 'databaseerror-error' => 'Xırab: $1',
@@ -737,12 +737,12 @@ Xızmetkarê  kılitkerdışi wa bewni ro enay wa çımra ravyarno: "$3".',
 'logouttext' => "'''Şıma hesabra newke vicyay.'''
 
 Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de hesabe şıma akerde aseno.",
-'welcomeuser' => 'Xeyr ameyê $1',
+'welcomeuser' => 'Ğeyr amey, $1!',
 'welcomecreation-msg' => 'Hesabê şıma abiyo.
 [[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.',
 'yourname' => 'Nameyê karberi:',
 'userlogin-yourname' => 'Nameyê karberi',
-'userlogin-yourname-ph' => 'Nameyê xoye karberi cıkewe',
+'userlogin-yourname-ph' => 'Namey ğoyé karberi cı kewe',
 'createacct-another-username-ph' => 'Namey karberi de fi',
 'yourpassword' => 'Parola',
 'userlogin-yourpassword' => 'Parola',
@@ -773,7 +773,7 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
 'gotaccount' => "Hesabê şıma esto? '''$1'''.",
 'gotaccountlink' => 'Cı kewe',
 'userlogin-resetlink' => 'Melumatê cıkewtışi xo vira kerdê?',
-'userlogin-resetpassword-link' => 'Parolaya xo reset ke',
+'userlogin-resetpassword-link' => 'To parola ke ğo vira?',
 'helplogin-url' => 'Help:Qeydbiyayış',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Desteg be qeydbiyayış ra]]',
 'userlogin-createanother' => 'Zewbi hesab vıraz',
@@ -841,17 +841,17 @@ Seba xırabgurenayışê xızmete ra, her {{PLURAL:$1|yew saete|$1 saetan}} de r
 'mailerror' => 'Erşawıtışe xetayê e-posta: $1',
 'acct_creation_throttle_hit' => 'Yew ten IP adresê şıma xebıtnayo u kewto no wiki, roco peyin de {{PLURAL:$1|1 hesab|$1 hesab}} vıraşto.
 xulasa ney kesê ke IP adresê şıma xebıtneni hini nêeşkeni ney ra zêdêr hesab akeri.',
-'emailauthenticated' => "Adresê E-posta da şıma '''$2''' seate $3 dı kerdo araşt.",
-'emailnotauthenticated' => 'No format de nuştışê e-postayi qebul nêbeno.
-Yew formato meqbul de adresê e-posta bınuse ya zi veng bıverde.',
+'emailauthenticated' => 'E-postay şıma $2 sehat $3 dı biya araşt',
+'emailnotauthenticated' => 'Adresa e-pota da şıma qebul nébiya.
+Qandé céréna şımaré teba do nérışiyo.',
 'noemailprefs' => 'Hesab biyo a.',
 'emailconfirmlink' => 'E-postayê xo araşt kerê',
 'invalidemailaddress' => 'No format de nuştışê e-postayi qebul nêbeno. Yew formato meqbul de adresê e-posta bınuse ya zi veng bıverde.',
 'cannotchangeemail' => 'E-postay hesabi ena wiki sera nêvurneyêno.',
 'emaildisabled' => 'Na site ra e-posta nêrışêno.',
-'accountcreated' => 'Hesab vıraciya',
+'accountcreated' => 'Hesab iycat bı',
 'accountcreatedtext' => 'Qandê [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) hesabê karberi vıraziyayo.',
-'createaccount-title' => 'Qey {{SITENAME}} newe yew heab vıraştış',
+'createaccount-title' => 'Qandé  {{SITENAME}} hesabé karberi iycat kerdış',
 'createaccount-text' => 'Kesê, be e-posteyê şıma ra {{SITENAME}} ($4) de, ebe nameyê "$2" u parola "$3" ra yew hesab vıraşto.
 Şıma gani cı kewê u parola xo nıka bıvurnê.',
 'usernamehasherror' => 'Namey karberi de karakteri gani têmiyan ra mebê',
@@ -879,7 +879,7 @@ Bıne vındere u newe ra dest pê bıkere.',
 'resetpass_forbidden' => 'parolayi nêvuryayi',
 'resetpass-no-info' => 'şıma gani hesab akere u hona bıeşke bırese cı',
 'resetpass-submit-loggedin' => 'Parola bıvurne',
-'resetpass-submit-cancel' => 'Bıtexelne',
+'resetpass-submit-cancel' => 'Bıterkne',
 'resetpass-wrong-oldpass' => 'parolayo parola maqbul niyo.
 şıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.',
 'resetpass-temp-password' => 'parolayo muweqet:',
@@ -926,7 +926,7 @@ Parola vêrdiye: $2',
 'changeemail-none' => '(Çıno)',
 'changeemail-password' => 'Parolaya şımaya {{SITENAME}}i:',
 'changeemail-submit' => 'E-postay xo bıvurne',
-'changeemail-cancel' => 'Bıtexelne',
+'changeemail-cancel' => 'Bıterkne',
 
 # Special:ResetTokens
 'resettokens' => 'Reset fi ye',
@@ -960,8 +960,8 @@ Parola vêrdiye: $2',
 # Edit pages
 'summary' => "<font style=\"color:Blue\">'''Xulasa:'''</font>",
 'subject' => 'Mewzu/sernuşte:',
-'minoredit' => "<font style=\"color:Green\">'''Eno vurnayışo de qıckeko'''</font>",
-'watchthis' => "<font style=\"color:Green\">'''Ena pele seyr ke'''</font>",
+'minoredit' => "'''Eno vurnayışo de qıckeko'''",
+'watchthis' => "'''Ena pele seyr ke'''",
 'savearticle' => 'Pele qeyd ke',
 'preview' => 'Verqayt',
 'showpreview' => 'Verqayti bımocne',
@@ -1052,7 +1052,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 '''hewna qayd nebı!'''",
 'userinvalidcssjstitle' => "'''Teme:''' Mewzuyê \"\$1\" çıniyo.
 Dosyanê be namey .css u .js'i de herfa werdiye bıgurêne, mesela herında {{ns:user}}:Foo/Vector.css'i de {{ns:user}}:Foo/vector.css bınuse.",
-'updated' => '(Newenyaya)',
+'updated' => '(Rozeneya)',
 'note' => "'''Not:'''",
 'previewnote' => "'''Xo vira mekerê ke ena yew verqayta.'''
 Vurnayışê şıma hona qeyd nêbiyo!",
@@ -1118,8 +1118,8 @@ Loge peniye cor de este:",
 'recreate-moveddeleted-warn' => "'''Hişyari: no pel o ke şıma vırazeni vere cû vırazyayo.'''
 
 Diqet bıkeri no vurnayişê şıma re gerek esto:",
-'moveddeleted-notice' => 'Ma ena pele wederna.
-Qe referansi logê wedernayışi bın de mocnayiya.',
+'moveddeleted-notice' => 'Na per besternyaya.
+Qeydé  besternayışi uq hewadayışi cér dé deyayo.',
 'log-fulllog' => 'Temamê rocaneyi bıvine',
 'edit-hook-aborted' => 'Vurnayiş vınderiya.
 Yew sebeb beyan nibı.',
@@ -1188,7 +1188,7 @@ Sebebo ke terefê $3 ra diyao ''$2''",
 'nextrevision' => 'Rewizyono newên →',
 'currentrevisionlink' => 'Tewr halê rocaniye bımocne',
 'cur' => 'ferq',
-'next' => 'badên',
+'next' => 'bahdoyên',
 'last' => 'peyên',
 'page_first' => 'verên',
 'page_last' => 'peyên',
@@ -1200,7 +1200,7 @@ Lecant: '''({{int:cur}})''' = ferqê versiyonê peyêni,
 'histfirst' => 'Verênêr',
 'histlast' => 'Peyênêr',
 'historysize' => '({{PLURAL:$1|1 bayt|$1 bayti}})',
-'historyempty' => '(thal)',
+'historyempty' => '(veng)',
 
 # Revision feed
 'history-feed-title' => 'Tarixê çımraviyarnayışi',
@@ -1251,7 +1251,7 @@ Eke şıma serkari u devam bıkeri [$1 no vurnayiş şıma eşkeni bıvini].",
 'revdelete-nologid-text' => 'Şıma vıraştışê nê fonksiyoni rê ya yew cıkewtışo waşte diyar nêkerdo, ya ki çıkewtışo diyarkerde çıniyo.',
 'revdelete-no-file' => 'Dosya diyarkerdiye çıniya.',
 'revdelete-show-file-confirm' => 'Şıma eminê ke wazenê çımraviyarnayışê esterıtey na dosya "<nowiki>$1</nowiki>" $2 ra $3 de bıvênê?',
-'revdelete-show-file-submit' => 'Eya',
+'revdelete-show-file-submit' => 'E',
 'revdelete-selected' => "'''[[:$1]]: ra {{PLURAL:$2|çımraviyarnayışo weçinıte|çımraviyarnayışê weçinıtey}}'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Qeydbiyayışo weçinıte|Qeydbiyayışê weçinıtey}}:'''",
 'revdelete-text' => "'''Çımraviyarnayışê esterıtey u kerdışi hewna tarixê pele u qeydan de asenê, hema parçeyê zerrekê dinan areze nêbenê.'''
@@ -1262,15 +1262,15 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşenê h
 * Melumatê şexio bêmınasıb
 *: ''adresa keyey u numreyê têlefoni, numreyê siğorta sosyale, uêb.''",
 'revdelete-legend' => 'Şertanê vênayışi rone',
-'revdelete-hide-text' => 'Nuştey çımraviyarnayışi bınımne',
+'revdelete-hide-text' => 'Nuştey revizyoni',
 'revdelete-hide-image' => 'zerreyê dosyay bınımnê',
 'revdelete-hide-name' => "hedef u vaqa' bınımne",
-'revdelete-hide-comment' => 'kılmvatış memocne',
-'revdelete-hide-user' => 'Karber u IP ê ke vurnayiş kerdo bınım.',
+'revdelete-hide-comment' => 'Menıni timar ke',
+'revdelete-hide-user' => 'IP asresa/namey  vırnoği',
 'revdelete-hide-restricted' => 'Malumatan pa serkaran u karberan ra bınım.',
 'revdelete-radio-same' => '(mevurne)',
-'revdelete-radio-set' => 'Eya',
-'revdelete-radio-unset' => 'Nê',
+'revdelete-radio-set' => 'Aseno',
+'revdelete-radio-unset' => 'Nımneya',
 'revdelete-suppress' => 'Hem ê binan ra hem zi serkaran ra malumatan bınım',
 'revdelete-unsuppress' => 'reizyonê ke tepiya anciye serbest ker',
 'revdelete-log' => 'Sebeb:',
@@ -1316,7 +1316,7 @@ Listey xırabi u bloki re pelay [[Special:BlockList|IP'yê ke bloke biyê]] bivi
 'mergehistory-header' => 'No pel, reviyonê yew peli eşkeno yewna pelo newe de piyawano.
 no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'mergehistory-box' => 'revizyonê pelanî yew bike:',
-'mergehistory-from' => 'Pela çimeyî',
+'mergehistory-from' => 'Para Çımi:',
 'mergehistory-into' => 'Pela destinasyonî',
 'mergehistory-list' => 'tarixê vurnayîşî ke eşkeno yew bi.',
 'mergehistory-merge' => '[[:$1]] qey ney revizyonê cêrini [[:$2]] şıma ekeni piyawani. Benatê wexto muwaqqet de piyayanayişê rezizyonan de tuşa radyo bıxebitne.',
@@ -1336,7 +1336,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'mergehistory-revisionrow' => '$1 ($2) $3 . . $4 $5 $6',
 
 # Merge log
-'mergelog' => 'Logê yew kerdişî',
+'mergelog' => 'Qeydé zew kerdışi',
 'pagemerge-logentry' => '[[$1]] u [[$2]] yew kerd (revizyonî heta $3)',
 'revertmerge' => 'Abırnê',
 'mergelogpagetext' => 'Cêr de yew liste esta ke mocnena ra, raya tewr peyêne kamci pela tarixi be a bine ra şanawa pê.',
@@ -1349,7 +1349,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'lineno' => 'Xeta $1i:',
 'compareselectedversions' => 'Rewizyonanê weçineyan pêver ke',
 'showhideselectedversions' => 'Revizyonanê weçinıtan bımocne/bınımne',
-'editundo' => 'peyser bia',
+'editundo' => 'peyser bıgi',
 'diff-empty' => '(Babetna niyo)',
 'diff-multi' => '({{PLURAL:$1|Yew revizyono miyanên|$1 revizyonê miyanêni}} terefê {{PLURAL:$2|yew karberi|$2 karberan}} nêmocno)',
 'diff-multi-manyusers' => '({{PLURAL:$1|jew timar kerdışo qıckeko|$1 timar kerdışo qıckeko}} timar kerdo, $2 {{PLURAL:$2|Karber|karberi}} memocne)',
@@ -1379,11 +1379,11 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
 'searchmenu-new' => "''Na Wiki de pelay \"[[:\$1]]\" vıraze!'''",
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|pê eno prefix ser pelan de bigêre]]',
-'searchprofile-articles' => 'Pelê tedeestey',
-'searchprofile-project' => 'Pelê yardım u procey',
+'searchprofile-articles' => 'Perré muhteway',
+'searchprofile-project' => 'Pera Destegi uw Procan',
 'searchprofile-images' => 'Multimedya',
-'searchprofile-everything' => 'Her çi',
-'searchprofile-advanced' => 'Raverşiyaye',
+'searchprofile-everything' => 'Heme çi',
+'searchprofile-advanced' => 'Ravérden',
 'searchprofile-articles-tooltip' => '$1 de bigêre',
 'searchprofile-project-tooltip' => '$1 de bigêre',
 'searchprofile-images-tooltip' => 'Dosya cı geyr',
@@ -1397,8 +1397,8 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'search-suggest' => 'To va: $1',
 'search-interwiki-caption' => 'Projey Bıray',
 'search-interwiki-default' => '$1 neticeyan:',
-'search-interwiki-more' => '(hona)',
-'search-relatedarticle' => 'Eqreba',
+'search-interwiki-more' => '(véşi)',
+'search-relatedarticle' => 'Eleqeyın',
 'mwsuggest-disable' => 'Tewsiyay AJAXi bıgê',
 'searcheverything-enable' => 'cayê nameyê hemi de bigêre',
 'searchrelated' => 'eleqeyın',
@@ -1462,7 +1462,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'recentchangesdays-max' => 'Tewr zaf $1 {{PLURAL:$1|roc|roci}}',
 'recentchangescount' => 'Amarê vurnayışê ke hesıbyaye deye bımocneyê:',
 'prefs-help-recentchangescount' => 'Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.',
-'savedprefs' => 'Tecihê şıma qeyd biy.',
+'savedprefs' => 'Tecihey şıma qeyd biyey.',
 'timezonelegend' => 'Warey saete:',
 'localtime' => 'saeta mehelliye:',
 'timezoneuseserverdefault' => 'Zey karkerdışê Wiki ($1)',
@@ -1504,26 +1504,25 @@ Na game tepeya nêerziyena.',
 'yourvariant' => 'Varyante miyandê zuwani:',
 'prefs-help-variant' => 'Zerrey ena viki mocnayışi rê varyant yana ortografi re şıre tercihan dê xo.',
 'yournick' => 'imza:',
-'prefs-help-signature' => 'mesajê ke pelê werenayişi de gani pê ney "<nowiki>~~~~</nowiki>" imza bıbi.',
+'prefs-help-signature' => 'Peran de vatenana de vatışi"<nowiki>~~~~</nowiki>" ya do imza bé, no bahdo beno çerğé imza u wahdey zemani',
 'badsig' => 'Îmzayê tu raşt niyo.
 Etiketê HTMLî kontrol bike.',
 'badsiglength' => 'İmzayê şıma zaf dergo.
 $1 gani bınê no {{PLURAL:$1|karakter|karakter}} de bıbo.',
 'yourgender' => 'Çıçiy cı esto?',
 'gender-unknown' => 'Ez detay nivana',
-'gender-male' => 'Ey pera viki vurni',
-'gender-female' => 'Ay pera wiki vurni',
-'prefs-help-gender' => 'Eyar kerdış keyfiyo.
- sofware qey adersê cinsiyet şuxulneno, no malumat umumiyo.Şaryayış malumat wazem.',
+'gender-male' => 'Perané wiki camérd deyne ezo vırnena',
+'gender-female' => 'Perané wiki cıni deyne eza vırnena',
+'prefs-help-gender' => 'Na tercih keyfiya.
+Na nustenek ercana qısan de qandé grameri karneyéna, na malumater herkes şeno bıvino .',
 'email' => 'E-posta',
 'prefs-help-realname' => 'Nameyo raşt waştena şıma rê mendo.
 Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de mocnenê.',
 'prefs-help-email' => 'Dayışê adresa e-postey keyfiyo, labelê seba eyarê parola lazıma, wexto ke şıma naye xo vira kerê.',
-'prefs-help-email-others' => 'Şıma şenê weçinê ke ê bini be yew gırey pela şımaya karberi ya zi pela werênayışi sera şıma de ebe e-poste irtıbat kewê.
-Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena.',
+'prefs-help-email-others' => 'Pera ğoya kerderi de zew link vırazése karberé bini şımaré şenê mesac bırşé. Lakin e-posta adresa şıma héç cayé de niasena.',
 'prefs-help-email-required' => 'E-mail adrese mecburiya.',
-'prefs-info' => 'Melumato bıngeh',
-'prefs-i18n' => 'Beynelmılelkerdış',
+'prefs-info' => 'Melumata şıma',
+'prefs-i18n' => 'Şar şélıg kerdış',
 'prefs-signature' => 'İmza',
 'prefs-dateformat' => 'Formatê tarixi',
 'prefs-timeoffset' => 'Wext offset',
@@ -1539,6 +1538,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'prefs-displaywatchlist' => 'Weçinayışê mocnayışi',
 'prefs-tokenwatchlist' => 'Morge',
 'prefs-diffs' => 'Ferqi',
+'prefs-help-prefershttps' => 'Na tercih, fına dekewten dı bena aktiv.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'e-posta adresi raştayo',
@@ -1570,7 +1570,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 # Groups
 'group' => 'Grube:',
 'group-user' => 'Karberi',
-'group-autoconfirmed' => 'Karberê ke xob xo biyê araşt',
+'group-autoconfirmed' => 'Karberê ke otomatikmen biyê araşt',
 'group-bot' => 'Boti',
 'group-sysop' => 'İdarekari',
 'group-bureaucrat' => 'Burokrati',
@@ -1578,21 +1578,21 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'group-all' => '(pêro)',
 
 'group-user-member' => '{{GENDER:$1|karber}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|Karberê ke xob xo biyê araşt}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|Karberê ke otomatikmen biyê araşt}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
 'group-sysop-member' => '{{GENDER:$1|İdarekar}}',
 'group-bureaucrat-member' => '{{GENDER:$1|buroqrat}}',
 'group-suppress-member' => '{{GENDER:$1|Temaşekar}}',
 
 'grouppage-user' => '{{ns:project}}:Karberi',
-'grouppage-autoconfirmed' => '{{ns:project}}:Karberê ke xob xo biyê araşt',
+'grouppage-autoconfirmed' => '{{ns:project}}:Karberê ke otomatikmen biyê araşt',
 'grouppage-bot' => '{{ns:project}}:Boti',
 'grouppage-sysop' => '{{ns:project}}:İdarekeri',
 'grouppage-bureaucrat' => '{{ns:project}}:Burokrati',
 'grouppage-suppress' => '{{ns:project}}:Qontrol',
 
 # Rights
-'right-read' => 'Pelan bıwane',
+'right-read' => 'Pera bıwané',
 'right-edit' => 'Pele bıvurne',
 'right-createpage' => 'Pele vıraze (pelê ke ê werênayışi niyê)',
 'right-createtalk' => 'Pela werênayışi vıraze',
@@ -1686,7 +1686,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'action-browsearchive' => 'pelanê esterıteyan bıgeyre',
 'action-undelete' => 'ena pele reyna biyere',
 'action-suppressrevision' => 'revizyone ki nimnaye biye reyna bivîne u restore bike',
-'action-suppressionlog' => 'ena logê xasî bivîne',
+'action-suppressionlog' => 'Ena bağse qeydi bıvin',
 'action-block' => 'enê karberi vurnayışi ra bıreyne',
 'action-protect' => 'seviyeyê pawitişî se ena pele bivurne',
 'action-rollback' => 'Lez/herbi vurnayışanê karberê peyêni tekrar bıke, oyo ke yew be yew pelê sero gureyao',
@@ -2132,7 +2132,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'statistics-pages' => 'Peli',
 'statistics-pages-desc' => 'Pelanê hemî ke wîkî de estê, pelanê mineqeşeyî, redireksiyon ucb... dehil o.',
 'statistics-files' => 'Dosyayê bar biye',
-'statistics-edits' => 'Amarê vurnayîşî ke wextê {{SITENAME}} ronayîşî ra',
+'statistics-edits' => '{{SITENAME}} saz kerdış ra hetana newke amora vırnayışan',
 'statistics-edits-average' => 'Ser her pele de amarê vurnayîşîyê averageyî',
 'statistics-views-total' => 'Yekunî bivîne',
 'statistics-views-total-desc' => 'Peleyê ke çınyê yana xısusiyê e nina zerre nêkerdê',
@@ -2225,8 +2225,8 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'newpages' => 'Pelê newey',
 'newpages-username' => 'Nameyê karberi:',
 'ancientpages' => 'Wesiqeyê ke vurnayışê ciyê peyeni tewr kehani',
-'move' => 'Berdış',
-'movethispage' => 'Ena pele bere',
+'move' => 'Beré',
+'movethispage' => 'Na perer beré',
 'unusedimagestext' => 'Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.
 Xo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.',
 'unusedcategoriestext' => 'kategoriyê cêrıni bıbo zi çı nêşuxulyena.',
@@ -2582,8 +2582,8 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 
 # Restrictions (nouns)
 'restriction-edit' => 'Bıvurne',
-'restriction-move' => 'Berê',
-'restriction-create' => 'Vıraze',
+'restriction-move' => 'Beré',
+'restriction-create' => 'İycad ke',
 'restriction-upload' => 'Bar ke',
 
 # Restriction levels
@@ -2910,7 +2910,7 @@ Yewna name bınus.',
 'movenosubpage' => 'pelê bınıni yê no peli çino.',
 'movereason' => 'Sebeb:',
 'revertmove' => 'peyser bia',
-'delete_and_move' => 'Bestere u bere',
+'delete_and_move' => 'Besterné uw beré',
 'delete_and_move_text' => '==gani hewn a bıbıo/bıesteriyo==
 
 " no [[:$1]]" name de yew pel ca ra esto. şıma wazeni pê hewn a kerdışê ey peli vurnayişê nameyi bıkeri?',
@@ -3228,9 +3228,9 @@ Ney '''Mefiyé de'''!",
 'markedaspatrollederrornotify' => 'Nışan kerdışê dewriyey nêbı',
 
 # Patrol log
-'patrol-log-page' => 'Logê devriye',
+'patrol-log-page' => 'Qeydé çımsernayoğan',
 'patrol-log-header' => 'Ena listeyê logi revizyonê devriyeyi mocneno.',
-'log-show-hide-patrol' => '$1 logê devriye',
+'log-show-hide-patrol' => 'Qeydé Çımsernayoğan $1',
 
 # Image deletion
 'deletedrevision' => 'Veriyono kihan $1 wederna',
@@ -4132,7 +4132,7 @@ enê programiya piya [{{SERVER}}{{SCRIPTPATH}}/COPYING jew kopyay lisans dê GNU
 'redirect-submit' => 'Şo',
 'redirect-lookup' => 'Bewni',
 'redirect-value' => 'Erc:',
-'redirect-user' => "ID'ê Karberi",
+'redirect-user' => 'Kamiya Karberi:',
 'redirect-revision' => 'Rewizyona pela',
 'redirect-file' => 'Namey dosya',
 'redirect-not-exists' => 'Erc nêvineyê',
index d17d81a..f529564 100644 (file)
@@ -37,6 +37,7 @@
  * @author Protnet
  * @author Reedy
  * @author Remember the dot
+ * @author Sfyrakis
  * @author Sinopeus
  * @author Tifa93
  * @author Urhixidur
@@ -812,7 +813,7 @@ $2',
 'gotaccount' => 'Έχετε ήδη λογαριασμό; $1.',
 'gotaccountlink' => 'Είσοδος',
 'userlogin-resetlink' => 'Ξεχάσατε τα στοιχεία εισόδου σας;',
-'userlogin-resetpassword-link' => 'Î\88κδοÏ\83η Î½Î­Î¿Ï\85 ÎºÏ\89δικοÏ\8d πρόσβασης',
+'userlogin-resetpassword-link' => 'Î\9eεÏ\87λαÏ\83αÏ\84ε Ï\84ον ÎºÏ\89δικÏ\8c πρόσβασης',
 'helplogin-url' => 'Help:Σύνδεση',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Βοήθεια για τη σύνδεσή σας]]',
 'createacct-join' => 'Εισάγετε τα στοιχεία σας παρακάτω.',
@@ -1309,8 +1310,8 @@ Mπορείτε να δείτε αυτή την διαφορά. Λεπτομέρ
 'revdelete-hide-user' => 'Κρύψε όνομα χρήστη/IP συντάκτη',
 'revdelete-hide-restricted' => 'Απόκρυψη δεδομένων από διαχειριστές καθώς και από άλλους',
 'revdelete-radio-same' => '(μην αλλάξετε)',
-'revdelete-radio-set' => 'Î\9dαι',
-'revdelete-radio-unset' => 'Î\8cÏ\87ι',
+'revdelete-radio-set' => 'Î\95μÏ\86ανέÏ\82',
+'revdelete-radio-unset' => 'Î\9aÏ\81Ï\85Ï\86Ï\8c',
 'revdelete-suppress' => 'Απόκρυψε δεδομένα από διαχειριστές όπως και από άλλους',
 'revdelete-unsuppress' => 'Αφαίρεσε περιορισμούς στις αποκατεστημένες αναθεωρήσεις',
 'revdelete-log' => 'Αιτία:',
index fd7ce57..c290e8f 100644 (file)
@@ -556,7 +556,7 @@ $preloadedMessages = array(
        'editsectionhint',
        'help',
        'helppage',
-       'tooltip-iwiki',
+       'interlanguage-link-title',
        'jumpto',
        'jumptonavigation',
        'jumptosearch',
@@ -976,7 +976,7 @@ See [[Special:Version|version page]].',
 'red-link-title'               => '$1 (page does not exist)',
 'sort-descending'              => 'Sort descending',
 'sort-ascending'               => 'Sort ascending',
-'tooltip-iwiki'                => '$1 – $2', # only translate this message to other languages if you have to change it
+'interlanguage-link-title'     => '$1 – $2', # only translate this message to other languages if you have to change it
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main'      => 'Page',
@@ -1169,7 +1169,6 @@ Use the form below to log in as another user.',
 'badretype'                       => 'The passwords you entered do not match.',
 'userexists'                      => 'Username entered already in use.
 Please choose a different name.',
-'newuserfailedvalidation'         => 'Your new account settings are invalid.',
 'loginerror'                      => 'Login error',
 'createacct-error'                => 'Account creation error',
 'createaccounterror'              => 'Could not create account: $1',
@@ -1709,7 +1708,7 @@ Other administrators on {{SITENAME}} will still be able to access the hidden con
 'revdelete-suppress-text'     => "Suppression should '''only''' be used for the following cases:
 * Potentially libelous information
 * Inappropriate personal information
-*: ''home addresses and telephone numbers, social security numbers, etc.''",
+*: ''home addresses and telephone numbers, national identification numbers, etc.''",
 'revdelete-legend'            => 'Set visibility restrictions',
 'revdelete-hide-text'         => 'Revision text',
 'revdelete-hide-image'        => 'Hide file content',
@@ -1718,8 +1717,8 @@ Other administrators on {{SITENAME}} will still be able to access the hidden con
 'revdelete-hide-user'         => "Editor's username/IP address",
 'revdelete-hide-restricted'   => 'Suppress data from administrators as well as others',
 'revdelete-radio-same'        => '(do not change)',
-'revdelete-radio-set'         => 'Visible',
-'revdelete-radio-unset'       => 'Hidden',
+'revdelete-radio-set'         => 'Hidden',
+'revdelete-radio-unset'       => 'Visible',
 'revdelete-suppress'          => 'Suppress data from administrators as well as others',
 'revdelete-unsuppress'        => 'Remove restrictions on restored revisions',
 'revdelete-log'               => 'Reason:',
@@ -3963,7 +3962,7 @@ By executing it, your system may be compromised.",
 'svg-long-desc'               => 'SVG file, nominally $1 × $2 pixels, file size: $3',
 'svg-long-desc-animated'      => 'Animated SVG file, nominally $1 × $2 pixels, file size: $3',
 'svg-long-error'              => 'Invalid SVG file: $1',
-'show-big-image'              => 'Full resolution',
+'show-big-image'              => 'Original file',
 'show-big-image-preview'      => 'Size of this preview: $1.',
 'show-big-image-other'        => 'Other {{PLURAL:$2|resolution|resolutions}}: $1.',
 'show-big-image-size'         => '$1 × $2 pixels',
@@ -4653,6 +4652,7 @@ Please confirm that you really want to recreate this page.",
 'percent'             => '$1%', # only translate this message to other languages if you have to change it
 'parentheses'         => '($1)', # only translate this message to other languages if you have to change it
 'brackets'            => '[$1]', # only translate this message to other languages if you have to change it
+'quotation-marks'     => '"$1"',
 
 # Multipage image navigation
 'imgmultipageprev' => '← previous page',
index 794da0f..938d90d 100644 (file)
@@ -1549,7 +1549,7 @@ Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índice
 'prefs-help-watchlist-token2' => 'Esta es la clave secreta para el canal de contenido web de tu lista de seguimiento.
 Cualquier persona que la conozca podría leer tu lista, así que no la compartas.
 [[Special:ResetTokens|Pulsa aquí si necesitas restablecerla]].',
-'savedprefs' => 'Tus preferencias han sido guardadas.',
+'savedprefs' => 'Se han guardado tus preferencias.',
 'timezonelegend' => 'Zona horaria:',
 'localtime' => 'Hora local:',
 'timezoneuseserverdefault' => 'Usar la hora del servidor ($1)',
@@ -1595,8 +1595,8 @@ Esto no se puede deshacer.',
 Debe contener un máximo de {{PLURAL:$1|un carácter|$1 caracteres}}.',
 'yourgender' => '¿Cómo prefieres ser descrito/a?',
 'gender-unknown' => 'Prefiero no especificar',
-'gender-male' => 'Él edita páginas wiki',
-'gender-female' => 'Ella edita páginas wiki',
+'gender-male' => 'Masculino',
+'gender-female' => 'Femenino',
 'prefs-help-gender' => 'Opcional: empleado para que sea usado correctamente el género por parte del software. Esta información será pública.',
 'email' => 'Correo electrónico',
 'prefs-help-realname' => 'El nombre real es opcional. Si decides proporcionarlo, se usará para dar atribución a tu trabajo.',
index 84d149c..13adf96 100644 (file)
@@ -806,15 +806,16 @@ Kui uut parooli palus keegi teine või sulle meenus vana parool ja sa ei soovi s
 'passwordsent' => 'Uus parool on saadetud kasutaja $1 registreeritud e-postiaadressil.
 Pärast parooli saamist logige palun sisse.',
 'blocked-mailpassword' => 'Sinu IP-aadressi jaoks on toimetamine blokeeritud, seetõttu ei saa sa kasutada ka parooli meeldetuletamise funktsiooni.',
-'eauthentsent' => 'Sisestatud e-posti aadressile on saadetud kinnituse e-kiri.
-Enne kui su kontole ükskõik milline muu e-kiri saadetakse, pead sa e-kirjas olevat juhist järgides kinnitama, et konto on tõepoolest sinu.',
+'eauthentsent' => 'Määratud e-posti aadressile on saadetud kinnituse e-kiri.
+Enne kui su kontole ükskõik milline muu e-kiri saadetakse, pead e-kirjas olevat juhist järgides kinnitama, et konto on tõepoolest sinu.',
 'throttled-mailpassword' => 'Parooli lähtestamise e-kiri saadetud viimase {{PLURAL:$1|tunni|$1 tunni}} jooksul.
 Väärtarvitamise vältimiseks saadetakse {{PLURAL:$1|tunni|$1 tunni}} jooksul ainult üks lähtestamise e-kiri.',
 'mailerror' => 'Viga kirja saatmisel: $1',
 'acct_creation_throttle_hit' => 'Selle viki külastajad, kes kasutavad sinu IP-aadressi, on viimase ööpäeva jooksul loonud {{PLURAL:$1|ühe konto|$1 kontot}}, mis on selles ajavahemikus ülemmääraks.
 Seetõttu ei saa seda IP-aadressi kasutades hetkel rohkem kontosid luua.',
 'emailauthenticated' => 'Sinu e-posti aadressi kinnitamisaeg: $2 kell $3.',
-'emailnotauthenticated' => 'Sinu e-posti aadress <strong>pole veel kinnitatud</strong>. Järgnevate funktsioonidega seotud e-kirju kinnitamata aadressile ei saadeta.',
+'emailnotauthenticated' => 'Sinu e-posti aadress pole veel kinnitatud.
+Järgnevate funktsioonidega seotud e-kirju ei saadeta.',
 'noemailprefs' => 'Järgnevate võimaluste toimimiseks on vaja sisestada e-posti aadress.',
 'emailconfirmlink' => 'Kinnita oma e-posti aadress',
 'invalidemailaddress' => 'E-posti aadress ei ole aktsepteeritav, sest see on vigaselt kirjutatud.
@@ -1120,15 +1121,15 @@ Tundub, et see on kustutatud.',
 See on juba olemas.',
 'defaultmessagetext' => 'Sõnumi vaiketekst',
 'invalid-content-data' => 'Vigased sisuandmed',
-'content-not-allowed-here' => 'Lehekülg [[$2]] ei või sisaldada $1.',
+'content-not-allowed-here' => 'Lehekülg [[$2]] ei või sisaldada $1i.',
 'editwarning-warning' => 'Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.
 Kui oled sisse loginud, saad selle hoiatuse eelistuste alaosas "Toimetamine" keelata.',
 
 # Content models
-'content-model-wikitext' => 'vikiteksti',
-'content-model-text' => 'lihtteksti',
-'content-model-javascript' => 'JavaScripti',
-'content-model-css' => 'CSSi',
+'content-model-wikitext' => 'vikitekst',
+'content-model-text' => 'lihttekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Hoiatus:''' See lehekülg kasutab liialt palju aeglustavaid laiendusfunktsioone. Neid võiks kasutada vähem kui {{PLURAL:$2|ühel|$2}} korral, praegu on kasutatud {{PLURAL:$1|ühel|$1}} korral.",
@@ -1240,18 +1241,19 @@ Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAG
 {{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:
+* Võimalik laim
 * Sobimatu isiklik teave
-*: ''kodune aadress ja telefoninumber, sotsiaalhoolekandenumber jne''",
+*: ''kodune aadress ja telefoninumber, isikukood jne''",
 'revdelete-legend' => 'Nähtavuse piirangute seadmine',
-'revdelete-hide-text' => 'Peida redaktsiooni tekst',
+'revdelete-hide-text' => 'Redaktsiooni tekst',
 'revdelete-hide-image' => 'Peida faili sisu',
 'revdelete-hide-name' => 'Peida toiming ja sihtmärk',
-'revdelete-hide-comment' => 'Peida resümee',
-'revdelete-hide-user' => 'Peida toimetaja kasutajanimi või IP-aadress',
+'revdelete-hide-comment' => 'Resümee',
+'revdelete-hide-user' => 'Toimetaja kasutajanimi või IP-aadress',
 'revdelete-hide-restricted' => 'Varja andmeid nii administraatorite kui ka teiste eest.',
 'revdelete-radio-same' => '(ära muuda)',
-'revdelete-radio-set' => 'Jah',
-'revdelete-radio-unset' => 'Ei',
+'revdelete-radio-set' => 'Nähtav',
+'revdelete-radio-unset' => 'Peidetud',
 'revdelete-suppress' => 'Varja andmed nii administraatorite kui ka teiste eest',
 'revdelete-unsuppress' => 'Eemalda taastatud redaktsioonidelt piirangud',
 'revdelete-log' => 'Põhjus:',
@@ -2890,7 +2892,8 @@ Kas kustutad selle, et luua võimalus teisaldamiseks?',
 'immobile-target-namespace-iw' => 'Keelelink ei ole sobiv koht lehekülje teisaldamiseks.',
 'immobile-source-page' => 'Lehekülg ei ole teisaldatav.',
 'immobile-target-page' => 'Soovitud pealkirja alla ei saa teisaldada.',
-'imagenocrossnamespace' => 'Faili ei saa teisaldada mõnda muusse nimeruumi',
+'bad-target-model' => 'Soovitud sihtlehekülje sisumudel on erinev. {{ucfirst:$1}}i ei saa teisendada $2iks.',
+'imagenocrossnamespace' => 'Faili ei saa teisaldada mõnda muusse nimeruumi.',
 'nonfile-cannot-move-to-file' => 'Failinimeruumi saab ainult faile teisaldada.',
 'imagetypemismatch' => 'Uus faililaiend ei sobi selle tüübiga',
 'imageinvalidfilename' => 'Sihtmärgi nimi on vigane',
@@ -3146,6 +3149,7 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
 'pageinfo-length' => 'Lehekülje pikkus (baitides)',
 'pageinfo-article-id' => 'Lehekülje identifikaator',
 'pageinfo-language' => 'Lehekülje sisu keel',
+'pageinfo-content-model' => 'Lehekülje sisumudel',
 'pageinfo-robot-policy' => 'Robotindekseering',
 'pageinfo-robot-index' => 'Lubatud',
 'pageinfo-robot-noindex' => 'Keelatud',
@@ -3868,7 +3872,7 @@ GNU Üldise Avaliku Litsentsi [{{SERVER}}{{SCRIPTPATH}}/COPYING eksemplar] peaks
 # Special:Redirect
 'redirect' => 'Ümbersuunamine faili, kasutaja või redaktsiooni identifikaatori järgi',
 'redirect-legend' => 'Ümbersuunamine faili juurde või leheküljele',
-'redirect-summary' => 'See erilehekülg suunab ümber faili (toodud failinimi), lehekülje (toodud redaktsiooni identifikaator) või kasutajalehekülje (toodud numbriline kasutaja identfikaator) juurde.',
+'redirect-summary' => 'See erilehekülg suunab ümber faili (toodud failinimi), lehekülje (toodud redaktsiooni identifikaator) või kasutajalehekülje (toodud numbriline kasutaja identfikaator) juurde. Kasutamine: [[{{#Special:Redirect}}/file/Näide.jpg]], [[{{#Special:Redirect}}/revision/328429]] või [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Mine',
 'redirect-lookup' => 'Leia:',
 'redirect-value' => 'Väärtus:',
index 8773920..be64d58 100644 (file)
@@ -133,12 +133,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Ezkutatu patruilatutako aldaketa azken aldaketetan',
 'tog-newpageshidepatrolled' => 'Ezkutatu patruilatutako orriak, orri-zerrenda berritik',
 'tog-extendwatchlist' => 'Jarraipen-zerrenda zabaldu aldaketa guztiak ikusteko, ez bakarrik azken aldaketak',
-'tog-usenewrc' => 'Azken aldaketetan eta jarraipen-zerrendan aldaketak orrialdearen arabera taldekatu (JavaScript behar da)',
+'tog-usenewrc' => 'Azken aldaketetan eta jarraipen-zerrendan aldaketak orrialdearen arabera taldekatu',
 'tog-numberheadings' => 'Goiburukoak automatikoki zenbakitu',
-'tog-showtoolbar' => 'Aldaketen tresna-barra erakutsi (JavaScript)',
-'tog-editondblclick' => 'Klik bikoitzaren bitartez orrialdeak aldatu (JavaScript)',
+'tog-showtoolbar' => 'Aldaketen tresna-barra erakutsi',
+'tog-editondblclick' => 'Klik bikoitzaren bitartez orrialdeak aldatu',
 'tog-editsection' => 'Atalak [aldatu] loturen bitartez aldatzeko aukera gaitu',
-'tog-editsectiononrightclick' => 'Atalen izenburuetan klik eginez atala<br />aldatzea gaitu (JavaScript)',
+'tog-editsectiononrightclick' => 'Atalen izenburuetan eskuin klik eginez aldatzea gaitu',
 'tog-showtoc' => 'Edukien taula erakutsi (3 goiburukotik gorako orrialdeentzako)',
 'tog-rememberpassword' => 'Nire saioa ordenagailu honetan gorde ({{PLURAL:$1|egun baterako| $1 egunerako}} gehienez)',
 'tog-watchcreations' => 'Sortzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu',
@@ -156,7 +156,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Jarraitzen duen erabiltzaile kopurua erakutsi',
 'tog-oldsig' => 'Egungo sinadura:',
 'tog-fancysig' => 'Sinadura wikitestu gisa tratatu (lotura automatikorik gabe)',
-'tog-uselivepreview' => 'Zuzeneko aurrebista erakutsi (JavaScript) (Proba fasean)',
+'tog-uselivepreview' => 'Zuzeneko aurrebista erakutsi (Proba fasean)',
 'tog-forceeditsummary' => 'Aldaketaren laburpena zuri uzterakoan ohartarazi',
 'tog-watchlisthideown' => 'Segimendu zerrendan nire aldaketak ezkutatu',
 'tog-watchlisthidebots' => 'Segimendu zerrendan bot-en aldaketak ezkutatu',
@@ -269,7 +269,7 @@ $messages = array(
 'newwindow' => '(leiho berrian irekitzen da)',
 'cancel' => 'Utzi',
 'moredotdotdot' => 'Gehiago...',
-'morenotlisted' => 'Zerrendatu gabeko gehiago...',
+'morenotlisted' => 'Zerrenda hau ez dago osorik.',
 'mypage' => 'Orrialdea',
 'mytalk' => 'Eztabaida',
 'anontalk' => 'IP honen eztabaida',
@@ -372,7 +372,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}}(e)ri buruz',
 'aboutpage' => 'Project:Honi_buruz',
-'copyright' => 'Eduki guztia $1(r)en babespean dago.',
+'copyright' => 'Eduki guztia $1(r)en babespean dago, ez bada kontrakoa esaten.',
 'copyrightpage' => '{{ns:project}}:Eskubideak',
 'currentevents' => 'Albisteak',
 'currentevents-url' => 'Project:Albisteak',
@@ -455,6 +455,10 @@ Existitzen direnen zerrenda ikus dezakezu  [[Special:SpecialPages|{{int:specialp
 # General errors
 'error' => 'Errorea',
 'databaseerror' => 'Datu-base errorea',
+'databaseerror-textcl' => 'Datubasearen eskera akats bat gertatu da.',
+'databaseerror-query' => 'Eskaera: $1',
+'databaseerror-function' => 'Funtzioa: $1',
+'databaseerror-error' => 'Akatsa: $1',
 'laggedslavemode' => 'Oharra: Baliteke orrialde honetan azken aldaketak ez erakustea.',
 'readonly' => 'Datu-basea blokeatuta dago',
 'enterlockreason' => 'Zehaztu blokeatzeko arrazoia, noiz kenduko den jakinaraziz',
@@ -488,6 +492,7 @@ Baliteke beste norbaitek ezabatu izana.',
 'cannotdelete-title' => 'Ezin da "$1" orrialdea ezabatu',
 'delete-hook-aborted' => 'Ezabatzea hook batek gelditu du.
 Ez du arrazoirik eman.',
+'no-null-revision' => 'Ezin izan da "$1" orrialdearen berrikuspen huts bat sortu',
 'badtitle' => 'Izenburu ezegokia',
 'badtitletext' => 'Eskatutako orrialde izenburua ez da baliozkoa, hutsik dago, edo gaizki lotutako hizkuntzen arteko lotura da. Baliteke izenburuetan erabili ezin den karaktereren bat izatea.',
 'perfcached' => 'Hurrengo datuak katxean gordeta daude eta litekeena da guztiz eguneratuta ez egotea. Gehienez {{PLURAL:$1|emaitza 1 dago|$1 emaitza daude}} eskuragarri katxean.',
@@ -516,6 +521,8 @@ $2",
 'customjsprotected' => 'Ez duzu baimenik JavaScript orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.',
 'mycustomcssprotected' => 'Ez duzu baimenik CSS orrialde hau aldatzeko.',
 'mycustomjsprotected' => 'Ez duzu baimentik JavaScript orrialdea aldatzeko.',
+'myprivateinfoprotected' => 'Ez duzu eskumenik zure informazio pribatua aldatzeko.',
+'mypreferencesprotected' => 'Ez daukazu eskumenik zure hobespenak aldatzeko.',
 'ns-specialprotected' => 'Ezin dira {{ns:special}} izen-tarteko orrialdeak editatu.',
 'titleprotected' => "[[User:$1|$1]]ek izenburu hau sortzea ekidin zuen.
 Emandako arrazoia ''$2'' izan zen.",
@@ -535,8 +542,7 @@ Blokeoa ezarri zuen administratzaileak honako arrazoia eman zuen: "$3".',
 # Login and logout pages
 'logouttext' => "'''Saioa itxi egin duzu.'''
 
-Erabiltzaile anonimo bezala jarrai dezakezu {{SITENAME}} erabiltzen, edo <span class='plainlinks'>[$1 saioa has dezakezu berriz]</span> erabiltzaile berdinarekin edo ezberdin batekin.
-Kontuan izan orrialde batzuk saioa hasita bazenu bezala ikus ditzakezula nabigatzailearen katxea garbitu arte.",
+Jakin ezazu hainbat orrialdetan ager daitekela oraindik saioa ez duzula itxi, zure nabigatzailearen katxea garbitzen ez duzun arte.",
 'welcomeuser' => 'Ongi etorri, $1!',
 'welcomecreation-msg' => 'Zure kontua sortua izan da.
 Ez ezazu ahaztu zure [[Special:Preferences|{{SITENAME}} hobespenak]] aldatzea.',
@@ -573,15 +579,19 @@ Ez ezazu ahaztu zure [[Special:Preferences|{{SITENAME}} hobespenak]] aldatzea.',
 'gotaccount' => "Baduzu erabiltzaile kontua? '''$1'''.",
 'gotaccountlink' => 'Saioa hasi',
 'userlogin-resetlink' => 'Saioa hasteko datuak ahaztu dituzu?',
-'userlogin-resetpassword-link' => 'Zure pasahitza berrezarri',
+'userlogin-resetpassword-link' => 'Zure pasahitza ahaztu duzu?',
 'helplogin-url' => 'Help:Sarrera',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Barrura sartzeko laguntza]]',
+'userlogin-loggedin' => 'Dagoeneko izena emana zaude {{GENDER:$1|$1}}.
+Beheko formularioa erabil ezazu beste erabiltzaile baten izenean sartzeko.',
+'userlogin-createanother' => 'Beste kontu bat sortu',
 'createacct-join' => 'Sartu zure informazioa azpian.',
+'createacct-another-join' => 'Sartu kontu berriaren informazioa azpian.',
 'createacct-emailrequired' => 'E-posta helbidea',
 'createacct-emailoptional' => 'E-posta helbidea (hautazkoa)',
 'createacct-email-ph' => 'Sartu zure e-posta helbidea',
 'createacct-another-email-ph' => 'Posta elektronikoaren helbidea sartu',
-'createaccountmail' => 'Erabili behin-behineko pasahitz ausazko bat eta bidali behean agertzeko den e-posta helbidera',
+'createaccountmail' => 'Erabili behin-behineko pasahitz ausazko bat eta bidali agertzen den e-posta helbidera',
 'createacct-realname' => 'Benetako izena (hautazkoa)',
 'createaccountreason' => 'Arrazoia:',
 'createacct-reason' => 'Arrazoia',
@@ -634,14 +644,15 @@ eta aurretik zenuen pasahitza erabiltzen jarrai ezazu.',
 Mesedez, saioa hasi jasotakoan.',
 'blocked-mailpassword' => 'Zure IP helbidea aldaketak egiteko blokeatuta dago, eta beraz ezin da pasahitza berreskuratzeko aukera erabili.',
 'eauthentsent' => 'Egiaztapen mezu bat bidali da zehaztutako e-posta helbidera.
-Helbide horretara beste edozein mezu bidali aurretik, bertan azaltzen diren argibideak jarraitu behar dituzu, e-posta hori zurea dela egiaztatzeko.',
+Helbide horretara beste edozein mezu bidali aurretik, bertan azaltzen diren argibideak jarraitu behar dituzu, kontua zurea dela egiaztatzeko.',
 'throttled-mailpassword' => 'Pasahitz gogorarazle bat bidali da jada azken {{PLURAL:$1|orduan|$1 orduetan}}.
 Bandalismoa sahiesteko pasahitz eskaera bat baino ezin da egin {{PLURAL:$1|orduan|$1 orduan}} behin.',
 'mailerror' => 'Errorea mezua bidaltzerakoan: $1',
 'acct_creation_throttle_hit' => 'Sentitzen dugu, {{PLURAL:$1|erabiltzaile kontu bat sortu duzu|$1 erabiltzaile kontu sortu dituzu}} dagoeneko.
 Ondorioz, ezin duzu kontu gehiago sortu.',
 'emailauthenticated' => 'Zure e-posta helbidea autentifikatu da $2an $3(e)tan.',
-'emailnotauthenticated' => 'Zure posta helbidea egiaztatu gabe dago. Ez da mezurik bidaliko hurrengo ezaugarrientzako.',
+'emailnotauthenticated' => 'Zure posta helbidea egiaztatu gabe dago. 
+Ez da mezurik bidaliko hurrengo ezaugarrientzako.',
 'noemailprefs' => 'Zehaztu e-posta helbide bat ezaugarri hauek erabili ahal izateko.',
 'emailconfirmlink' => 'Egiaztatu zure e-posta helbidea',
 'invalidemailaddress' => 'Ezin da e-posta helbide hori ontzat eman baliogabeko formatua duela dirudielako.
@@ -658,10 +669,12 @@ Orain bertan sar zaitezke eta zure pasahitza aldatu.
 Kontu honen sorrera akats bat dela uste baduzu mezu honi ez diozu zertan jaramonik egin.',
 'usernamehasherror' => 'Erabiltzaile-izenak ezin du kuxin-karaktererik eduki',
 'login-throttled' => 'Saioa hasteko saiakera gehiegi egin berri dituzu.
-Berriro saiatu aurretik itxaron ezazu, mesedez.',
+Berriro saiatu aurretik $1 itxoin, mesedez.',
 'login-abort-generic' => 'Zure sarrera ez da arrakastatsua izan - Abortatua',
 'loginlanguagelabel' => 'Hizkuntza: $1',
 'suspicious-userlogout' => 'Saioa amaitzeko egin duzun eskaria ukatu da. Izan ere, ematen du eskari hori gaizki dabilen nabigatzaile edo cache proxy batek bidali duela.',
+'createacct-another-realname-tip' => 'Benetako izena hautazkoa da.
+Ematea erabakitzen baduzu hori erabiliko da lanaren atribuzioa egiterako garaian.',
 
 # Email sending
 'php-mail-error-unknown' => 'PHPren mail() funtzioan arazo ezezagun bat egon da.',
@@ -677,7 +690,7 @@ Berriro saiatu aurretik itxaron ezazu, mesedez.',
 'newpassword' => 'Pasahitz berria:',
 'retypenew' => 'Pasahitz berria berriz idatzi:',
 'resetpass_submit' => 'Pasahitza definitu eta saioa hasi',
-'changepassword-success' => 'Zure pasahitza aldatu egin da! Saioa hasten...',
+'changepassword-success' => 'Zure pasahitza ondo aldatu da!',
 'resetpass_forbidden' => 'Ezin dira pasahitzak aldatu',
 'resetpass-no-info' => 'Orrialde honetara zuzenean sartzeko izena eman behar duzu.',
 'resetpass-submit-loggedin' => 'Pasahitza aldatu',
@@ -703,6 +716,7 @@ Agian dagoeneko ondo aldatu duzu zure pasahitza edo behin-behineko pasahitza bat
 'passwordreset-emailelement' => 'Erabiltzaile izena: $1
 Behin-behineko pasahitza: $2',
 'passwordreset-emailsent' => 'Pasahitza berrezartzeko e-posta bidali da.',
+'passwordreset-emailsent-capture' => 'Pasahitza berrezartzeko e-posta bat bidali dizugu, behean erakusten dena.',
 
 # Special:ChangeEmail
 'changeemail' => 'Aldatu e-mail helbidea',
@@ -716,6 +730,16 @@ Behin-behineko pasahitza: $2',
 'changeemail-submit' => 'E-posta aldatu',
 'changeemail-cancel' => 'Utzi',
 
+# Special:ResetTokens
+'resettokens' => 'Tokenak berrezarri',
+'resettokens-no-tokens' => 'Ez dago tokenik berrezartzeko.',
+'resettokens-legend' => 'Tokenak berrezarri',
+'resettokens-tokens' => 'Tokenak:',
+'resettokens-token-label' => '$1 (oraingo balioa: $2)',
+'resettokens-watchlist-token' => '(Atom/RSS) jarioarentzako tokenak [[Special:Watchlist|jarraitzen dituzun orrialdeen aldaketetarako]]',
+'resettokens-done' => 'Tokenak berrezarrita.',
+'resettokens-resetbutton' => 'Hautatutako tokenak berrezarri',
+
 # Edit page toolbar
 'bold_sample' => 'Letra lodiko testua',
 'bold_tip' => 'Letra lodiko testua',
@@ -794,7 +818,7 @@ Baliteke orrialdea begiratzen zenuen bitartean norbaitek ezabatu edo izenburua a
 'accmailtitle' => 'Pasahitza bidali da.',
 'accmailtext' => "[[User talk:$1|$1]]-entzako ausaz sortutako pasahitza $2-(r)a bidali da.
 
-Kontu berri honentzako pasahitza edozein unetan alda daiteke ''[[Special:ChangePassword|pasahitz aldaketa]]'' orrian, saioa hasi ondoren.",
+''[[Special:ChangePassword|pasahitz aldaketa]]'' orrialdean alda daiteke, behin barruan sartuta.",
 'newarticle' => '(Berria)',
 'newarticletext' => "Orrialde hau ez da existitzen oraindik. Orrialde sortu nahi baduzu, beheko koadroan idazten hasi zaitezke (ikus [[{{MediaWiki:Helppage}}|laguntza orrialdea]] informazio gehiagorako). Hona nahi gabe etorri bazara, nabigatzaileko '''atzera''' botoian klik egin.",
 'anontalkpagetext' => "----''Orrialde hau konturik sortu ez edo erabiltzen ez duen erabiltzaile anonimo baten eztabaida orria da.
@@ -842,6 +866,7 @@ Zure aldaketak ez dira oraindik gorde!",
 'token_suffix_mismatch' => "'''Zure aldaketa ezeztatua izan da zure bezeroak puntuazio-karaktereak itxuragabetu dituelako.
 Aldaketa ezeztatua izan da testuaren galtzea galarazteko.
 Hau batzuetan gertatzen da buggyan oinarritutako web proxy zerbitzua erabiltzean.'''",
+'edit_form_incomplete' => "'''Aldaketa formularioaren atal batzuk ez dira iritsi zerbitzarira; bi aldiz ziurtatu zure aldaketak osorik daudela eta berriro saiatu.'''",
 'editing' => '$1 aldatzen',
 'creating' => '$1 sortzen',
 'editingsection' => '$1 aldatzen (atala)',
@@ -1125,6 +1150,7 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
 'compareselectedversions' => 'Hautatutako bertsioak alderatu',
 'showhideselectedversions' => 'Erakutsi/ezkutatu aukeratutako berrikuspenak',
 'editundo' => 'desegin',
+'diff-empty' => '(Ez dago alderik)',
 'diff-multi' => '({{PLURAL:$1|Ez da tarteko berrikuspen bat|Ez dira tarteko $1 berrikuspen}} erakusten {{PLURAL:$2|lankide batena|$2 lankiderena}}.)',
 
 # Search results
@@ -1219,7 +1245,7 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
 'prefs-rendering' => 'Itxura',
 'saveprefs' => 'Gorde',
 'resetprefs' => 'Hasieratu',
-'restoreprefs' => 'Konfigurazio lehenetsi guztiak berrezarri',
+'restoreprefs' => 'Konfigurazio lehenetsi guztiak berrezarri (sekzio guztietan)',
 'prefs-editing' => 'Aldatzen',
 'rows' => 'Lerroak:',
 'columns' => 'Zutabeak:',
@@ -1290,6 +1316,8 @@ Informazio hau publikoa da.',
 'prefs-dateformat' => 'Data-formatua',
 'prefs-timeoffset' => 'Denbora ezberdintasuna',
 'prefs-advancedediting' => 'Genero aukerak',
+'prefs-editor' => 'Editorea',
+'prefs-preview' => 'Aurreikusi',
 'prefs-advancedrc' => 'Aukera aurreratuak',
 'prefs-advancedrendering' => 'Aukera aurreratuak',
 'prefs-advancedsearchoptions' => 'Aukera aurreratuak',
@@ -1298,6 +1326,7 @@ Informazio hau publikoa da.',
 'prefs-displaysearchoptions' => 'Aukerak erakutsi',
 'prefs-displaywatchlist' => 'Aukerak erakutsi',
 'prefs-diffs' => 'Ezberdintasunak',
+'prefs-help-prefershttps' => 'Hobespen hauek eragina izango dute sartzen zaren hurrengoan.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-posta helbidea zuzena dela dirudi',
@@ -1456,9 +1485,15 @@ Informazio hau publikoa da.',
 'action-userrights-interwiki' => 'beste wikietako lankideen lankide-eskumenak aldatu',
 'action-siteadmin' => 'datubasea babestu edo babesa kendu',
 'action-sendemail' => 'E-mailak bidali',
+'action-editmywatchlist' => 'zure jarraipn zerrenda aldatu',
+'action-viewmywatchlist' => 'zure jarraipen zerrenda ikusi',
+'action-viewmyprivateinfo' => 'zure informazio pribatua ikusi',
+'action-editmyprivateinfo' => 'zure informazio pribatua aldatu',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|aldaketa 1|$1 aldaketa}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|azkeneko bisitatik}}',
+'enhancedrc-history' => 'historia',
 'recentchanges' => 'Aldaketa berriak',
 'recentchanges-legend' => 'Azken aldaketen aukerak',
 'recentchanges-summary' => 'Orri honetan ikuska ditzakezu wiki honetan egindako azken aldaketak.',
@@ -1640,6 +1675,8 @@ $1',
 'backend-fail-read' => 'Ezin izan da "$1" fitxategia irakurri.',
 'backend-fail-create' => 'Ezin izan da "$1" fitxategia idatzi.',
 'backend-fail-maxsize' => 'Ezin izan da idatzi "$1" fitxategia {{PLURAL:$2|byte bat|$2 byte}} baino handiagoa delako.',
+'backend-fail-connect' => 'Ezin izan da "$1" gordailuaren atzeko aldearekin konektatu.',
+'backend-fail-internal' => 'Akats ezezaguna gertatu da "$1" gordailuaren atzeko aldean.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Ezin izan da "$1" askatu; ez dago itxita.',
@@ -1647,12 +1684,18 @@ $1',
 'lockmanager-fail-deletelock' => 'Ezin izan da "$1" fitxategia desblokeatu.',
 'lockmanager-fail-acquirelock' => 'Ezin izan da "$1" blokeoa eskuratu.',
 'lockmanager-fail-openlock' => 'Ezin izan da "$1" blokeo fitxategia ireki.',
+'lockmanager-fail-releaselock' => 'Ezin izan da "$1" blokeoa askatu.',
+'lockmanager-fail-db-bucket' => 'Ezin izan dut $1 buketean datubase nahikoa ziurtatu.',
+'lockmanager-fail-db-release' => 'Ezin izan da $1 datubasean giltzaraporik askatu.',
 
 # ZipDirectoryReader
 'zip-wrong-format' => 'Zehaztutako fitxategia ez zen ZIP motakoa.',
 
 # Special:UploadStash
 'uploadstash' => 'Gordailu bat igo',
+'uploadstash-clear' => 'Kodetutako fitxategiak izkutatu',
+'uploadstash-nofiles' => 'Ez duzu kodetutako fitxategirik.',
+'uploadstash-errclear' => 'Fitxategiak ezabatzeak ez du arrakastarik izan.',
 'uploadstash-refresh' => 'Fitxategien zerrenda eguneratu',
 
 # img_auth script messages
@@ -1792,6 +1835,9 @@ Bere [$2 fitxategiaren deskribapen orrialdea] behean dago.',
 'randompage' => 'Ausazko orria',
 'randompage-nopages' => 'Ez dago orrialderik honako {{PLURAL:$2|kategorian|kategoriatan}}: $1',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Joan',
+
 # Random redirect
 'randomredirect' => 'Ausazko birzuzenketa',
 'randomredirect-nopages' => 'Ez dago birzuzenketarik "$1" izen-tartean.',
@@ -2019,6 +2065,7 @@ Badago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako
 'noemailtext' => 'Erabiltzaile honek ez du baliozko e-posta helbiderik zehaztu.',
 'nowikiemailtitle' => 'Ezin da e-postarik bidali',
 'nowikiemailtext' => 'Erabiltzaile honek beste erabiltzaileengandik e-postak ez jasotzea hautatu du.',
+'emailnotarget' => 'Jasotzailearentzat lankide izen ez-egokia edo ezezaguna.',
 'emailtarget' => 'Sartu jasolearen erabiltzaile izena',
 'emailusername' => 'Lankide izena:',
 'emailusernamesubmit' => 'Bidali',
@@ -2246,11 +2293,8 @@ Aukeratutako leheneratze bat burutzeko, leheneratu nahi dituzun berrikuspenen ko
 'undeleterevisions' => '$1 {{PLURAL:$1|berrikuspen|berrikuspen}} artxibatuta',
 'undeletehistory' => 'Orrialdea leheneratzen baduzu, berrikuspena guztiak leheneratuko dira historian.
 Ezabatu ondoren izen berdina duen orrialde berri bat sortzen bada leheneratutako berrikuspenak azalduko dira historian.',
-'undeleterevdel' => 'Berrezarpena ez da egingo goreneko orrialde edo fitxategia partzialki ezabatua suertatzen bada.
-Kasu horietan ezabatutako azken aldaketen aukeraketa kendu edo agertarazi beharko dituzu.
-
-Undeletion will not be performed if it will result in the top page or file revision being partially deleted.
-In such cases, you must uncheck or unhide the newest deleted revision.',
+'undeleterevdel' => 'Desezabatzea ez da egingo, baldin horren ondorioz goreneko orria edo fitxategia partzialki ezabatuko bada.
+Halakoetan, ezabatutako azken aldaketak desaukeratu edo atzera agerrarazi beharko dituzu.',
 'undeletehistorynoadmin' => 'Artikulua ezabatu egin da. Ezabatzeko azalpena beheko laburpenean erakusten da, ezabatu aurretik parte hartu zuten erabiltzaileen xehetasunekin batera. Ezabatutako berrikuspenen oraingo testua administratzaileek bakarrik ikus dezakete.',
 'undelete-revision' => '$1(e)n berrikuspen $3(e)k ezabatu du ($4(e)ko $5(e)tan):',
 'undeleterevision-missing' => 'Baliogabeko berrikuspena. Baliteke lotura ezegokia izatea, edo berriskupena leheneratu edo kendu izana.',
@@ -2259,7 +2303,7 @@ In such cases, you must uncheck or unhide the newest deleted revision.',
 'undeletelink' => 'ikusi/leheneratu',
 'undeleteviewlink' => 'ikusi',
 'undeletereset' => 'Hasieratu',
-'undeleteinvert' => 'Aukeraketa alderanztu',
+'undeleteinvert' => 'Alderanztu aukera',
 'undeletecomment' => 'Arrazoia:',
 'undeletedrevisions' => '{{PLURAL:$1|Berrikuspen 1 leheneratu da|$1 berrikuspen leheneratu dira}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|berrikuspen|berrikuspen}} eta {{PLURAL:$2|fitxategi|fitxategi}} leheneratu dira',
@@ -2639,6 +2683,8 @@ Fitxategiaren atal bat baino ez zen igo.',
 'import-upload' => 'Igo XML datuak',
 'import-token-mismatch' => 'Sesio data galdu da. Saia saitez berriro ere, mesedez.',
 'import-invalid-interwiki' => 'Ezin da esandako wikitik inportatu.',
+'import-rootpage-invalid' => 'Emandako jatorri orrialdea izenburu ez-baliagarria da.',
+'import-rootpage-nosubpage' => 'Jatorri orrialdearen "$1" izen-tarteak ez du baimentzen azpi-orrialderik.',
 
 # Import log
 'importlogpage' => 'Inportazio erregistroa',
@@ -2651,6 +2697,12 @@ Fitxategiaren atal bat baino ez zen igo.',
 # JavaScriptTest
 'javascripttest' => 'JavaScript frogatzen',
 'javascripttest-title' => '$1 frogak egiten',
+'javascripttest-pagetext-noframework' => 'Orrialde hau JavaScript frogak egiteko gordeta dago.',
+'javascripttest-pagetext-unknownframework' => 'Froga eremu ez-ezaguna "$1".',
+'javascripttest-pagetext-frameworks' => 'Mesedez, aukera ezazu froga eremu hauetako bat: $1',
+'javascripttest-pagetext-skins' => 'Aukeratu frogak egiteko itxura bat:',
+'javascripttest-qunit-intro' => 'Ikusi [$1 frogen dokumentazioa] mediawiki.org orrialdean.',
+'javascripttest-qunit-heading' => 'MediWiki JavaScript QUnit froga taldea',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Nire lankide orria',
@@ -2768,14 +2820,15 @@ Atal hau '''EZ''' bete!",
 'pageinfo-length' => 'Orriaren neurria (byteak)',
 'pageinfo-article-id' => 'Orriaren identifikazio zenbakia',
 'pageinfo-language' => 'Orriaren edukiaren hizkuntza',
-'pageinfo-robot-policy' => 'Bilaketa motorraren egoera',
-'pageinfo-robot-index' => 'Indexagarria',
-'pageinfo-robot-noindex' => 'Indexaezina',
+'pageinfo-robot-policy' => 'Errobotak indexatzea egiten',
+'pageinfo-robot-index' => 'Baimendua',
+'pageinfo-robot-noindex' => 'Debekatua',
 'pageinfo-views' => 'Bistaratze-kopurua',
 'pageinfo-watchers' => 'Orriaren jarraitzaileen kopurua',
 'pageinfo-few-watchers' => '{{PLURAL:$1|Ikusle bat|$1 ikusle}} baino gutxiago',
 'pageinfo-redirects-name' => 'Orri honetara dakarten birzuzenketak',
 'pageinfo-subpages-name' => 'Orri honen azpiorriak',
+'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|birzuzenketa $2|$2 birzuzenketa}}; {{PLURAL:$3|ez-birzuzenketa $3|$3 ez-birzuzenketa}}',
 'pageinfo-firstuser' => 'Orriaren sortzailea',
 'pageinfo-firsttime' => 'Orriaren sortze data',
 'pageinfo-lastuser' => 'Azken editorea',
@@ -2784,6 +2837,7 @@ Atal hau '''EZ''' bete!",
 'pageinfo-authors' => 'Egile kopurua, guztira',
 'pageinfo-recent-edits' => 'Oraintsuko edizioen kopurua (azken $1)',
 'pageinfo-recent-authors' => 'Oraintsuko egileen kopurua',
+'pageinfo-magic-words' => 'Hitz {{PLURAL:$1|magikoa|magikoak}} ($1)',
 'pageinfo-hidden-categories' => 'Ezkutuko {{PLURAL:$1|kategoria|kategoriak}} ($1)',
 'pageinfo-templates' => 'Txertatutako {{PLURAL:$1|txantiloia|txantiloiak}} ($1)',
 'pageinfo-toolboxlink' => 'Orri honen datuak',
@@ -3106,10 +3160,12 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
 # Exif attributes
 'exif-compression-1' => 'Konprimatu gabe',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman kodetzea abiatu da',
+'exif-compression-3' => 'CCITT Group 3 fax kodetzea',
+'exif-compression-4' => 'CCITT Group 4 fax kodetzea',
 'exif-compression-6' => 'JPEG',
 
 'exif-copyrighted-true' => 'Copyrightduna',
-'exif-copyrighted-false' => 'Domeinu askea',
+'exif-copyrighted-false' => 'Copyright egoera ez da ezarri',
 
 'exif-photometricinterpretation-2' => 'GBU (RGB)',
 'exif-photometricinterpretation-6' => 'YCbCr',
@@ -3292,8 +3348,10 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
 'exif-gpsdirection-m' => 'Norabide magnetikoa',
 
 'exif-ycbcrpositioning-1' => 'Zentratua',
+'exif-ycbcrpositioning-2' => 'Gune partekatua',
 
 'exif-dc-contributor' => 'Egileak',
+'exif-dc-coverage' => 'Media honen denbora- edo leku-esparrua',
 'exif-dc-date' => 'Data(k)',
 'exif-dc-publisher' => 'Argitaratzailea',
 'exif-dc-relation' => 'Harremana duen media',
@@ -3503,6 +3561,7 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 'fileduplicatesearch-info' => '$1 × $2 pixel<br />Fitxategiaren tamaina: $3<br />MIME mota: $4',
 'fileduplicatesearch-result-1' => '"$1" fitxategiak ez du duplikazio zehazki berdinik.',
 'fileduplicatesearch-result-n' => '"$1" fitxategiak {{PLURAL:$2|kopia zehatz bakarra du|$2 kopia zehatz ditu}}.',
+'fileduplicatesearch-noresults' => 'Ez da aurkitu "$1" izeneko fitxategirik.',
 
 # Special:SpecialPages
 'specialpages' => 'Orri bereziak',
@@ -3557,6 +3616,9 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 'compare-rev1' => '1. berrikuspena',
 'compare-rev2' => '2. berrikuspena',
 'compare-submit' => 'Alderatu',
+'compare-invalid-title' => 'Zehaztutako izenburua ez dago zuzen.',
+'compare-title-not-exists' => 'Zehazturiko izenburua ez da existitzen.',
+'compare-revision-not-exists' => 'Zehazturiko berrikuspena ez da existitzen.',
 
 # Database error messages
 'dberr-header' => 'Wiki honek arazo bat du',
@@ -3584,6 +3646,7 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 testu osoan bilatzeko laguntzarekin',
+'sqlite-no-fts' => '$1 testu osoan bilatzeko laguntzarik gabe',
 
 # New logging system
 'logentry-delete-delete' => '$1 wikilariak $3 orria {{GENDER:$2|ezabatu}} du',
index 36a721c..02f1e49 100644 (file)
@@ -481,7 +481,7 @@ $messages = array(
 'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرفعال شود',
 'tog-norollbackdiff' => 'بعد از واگردانی تفاوت نشان داده نشود',
 'tog-useeditwarning' => 'زمان خروج از صفحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود',
-'tog-prefershttps' => 'هنگامی که ثبت ورود انجام گرفته همواره از اتصال امن استفاده شود',
+'tog-prefershttps' => 'در حالت ورود به سامانه همواره از اتصال امن استفاده شود',
 
 'underline-always' => 'همیشه',
 'underline-never' => 'هرگز',
@@ -1534,7 +1534,7 @@ $1",
 'shown-title' => 'نمایش $1 {{PLURAL:$1|نتیجه|نتیجه}} در هر صفحه',
 'viewprevnext' => 'نمایش ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'گزینه‌های جستجو',
-'searchmenu-exists' => "'''صفحه‌ای با عنوان \"[[:\$1]]\" در این ویکی وجود دارد.'''",
+'searchmenu-exists' => "'''صفحه‌ای با عنوان «[[:$1]]» در این ویکی وجود دارد.'''",
 'searchmenu-new' => "'''صفحهٔ «[[:$1]]» را در این ویکی بسازید!'''",
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|مرور صفحه‌های با این پیشوند]]',
 'searchprofile-articles' => 'صفحه‌های محتوایی',
@@ -4213,7 +4213,7 @@ $5
 * صفحه‌های ویژهٔ عادی.
 * <strong class="mw-specialpagerestricted">صفحه‌های ویژهٔ محدودشده.</strong>',
 'specialpages-group-maintenance' => 'گزارش‌های نگهداری',
-'specialpages-group-other' => 'صÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ù\88Û\8cÚ\98Ù\87Ù\94 Ø¯Û\8cگر',
+'specialpages-group-other' => 'ساÛ\8cر ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c Ù\88Û\8cÚ\98Ù\87',
 'specialpages-group-login' => 'ورود / ثبت نام',
 'specialpages-group-changes' => 'تغییرات اخیر و سیاهه‌ها',
 'specialpages-group-media' => 'گزارش بارگذاری رسانه‌ها',
index fcc4560..41ebf99 100644 (file)
@@ -917,8 +917,8 @@ pyynnön, tai muistat sittenkin vanhan salasanasi, etkä halua muuttaa sitä,
 voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.',
 'passwordreset-emailelement' => 'Käyttäjätunnus: $1
 Väliaikainen salasana: $2',
-'passwordreset-emailsent' => 'Salasanan palautuksesta kertova viesti on lähetetty sähköpostitse.',
-'passwordreset-emailsent-capture' => 'Salasanan palautuksesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.',
+'passwordreset-emailsent' => 'Salasanan uudistamisesta kertova viesti on lähetetty sähköpostitse.',
+'passwordreset-emailsent-capture' => 'Salasanan uudistamisesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.',
 'passwordreset-emailerror-capture' => 'Allaoleva sähköpostiviesti luotiin, mutta sen lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1',
 
 # Special:ChangeEmail
@@ -1138,7 +1138,7 @@ Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä as
 
 # Content models
 'content-model-wikitext' => 'wikiteksti',
-'content-model-text' => 'teksti',
+'content-model-text' => 'pelkkä teksti',
 'content-model-javascript' => 'JavaScript',
 'content-model-css' => 'CSS',
 
@@ -1283,15 +1283,17 @@ $1",
 'revdel-restore-visible' => 'näkyvät versiot',
 'pagehist' => 'Sivun muutoshistoria',
 'deletedhist' => 'Poistettujen versioiden historia',
-'revdelete-hide-current' => 'Virhe piilotettaessa $1 kello $2 päivättyä kohdetta: Tämä on uusin versio.
+'revdelete-hide-current' => 'Virhe piilotettaessa kohdetta päivämäärällä $1 kello $2: Tämä on uusin versio.
 Sitä ei voi piilottaa.',
 'revdelete-show-no-access' => 'Virhe näyttäessä kohtaa $2 kello $1: kohta on merkitty ”rajoitetuksi”.
 Sinulla ei ole oikeutta siihen.',
-'revdelete-modify-no-access' => 'Virhe tapahtui $2, $1 kohteen muokkauksessa: tämä kohde on merkitty "rajoitetuksi". Sinulla ei ole oikeuksia sen muokkaukseen.',
+'revdelete-modify-no-access' => 'Virhe kohteen päivämäärällä $1 kello $2 muutoksessa: tämä kohde on merkitty "rajoitetuksi". 
+Sinulla ei ole oikeutta muuttaa kohdetta.',
 'revdelete-modify-missing' => 'Virhe muuttaessa kohdetta, jonka tunniste on $1: Se puuttuu tietokannasta.',
-'revdelete-no-change' => "'''Varoitus:''' kohteessa $2 kello $1 on jo valmiiksi haluamasi näkyvyysasetukset.",
-'revdelete-concurrent-change' => 'Virhe $2, $1 päivätyn kohteen muokkauksessa: sen tilan on näköjään muuttanut joku sillä aikaa kun yritit muokata sitä. Ole hyvä ja tarkista lokit.',
-'revdelete-only-restricted' => 'Virhe piilotettaessa $1 kello $2 päivättyä kohdetta: Et voi poistaa kohteita ylläpitäjien näkyviltä valitsematta myös jotain muuta näkyvyysasetusta.',
+'revdelete-no-change' => "'''Varoitus.''' Kohteessa päivämäärällä $1 kello $2 on jo valmiiksi haluamasi näkyvyysasetukset.",
+'revdelete-concurrent-change' => 'Virhe kohteen päivämäärällä $1 kello $2 muutoksessa: sen näkyvyysasetuksia on ilmeisesti joku muuttanut sillä aikaa kun yritit muuttaa sitä.
+Ole hyvä ja tarkista lokit.',
+'revdelete-only-restricted' => 'Virhe piilotettaessa kohdetta päivämäärällä $1 kello $2: Et voi häivyttää kohteita ylläpitäjien näkyviltä valitsematta sen lisäksi jotain muuta näkyvyysasetusta.',
 'revdelete-reason-dropdown' => '*Yleiset poistosyyt
 ** Tekijänoikeusrikkomus
 ** Sopimattomat henkilötiedot
@@ -1402,7 +1404,7 @@ $1 {{int:pipe-separator}} $2',
 'searchall' => 'kaikki',
 'showingresults' => "{{PLURAL:$1|'''Yksi''' tulos|'''$1''' tulosta}} tuloksesta '''$2''' alkaen.",
 'showingresultsnum' => "Alla on {{PLURAL:$3|'''Yksi''' hakutulos|'''$3''' hakutulosta}} alkaen '''$2.''' tuloksesta.",
-'showingresultsheader' => "{{PLURAL:$5|Tulokset '''$1'''–'''$3'''|Tulokset '''$1'''–'''$2''' kaikkiaan '''$3''' osuman joukosto}} haulle '''$4'''",
+'showingresultsheader' => "{{PLURAL:$5|Tulokset '''$1'''–'''$3'''|Tulokset '''$1'''–'''$2''' kaikkiaan '''$3''' osuman joukosta}} haulle '''$4'''",
 'nonefound' => "'''Huomautus''': Haku kohdistuu oletuksena vain tiettyihin nimiavaruuksiin.
 Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön (mukaan lukien keskustelut, mallineet jne.) tai kohdista haku haluttuun nimiavaruuteen.",
 'search-nonefound' => 'Hakusi ei tuottanut tulosta.',
@@ -1411,9 +1413,9 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'powersearch-ns' => 'Hae nimiavaruuksista:',
 'powersearch-redir' => 'Luettele ohjaukset',
 'powersearch-field' => 'Etsi',
-'powersearch-togglelabel' => 'Muuta valintaa',
+'powersearch-togglelabel' => 'Valitse:',
 'powersearch-toggleall' => 'Valitse kaikki',
-'powersearch-togglenone' => 'Poista valinnat',
+'powersearch-togglenone' => 'Ei mitään',
 'search-external' => 'Ulkoinen haku',
 'searchdisabled' => 'Tekstihaku on poistettu toistaiseksi käytöstä suuren kuorman vuoksi. Voit käyttää alla olevaa Googlen hakukenttää sivujen etsimiseen, kunnes haku tulee taas käyttöön. <small>Huomaa, että ulkopuoliset kopiot {{GRAMMAR:genitive|{{SITENAME}}}} sisällöstä eivät välttämättä ole ajan tasalla.</small>',
 'search-error' => 'Virhe ilmaantui haettaessa: $1',
@@ -1605,7 +1607,7 @@ Tämä tieto on julkinen.',
 'right-reupload-own' => 'Korvata itsetallennettu tiedosto uudella tiedostolla',
 'right-reupload-shared' => 'Korvata jaettuun mediavarastoon tallennettuja tiedostoja paikallisesti',
 'right-upload_by_url' => 'Tallentaa tiedostoja verkko-osoitteella',
-'right-purge' => 'Päivittää tiedoston välimuistitetun version ilman varmennussivua',
+'right-purge' => 'Tyhjentää sivuston välimuisti ilman varmennussivua',
 'right-autoconfirmed' => 'IP-pohjaiset nopeusrajoitukset eivät ole voimassa',
 'right-bot' => 'Kohdellaan automaattisena prosessina',
 'right-nominornewtalk' => 'Tehdä pieniä muokkauksia käyttäjien keskustelusivuille siten, että käyttäjälle ei ilmoiteta siitä uutena viestinä',
@@ -1615,9 +1617,9 @@ Tämä tieto on julkinen.',
 'right-bigdelete' => 'Poistaa sivuja, joilla on pitkä historia',
 'right-deletelogentry' => 'Poistaa ja palauttaa tiettyjä lokimerkintöjä',
 'right-deleterevision' => 'Poistaa ja palauttaa sivujen versioita',
-'right-deletedhistory' => 'Tarkastella poistettuja versiotietoja ilman niihin liittyvää sisältöä',
+'right-deletedhistory' => 'Tarkastella poistettujen versioiden tietoja ilman niihin liittyvää tekstisisältöä',
 'right-deletedtext' => 'Tarkastella poistettujen sivujen tekstiä ja muutoksia poistettujen versioiden välillä',
-'right-browsearchive' => 'Tarkastella poistettuja sivuja',
+'right-browsearchive' => 'Hakea poistettuja sivuja',
 'right-undelete' => 'Palauttaa poistettuja sivuja',
 'right-suppressrevision' => 'Tarkastella ja palauttaa ylläpitäjiltä piilotettuja versioita',
 'right-suppressionlog' => 'Tarkastella yksityisiä lokeja',
@@ -1636,20 +1638,20 @@ Tämä tieto on julkinen.',
 'right-edituserjs' => 'Muokata toisten käyttäjien JavaScript-tiedostoja',
 'right-editmyusercss' => 'Muokata omia CSS-tiedostoja',
 'right-editmyuserjs' => 'Muokata omia JavaScript-tiedostoja',
-'right-viewmywatchlist' => 'Tarkastella tarkkailulistaasi',
+'right-viewmywatchlist' => 'Nähdä oma tarkkailulista',
 '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)',
 'right-editmyoptions' => 'Muokata omia asetuksiasi',
 'right-rollback' => 'Palauttaa nopeasti käyttäjän viimeisimmät muokkaukset sivuun',
-'right-markbotedits' => 'Kumota muokkauksia bottimerkinnällä',
+'right-markbotedits' => 'Merkitä muokkausten palauttaminen botilla tehdyksi',
 'right-noratelimit' => 'Ohittaa nopeusrajoitukset',
 'right-import' => 'Tuoda sivuja muista wikeistä',
 'right-importupload' => 'Tuoda sivuja tiedostosta',
-'right-patrol' => 'Merkitä muokkaukset tarkastetuiksi',
-'right-autopatrol' => 'Muokkaukset aina valmiiksi tarkastetuksi merkittyjä',
+'right-patrol' => 'Merkitä muiden tekemät muokkaukset tarkastetuiksi',
+'right-autopatrol' => 'Omat muokkaukset on automaattisesti merkitty tarkastetuksi',
 'right-patrolmarks' => 'Nähdä tarkastusmerkit tuoreissa muutoksissa',
-'right-unwatchedpages' => 'Tarkastella listaa tarkkailemattomista sivuista',
+'right-unwatchedpages' => 'Nähdä luetteloa tarkkailemattomista sivuista',
 'right-mergehistory' => 'Yhdistää sivujen historioita',
 'right-userrights' => 'Muuttaa kaikkia käyttäjäoikeuksia',
 'right-userrights-interwiki' => 'Muokata käyttäjien oikeuksia muissa wikeissä',
@@ -1674,7 +1676,7 @@ Tämä tieto on julkinen.',
 'action-createaccount' => 'luoda tätä käyttäjätunnusta',
 'action-minoredit' => 'merkitä tätä muokkausta pieneksi',
 'action-move' => 'siirtää tätä sivua',
-'action-move-subpages' => 'siirtää tätä sivua, ja sen alasivuja',
+'action-move-subpages' => 'siirtää tätä sivua eikä sen alasivuja',
 'action-move-rootuserpages' => 'siirtää käyttäjäsivuja',
 'action-movefile' => 'siirtää tätä tiedostoa',
 'action-upload' => 'tallentaa tätä tiedostoa',
@@ -1686,7 +1688,7 @@ Tämä tieto on julkinen.',
 'action-deleterevision' => 'poistaa tätä versiota',
 'action-deletedhistory' => 'tarkastella tämän sivun poistettua historiaa',
 'action-browsearchive' => 'etsiä poistettuja sivuja',
-'action-undelete' => 'palauttaa tätä sivua',
+'action-undelete' => 'palauttaa tätä poistettua sivua',
 'action-suppressrevision' => 'tarkastella ja palauttaa tätä piilotettua versiota',
 'action-suppressionlog' => 'tarkastella tätä yksityislokia',
 'action-block' => 'estää tätä käyttäjää muokkaamasta',
@@ -1694,9 +1696,9 @@ Tämä tieto on julkinen.',
 'action-rollback' => 'käyttää nopeaa palautusta kumoamaan viimeisen käyttäjän viimeiset muutokset sivuun',
 'action-import' => 'tuoda sivuja toisesta wikistä',
 'action-importupload' => 'tuoda sivuja tiedostosta',
-'action-patrol' => 'merkitä muiden muokkauksia tarkastetuiksi',
-'action-autopatrol' => 'saada muokkaukset automaattisesti tarkastetuiksi',
-'action-unwatchedpages' => 'tarkastella tarkkailemattomien sivujen listaa',
+'action-patrol' => 'merkitä muiden tekemiä muokkauksia tarkastetuiksi',
+'action-autopatrol' => 'merkitä omia muokkauksiasi tarkastetuiksi',
+'action-unwatchedpages' => 'nähdä luetteloa tarkkailemattomista sivuista',
 'action-mergehistory' => 'yhdistää tämän sivun historiaa',
 'action-userrights' => 'muokata kaikkia käyttöoikeuksia',
 'action-userrights-interwiki' => 'muokata muiden wikien käyttäjien käyttöoikeuksia',
@@ -2013,7 +2015,7 @@ Parhaan turvallisuuden vuoksi img_auth.php on poissa käytöstä.',
 'filehist-help' => 'Päiväystä napsauttamalla näet, millainen tiedosto oli kyseisellä hetkellä.',
 'filehist-deleteall' => 'poista kaikki',
 'filehist-deleteone' => 'poista tämä',
-'filehist-revert' => 'palauta',
+'filehist-revert' => 'palauta tämä',
 'filehist-current' => 'nykyinen',
 'filehist-datetime' => 'Päiväys',
 'filehist-thumb' => 'Pienoiskuva',
@@ -2047,30 +2049,30 @@ Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
 'uploadnewversion-linktext' => 'Tallenna uusi versio tästä tiedostosta',
 'shared-repo-from' => 'kohteesta $1',
 'shared-repo' => 'jaettu mediavarasto',
-'upload-disallowed-here' => 'Et voi korvata tätä tiedostoa.',
+'upload-disallowed-here' => 'Et voi korvata tätä tiedostoa uudella tiedostolla.',
 
 # File reversion
 'filerevert' => 'Tiedoston $1 palautus',
 'filerevert-legend' => 'Tiedoston palautus',
-'filerevert-intro' => '<span class="plainlinks">Olet palauttamassa tiedostoa \'\'\'[[Media:$1|$1]]\'\'\' [$4 versioon, joka luotiin $2 kello $3].</span>',
-'filerevert-comment' => 'Syy',
-'filerevert-defaultcomment' => 'Palautettiin versioon, joka luotiin $1 kello $2 (UTC)',
-'filerevert-submit' => 'Palauta',
-'filerevert-success' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\' on palautettu [$4 versioon, joka luotiin $2 kello $3].</span>',
+'filerevert-intro' => "Olet palauttamassa takaisin tiedostoa '''[[Media:$1|$1]]''' [$4 versioon, joka luotiin $2 kello $3].",
+'filerevert-comment' => 'Syy:',
+'filerevert-defaultcomment' => 'Palautettiin takaisin versioon, joka luotiin $1 kello $2 (UTC)',
+'filerevert-submit' => 'Suorita palauttaminen',
+'filerevert-success' => "'''[[Media:$1|$1]]''' on palautettu takaisin [$4 versioon, joka luotiin $2 kello $3].",
 'filerevert-badversion' => 'Tiedostosta ei ole luotu versiota kyseisellä ajan hetkellä.',
 
 # File deletion
 'filedelete' => 'Tiedoston $1 poisto',
 'filedelete-legend' => 'Tiedoston poisto',
-'filedelete-intro' => "Olet poistamassa tiedostoa '''[[Media:$1|$1]]''' ja kaiken sen historian.",
-'filedelete-intro-old' => '<span class="plainlinks">Olet poistamassa tiedoston \'\'\'[[Media:$1|$1]]\'\'\' [$4 $3 kello $2 luotua versiota].</span>',
-'filedelete-comment' => 'Syy',
+'filedelete-intro' => "Olet poistamassa tiedoston '''[[Media:$1|$1]]''' ja kaiken sen historian.",
+'filedelete-intro-old' => '<span class="plainlinks">Olet poistamassa tiedoston \'\'\'[[Media:$1|$1]]\'\'\' [$4 päivämäärällä $2 kello $3 luotua versiota].</span>',
+'filedelete-comment' => 'Syy:',
 'filedelete-submit' => 'Poista',
 'filedelete-success' => "Tiedosto '''$1''' on poistettu.",
-'filedelete-success-old' => "Tiedoston '''[[Media:$1|$1]]''' $3 kello $2 luotu versio on poistettu.",
-'filedelete-nofile' => "Tiedostoa '''$1''' ei ole.",
-'filedelete-nofile-old' => "Tiedostosta '''$1''' ei ole olemassa pyydettyä versiota.",
-'filedelete-otherreason' => 'Muu syy tai tarkennus',
+'filedelete-success-old' => "Tiedoston '''[[Media:$1|$1]]''' $2 kello $3 luotu versio on poistettu.",
+'filedelete-nofile' => "Tiedostoa '''$1''' ei ole olemassa.",
+'filedelete-nofile-old' => "Tiedostosta '''$1''' ei ole olemassa arkistossa olevaa versiota, jolla on annetut ominaisuudet.",
+'filedelete-otherreason' => 'Muu syy tai tarkennus:',
 'filedelete-reason-otherlist' => 'Muu syy',
 'filedelete-reason-dropdown' => '*Yleiset poistosyyt
 ** Kaksoiskappale
@@ -2458,9 +2460,9 @@ Palaute ja lisäapu osoitteessa:
 'excontentauthor' => 'sisälsi: ”$1” (ainoa muokkaaja oli $2)',
 'exbeforeblank' => 'ennen tyhjentämistä sisälsi: ”$1”',
 'exblank' => 'oli tyhjä',
-'delete-confirm' => 'Sivun ”$1” poistaminen',
+'delete-confirm' => 'Poista ”$1”',
 'delete-legend' => 'Sivun poisto',
-'historywarning' => "'''Varoitus:''' Sivua, jota olet poistamassa on muokattu noin $1 {{PLURAL:$1|kerta|kertaa}}:",
+'historywarning' => "'''Varoitus:''' Sivua, jota olet poistamassa, on muokattu noin $1 {{PLURAL:$1|kerta|kertaa}}:",
 'confirmdeletetext' => 'Olet poistamassa sivun tai tiedoston ja kaiken sen historian. Ymmärrä teon seuraukset ja tee poisto {{GRAMMAR:genitive|{{SITENAME}}}} [[{{MediaWiki:Policy-url}}|käytäntöjen]] mukaisesti.',
 'actioncomplete' => 'Toiminto suoritettu',
 'actionfailed' => 'Toiminto epäonnistui',
@@ -2487,7 +2489,7 @@ Sivulla $2 on lista viimeaikaisista poistoista.',
 'rollback' => 'palauta aiempaan versioon',
 'rollback_short' => 'Palautus',
 'rollbacklink' => 'palauta',
-'rollbacklinkcount' => 'palauta {{PLURAL:$1|muutos|$1 muutosta}}',
+'rollbacklinkcount' => 'palauta $1 {{PLURAL:$1|muutos|muutosta}}',
 'rollbacklinkcount-morethan' => 'palauta yli $1 {{PLURAL:$1|muutos|muutosta}}',
 'rollbackfailed' => 'Palautus epäonnistui',
 'cantrollback' => 'Aiempaan versioon ei voi palauttaa, koska viimeisin kirjoittaja on sivun ainoa tekijä.',
@@ -2568,47 +2570,47 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 'restriction-level-all' => 'mikä tahansa suojaus',
 
 # Undelete
-'undelete' => 'Palauta poistettuja sivuja',
+'undelete' => 'Tarkastele poistettuja sivuja',
 'undeletepage' => 'Tarkastele ja palauta poistettuja sivuja',
 'undeletepagetitle' => "'''Poistetut versiot sivusta [[:$1]]'''.",
 'viewdeletedpage' => 'Poistettujen sivujen selaus',
-'undeletepagetext' => '{{PLURAL:$1|Seuraava sivu|Seuraavat sivut}} on poistettu, mutta {{PLURAL:$1|se löytyy|ne löytyvät}} vielä arkistosta, joten {{PLURAL:$1|se on|ne ovat}} palautettavissa. Arkisto saatetaan tyhjentää aika ajoin.',
-'undelete-fieldset-title' => 'Palauta versiot',
+'undeletepagetext' => '{{PLURAL:$1|Seuraava sivu|Seuraavat sivut}} on poistettu, mutta {{PLURAL:$1|se löytyy|ne löytyvät}} vielä arkistosta, joten {{PLURAL:$1|se|ne}} voidaan palauttaa takaisin. Arkisto saatetaan tyhjentää aika ajoin.',
+'undelete-fieldset-title' => 'Palauta versioita',
 'undeleteextrahelp' => "Palauttaaksesi sivun koko muutoshistorian jätä kaikki valintalaatikot tyhjiksi ja napsauta '''''{{int:undeletebtn}}'''''.
 Voit palauttaa versioita valikoivasti valitsemalla vain niiden versioiden valintalaatikot, jotka haluat palauttaa.",
-'undeleterevisions' => '{{PLURAL:$1|Versio|$1 versiota}} arkistoitu.',
+'undeleterevisions' => '$1 {{PLURAL:$1|versio|versiota}} on arkistoitu.',
 'undeletehistory' => 'Jos palautat sivun, kaikki versiot lisätään sivun historiaan. Jos uusi sivu samalla nimellä on luotu poistamisen jälkeen, palautetut versiot lisätään sen historiaan.',
 'undeleterevdel' => 'Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain piilotettu. 
 Tässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistettua versiota tai poista version piilotus.',
 'undeletehistorynoadmin' => 'Tämä sivu on poistettu. 
 Syy sivun poistamiseen näkyy alla olevassa yhteenvedossa, jossa on myös tiedot, ketkä olivat muokanneet tätä sivua ennen poistamista. 
 Näiden poistettujen versioiden varsinainen tekstisisältö on vain ylläpitäjien luettavissa.',
-'undelete-revision' => 'Poistettu sivu $1 hetkellä $4 kello $5. Tekijä: $3.',
+'undelete-revision' => 'Poistettu versio sivusta $1 (aikaleima $4 kello $5). Version tekijä: $3.',
 'undeleterevision-missing' => 'Virheellinen tai puuttuva versio. 
-Sinulla on kenties käytössä väärä linkki, tai sitten versio on saatettu palauttaa tai poistaa arkistosta.',
+Sinulla on kenties käytössä väärä linkki, tai sitten versio on saatettu palauttaa takaisin tai poistaa arkistosta.',
 'undelete-nodiff' => 'Aikaisempaa versiota ei löytynyt.',
 'undeletebtn' => 'Palauta',
 'undeletelink' => 'näytä tai palauta',
 'undeleteviewlink' => 'näytä',
 'undeletereset' => 'Tyhjennä',
 'undeleteinvert' => 'Käänteinen valinta',
-'undeletecomment' => 'Syy',
+'undeletecomment' => 'Syy:',
 'undeletedrevisions' => '{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin',
 'undeletedrevisions-files' => '{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin',
 'undeletedfiles' => '{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin',
 'cannotundelete' => 'Palauttaminen epäonnistui:
 $1',
-'undeletedpage' => "'''$1 on palautettu.'''
+'undeletedpage' => "'''$1 on palautettu takaisin'''
 
 [[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.",
-'undelete-header' => '[[Special:Log/delete|Poistolokissa]] on lista viimeisimmistä poistoista.',
+'undelete-header' => 'Katso [[Special:Log/delete|poistolokia]], jossa ovat äskettäin poistetut sivut.',
 'undelete-search-title' => 'Etsi poistettuja sivuja',
 'undelete-search-box' => 'Etsi poistettuja sivuja',
 'undelete-search-prefix' => 'Näytä sivut, jotka alkavat merkkijonolla:',
 'undelete-search-submit' => 'Hae',
 'undelete-no-results' => 'Poistoarkistosta ei löytynyt haettuja sivuja.',
-'undelete-filename-mismatch' => 'Tiedoston versiota, jonka aikaleima on $1, ei voi palauttaa, koska tiedostonimi ei ole sama.',
-'undelete-bad-store-key' => 'Tiedoston version, jonka aikaleima on $1 palauttaminen epäonnistui, koska tiedostoa ei ollut ennen poistoa.',
+'undelete-filename-mismatch' => 'Ei voida palauttaa tiedoston versiota, jonka aikaleima on $1: Tiedostonimi ei ole sama.',
+'undelete-bad-store-key' => 'Ei voida palauttaa tiedoston versiota, jonka aikaleima on $1: Tiedostoa ei ollut olemassa ennen poistoa.',
 'undelete-cleanup-error' => 'Käyttämättömän arkistotiedoston $1 poistaminen epäonnistui.',
 'undelete-missing-filearchive' => 'Tiedostoarkiston tunnuksen $1 hakeminen epäonnistui. Tiedosto on saatettu jo palauttaa.',
 'undelete-error' => 'Sivun palauttaminen epäonnistui',
@@ -2640,7 +2642,7 @@ $1',
 'sp-contributions-newbies' => 'Näytä uusien tulokkaiden muutokset',
 'sp-contributions-newbies-sub' => 'Uusien käyttäjien muokkaukset',
 'sp-contributions-newbies-title' => 'Uusien käyttäjien muokkaukset',
-'sp-contributions-blocklog' => 'estot',
+'sp-contributions-blocklog' => 'estoloki',
 'sp-contributions-deleted' => 'poistetut muokkaukset',
 'sp-contributions-uploads' => 'tallennukset',
 'sp-contributions-logs' => 'lokit',
@@ -2716,11 +2718,11 @@ Voimassa olevat estot näkyvät [[Special:BlockList|estolistasta]].',
 'ipb-edit-dropdown' => 'Muokkaa estosyitä',
 'ipb-unblock-addr' => 'Poista käyttäjän $1 esto',
 'ipb-unblock' => 'Poista käyttäjän tai IP-osoitteen muokkausesto',
-'ipb-blocklist' => 'Näytä estot',
+'ipb-blocklist' => 'Näytä voimassa olevat estot',
 'ipb-blocklist-contribs' => 'Käyttäjän $1 muokkaukset',
-'unblockip' => 'Muokkauseston poisto',
+'unblockip' => 'Muokkauseston poisto käyttäjältä',
 'unblockiptext' => 'Tällä lomakkeella voit poistaa käyttäjän tai IP-osoitteen muokkauseston.',
-'ipusubmit' => 'Poista esto',
+'ipusubmit' => 'Poista tämä esto',
 'unblocked' => 'Käyttäjän [[User:$1|$1]] esto on poistettu',
 'unblocked-range' => '$1 ei ole enää estettynä',
 'unblocked-id' => 'Esto $1 on poistettu',
@@ -2772,7 +2774,7 @@ Alla on ote häivytyslokista.',
 'block-log-flags-nousertalk' => 'oman keskustelusivun muokkaaminen estetty',
 'block-log-flags-angry-autoblock' => 'kehittynyt automaattiesto käytössä',
 'block-log-flags-hiddenname' => 'käyttäjänimi piilotettu',
-'range_block_disabled' => 'Ylläpitäjän oikeus luoda alue-estoja ei ole käytössä.',
+'range_block_disabled' => 'Ylläpitäjien mahdollisuus asettaa avaruusestoja on poistettu käytöstä.',
 'ipb_expiry_invalid' => 'Virheellinen päättymisaika.',
 'ipb_expiry_temp' => 'Piilotettujen käyttäjätunnusten estojen tulee olla pysyviä.',
 'ipb_hide_invalid' => 'Tämän tunnuksen piilottaminen ei onnistu. Sillä saattaa olla liikaa muokkauksia.',
@@ -2816,7 +2818,7 @@ Muista [[Special:UnlockDB|poistaa tietokannan lukitus]] kun huolto on tehty.',
 'lockedbyandtime' => '(lukinnut {{GENDER:$1|$1}} $2 kello $3)',
 
 # Move page
-'move-page' => 'Sivun $1 siirto',
+'move-page' => 'Siirrä $1',
 'move-page-legend' => 'Siirrä sivu',
 'movepagetext' => "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle.
 Vanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.
@@ -2887,7 +2889,7 @@ Haluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää?',
 'immobile-target-namespace-iw' => 'Kielilinkki ei ole kelvollinen kohde sivun siirrolle.',
 'immobile-source-page' => 'Tämä sivu ei ole siirrettävissä.',
 'immobile-target-page' => 'Kyseiselle kohdenimelle ei voi siirtää.',
-'bad-target-model' => 'Kohde käyttää eri sisältömallia. Sisällön muuttaminen muodosta $1 muotoon $2 ei ole mahdollista.',
+'bad-target-model' => 'Toivottu kohde käyttää eri sisältömuotoa. Sisällön muuttaminen muodosta $1 muotoon $2 ei ole mahdollista.',
 'imagenocrossnamespace' => 'Tiedostoja ei voi siirtää pois tiedostonimiavaruudesta.',
 'nonfile-cannot-move-to-file' => 'Sivuja ei voi siirtää tiedostonimiavaruuteen.',
 'imagetypemismatch' => 'Uusi tiedostopääte ei vastaa tiedoston tyyppiä',
@@ -2904,27 +2906,26 @@ Alla on viimeisin lokitapahtuma:',
 Valitse toinen nimi.',
 
 # Export
-'export' => 'Sivujen vienti',
-'exporttext' => 'Voit viedä sivun tai sivujen tekstiä ja muokkaushistoriaa XML-muodossa.
-Tämä tieto voidaan tuoda toiseen käyttämällä MediaWikiä [[Special:Import|tuontisivun]] kautta.
+'export' => 'Vie sivuja',
+'exporttext' => "Voit viedä (''export'') sivun tai usean sivun tekstin ja muokkaushistorian XML-muodossa.
+Tämä tieto voidaan tuoda (''import'') toiseen wikiin käyttämällä MediaWikiä [[Special:Import|tuontisivun]] kautta.
 
-Syötä sivujen otsikoita jokainen omalle rivilleen alla olevaan laatikkoon.
-Valitse myös, haluatko kaikki versiot sivuista, vai ainoastaan nykyisen version.
+Kirjoita sivujen nimet, jokainen nimike omalle rivilleen, alla olevaan tietolaatikkoon. Valitse, haluatko viedä sivun uusimman version sekä samalla kaikki vanhat versiot ja sivun historian tietorivit, vai haluatko viedä sivun uusimman version, jossa on tieto viimeisimmästä muokkauksesta.
 
-Jälkimmäisessä tapauksessa voit myös käyttää linkkiä. Esimerkiksi sivun [[{{MediaWiki:Mainpage}}]] saa vietyä linkistä [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+Jälkimmäisessä tapauksessa voit myös käyttää linkkiä. Esimerkiksi sivun [[{{MediaWiki:Mainpage}}]] saa vietyä linkistä [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
 'exportall' => 'Vie kaikki sivut',
-'exportcuronly' => 'Liitä mukaan ainoastaan uusin versio – ei koko historiaa.',
-'exportnohistory' => '----
-Sivujen koko historian vienti on estetty suorituskykysyistä.',
+'exportcuronly' => 'Ota vientiin ainoastaan uusin versio – ei koko historiaa',
+'exportnohistory' => "----
+'''Huomautus:''' Sivujen koko muokkaushistorian vienti tämän lomakkeen kautta on poistettu käytöstä suorituskykysyistä.",
 'exportlistauthors' => 'Lisää lista jokaisen sivun muokkaajista',
 'export-submit' => 'Vie',
-'export-addcattext' => 'Lisää sivut luokasta',
+'export-addcattext' => 'Lisää sivut luokasta:',
 'export-addcat' => 'Lisää',
-'export-addnstext' => 'Lisää sivut nimiavaruudesta',
+'export-addnstext' => 'Lisää sivut nimiavaruudesta:',
 'export-addns' => 'Lisää',
 'export-download' => 'Tallenna tiedostona',
-'export-templates' => 'Liitä mallineet',
-'export-pagelinks' => 'Sisällytä linkkien kohteina olevat sivut syvyydelle',
+'export-templates' => 'Ota mukaan mallineet',
+'export-pagelinks' => 'Sisällytä linkkien kohteina olevat sivut syvyydelle:',
 
 # Namespace 8 related
 'allmessages' => 'Järjestelmäviestit',
@@ -2961,7 +2962,7 @@ $2',
 
 # Special:Import
 'import' => 'Tuo sivuja',
-'importinterwiki' => 'Tuo sivuja lähiwikeistä',
+'importinterwiki' => 'Tuo sivuja muista wikeistä',
 'import-interwiki-text' => 'Valitse wiki ja sivun nimi. Versioiden päivämäärät ja muokkaajat säilytetään. Kaikki wikienväliset tuonnit kirjataan [[Special:Log/import|tuontilokiin]].',
 'import-interwiki-source' => 'Lähdewiki/sivu:',
 'import-interwiki-history' => 'Kopioi sivun koko historia',
@@ -2970,7 +2971,7 @@ $2',
 'import-interwiki-namespace' => 'Kohdenimiavaruus:',
 'import-interwiki-rootpage' => 'Tuo annetun sivun alasivuiksi (valinnainen):',
 'import-upload-filename' => 'Tiedostonimi:',
-'import-comment' => 'Syy',
+'import-comment' => 'Kommentti:',
 'importtext' => 'Vie sivuja lähdewikistä käyttäen [[Special:Export|vientityökalua]].
 Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'importstart' => 'Tuodaan sivuja...',
@@ -2998,9 +2999,9 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'import-invalid-interwiki' => 'Määritellystä wikistä ei voi tuoda.',
 'import-error-edit' => 'Sivua $1 ei tuotu, koska sinulla ei ole oikeutta muokata sitä.',
 'import-error-create' => 'Sivua $1 ei tuotu, koska sinulla ei ole oikeutta luoda sitä.',
-'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-interwiki' => 'Sivua $1 ei tuotu, koska sen nimi on varattu ulkoiseen linkittämiseen (interwiki).',
+'import-error-special' => 'Sivua $1 ei tuotu, koska se kuuluu erityiseen nimiavaruuteen, joka ei salli sivuja.',
+'import-error-invalid' => 'Sivua $1 ei tuotu, koska sen nimi ei kelpaa.',
 '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}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Annettu sivun nimi ei kelpaa.',
@@ -3009,7 +3010,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 # Import log
 'importlogpage' => 'Tuontiloki',
 'importlogpagetext' => 'Loki toisista wikeistä tuoduista sivuista.',
-'import-logentry-upload' => 'toi sivun [[$1]] lähettämällä tiedoston',
+'import-logentry-upload' => 'toi tiedoston [[$1]] tallentamalla sen',
 'import-logentry-upload-detail' => '{{PLURAL:$1|yksi versio|$1 versiota}}',
 'import-logentry-interwiki' => 'toi toisesta wikistä sivun $1',
 'import-logentry-interwiki-detail' => '{{PLURAL:$1|yksi versio|$1 versiota}} wikistä $2',
@@ -3042,9 +3043,9 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 Voit katsella sivun lähteenä olevaa wikitekstiä.',
 'tooltip-ca-history' => 'Sivun aikaisemmat versiot',
 'tooltip-ca-protect' => 'Suojaa tämä sivu',
-'tooltip-ca-unprotect' => 'Muuta tämän sivun suojauksia',
+'tooltip-ca-unprotect' => 'Muuta tämän sivun suojauksen asetuksia',
 'tooltip-ca-delete' => 'Poista tämä sivu',
-'tooltip-ca-undelete' => 'Palauta tämä sivu',
+'tooltip-ca-undelete' => 'Palauta ne muokkaukset, jotka tehtiin tälle sivulle ennen kuin se poistettiin',
 'tooltip-ca-move' => 'Siirrä tämä sivu',
 'tooltip-ca-watch' => 'Lisää tämä sivu tarkkailulistallesi',
 'tooltip-ca-unwatch' => 'Poista tämä sivu tarkkailulistaltasi',
@@ -3056,7 +3057,7 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.',
 'tooltip-n-mainpage-description' => 'Siirry etusivulle',
 'tooltip-n-portal' => 'Keskustelua projektista',
 'tooltip-n-currentevents' => 'Taustatietoa tämänhetkisistä tapahtumista',
-'tooltip-n-recentchanges' => 'Lista tuoreista muutoksista',
+'tooltip-n-recentchanges' => 'Luettelo wikiin tehdyistä tuoreista muutoksista',
 'tooltip-n-randompage' => 'Avaa satunnainen sivu',
 'tooltip-n-help' => 'Ohjeita',
 'tooltip-t-whatlinkshere' => 'Lista sivuista, jotka viittaavat tänne',
@@ -3089,10 +3090,11 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.',
 'tooltip-watchlistedit-raw-submit' => 'Päivitä tarkkailulista',
 'tooltip-recreate' => 'Luo sivu uudelleen',
 'tooltip-upload' => 'Aloita tallennus',
-'tooltip-rollback' => 'Palauttaminen kumoaa viimeisimmän muokkaajan yhden tai useamman muutoksen yhdellä kertaa.',
+'tooltip-rollback' => 'Palautustyökalu kumoaa sivun viimeisen muokkaajan yhden tai useamman muutoksen yhdellä kertaa.',
 'tooltip-undo' => 'Kumoaminen palauttaa tämän muutoksen ja avaa artikkelin esikatselussa. Yhteenvetokenttään voi kirjoittaa palautuksen syyn.',
 'tooltip-preferences-save' => 'Tallenna asetukset',
 'tooltip-summary' => 'Kirjoita lyhyt yhteenveto',
+'interlanguage-link-title' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */',
@@ -3146,7 +3148,7 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.',
 
 # Info page
 'pageinfo-title' => 'Tietoja sivusta $1',
-'pageinfo-not-current' => 'Tätä tietoa on mahdoton näyttää vanhoille versiolle.',
+'pageinfo-not-current' => 'Valitettavasti ei ole mahdollista antaa tätä tietoa, joka liittyy vanhoihin versioihin.',
 'pageinfo-header-basic' => 'Perustiedot',
 'pageinfo-header-edits' => 'Muutoshistoria',
 'pageinfo-header-restrictions' => 'Sivun suojaus',
@@ -3156,7 +3158,8 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.',
 'pageinfo-length' => 'Sivun pituus (tavuina)',
 'pageinfo-article-id' => 'Sivun tunniste',
 'pageinfo-language' => 'Sivun sisällön kieli',
-'pageinfo-robot-policy' => 'Hakukonemerkinnät',
+'pageinfo-content-model' => 'Sivun sisällön muoto',
+'pageinfo-robot-policy' => 'Robottien tekemä indeksointi',
 'pageinfo-robot-index' => 'Indeksoitava',
 'pageinfo-robot-noindex' => 'Ei indeksoitava',
 'pageinfo-views' => 'Katselukertojen määrä',
@@ -3220,8 +3223,8 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.',
 
 $1',
 'filedelete-missing' => 'Tiedostoa $1 ei voi poistaa, koska sitä ei ole olemassa.',
-'filedelete-old-unregistered' => 'Tiedoston version $1 ei ole tietokannassa.',
-'filedelete-current-unregistered' => 'Tiedosto $1 ei ole tietokannassa.',
+'filedelete-old-unregistered' => 'Tiedoston määritettyä versiota $1 ei ole tietokannassa.',
+'filedelete-current-unregistered' => 'Tiedostoa $1 ei ole tietokannassa.',
 'filedelete-archive-read-only' => 'Arkistohakemistoon ”$1” kirjoittaminen epäonnistui.',
 
 # Browsing diffs
index d643f59..5ef2ad3 100644 (file)
@@ -71,6 +71,7 @@
  * @author Omnipaedista
  * @author Peter17
  * @author PieRRoMaN
+ * @author ProgVal
  * @author Quentinv57
  * @author Rastus Vernon
  * @author Remember the dot
@@ -417,7 +418,7 @@ $messages = array(
 'tog-enotifusertalkpages' => "M'avertir par courriel si ma page de discussion est modifiée",
 'tog-enotifminoredits' => "M'avertir par courriel pour les modifications mineures de pages ou de fichiers également",
 'tog-enotifrevealaddr' => 'Afficher mon adresse de courriel dans les courriels de notification',
-'tog-shownumberswatching' => "Afficher le nombre d'utilisateurs qui suivent la page",
+'tog-shownumberswatching' => 'Afficher le nombre d’utilisateurs et d’utilisatrices qui suivent la page',
 'tog-oldsig' => 'Signature existante :',
 'tog-fancysig' => 'Traiter la signature comme du wikitexte (sans lien automatique)',
 'tog-uselivepreview' => 'Utiliser l’aperçu rapide (expérimental)',
@@ -434,7 +435,7 @@ $messages = array(
 'tog-noconvertlink' => 'Désactiver la conversion des titres',
 'tog-norollbackdiff' => "Ne pas afficher le diff lors d'une révocation",
 'tog-useeditwarning' => "M'avertir quand je quitte une page de modification sans publier les changements",
-'tog-prefershttps' => 'Toujours utiliser une connexion sécurisée en étant connecté',
+'tog-prefershttps' => 'Toujours utiliser une connexion sécurisée en étant connecté(e)',
 
 'underline-always' => 'Toujours',
 'underline-never' => 'Jamais',
@@ -609,7 +610,7 @@ $messages = array(
 'talk' => 'Discussion',
 'views' => 'Affichages',
 'toolbox' => 'Outils',
-'userpage' => 'Page utilisateur',
+'userpage' => 'Page utilisateur/utilisatrice',
 'projectpage' => 'Page méta',
 'imagepage' => 'Voir la page du fichier',
 'mediawikipage' => 'Voir la page du message',
@@ -666,7 +667,7 @@ $1",
 'youhavenewmessages' => 'Vous avez $1 ($2).',
 'newmessageslink' => 'de nouveaux messages',
 'newmessagesdifflink' => 'dernière modification',
-'youhavenewmessagesfromusers' => "Vous avez $1 {{PLURAL:$3|d'un autre utilisateur|de $3 autres utilisateurs}} ($2).",
+'youhavenewmessagesfromusers' => "Vous avez $1 {{PLURAL:$3|d'un(e) autre utilisateur/utilisatrice|de $3 autres utilisateurs/utilisatrices}} ($2).",
 'youhavenewmessagesmanyusers' => 'Vous avez $1 de nombreux utilisateurs ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|un message|de nouveaux messages}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|dernière modification|dernières modifications}}',
@@ -783,8 +784,8 @@ Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser
 'cascadeprotected' => 'Cette page est protégée car elle est incluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :
 $2',
 'namespaceprotected' => "Vous n'avez pas la permission de modifier les pages de l'espace de noms « '''$1''' ».",
-'customcssprotected' => "Vous n'avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d'un autre utilisateur.",
-'customjsprotected' => "Vous n'avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d'un autre utilisateur.",
+'customcssprotected' => "Vous n'avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d'un autre utilisateur ou utilisatrice.",
+'customjsprotected' => "Vous n'avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d'un autre utilisateur ou utilisatrice.",
 'mycustomcssprotected' => 'Vous n’avez pas le droit de modifier cette page CSS.',
 'mycustomjsprotected' => 'Vous n’avez pas le droit de modifier cette page JavaScript.',
 'myprivateinfoprotected' => 'Vous n’avez pas les droits pour modifier vos informations personnelles.',
@@ -797,7 +798,7 @@ Le motif avancé est « ''$2'' ».",
 L'administrateur qui l'a verrouillé a fourni ce motif : « $3 ».",
 'invalidtitle-knownnamespace' => "Titre invalide avec l'espace de noms « $2 » et l'intitulé « $3 »",
 'invalidtitle-unknownnamespace' => "Titre invalide avec le numéro d'espace de noms $1 et l'intitulé « $2 » inconnus",
-'exception-nologin' => 'Non connecté',
+'exception-nologin' => 'Non connecté(e)',
 'exception-nologin-text' => "Cette page ou cette action nécessite d'être connecté sur ce wiki.",
 
 # Virus scanner
@@ -814,8 +815,8 @@ Notez que certaines pages peuvent être encore affichées comme si vous étiez t
 N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAME}}]].",
 'yourname' => "Nom d'utilisateur :",
 'userlogin-yourname' => "Nom d'utilisateur",
-'userlogin-yourname-ph' => "Entrez votre nom d'utilisateur",
-'createacct-another-username-ph' => 'Saisir le nom d’utilisateur',
+'userlogin-yourname-ph' => "Entrez votre nom d'utilisateur ou d'utilisatrice",
+'createacct-another-username-ph' => 'Saisir le nom d’utilisateur ou d’utilisatrice',
 'yourpassword' => 'Mot de passe&nbsp;:',
 'userlogin-yourpassword' => 'Mot de passe',
 'userlogin-yourpassword-ph' => 'Entrez votre mot de passe',
@@ -839,7 +840,7 @@ N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAM
 'notloggedin' => 'Non connecté',
 'userlogin-noaccount' => "Vous n'avez pas de compte ?",
 'userlogin-joinproject' => 'Rejoignez {{SITENAME}}',
-'nologin' => "Vous n'êtes pas encore inscrit ? $1.",
+'nologin' => "Vous n'avez pas de compte ? $1.",
 'nologinlink' => 'Créer un compte',
 'createaccount' => 'Créer un compte',
 'gotaccount' => "Vous avez déjà un compte ? '''$1'''.",
@@ -848,8 +849,8 @@ N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAM
 'userlogin-resetpassword-link' => 'Mot de passe oublié ?',
 'helplogin-url' => 'Help:Connexion',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aide à la connexion]]',
-'userlogin-loggedin' => 'Vous êtes déjà connecté en tant que {{GENDER:$1|$1}}.
-Utilisez le formulaire ci-dessous pour vous connecter avec un autre utilisateur.',
+'userlogin-loggedin' => 'Vous êtes déjà connecté{{GENDER:$1||e|(e)}} en tant que {{GENDER:$1|$1}}.
+Utilisez le formulaire ci-dessous pour vous connecter avec un autre compte utilisateur.',
 'userlogin-createanother' => 'Créer un autre compte',
 'createacct-join' => 'Entrez vos informations ci-dessous.',
 'createacct-another-join' => 'Saisir les informations du nouveau compte ci-dessous.',
@@ -869,9 +870,9 @@ Utilisez le formulaire ci-dessous pour vous connecter avec un autre utilisateur.
 'createacct-benefit-heading' => '{{SITENAME}} est écrit par des gens comme vous.',
 'createacct-benefit-body1' => '{{PLURAL:$1|modification|modifications}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|article|articles}}',
-'createacct-benefit-body3' => '{{PLURAL:$1|contributeur récent|contributeurs récents}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributeur(trice) récent(e)|contributeurs et contributrices récent(e)s}}',
 'badretype' => 'Les mots de passe que vous avez saisis ne correspondent pas.',
-'userexists' => "Nom d'utilisateur entré déjà utilisé.
+'userexists' => "Nom d'utilisateur/utilisatrice entré déjà utilisé.
 Veuillez choisir un nom différent.",
 'loginerror' => 'Erreur de connexion',
 'createacct-error' => 'Erreur lors de la création du compte',
@@ -880,20 +881,20 @@ Veuillez choisir un nom différent.",
 'nocookieslogin' => '{{SITENAME}} utilise des cookies pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter.',
 'nocookiesfornew' => "Le compte utilisateur n'a pas été créé, car nous n'avons pas pu identifier son origine.
 Vérifiez que vous avez activé les cookies, rechargez la page et réessayez.",
-'noname' => "Vous n'avez pas saisi un nom d'utilisateur valide.",
+'noname' => "Vous n'avez pas saisi un nom d'utilisateur/utilisatrice valide.",
 'loginsuccesstitle' => 'Connexion réussie',
 'loginsuccess' => 'Vous êtes maintenant connecté{{GENDER:$1||e|(e)}} à {{SITENAME}} en tant que « $1 ».',
 'nosuchuser' => "L'utilisateur « $1 » n'existe pas.
 Les noms d'utilisateurs sont sensibles à la casse.
 Vérifiez l'orthographe, ou [[Special:UserLogin/signup|créez un nouveau compte]].",
-'nosuchusershort' => "Il n'y a pas de contributeur avec le nom « $1 ». Veuillez vérifier l'orthographe.",
-'nouserspecified' => "Vous devez saisir un nom d'utilisateur.",
-'login-userblocked' => 'Cet utilisateur est bloqué. Connexion non autorisée.',
+'nosuchusershort' => "Il n'y a pas de contributeur ni de contributrice avec le nom « $1 ». Veuillez vérifier l'orthographe.",
+'nouserspecified' => "Vous devez saisir un nom d'utilisateur/utilisatrice.",
+'login-userblocked' => 'Cet {{GENDER:$1|utilisateur|utilisatrice|utilisateur/utilisatrice}} est bloqué. Connexion non autorisée.',
 'wrongpassword' => 'Le mot de passe est incorrect. Veuillez essayer à nouveau.',
 'wrongpasswordempty' => "Vous n'avez pas entré de mot de passe. Veuillez essayer à nouveau.",
 'passwordtooshort' => 'Votre mot de passe doit contenir au moins $1 caractère{{PLURAL:$1||s}}.',
-'password-name-match' => "Votre mot de passe doit être différent de votre nom d'utilisateur.",
-'password-login-forbidden' => "L'utilisation de ce nom d'utilisateur et de ce mot de passe a été interdite.",
+'password-name-match' => "Votre mot de passe doit être différent de votre nom d'utilisateur/utilisatrice.",
+'password-login-forbidden' => "L'utilisation de ce nom d'utilisateur/utilisatrice et de ce mot de passe a été interdite.",
 'mailmypassword' => 'Recevoir un nouveau mot de passe par courriel',
 'passwordremindertitle' => 'Nouveau mot de passe temporaire pour {{SITENAME}}',
 'passwordremindertext' => "Quelqu'un (probablement vous, ayant l'adresse IP $1) a demandé un nouveau mot de
@@ -930,7 +931,7 @@ Entrez une adresse bien formatée ou laissez ce champ vide.',
 Vous devriez ouvrir une session et modifier dès à présent votre mot de passe.
 
 Ignorez ce message si ce compte a été créé par erreur.',
-'usernamehasherror' => "Le nom d'utilisateur ne peut pas contenir des caractères de hachage",
+'usernamehasherror' => "Le nom d'utilisateur/utilisatrice ne peut pas contenir des caractères de hachage",
 'login-throttled' => "Vous avez tenté un trop grand nombre de connexions dernièrement.
 Veuillez attendre $1 avant d'essayer à nouveau.",
 'login-abort-generic' => 'Votre tentative de connexion a échoué',
@@ -955,7 +956,7 @@ Si vous décidez de le fournir, il sera utilisé pour attribuer à l’utilisate
 'resetpass_submit' => 'Changer le mot de passe et se connecter',
 'changepassword-success' => 'Votre mot de passe a été changé avec succès !',
 'resetpass_forbidden' => 'Les mots de passe ne peuvent pas être changés',
-'resetpass-no-info' => 'Vous devez être connecté pour avoir accès à cette page.',
+'resetpass-no-info' => 'Vous devez être connecté(e) pour avoir accès à cette page.',
 'resetpass-submit-loggedin' => 'Changer de mot de passe',
 'resetpass-submit-cancel' => 'Annuler',
 'resetpass-wrong-oldpass' => 'Mot de passe actuel ou temporaire invalide.
@@ -970,7 +971,7 @@ Vous avez peut-être déjà changé votre mot de passe ou demandé un nouveau mo
 'passwordreset-legend' => 'Remise à zéro du mot de passe',
 'passwordreset-disabled' => 'La réinitialisation des mots de passe a été désactivée sur ce wiki.',
 'passwordreset-emaildisabled' => 'Les fonctionnalités e-mail ont été désactivées sur ce wiki.',
-'passwordreset-username' => "Nom d'utilisateur :",
+'passwordreset-username' => "Nom d'utilisateur/utilisatrice :",
 'passwordreset-domain' => 'Domaine :',
 'passwordreset-capture' => 'Voir le courriel résultant?',
 'passwordreset-capture-help' => "Si vous cochez cette case, le courriel (avec le mot de passe temporaire) vous sera affiché en même temps qu'il sera envoyé à l'utilisateur.",
@@ -986,17 +987,17 @@ $2
 $2
 
 {{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous vous êtes souvenu de votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
-'passwordreset-emailelement' => "Nom d'utilisateur : $1
+'passwordreset-emailelement' => "Nom d'{{GENDER:$1|utilisateur|utilisatrice|utilisateur/utilisatrice}} : $1
 Mot de passe temporaire : $2",
 'passwordreset-emailsent' => 'Un courriel de réinitialisation de mot de passe a été envoyé.',
 'passwordreset-emailsent-capture' => 'Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.',
-'passwordreset-emailerror-capture' => "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur}} a échoué : $1",
+'passwordreset-emailerror-capture' => "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur|utilisatrice|utilisateur/utilisatrice}} a échoué : $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Changer l’adresse de courriel',
 'changeemail-header' => 'Changer l’adresse de courriel du compte',
 'changeemail-text' => 'Remplissez ce formulaire pour changer votre adresse de courriel. Vous devrez entrer votre mot de passe pour confirmer ce changement.',
-'changeemail-no-info' => 'Vous devez être connecté pour pouvoir accéder directement à cette page.',
+'changeemail-no-info' => 'Vous devez être connecté(e) pour pouvoir accéder directement à cette page.',
 'changeemail-oldemail' => 'Adresse de courriel actuelle :',
 'changeemail-newemail' => 'Nouvelle adresse de courriel :',
 'changeemail-none' => '(aucune)',
@@ -1048,7 +1049,7 @@ Vous devriez le faire si vous les avez partagés accidentellement avec quelqu'un
 'showlivepreview' => 'Aperçu rapide',
 'showdiff' => 'Voir les modifications',
 'anoneditwarning' => "'''Attention :''' vous n'êtes pas identifié(e). Votre adresse IP sera enregistrée dans l'historique de cette page.",
-'anonpreviewwarning' => "''Vous n'êtes pas identifié. Sauvegarder enregistrera votre adresse IP dans l'historique des modifications de la page.''",
+'anonpreviewwarning' => "''Vous n'êtes pas identifié(e). Sauvegarder enregistrera votre adresse IP dans l'historique des modifications de la page.''",
 'missingsummary' => "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.
 Si vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
 'missingcommenttext' => 'Veuillez entrer un commentaire ci-dessous.',
@@ -1066,7 +1067,7 @@ La raison invoquée est la suivante : ''$2''.
 * Expiration du blocage : $6
 * Compte bloqué : $7.
 
-Vous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.
+Vous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur ou administratrice]] pour en discuter.
 Vous ne pouvez utiliser la fonction « {{MediaWiki:emailpage}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été bloquée.
 Votre adresse IP actuelle est $3 et votre identifiant de blocage est $5.
 Veuillez préciser ces indications dans toutes les requêtes que vous ferez.",
@@ -1079,7 +1080,7 @@ La raison invoquée est :
 * Expiration du blocage : $6
 * Compte bloqué : $7
 
-Vous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.
+Vous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs et administratrices]] pour discuter de ce blocage.
 
 Notez que vous ne pourrez utiliser la fonctionnalité d’envoi de courriel que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été désactivée.
 
@@ -1097,12 +1098,12 @@ Elle a peut-être été déplacée ou supprimée depuis que vous avez lu cette p
 'loginreqpagetext' => 'Vous devez vous $1 pour voir les autres pages.',
 'accmailtitle' => 'Mot de passe envoyé.',
 'accmailtext' => "Un mot de passe généré aléatoirement pour [[User talk:$1|$1]] a été envoyé à $2.
-Il peut être modifié sur la page ''[[Special:ChangePassword|Changement de mot de passe]]'' après s’être connecté.",
+Il peut être modifié sur la page ''[[Special:ChangePassword|Changement de mot de passe]]'' après s’être connecté{{GENDER:$1||e|(e)}}.",
 'newarticle' => '(Nouveau)',
 'newarticletext' => "Vous avez suivi un lien vers une page qui n'existe pas encore ou qui a été [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} effacée].
 Pour créer cette page, entrez votre texte dans la boîte ci-dessous (vous pouvez consulter [[{{MediaWiki:Helppage}}|la page d'aide]] pour plus d'informations).
 Si vous êtes arrivé{{GENDER:||e|(e)}} ici par erreur, cliquez sur le bouton '''retour''' de votre navigateur.",
-'anontalkpagetext' => "---- ''Vous êtes sur la page de discussion d'un utilisateur anonyme qui n'a pas encore créé de compte ou qui n'en utilise pas. Pour cette raison, nous devons utiliser son adresse IP pour l'identifier. Une adresse IP peut être partagée par plusieurs utilisateurs. Si vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:UserLogin/signup|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d'éviter toute confusion future avec d'autres contributeurs anonymes.''",
+'anontalkpagetext' => "---- ''Vous êtes sur la page de discussion d'un(e) utilisateur/trice anonyme qui n'a pas encore créé de compte ou qui n'en utilise pas. Pour cette raison, nous devons utiliser son adresse IP pour l'identifier. Une adresse IP peut être partagée par plusieurs utilisateurs et utilisatrices. Si vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur/rice}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:UserLogin/signup|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d'éviter toute confusion future avec d'autres contributeurs et contributrices anonymes.''",
 'noarticletext' => 'Il n\'y a pour l\'instant aucun texte sur cette page.
 Vous pouvez [[Special:Search/{{PAGENAME}}|lancer une recherche sur ce titre]] dans les autres pages,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les opérations liées]
@@ -1116,7 +1117,7 @@ Cela survient en général en suivant un lien historique obsolète vers une page
 Vous pouvez trouver plus de détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
 'userpage-userdoesnotexist' => "Le compte utilisateur « <nowiki>$1</nowiki> » n'est pas enregistré. Veuillez vérifier que vous voulez créer cette page.",
 'userpage-userdoesnotexist-view' => "Le compte utilisateur « $1 » n'est pas enregistré.",
-'blocked-notice-logextract' => 'Cet utilisateur est actuellement bloqué.
+'blocked-notice-logextract' => 'Cet utilisateur/trice est actuellement bloqué(e).
 La dernière entrée du journal des blocages est indiquée ci-dessous à titre d’information :',
 'clearyourcache' => "'''Note :''' après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
 * '''Firefox / Safari :''' Maintenez la touche ''Maj'' (''Shift'') en cliquant sur le bouton ''Actualiser'' ou pressez ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' sur un Mac) ;
@@ -1169,8 +1170,8 @@ Une solution de rechange a été trouvée pour vous permettre de modifier en tou
 'editingold' => "'''Attention : vous êtes en train de modifier une ancienne version de cette page.
 Si vous la publiez, toutes les modifications effectuées depuis cette version seront perdues.'''",
 'yourdiff' => 'Différences',
-'copyrightwarning' => "Toutes les contributions à {{SITENAME}} sont considérées comme publiées sous les termes de la $2 (voir $1 pour plus de détails). Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br 
-/>Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. '''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
+'copyrightwarning' => "Toutes les contributions à {{SITENAME}} sont considérées comme publiées sous les termes de la $2 (voir $1 pour plus de détails). Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br />
+Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. '''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
 'copyrightwarning2' => "Toutes les contributions à {{SITENAME}} peuvent être modifiées ou supprimées par d’autres utilisateurs. Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br 
 />Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. (voir $1 pour plus de détails).
 '''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
@@ -1180,10 +1181,10 @@ Il ne peut pas être sauvegardé.",
 Vous pouvez copier et coller votre texte dans un fichier texte et l’enregistrer pour plus tard.
 
 L’administrateur ayant verrouillé la base de données a donné l’explication suivante : $1",
-'protectedpagewarning' => "'''AVERTISSEMENT : cette page est protégée. Seuls les utilisateurs ayant le statut d'administrateur peuvent la modifier.'''<br />
+'protectedpagewarning' => "'''AVERTISSEMENT : cette page est protégée. Seuls les utilisateurs et utilisatrices ayant le statut d’administrateur/administratrice peuvent la modifier.'''<br />
 La dernière entrée du journal est affichée ci-dessous pour référence :",
-'semiprotectedpagewarning' => "'''Note :''' Cette page a été protégée de telle façon que seuls les contributeurs enregistrés puissent la modifier. La dernière entrée du journal est affichée ci-dessous pour référence :",
-'cascadeprotectedwarning' => "'''ATTENTION :''' Cette page a été protégée de manière à ce que seuls les administrateurs puissent la modifier. Cette protection est héritée par son inclusion par {{PLURAL:$1|la page protégée suivante, qui a|les pages protégées suivantes, qui ont}} la « protection en cascade » activée :",
+'semiprotectedpagewarning' => "'''Note :''' Cette page a été protégée de telle façon que seuls les contributeurs et contributrices enregistré(e)s puissent la modifier. La dernière entrée du journal est affichée ci-dessous pour référence :",
+'cascadeprotectedwarning' => "'''ATTENTION :''' Cette page a été protégée de manière à ce que seul(e)s les administrateurs et administratrices puissent la modifier. Cette protection est héritée par son inclusion par {{PLURAL:$1|la page protégée suivante, qui a|les pages protégées suivantes, qui ont}} la « protection en cascade » activée :",
 'titleprotectedwarning' => "'''ATTENTION : Cette page a été protégée de telle manière que des [[Special:ListGroupRights|droits spécifiques]] sont requis pour pouvoir la créer.''' La dernière entrée du journal est affichée ci-dessous pour référence :",
 'templatesused' => '{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} par cette page :',
 'templatesusedpreview' => '{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} dans cette prévisualisation :',
@@ -1252,7 +1253,7 @@ Il devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu'il y en a mainten
 'undo-failure' => 'Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.',
 'undo-norev' => "La modification n'a pas pu être défaite parce qu'elle est inexistante ou qu'elle a été supprimée.",
 'undo-summary' => 'Annulation des modifications $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])',
-'undo-summary-username-hidden' => 'Annuler la révision $1 par un utilisateur masqué',
+'undo-summary-username-hidden' => 'Annuler la révision $1 par un(e) utilisateur/utilisatrice masqué(e)',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Vous ne pouvez pas créer de compte.',
@@ -1293,9 +1294,9 @@ Essayez de [[Special:Search|rechercher sur le wiki]] pour trouver des pages en r
 
 # Revision deletion
 'rev-deleted-comment' => '(résumé de modification retiré)',
-'rev-deleted-user' => "(nom d'utilisateur retiré)",
+'rev-deleted-user' => "(nom d'utilisateur/utilisatrice retiré)",
 'rev-deleted-event' => '(entrée retirée)',
-'rev-deleted-user-contribs' => "[nom d'utilisateur ou adresse IP retiré - modification masquée sur les contributions]",
+'rev-deleted-user-contribs' => "[nom d'utilisateur/utilisatrice ou adresse IP retiré - modification masquée sur les contributions]",
 'rev-deleted-text-permission' => "Cette version de la page a été '''effacée'''.
 Des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
 'rev-deleted-text-unhide' => "Cette version de la page a été '''effacée'''.
@@ -1339,6 +1340,7 @@ Vous pouvez voir ce diff ; des détails sont disponibles dans le [{{fullurl:{{#S
 Les autres administrateurs de {{SITENAME}} pourront toujours accéder au contenu caché et le restaurer à travers cette même interface, à moins que des restrictions supplémentaires ne soient mises en place.",
 'revdelete-confirm' => 'Confirmez que vous voulez effectuer cette action, que vous en comprenez les conséquences, et que vous le faites en accord avec [[{{MediaWiki:Policy-url}}|les règles]].',
 'revdelete-suppress-text' => "La suppression ne doit être utilisée '''que''' dans les cas suivants :
+* Informations potentiellement diffamatoires
 * Informations personnelles inappropriées
 *: ''adresse, numéro de téléphone, numéro de sécurité sociale, …''",
 'revdelete-legend' => 'Mettre en place des restrictions de visibilité :',
@@ -1346,11 +1348,11 @@ Les autres administrateurs de {{SITENAME}} pourront toujours accéder au contenu
 'revdelete-hide-image' => 'Masquer le contenu du fichier',
 'revdelete-hide-name' => "Masquer l'action et la cible",
 'revdelete-hide-comment' => 'Modifier le résumé',
-'revdelete-hide-user' => 'Nom d’utilisateur/Adresse IP de l’éditeur',
-'revdelete-hide-restricted' => "Supprimer ces données aux administrateurs ainsi qu'aux autres",
+'revdelete-hide-user' => 'Nom d’utilisateur/utilisatrice ou adresse IP de l’éditeur/éditrice',
+'revdelete-hide-restricted' => "Supprimer ces données aux administrateurs et administratrices ainsi bien qu'aux autres",
 'revdelete-radio-same' => '(ne pas changer)',
-'revdelete-radio-set' => 'Visible',
-'revdelete-radio-unset' => 'Masqué',
+'revdelete-radio-set' => 'Masqué',
+'revdelete-radio-unset' => 'Visible',
 'revdelete-suppress' => 'Masquer également les données pour les administrateurs',
 'revdelete-unsuppress' => 'Enlever les restrictions sur les versions restaurées',
 'revdelete-log' => 'Motif :',
@@ -1376,7 +1378,7 @@ Vous n'y avez pas accès.",
 'revdelete-no-change' => "'''Attention :''' L'élément daté du $1 à $2 a déjà les paramètres de visibilité demandés.",
 'revdelete-concurrent-change' => "Erreur lors de la modification de l'élément daté du $1 à $2 : son statut a été changé par quelqu'un d'autre pendant que vous le modifiez.
 Vérifiez les journaux.",
-'revdelete-only-restricted' => "Erreur lors de la suppression de l'entrée datée du $1 à $2 : vous ne pouvez pas supprimer ces éléments aux administrateurs sans également sélectionner des autres options de suppression.",
+'revdelete-only-restricted' => "Erreur lors de la suppression de l'entrée datée du $1 à $2 : vous ne pouvez pas supprimer ces éléments aux administrateurs et administratrices sans également sélectionner des autres options de suppression.",
 'revdelete-reason-dropdown' => "* Raisons courantes de suppression :
 ** Violation des droits d'auteurs ;
 ** Commentaires ou renseignements personnels inappropriés ;
@@ -1477,10 +1479,10 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'search-interwiki-caption' => 'Projets frères',
 'search-interwiki-default' => 'Résultats sur $1 :',
 'search-interwiki-more' => '(plus)',
-'search-relatedarticle' => 'Relaté',
+'search-relatedarticle' => 'Reliés',
 'mwsuggest-disable' => 'Désactiver les suggestions de recherche',
 'searcheverything-enable' => 'Rechercher dans tous les espaces de noms',
-'searchrelated' => 'relaté',
+'searchrelated' => 'reliés',
 'searchall' => 'tout',
 'showingresults' => 'Affichage de <b>$1</b> résultat{{PLURAL:$1||s}} à partir du n°<b>$2</b>.',
 'showingresultsnum' => 'Affichage de <b>$3</b> résultat{{PLURAL:$3||s}} à partir du n°<b>$2</b>.',
@@ -1563,7 +1565,7 @@ Toute personne la connaissant pourra lire votre liste de suivi, ne la communique
 'timezoneregion-europe' => 'Europe',
 'timezoneregion-indian' => 'Océan indien',
 'timezoneregion-pacific' => 'Océan pacifique',
-'allowemail' => "Autoriser l'envoi de courriels venant d'autres utilisateurs",
+'allowemail' => "Autoriser l'envoi de courriels venant d'autres utilisateurs et utilisatrices",
 'prefs-searchoptions' => 'Recherche',
 'prefs-namespaces' => 'Espaces de noms',
 'defaultns' => 'Rechercher par défaut dans ces espaces de noms :',
@@ -1625,13 +1627,13 @@ Cette information sera publique.',
 'email-address-validity-invalid' => 'Une adresse valide est nécessaire !',
 
 # User rights
-'userrights' => 'Gestion des droits des utilisateurs',
-'userrights-lookup-user' => "Gestion des groupes d'utilisateurs",
-'userrights-user-editname' => "Entrez un nom d'utilisateur :",
-'editusergroup' => "Modification des groupes d'utilisateurs",
+'userrights' => 'Gestion des droits des utilisateurs et utilisatrices',
+'userrights-lookup-user' => "Gestion des groupes d'utilisateurs et utilisatrices",
+'userrights-user-editname' => "Entrez un nom d'utilisateur/utilisatrice :",
+'editusergroup' => "Modification des groupes d'utilisateurs et utilisatrices",
 'editinguser' => "Modification des droits de l'{{GENDER:$1|utilisateur|utilisatrice}} '''[[User:$1|$1]]''' $2",
-'userrights-editusergroup' => "Modifier les groupes de l'utilisateur",
-'saveusergroups' => "Enregistrer les groupes de l'utilisateur",
+'userrights-editusergroup' => "Modifier les groupes de l'{{GENDER:$1|utilisateur|utilisatrice|utilisateur/trice}}",
+'saveusergroups' => "Enregistrer les groupes de l'utilisateur/utilisatrice",
 'userrights-groupsmember' => 'Membre de :',
 'userrights-groupsmember-auto' => 'Membre implicite de :',
 'userrights-groups-help' => 'Vous pouvez modifier les groupes auxquels appartient {{GENDER:$1|cet utilisateur|cette utilisatrice}} :
@@ -1650,20 +1652,20 @@ Cette information sera publique.',
 
 # Groups
 'group' => 'Groupe :',
-'group-user' => 'Utilisateurs',
-'group-autoconfirmed' => 'Utilisateurs enregistrés',
+'group-user' => 'Utilisateurs et utilisatrices',
+'group-autoconfirmed' => 'Utilisateurs et utilisatrices enregistré(e)s',
 'group-bot' => 'Robots',
-'group-sysop' => 'Administrateurs',
+'group-sysop' => 'Administrateurs et administratrices',
 'group-bureaucrat' => 'Bureaucrates',
 'group-suppress' => 'Superviseurs',
 'group-all' => '(tous)',
 
 'group-user-member' => '{{GENDER:$1|utilisateur|utilisatrice}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|utilisateur enregistré|utilisatrice enregistrée}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|utilisateur enregistré|utilisatrice enregistrée|utilisateur/utilisatrice enregistré(e)}}',
 'group-bot-member' => '{{GENDER:$1|robot}}',
-'group-sysop-member' => '{{GENDER:$1|administrateur|administratrice}}',
+'group-sysop-member' => '{{GENDER:$1|administrateur|administratrice|administrateur/administratice}}',
 'group-bureaucrat-member' => '{{GENDER:$1|bureaucrate}}',
-'group-suppress-member' => '{{GENDER:$1|superviseur|superviseuse}}',
+'group-suppress-member' => '{{GENDER:$1|superviseur|superviseuse|superviseur/superviseuse}}',
 
 'grouppage-user' => '{{ns:project}}:Utilisateurs',
 'grouppage-autoconfirmed' => '{{ns:project}}:Utilisateurs enregistrés',
@@ -1677,11 +1679,11 @@ Cette information sera publique.',
 'right-edit' => 'Modifier les pages',
 'right-createpage' => 'Créer des pages (qui ne sont pas des pages de discussion)',
 'right-createtalk' => 'Créer des pages de discussion',
-'right-createaccount' => 'Créer des comptes utilisateur',
+'right-createaccount' => 'Créer des comptes utilisateurs',
 'right-minoredit' => 'Marquer ses modifications comme mineures',
 'right-move' => 'Renommer des pages',
 'right-move-subpages' => 'Renommer des pages avec leurs sous-pages',
-'right-move-rootuserpages' => "Renommer la page principale d'un utilisateur",
+'right-move-rootuserpages' => "Renommer la page principale d'un utilisateur ou d’une utilisatrice",
 'right-movefile' => 'Renommer des fichiers',
 'right-suppressredirect' => "Ne pas créer de redirection depuis le titre d'origine en renommant une page",
 'right-upload' => 'Importer des fichiers',
@@ -1705,19 +1707,19 @@ Cette information sera publique.',
 'right-undelete' => 'Restaurer une page supprimée',
 'right-suppressrevision' => 'Examiner et restaurer les versions masquées aux administrateurs',
 'right-suppressionlog' => 'Voir les journaux privés',
-'right-block' => "Bloquer en écriture d'autres utilisateurs",
-'right-blockemail' => "Empêcher un utilisateur d'envoyer des courriels",
-'right-hideuser' => 'Bloquer un utilisateur en masquant son nom au public',
+'right-block' => "Bloquer en écriture d'autres utilisateurs et utilisatrices",
+'right-blockemail' => "Empêcher un utilisateur ou une utilisatrice d'envoyer des courriels",
+'right-hideuser' => 'Bloquer un utilisateur ou une utilisatrice en masquant son nom du public',
 'right-ipblock-exempt' => "Ne pas être affecté par les IP bloquées, les blocages automatiques et les blocages de plages d'IP",
 'right-proxyunbannable' => 'Ne pas être affecté par les blocages automatiques de serveurs mandataires',
 'right-unblockself' => 'Se débloquer soi-même',
 'right-protect' => 'Modifier les niveaux de protection et modifier les pages protégées en cascade',
 'right-editprotected' => 'Modifier les pages protégées avec « {{int:protect-level-sysop}} »',
-'right-editsemiprotected' => 'Modifier les pages protégées avec « {{int:protect-level-autoconfirmed}} »',
+'right-editsemiprotected' => 'Modifier les pages protégées avec « {{int:protect-level-autoconfirmed}} »',
 'right-editinterface' => "Modifier l'interface utilisateur",
-'right-editusercssjs' => "Modifier les fichiers CSS et JavaScript d'autres utilisateurs",
-'right-editusercss' => "Modifier les fichiers CSS d'autres utilisateurs",
-'right-edituserjs' => "Modifier les fichiers JavaScript d'autres utilisateurs",
+'right-editusercssjs' => "Modifier les fichiers CSS et JavaScript d'autres utilisateurs et utilisatrices",
+'right-editusercss' => "Modifier les fichiers CSS d'autres utilisateurs et utilisatrices",
+'right-edituserjs' => "Modifier les fichiers JavaScript d'autres utilisateurs et utilisatrices",
 'right-editmyusercss' => 'Modifier vos propres fichiers CSS utilisateur',
 'right-editmyuserjs' => 'Modifier vos propres fichiers JavaScript utilisateur',
 'right-viewmywatchlist' => 'Afficher votre propre liste de suivi',
@@ -1735,11 +1737,11 @@ Cette information sera publique.',
 'right-patrolmarks' => 'Voir les marquages de surveillance dans les modifications récentes',
 'right-unwatchedpages' => 'Voir la liste des pages non suivies',
 'right-mergehistory' => 'Fusionner les historiques des pages',
-'right-userrights' => "Modifier tous les droits d'un utilisateur",
-'right-userrights-interwiki' => "Modifier les droits d'utilisateurs qui sont sur un autre wiki",
+'right-userrights' => 'Modifier tous les droits d’un utilisateur ou d’une utilisatrice',
+'right-userrights-interwiki' => "Modifier les droits d'utilisateurs et utilisatrices qui sont sur un autre wiki",
 'right-siteadmin' => 'Verrouiller ou déverrouiller la base de données',
 'right-override-export-depth' => "Exporter les pages en incluant les pages liées jusqu'à une profondeur de 5 niveaux",
-'right-sendemail' => 'Envoyer un courriel aux autres utilisateurs',
+'right-sendemail' => 'Envoyer un courriel aux autres utilisateurs et utilisatrices',
 'right-passwordreset' => 'Voir les courriels de réinitialisation des mots de passe',
 
 # Special:Log/newusers
@@ -1747,7 +1749,7 @@ Cette information sera publique.',
 'newuserlogpagetext' => "Cette page affiche l'historique des créations de comptes utilisateur.",
 
 # User rights log
-'rightslog' => "Journal des modifications de droits d'utilisateurs",
+'rightslog' => "Journal des modifications de droits d'utilisateurs/utilisatrices",
 'rightslogtext' => "Voici l'historique des modifications des droits des utilisateurs.",
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1759,7 +1761,7 @@ Cette information sera publique.',
 'action-minoredit' => 'marquer cette modification comme mineure',
 'action-move' => 'renommer cette page',
 'action-move-subpages' => 'renommer cette page et ses sous-pages',
-'action-move-rootuserpages' => "renommer la page principale d'un utilisateur",
+'action-move-rootuserpages' => "renommer la page principale d'un utilisateur ou d’une utilisatrice",
 'action-movefile' => 'renommer ce fichier',
 'action-upload' => 'importer ce fichier',
 'action-reupload' => 'écraser ce fichier existant',
@@ -1773,7 +1775,7 @@ Cette information sera publique.',
 'action-undelete' => 'restaurer cette page',
 'action-suppressrevision' => 'visionner et rétablir cette version supprimée',
 'action-suppressionlog' => 'voir ce journal privé',
-'action-block' => 'bloquer en écriture cet utilisateur',
+'action-block' => 'bloquer en écriture cet utilisateur/utilisatrice',
 'action-protect' => 'modifier les niveaux de protection pour cette page',
 'action-rollback' => 'annuler rapidement les modifications du dernier utilisateur qui a modifié une page donnée',
 'action-import' => 'importer des pages depuis un autre wiki',
@@ -1783,7 +1785,7 @@ Cette information sera publique.',
 'action-unwatchedpages' => 'voir la liste des pages non suivies',
 'action-mergehistory' => "fusionner l'historique de cette page",
 'action-userrights' => "modifier tous les droits d'utilisateur",
-'action-userrights-interwiki' => "modifier les droits des utilisateurs sur d'autres wikis",
+'action-userrights-interwiki' => "modifier les droits des utilisateurs et utilisatrices sur d'autres wikis",
 'action-siteadmin' => 'verrouiller ou déverrouiller la base de données',
 'action-sendemail' => 'envoyer des courriels',
 'action-editmywatchlist' => 'modifier votre liste de suivi',
@@ -1809,8 +1811,8 @@ Cette information sera publique.',
 'rclistfrom' => 'Afficher les nouvelles modifications depuis le $1.',
 'rcshowhideminor' => '$1 les modifications mineures',
 'rcshowhidebots' => '$1 les robots',
-'rcshowhideliu' => '$1 les utilisateurs inscrits',
-'rcshowhideanons' => '$1 les utilisateurs anonymes',
+'rcshowhideliu' => '$1 les utilisateurs et utilisatrices inscrit(e)s',
+'rcshowhideanons' => '$1 les utilisateurs et utilisatrices anonymes',
 'rcshowhidepatr' => '$1 les modifications surveillées',
 'rcshowhidemine' => '$1 mes modifications',
 'rclinks' => 'Afficher les $1 dernières modifications effectuées au cours des $2 derniers jours<br />$3.',
@@ -1844,7 +1846,7 @@ Cette information sera publique.',
 'uploadbtn' => 'Importer le fichier',
 'reuploaddesc' => "Annuler et retourner au formulaire d'import",
 'upload-tryagain' => 'Envoyer la description du fichier modifiée',
-'uploadnologin' => 'Non connecté(e)',
+'uploadnologin' => 'Non connecté{{GENDER:||e|(e)}}',
 'uploadnologintext' => 'Vous devez $1 pour importer des fichiers.',
 'upload_directory_missing' => "Le répertoire d'import de fichier ($1) est introuvable et n'a pas pu être créé par le serveur web.",
 'upload_directory_read_only' => "Le répertoire d'import de fichier ($1) n'est pas accessible en écriture depuis le serveur web.",
@@ -2058,14 +2060,14 @@ Voyez https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
 'img-auth-notindir' => "Le chemin demandé n'est pas le répertoire d'import configuré.",
 'img-auth-badtitle' => 'Impossible de construire un titre valide à partir de « $1 ».',
 'img-auth-nologinnWL' => "Vous n'êtes pas connecté et « $1 » n'est pas dans la liste blanche.",
-'img-auth-nofile' => "Le fichier « $1 » n'existe pas.",
+'img-auth-nofile' => "Le fichier « $1 » n'existe pas.",
 'img-auth-isdir' => "Vous essayez d'accéder au répertoire « $1 ».
 Seul l'accès aux fichiers est permis.",
 'img-auth-streaming' => 'Lecture en continu de « $1 ».',
 'img-auth-public' => "La fonction de img_auth.php est d'afficher des fichiers d'un wiki privé.
 Ce wiki est configuré comme un wiki public.
 Pour une sécurité optimale, img_auth.php est désactivé.",
-'img-auth-noread' => "L'utilisateur n'a pas le droit en lecture sur « $1 ».",
+'img-auth-noread' => "L'utilisateur/utilisatrice n'a pas le droit en lecture sur « $1 ».",
 'img-auth-bad-query-string' => "L'URL a une chaîne de requête invalide.",
 
 # HTTP errors
@@ -2098,7 +2100,7 @@ Pour une sécurité optimale, img_auth.php est désactivé.",
 'listfiles_thumb' => 'Miniature',
 'listfiles_date' => 'Date',
 'listfiles_name' => 'Nom',
-'listfiles_user' => 'Utilisateur',
+'listfiles_user' => 'Utilisateur/trice',
 'listfiles_size' => 'Taille',
 'listfiles_description' => 'Description',
 'listfiles_count' => 'Versions',
@@ -2232,14 +2234,14 @@ N'oubliez pas de vérifier s'il n'y a pas d'autres liens vers les modèles avant
 'statistics-views-total-desc' => 'Les vues des pages non existantes et des pages spéciales ne sont pas incluses',
 'statistics-views-peredit' => 'Visites par modification',
 'statistics-users' => '[[Special:ListUsers|Utilisateurs]] enregistrés',
-'statistics-users-active' => 'Utilisateurs actifs',
-'statistics-users-active-desc' => 'Utilisateurs ayant fait au moins une action durant {{PLURAL:$1|le dernier jours|les $1 derniers jours}}',
+'statistics-users-active' => 'Utilisateurs et utilisatrices actifs/actives',
+'statistics-users-active-desc' => 'Utilisateurs et utilisatrices ayant fait au moins une action durant {{PLURAL:$1|le dernier jours|les $1 derniers jours}}',
 'statistics-mostpopular' => 'Pages les plus consultées',
 
 'pageswithprop' => 'Pages avec une propriété de page',
 'pageswithprop-legend' => 'Pages avec une propriété de page',
 'pageswithprop-text' => 'Cette page liste les pages qui utilisent une propriété de page particulière.',
-'pageswithprop-prop' => 'Nom de la propriété:',
+'pageswithprop-prop' => 'Nom de la propriété :',
 'pageswithprop-submit' => 'Aller',
 'pageswithprop-prophidden-long' => 'valeur de propriété de texte long masquée ($1)',
 'pageswithprop-prophidden-binary' => 'valeur de propriété binaire masquée ($1)',
@@ -2318,9 +2320,9 @@ Les entrées <del>barrées</del> ont été résolues.',
 'listusers-creationsort' => 'Trier par date de création',
 'listusers-desc' => 'Trier en ordre descendant',
 'usereditcount' => '$1 modification{{PLURAL:$1||s}}',
-'usercreated' => '{{GENDER:$3|Créé}} le $1 à $2',
+'usercreated' => '{{GENDER:$3|Créé|Créée|Créé(e)}} le $1 à $2',
 'newpages' => 'Nouvelles pages',
-'newpages-username' => "Nom d'utilisateur :",
+'newpages-username' => "Nom d'utilisateur/utilisatrice :",
 'ancientpages' => 'Pages les plus anciennement modifiées',
 'move' => 'Renommer',
 'movethispage' => 'Renommer cette page',
@@ -2346,7 +2348,7 @@ Veuillez noter que d'autres sites peuvent avoir un lien direct vers un fichier,
 
 # Special:Log
 'specialloguserlabel' => 'Auteur :',
-'speciallogtitlelabel' => 'Cible (titre ou utilisateur):',
+'speciallogtitlelabel' => 'Cible (titre ou utilisateur/utilisatrice):',
 'log' => "Journaux d'opérations",
 'all-logs-page' => 'Tous les journaux publics',
 'alllogstext' => "Affichage combiné de tous les journaux disponibles sur {{SITENAME}}.<br />
@@ -2404,22 +2406,22 @@ Ils nécessitent au moins un domaine de niveau supérieur, par exemple « *.org
 'linksearch-error' => "Les caractères jokers ne peuvent être utilisés qu'au début du nom de domaine de l'hôte.",
 
 # Special:ListUsers
-'listusersfrom' => 'Afficher les utilisateurs à partir de :',
+'listusersfrom' => 'Afficher les utilisateurs et utilisatrices à partir de :',
 'listusers-submit' => 'Lister',
-'listusers-noresult' => 'Aucun utilisateur trouvé. Vérifiez aussi les variantes de casse.',
+'listusers-noresult' => 'Aucun utilisateur ou utilisatrice trouvé(e). Vérifiez aussi les variantes de casse.',
 'listusers-blocked' => '(bloqué{{GENDER:$1||e|(e)}})',
 
 # Special:ActiveUsers
-'activeusers' => 'Liste des utilisateurs actifs',
-'activeusers-intro' => 'Ceci est une liste des utilisateurs qui ont exercé une quelconque activité au cours {{PLURAL:$1|de la dernière journée|des $1 derniers jours}}.',
+'activeusers' => 'Liste des utilisateurs et utilisatrices actifs/actives',
+'activeusers-intro' => 'Ceci est une liste des utilisatrices et utilisateurs qui ont exercé une quelconque activité au cours {{PLURAL:$1|de la dernière journée|des $1 derniers jours}}.',
 'activeusers-count' => '$1 {{PLURAL:$1|action|actions}} lors {{PLURAL:$3|du dernier jour|des $3 derniers jours}}',
-'activeusers-from' => 'Afficher les utilisateurs depuis :',
+'activeusers-from' => 'Afficher les utilisatrices et utilisateurs depuis :',
 'activeusers-hidebots' => 'Masquer les robots',
-'activeusers-hidesysops' => 'Masquer les administrateurs',
-'activeusers-noresult' => 'Aucun utilisateur trouvé.',
+'activeusers-hidesysops' => 'Masquer les administratrices et administrateurs',
+'activeusers-noresult' => 'Aucun(e) utilisatrice ou utilisateur trouvé(e).',
 
 # Special:ListGroupRights
-'listgrouprights' => "Droits des groupes d'utilisateurs",
+'listgrouprights' => "Droits des groupes d'utilisateurs et utilisatrices",
 'listgrouprights-summary' => "Cette page contient une liste des groupes définis sur ce wiki ainsi que les droits d'accès qui leur sont associés.
 Des [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuvent exister au sujet des droits individuels.",
 'listgrouprights-key' => 'Légende :
@@ -2439,27 +2441,27 @@ Des [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuve
 'listgrouprights-removegroup-self-all' => 'Peut se retirer tous les groupes de son propre compte',
 
 # Email user
-'mailnologin' => "Pas d'adresse d'expéditeur",
-'mailnologintext' => "Vous devez être [[Special:UserLogin|identifié]] et avoir indiqué une adresse électronique valide dans vos [[Special:Preferences|préférences]] pour pouvoir envoyer des courriels à d'autres utilisateurs.",
+'mailnologin' => "Pas d'adresse d'expéditeur/expéditrice",
+'mailnologintext' => "Vous devez être [[Special:UserLogin|identifié]] et avoir indiqué une adresse électronique valide dans vos [[Special:Preferences|préférences]] pour pouvoir envoyer des courriels à d'autres utilisatrices ou utilisateurs.",
 'emailuser' => 'Lui envoyer un courriel',
-'emailuser-title-target' => 'Envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}',
-'emailuser-title-notarget' => "Envoyer un courriel à l'utilisateur",
-'emailpage' => "Envoyer un courriel à l'utilisateur",
-'emailpagetext' => "Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}.
-L'adresse électronique que vous avez indiquée dans [[Special:Preferences|vos préférences]] apparaîtra dans le champ « Expéditeur » de votre message ; ainsi, le destinataire pourra vous répondre directement.",
+'emailuser-title-target' => 'Envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice|cet utilisateur/cette utilisatrice}}',
+'emailuser-title-notarget' => "Envoyer un courriel à l'utilisatrice/utilisateur",
+'emailpage' => "Envoyer un courriel à l'utilisateur/utilisatrice",
+'emailpagetext' => "Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice|cet(te) utilisatrice/utilisateur}}.
+L'adresse électronique que vous avez indiquée dans [[Special:Preferences|vos préférences]] apparaîtra dans le champ « Expéditeur » de votre message ; ainsi, {{GENDER:$1|le|la|la/le}} destinataire pourra vous répondre directement.",
 'usermailererror' => "Erreur dans l'objet du courriel :",
-'defemailsubject' => "{{SITENAME}} Courriel de l'utilisateur « $1 »",
-'usermaildisabled' => "L'envoi de courriels entre utilisateurs est désactivé",
-'usermaildisabledtext' => "Vous ne pouvez pas envoyer de courriels à d'autres utilisateurs sur ce wiki",
+'defemailsubject' => "{{SITENAME}} Courriel de l'{{GENDER:$1|utilisateur|utilisatrice|utilisatrice/utilisateur}} « $1 »",
+'usermaildisabled' => "L'envoi de courriels entre utilisateurs/utilisatrices est désactivé",
+'usermaildisabledtext' => "Vous ne pouvez pas envoyer de courriels à d'autres utilisatrices utilisateurs sur ce wiki",
 'noemailtitle' => 'Aucune adresse de courriel',
-'noemailtext' => "Cet utilisateur n'a pas spécifié une adresse de courriel valide.",
+'noemailtext' => "Cet utilisateur/cette utilisatrice n'a pas spécifié une adresse de courriel valide.",
 'nowikiemailtitle' => 'Pas de courriel autorisé',
-'nowikiemailtext' => "Cet utilisateur a choisi de ne pas recevoir de courriel de la part d'autres utilisateurs.",
-'emailnotarget' => "Nom d'utilisateur du destinataire inexistant ou invalide.",
-'emailtarget' => "Entrez le nom d'utilisateur du destinataire",
-'emailusername' => "Nom d'utilisateur :",
+'nowikiemailtext' => "Cet utilisateur/cette utilisatrice a choisi de ne pas recevoir de courriel de la part d'autres utilisateurs et utilisatrices.",
+'emailnotarget' => "Nom d'utilisateur/utilisatrice du/de la destinataire inexistant ou invalide.",
+'emailtarget' => "Entrez le nom d'utilisateur du ou de la destinataire",
+'emailusername' => "Nom d'utilisateur/utilisatrice :",
 'emailusernamesubmit' => 'Soumettre',
-'email-legend' => 'Envoyer un courriel à un autre utilisateur de {{SITENAME}}',
+'email-legend' => 'Envoyer un courriel à un autre utilisateur ou une autre utilisatrice de {{SITENAME}}',
 'emailfrom' => 'De :',
 'emailto' => 'À :',
 'emailsubject' => 'Objet :',
@@ -2481,8 +2483,8 @@ L'adresse électronique que vous avez indiquée dans [[Special:Preferences|vos p
 'watchlistfor2' => 'Pour $1 $2',
 'nowatchlist' => 'Votre liste de suivi ne référence aucune page.',
 'watchlistanontext' => 'Veuillez vous $1 pour visualiser ou modifier les éléments de votre liste de suivi.',
-'watchnologin' => 'Non connecté',
-'watchnologintext' => 'Vous devez être [[Special:UserLogin|identifié]] pour modifier votre liste de suivi.',
+'watchnologin' => 'Non connecté(e)',
+'watchnologintext' => 'Vous devez être [[Special:UserLogin|identifié(e)]] pour modifier votre liste de suivi.',
 'addwatch' => 'Ajouter à la liste de suivi',
 'addedwatchtext' => 'La page « [[:$1]] » a été ajoutée à votre [[Special:Watchlist|liste de suivi]].
 Les prochaines modifications de cette page et de la page de discussion associée y seront répertoriées.',
@@ -2512,7 +2514,7 @@ Les prochaines modifications de cette page et de la page de discussion associée
 
 'enotif_mailer' => 'Système de notification par courriel de {{SITENAME}}',
 'enotif_reset' => 'Marquer toutes les pages comme visitées',
-'enotif_impersonal_salutation' => 'Utilisateur de {{SITENAME}}',
+'enotif_impersonal_salutation' => '{{GENDER:$2|utilisateur|utilisatrice|utilisateur/utilisatrice}} $1 de {{SITENAME}}',
 'enotif_subject_deleted' => 'La page $1 sur {{SITENAME}} a été supprimée par {{GENDER:$2|$2}}',
 'enotif_subject_created' => 'La page $1 sur {{SITENAME}} a été créée par {{GENDER:$2|$2}}',
 'enotif_subject_moved' => 'La page $1 sur {{SITENAME}} a été renommée par {{GENDER:$2|$2}}',
@@ -2525,14 +2527,14 @@ Les prochaines modifications de cette page et de la page de discussion associée
 'enotif_body_intro_changed' => 'La page $1 sur {{SITENAME}} a été modifiée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.',
 'enotif_lastvisited' => 'Voyez $1 pour tous les changements depuis votre dernière visite.',
 'enotif_lastdiff' => 'Voyez $1 pour visualiser ces changements.',
-'enotif_anon_editor' => 'utilisateur non-enregistré $1',
-'enotif_body' => 'Cher $WATCHINGUSERNAME,
+'enotif_anon_editor' => 'utilisateur ou utilisatrice non-enregistré(e) $1',
+'enotif_body' => '{{GENDER:$WATCHINGUSERNAME|Cher|Chère|Cher/Chère}} $WATCHINGUSERNAME,
 
 $PAGEINTRO $NEWPAGE
 
-Résumé du contributeur : $PAGESUMMARY $PAGEMINOREDIT
+Résumé {{GENDER:$WATCHINGUSERNAME|du contribteur|de la contributrice|du constributeur/de la contributrice}} : $PAGESUMMARY $PAGEMINOREDIT
 
-Contactez ce contributeur :
+Contactez {{GENDER:$WATCHINGUSERNAME|ce contribteur|cette contributrice|ce constributeur/cette contributrice}} :
 courriel : $PAGEEDITOR_EMAIL
 wiki : $PAGEEDITOR_WIKI
 
@@ -2644,10 +2646,10 @@ Voici les réglages actuels de la page '''$1''' :",
 'protect-locked-access' => "Vous n'avez pas les droits nécessaires pour modifier les niveaux de protection de pages.
 Voici les réglages actuels de la page '''$1''' :",
 'protect-cascadeon' => "Cette page est protégée car incluse dans {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l'option « protection en cascade » activée. Vous pouvez changer le niveau de protection de cette page sans que cela n'affecte la protection en cascade.",
-'protect-default' => 'Autoriser tous les utilisateurs',
-'protect-fallback' => 'Autoriser uniquement les utilisateurs avec le droit « $1 »',
-'protect-level-autoconfirmed' => 'Autoriser uniquement les utilisateurs auto-confirmés',
-'protect-level-sysop' => 'Autoriser uniquement les administrateurs',
+'protect-default' => 'Autoriser tous les utilisateurs et toutes les utilisatrices',
+'protect-fallback' => 'Autoriser uniquement les utilisateurs et utilisatrices avec le droit « $1 »',
+'protect-level-autoconfirmed' => 'Autoriser uniquement les utilisateurs et utilisatrices auto-confirmé(e)s',
+'protect-level-sysop' => 'Autoriser uniquement les administratrices et administrateurs',
 'protect-summary-cascade' => 'protection en cascade',
 'protect-expiring' => 'expire le $1 (UTC)',
 'protect-expiring-local' => 'expire le $1',
@@ -2735,7 +2737,7 @@ Il a peut-être déjà été restauré.",
 'undelete-error-long' => 'Des erreurs ont été rencontrées lors de la restauration du fichier :
 
 $1',
-'undelete-show-file-confirm' => 'Êtes-vous sûr de vouloir visionner une version supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?',
+'undelete-show-file-confirm' => 'Êtes-vous {{GENDER:|sûr|sure|sûr/sure}} de vouloir visionner une version supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?',
 'undelete-show-file-submit' => 'Oui',
 
 # Namespace form on various pages
@@ -2747,8 +2749,8 @@ $1',
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => 'Contributions de l’{{GENDER:$1|utilisateur|utilisatrice}}',
-'contributions-title' => 'Liste des contributions de l’utilisat{{GENDER:$1|eur|rice|eur}} $1',
+'contributions' => 'Contributions de l’{{GENDER:$1|utilisateur|utilisatrice|utilisateur/utilisatrice}}',
+'contributions-title' => 'Liste des contributions de l’utilisa{{GENDER:$1|teur|trice|teur/trice}} $1',
 'mycontris' => 'Contributions',
 'contribsub2' => 'Pour {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "Aucune modification correspondant à ces critères n'a été trouvée.",
@@ -2758,18 +2760,18 @@ $1',
 
 'sp-contributions-newbies' => 'Ne montrer que les contributions des nouveaux utilisateurs',
 'sp-contributions-newbies-sub' => 'Parmi les nouveaux comptes',
-'sp-contributions-newbies-title' => "Contributions d'utilisateurs parmi les nouveaux comptes",
+'sp-contributions-newbies-title' => 'Contributions d’utilisateurs et d’utilisatrices parmi les nouveaux comptes',
 'sp-contributions-blocklog' => 'journal des blocages',
 'sp-contributions-deleted' => 'contributions supprimées',
 'sp-contributions-uploads' => 'imports',
 'sp-contributions-logs' => 'journaux',
 'sp-contributions-talk' => 'discuter',
 'sp-contributions-userrights' => 'gérer les droits',
-'sp-contributions-blocked-notice' => "Cet utilisateur est actuellement bloqué. La dernière entrée du journal des blocages est indiquée ci-dessous à titre d'information :",
+'sp-contributions-blocked-notice' => "{{GENDER:$1|Cet utilisateur|Cette utilisatrice|Cet(te) utilisatrice/utilisateur}} est actuellement bloqué{{GENDER:$1||e|(e)}}. La dernière entrée du journal des blocages est indiquée ci-dessous à titre d'information :",
 'sp-contributions-blocked-notice-anon' => "Cette adresse IP est actuellement bloquée.
 La dernière entrée du journal des blocages est indiquée ci-dessous à titre d'information :",
 'sp-contributions-search' => 'Rechercher les contributions',
-'sp-contributions-username' => "Adresse IP ou nom d'utilisateur :",
+'sp-contributions-username' => "Adresse IP ou nom d'utilisateur/utilisatrice :",
 'sp-contributions-toponly' => 'Ne montrer que les contributions qui sont les dernières des articles',
 'sp-contributions-submit' => 'Rechercher',
 
@@ -2794,15 +2796,15 @@ La dernière entrée du journal des blocages est indiquée ci-dessous à titre d
 
 # Block/unblock
 'autoblockid' => 'Blocage automatique #$1',
-'block' => 'Bloquer l’utilisateur',
-'unblock' => "Débloquer l'utilisateur",
-'blockip' => 'Bloquer l’utilisateur',
-'blockip-title' => 'Bloquer l’utilisateur',
-'blockip-legend' => 'Bloquer l’utilisateur',
+'block' => 'Bloquer l’utilisateur/utilisatrice',
+'unblock' => "Débloquer l'utilisateur/utilisatrice",
+'blockip' => 'Bloquer l’utilisateur/utilisatrice',
+'blockip-title' => 'Bloquer l’utilisatrice/utilisateur',
+'blockip-legend' => 'Bloquer l’utilisatrice/utilisateur',
 'blockiptext' => 'Utilisez le formulaire ci-dessous pour bloquer les tentatives de modification faites à partir d’une adresse IP spécifique ou d’un nom d’utilisateur.
 Une telle mesure ne devrait être prise que pour prévenir le vandalisme et en accord avec les [[{{MediaWiki:Policy-url}}|règles internes]].
 Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont été vandalisées).',
-'ipadressorusername' => "Adresse IP ou nom d'utilisateur :",
+'ipadressorusername' => "Adresse IP ou nom d'utilisateur/utilisatrice :",
 'ipbexpiry' => 'Durée avant expiration :',
 'ipbreason' => 'Motif :',
 'ipbreasonotherlist' => 'Autre motif',
@@ -2814,40 +2816,40 @@ Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont ét
 ** Tentative d'intimidation ou harcèlement
 ** Abus d'utilisation de comptes multiples
 ** Nom d'utilisateur inacceptable, injurieux ou diffamant",
-'ipb-hardblock' => 'Empêcher les utilisateurs connectés de modifier en utilisant cette adresse IP',
+'ipb-hardblock' => 'Empêcher les utilisateurs et utilisatrices connecté(e)s de modifier en utilisant cette adresse IP',
 'ipbcreateaccount' => 'Empêcher la création de compte',
-'ipbemailban' => "Empêcher l'utilisateur d'envoyer des courriels",
-'ipbenableautoblock' => "Bloquer automatiquement la dernière adresse IP utilisée par l'utilisateur et toutes ses IPs ultérieures qu'il pourrait essayer",
-'ipbsubmit' => 'Bloquer cet utilisateur',
+'ipbemailban' => "Empêcher l'utilisatrice/utilisateur d'envoyer des courriels",
+'ipbenableautoblock' => "Bloquer automatiquement la dernière adresse IP utilisée par l'utilisateur ou l’utilisatrice et toutes ses IPs ultérieures qu'il pourrait essayer",
+'ipbsubmit' => 'Bloquer cet(te) utilisatrice/utilisateur',
 'ipbother' => 'Autre durée :',
 'ipboptions' => '2 heures:2 hours,1 jour:1 day,3 jours:3 days,1 semaine:1 week,2 semaines:2 weeks,1 mois:1 month,3 mois:3 months,6 mois:6 months,1 an:1 year,indéfiniment:infinite',
 'ipbotheroption' => 'autre',
 'ipbotherreason' => 'Motif différent ou supplémentaire :',
-'ipbhidename' => "Masquer le nom d'utilisateur des modifications et des listes",
-'ipbwatchuser' => 'Suivre les pages utilisateur et de discussion de cet utilisateur',
-'ipb-disableusertalk' => "Empêcher l'utilisateur de modifier sa page de discussion pendant le blocage",
-'ipb-change-block' => 'Bloquer à nouveau cet utilisateur avec ces paramètres',
+'ipbhidename' => "Masquer le nom d'utilisatrice/utilisateur des modifications et des listes",
+'ipbwatchuser' => 'Suivre les pages utilisatrice/utilisateur et de discussion de cet utilisateur',
+'ipb-disableusertalk' => 'Empêcher l’utilisatrice ou l’utilisateur de modifier sa page de discussion pendant le blocage',
+'ipb-change-block' => 'Bloquer à nouveau cet utilisateur ou cette utilisatrice avec ces paramètres',
 'ipb-confirm' => 'Confirmer le blocage',
 'badipaddress' => 'Adresse IP incorrecte',
 'blockipsuccesssub' => 'Blocage réussi',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e|}}.<br />
 Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.',
-'ipb-blockingself' => 'Vous êtes sur le point de bloquer votre propre compte ! Êtes-vous certain de vouloir faire cela ?',
-'ipb-confirmhideuser' => "Vous êtes sur le point de bloquer un utilisateur avec « cacher l'utilisateur » activé. Cela supprime le nom de l'utilisateur dans toutes les listes et les entrées du journal. Êtes-vous sûr de vouloir le faire ?",
+'ipb-blockingself' => 'Vous êtes sur le point de bloquer votre propre compte ! Êtes-vous certain{{GENDER:||e|(e)}} de vouloir faire cela ?',
+'ipb-confirmhideuser' => "Vous êtes sur le point de bloquer une utilisatrice ou un utilisateur avec « cacher l'utilisateur/utilisatrice » activé. Cela supprime le nom de l'utilisateur/utilisatrice dans toutes les listes et les entrées du journal. Êtes-vous sûr de vouloir le faire ?",
 'ipb-edit-dropdown' => 'Modifier les motifs de blocage par défaut',
 'ipb-unblock-addr' => 'Débloquer $1',
 'ipb-unblock' => 'Débloquer un compte utilisateur ou une adresse IP',
 'ipb-blocklist' => 'Voir les blocages existants',
 'ipb-blocklist-contribs' => 'Contributions pour $1',
-'unblockip' => 'Débloquer un utilisateur ou une adresse IP',
+'unblockip' => 'Débloquer un utilisateur/une utilisatrice ou une adresse IP',
 'unblockiptext' => "Utilisez le formulaire ci-dessous pour rétablir l'accès aux modifications depuis une adresse IP ou un nom d'utilisateur.",
 'ipusubmit' => 'Supprimer ce blocage',
-'unblocked' => '[[User:$1|$1]] a été débloqué',
-'unblocked-range' => '$1 a été débloqué',
+'unblocked' => '[[User:$1|$1]] a été débloqué{{GENDER:$1||e|(e)}}',
+'unblocked-range' => '$1 a été débloqué{{GENDER:$1||e|(e)}}',
 'unblocked-id' => 'Le blocage $1 a été enlevé',
-'blocklist' => 'Utilisateurs bloqués',
-'ipblocklist' => 'Utilisateurs bloqués',
-'ipblocklist-legend' => 'Chercher un utilisateur bloqué',
+'blocklist' => 'Utilisateurs et utilisatrices bloqué(e)s',
+'ipblocklist' => 'Utilisateurs et utilisatrices bloqué(e)s',
+'ipblocklist-legend' => 'Chercher une utilisatrice ou un utilisateur bloqué(e)',
 'blocklist-userblocks' => 'Masquer les blocages de comptes',
 'blocklist-tempblocks' => 'Masquer les blocages temporaires',
 'blocklist-addressblocks' => 'Masquer les blocages d’adresses IP uniques',
@@ -2855,7 +2857,7 @@ Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.'
 'blocklist-timestamp' => 'Date et heure',
 'blocklist-target' => 'Cible',
 'blocklist-expiry' => 'Date d’expiration',
-'blocklist-by' => 'Administrateur ayant effectué le blocage',
+'blocklist-by' => 'Administratrice ou administrateur ayant effectué le blocage',
 'blocklist-params' => 'Paramètres de blocage',
 'blocklist-reason' => 'Motif',
 'ipblocklist-submit' => 'Rechercher',
@@ -2863,13 +2865,13 @@ Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.'
 'ipblocklist-otherblocks' => '{{PLURAL:$1|Autre blocage|Autres blocages}}',
 'infiniteblock' => 'permanent',
 'expiringblock' => 'expire le $1 à $2',
-'anononlyblock' => 'utilisateur non enregistré uniquement',
+'anononlyblock' => 'utilisateurs et utilisatrices non enregistré(e)s uniquement',
 'noautoblockblock' => 'blocage automatique désactivé',
 'createaccountblock' => 'création de compte bloquée',
 'emailblock' => 'courriel bloqué',
 'blocklist-nousertalk' => 'ne peut modifier sa propre page de discussion',
 'ipblocklist-empty' => 'La liste des adresses IP bloquées est actuellement vide.',
-'ipblocklist-no-results' => "L'adresse IP ou l'utilisateur demandé n'est pas bloqué.",
+'ipblocklist-no-results' => "L'adresse IP ou l'utilisatrice/utilisateur demandé(e) n'est pas bloqué.",
 'blocklink' => 'bloquer',
 'unblocklink' => 'débloquer',
 'change-blocklink' => 'modifier le blocage',
@@ -2886,13 +2888,13 @@ Le motif fourni pour le blocage de $1 est : « $2 ».',
 Les adresses IP automatiquement bloquées ne sont pas listées.
 Consultez la [[Special:BlockList|liste des blocages]] pour voir les bannissements et blocages effectivement en cours.',
 'unblocklogentry' => 'a débloqué $1',
-'block-log-flags-anononly' => 'utilisateurs anonymes seulement',
+'block-log-flags-anononly' => 'utilisateurs et utilisatrices anonymes seulement',
 'block-log-flags-nocreate' => 'création de compte interdite',
 'block-log-flags-noautoblock' => 'autoblocage des IP désactivé',
 'block-log-flags-noemail' => 'envoi de courriel interdit',
 'block-log-flags-nousertalk' => 'ne peut modifier sa propre page de discussion',
 'block-log-flags-angry-autoblock' => 'autoblocage amélioré activé',
-'block-log-flags-hiddenname' => 'nom d’utilisateur masqué',
+'block-log-flags-hiddenname' => 'nom d’utilisateur/utilisatrice masqué',
 'range_block_disabled' => 'Le droit administrateur de créer des blocages de plages IP est désactivé.',
 'ipb_expiry_invalid' => "Durée d'expiration incorrecte.",
 'ipb_expiry_temp' => "Les blocages de noms d'utilisateurs cachés doivent être permanents.",
@@ -2914,17 +2916,17 @@ Veuillez contacter votre fournisseur d'accès Internet ou votre support techniqu
 '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.',
 'xffblockreason' => "Une adresse IP dans l'en-tête X-Forwarded-For, soit la vôtre ou celle d'un serveur proxy que vous utilisez, a été bloquée. La raison du blocage initial est : $1",
-'cant-block-while-blocked' => 'Vous ne pouvez pas bloquer d’autres utilisateurs tant que vous êtes bloqué{{GENDER:||e|(e)}}.',
-'cant-see-hidden-user' => "L’utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. N’ayant pas le droit ''hideuser'', vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
-'ipbblocked' => "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué",
-'ipbnounblockself' => "Vous n'êtes pas autorisé à vous débloquer vous-même",
+'cant-block-while-blocked' => 'Vous ne pouvez pas bloquer d’autres utilisateurs ou utilisatrices tant que vous êtes bloqué{{GENDER:||e|(e)}}.',
+'cant-see-hidden-user' => "L’utilisatrice ou utilisateur que vous tentez de bloquer a déjà été bloqué(e) et masqué(e). N’ayant pas le droit ''hideuser'', vous ne pouvez pas voir ou modifier le blocage de cet(te) utilisatrice ou utilisateur.",
+'ipbblocked' => "Vous ne pouvez pas bloquer ou débloquer d'autres utilisatrices ou utilisateurs, parce que vous êtes vous-même bloqué{{GENDER:||e|(e)}}",
+'ipbnounblockself' => "Vous n'êtes pas autorisé{{GENDER:||e|(e)}} à vous débloquer vous-même",
 
 # Developer tools
 'lockdb' => 'Verrouiller la base de données',
 'unlockdb' => 'Déverrouiller la base de données',
-'lockdbtext' => "Le verrouillage de la base de données empêchera tous les utilisateurs de modifier des pages, d'enregistrer leurs préférences, de modifier leur liste de suivi et d'effectuer toutes les autres opérations nécessitant des changements dans la base de données.
+'lockdbtext' => "Le verrouillage de la base de données empêchera tou(te)s les utilisatrices et utilisateurs de modifier des pages, d'enregistrer leurs préférences, de modifier leur liste de suivi et d'effectuer toutes les autres opérations nécessitant des changements dans la base de données.
 Veuillez confirmer que c'est bien là ce que vous voulez faire et que vous déverrouillerez la base dès que votre opération de maintenance sera terminée.",
-'unlockdbtext' => "Le déverrouillage de la base de données permettra à nouveau à tous les utilisateurs de modifier des pages, de changer leurs préférences, de modifier leur liste de suivi et d'effectuer les autres opérations nécessitant des changements dans la base de données.
+'unlockdbtext' => "Le déverrouillage de la base de données permettra à nouveau à tou(te)s les utilisateurs et utilisatrices de modifier des pages, de changer leurs préférences, de modifier leur liste de suivi et d'effectuer les autres opérations nécessitant des changements dans la base de données.
 Veuillez confirmer que c'est bien là ce que vous voulez faire.",
 'lockconfirm' => 'Oui, je confirme que je souhaite verrouiller la base de données.',
 'unlockconfirm' => 'Oui, je confirme que je souhaite déverrouiller la base de données.',
@@ -3152,8 +3154,8 @@ Un dossier temporaire est manquant.",
 'javascripttest-qunit-heading' => 'Suite de test QUnit de JavaScript sur MediaWiki',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Votre page utilisateur',
-'tooltip-pt-anonuserpage' => "La page utilisateur de l'IP avec laquelle vous contribuez",
+'tooltip-pt-userpage' => 'Votre page {{GENDER:|utilisateur|utilisatrice|utilisateur/utilisatrice}}',
+'tooltip-pt-anonuserpage' => "La page utilisateur/utilisatrice de l'IP avec laquelle vous contribuez",
 'tooltip-pt-mytalk' => 'Votre page de discussion',
 'tooltip-pt-anontalk' => 'La page de discussion pour les contributions depuis cette adresse IP',
 'tooltip-pt-preferences' => 'Vos préférences',
@@ -3181,7 +3183,7 @@ Vous pouvez toutefois en visualiser la source.',
 'tooltip-search-fulltext' => 'Rechercher les pages comportant ce texte.',
 'tooltip-p-logo' => 'Page principale',
 'tooltip-n-mainpage' => "Visiter la page d'accueil du site",
-'tooltip-n-mainpage-description' => "Aller à l'accueil",
+'tooltip-n-mainpage-description' => 'Aller à l’accueil',
 'tooltip-n-portal' => 'À propos du projet',
 'tooltip-n-currentevents' => "Trouver les informations de fond sur l'actualité du moment",
 'tooltip-n-recentchanges' => 'Liste des modifications récentes sur le wiki',
@@ -3191,14 +3193,14 @@ Vous pouvez toutefois en visualiser la source.',
 'tooltip-t-recentchangeslinked' => 'Liste des modifications récentes des pages liées à celle-ci',
 'tooltip-feed-rss' => 'Flux RSS pour cette page',
 'tooltip-feed-atom' => 'Flux Atom pour cette page',
-'tooltip-t-contributions' => 'Voir la liste des contributions de cet utilisateur',
-'tooltip-t-emailuser' => 'Envoyer un courriel à cet utilisateur',
+'tooltip-t-contributions' => 'Voir la liste des contributions de cet(te) utilisateur/utilisatrice',
+'tooltip-t-emailuser' => 'Envoyer un courriel à cet(te) utilisatrice/utilisateur',
 'tooltip-t-upload' => 'Envoyer une image ou fichier média sur le serveur',
 'tooltip-t-specialpages' => 'Liste de toutes les pages spéciales',
 'tooltip-t-print' => 'Version imprimable de cette page',
 'tooltip-t-permalink' => 'Lien permanent vers cette version de la page',
 'tooltip-ca-nstab-main' => 'Voir la page de contenu',
-'tooltip-ca-nstab-user' => 'Voir la page utilisateur',
+'tooltip-ca-nstab-user' => 'Voir la page utilisateur/utilisatrice',
 'tooltip-ca-nstab-media' => 'Voir la page du média',
 'tooltip-ca-nstab-special' => 'Ceci est une page spéciale, vous ne pouvez pas la modifier.',
 'tooltip-ca-nstab-project' => 'Voir la page du projet',
@@ -3221,7 +3223,7 @@ Vous pouvez toutefois en visualiser la source.',
 'tooltip-undo' => '« Annuler » rétablit la modification précédente et ouvre la fenêtre de modification en mode prévisualisation. Il est possible d’ajouter une raison dans le résumé.',
 'tooltip-preferences-save' => 'Sauvegarder les préférences',
 'tooltip-summary' => 'Entrez un bref résumé',
-'tooltip-iwiki' => '$1 — $2',
+'interlanguage-link-title' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/* Le CSS placé ici sera appliqué à tous les habillages. */',
@@ -3252,13 +3254,13 @@ Vous pouvez toutefois en visualiser la source.',
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Utilisateur non enregistré|Utilisateurs non enregistrés}} sur {{SITENAME}}',
-'siteuser' => "{{GENDER:$2|l'utilisateur|l'utilisatrice|l'utilisateur}} $1 de {{SITENAME}}",
-'anonuser' => "l'utilisateur anonyme $1 de {{SITENAME}}",
+'siteuser' => "{{GENDER:$2|l'utilisateur|l'utilisatrice|l'utilisateur ou utilisatrice}} $1 de {{SITENAME}}",
+'anonuser' => "l'utilisateur ou utilisatrice anonyme $1 de {{SITENAME}}",
 'lastmodifiedatby' => 'Cette page a été modifiée pour la dernière fois le $1 à $2 par $3.',
 'othercontribs' => 'Basé sur le travail de $1.',
 'others' => 'autres',
-'siteusers' => "{{PLURAL:$2|l'utilisateur|les utilisateurs}} $1 de {{SITENAME}}",
-'anonusers' => "{{PLURAL:$2|l'utilisateur anonyme|les utilisateurs anonymes}} $1 de {{SITENAME}}",
+'siteusers' => '{{PLURAL:$2|{{GENDER:$1|l’utilisateur|l’utilisatrice|l’utilisatrice ou utilisateur}}|les utilisatrices et/ou utilisateurs}} $1 de {{SITENAME}}',
+'anonusers' => "{{PLURAL:$2|l'utilisateur ou utilisatrice anonyme|les utilisateurs et/ou utilisatrices anonymes}} $1 de {{SITENAME}}",
 'creditspage' => 'Crédits de la page',
 'nocredits' => "Il n'y a pas d'informations d'attribution disponibles pour cette page.",
 
@@ -3285,23 +3287,24 @@ Ne '''RIEN''' inscrire ici !",
 'pageinfo-length' => 'Taille de la page (en octets)',
 'pageinfo-article-id' => 'Numéro de la page',
 'pageinfo-language' => 'Langue du contenu de la page',
+'pageinfo-content-model' => 'Modèle de contenu de la page',
 'pageinfo-robot-policy' => 'Indexation par robots',
 'pageinfo-robot-index' => 'Autorisée',
 'pageinfo-robot-noindex' => 'Interdite',
 'pageinfo-views' => 'Nombre de vues',
-'pageinfo-watchers' => 'Nombre de contributeurs ayant la page dans leur liste de suivi',
-'pageinfo-few-watchers' => 'Moins de $1 {{PLURAL:$1|observateur|observateurs}}',
+'pageinfo-watchers' => 'Nombre de contributrices et contributeurs ayant la page dans leur liste de suivi',
+'pageinfo-few-watchers' => 'Moins de $1 {{PLURAL:$1|observateur ou observatrice|observateurs et observatrices}}',
 'pageinfo-redirects-name' => 'Nombre de redirections vers cette page',
 'pageinfo-subpages-name' => 'Sous-pages de cette page',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirection|redirections}}; $3 {{PLURAL:$3|non-redirection|non-redirections}})',
 'pageinfo-firstuser' => 'Créateur de la page',
 'pageinfo-firsttime' => 'Date de création de la page',
-'pageinfo-lastuser' => 'Dernier contributeur',
+'pageinfo-lastuser' => 'Dernier contributeur ou dernière contributrice',
 'pageinfo-lasttime' => 'Date de la dernière modification',
 'pageinfo-edits' => 'Nombre total de modifications',
-'pageinfo-authors' => "Nombre total d'auteurs distincts",
+'pageinfo-authors' => "Nombre total d'auteur(e)s distinct(e)s",
 'pageinfo-recent-edits' => 'Nombre de modifications récentes (dans les derniers $1)',
-'pageinfo-recent-authors' => "Nombre d'auteurs distincts récents",
+'pageinfo-recent-authors' => "Nombre d'auteur(e)s distinct(e)s récents",
 'pageinfo-magic-words' => '{{PLURAL:$1|Mot magique|Mots magiques}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Catégorie cachée|Catégories cachées}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Modèle inclu|Modèles inclus}} ($1)',
@@ -3483,7 +3486,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-compressedbitsperpixel' => "Mode de compression de l'image",
 'exif-pixelydimension' => "Largeur de l'image",
 'exif-pixelxdimension' => "Hauteur de l'image",
-'exif-usercomment' => "Commentaires de l'utilisateur",
+'exif-usercomment' => "Commentaires de l'utilisateur ou de l’utilisatrice",
 'exif-relatedsoundfile' => 'Fichier audio associé',
 'exif-datetimeoriginal' => 'Date de la prise originelle',
 'exif-datetimedigitized' => 'Date de la numérisation',
@@ -3931,7 +3934,7 @@ $5',
 'scarytranscludetoolong' => "[L'URL est trop longue]",
 
 # Delete conflict
-'deletedwhileediting' => "'''Attention''' : cette page a été supprimée après que vous avez commencé à la modifier !",
+'deletedwhileediting' => "'''Attention''' : cette page a été supprimée après que vous ayez commencé à la modifier !",
 'confirmrecreate' => "L’utilisateur [[User:$1|$1]] ([[User talk:$1|Discussion]]) a supprimé cette page, alors que vous aviez commencé à la modifier, pour le motif suivant :
 : ''$2''
 Veuillez confirmer que vous désirez réellement recréer cette page.",
@@ -3953,6 +3956,7 @@ Veuillez confirmer que vous désirez réellement recréer cette page.",
 'semicolon-separator' => '&nbsp;;&#32;',
 'colon-separator' => '&nbsp;:&#32;',
 'percent' => '$1&#160;%',
+'quotation-marks' => '« $1 »',
 
 # Multipage image navigation
 'imgmultipageprev' => '← page précédente',
index 53d89d2..1aba4bb 100644 (file)
@@ -479,7 +479,7 @@ Ferjid det ei, an aachte üüb din [[Special:Preferences|{{SITENAME}} iinstelang
 'gotaccount' => "Dü hääst ål en brükerkonto? '''$1'''.",
 'gotaccountlink' => 'Uunmelde',
 'userlogin-resetlink' => 'Heest dü din login dooten ferjiden?',
-'userlogin-resetpassword-link' => 'Paaswurd turagsaat',
+'userlogin-resetpassword-link' => 'Paaswurd ferjiden?',
 'helplogin-url' => 'Help:Uunmelde',
 'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Halep bi't uunmeldin]]",
 'userlogin-loggedin' => 'Du beest al üs {{GENDER:$1|$1}} uunmeldet.
@@ -505,8 +505,8 @@ Brük det formulaar diar oner, am di mä en öödern nööm uuntumeldin.',
 'createacct-benefit-body2' => '{{PLURAL:$1|sidj|sidjen}}',
 'createacct-benefit-body3' => 'aktiif {{PLURAL:$1|skriiwer|skriiwern}}',
 'badretype' => 'Jo tau paaswurden san ei likedenang.',
-'userexists' => 'Dideer brükernoome as ål ferjääwen.
-Wees sü gödj en kiis en ouderen.',
+'userexists' => 'Didiar brükernööm as al wech.
+Wees so gud an schük di en öödern.',
 'loginerror' => "Bi't uunmeldin as wat skiaf gingen",
 'createacct-error' => "Bi't iinrachten faan det brükerkonto as wat skiaf gingen",
 'createaccounterror' => 'Brükerkonto küd ei iinracht wurd: $1',
@@ -532,7 +532,7 @@ Wees so gud an ferschük det noch ans.',
 Ferschük det man noch ans.',
 'passwordtooshort' => 'Paaswurden skel tumanst {{PLURAL:$1|1 tiaken|$1 tiakens}} lung wees.',
 'password-name-match' => 'Dü könst dan brükernööm ei üs paaswurd nem.',
-'password-login-forbidden' => 'Jüdeer brükernoome än paasuurd as ferbin.',
+'password-login-forbidden' => 'Didiar brükernööm mä detdiar paaswurd as ei tuläät.',
 'mailmypassword' => 'Schüür mi en nei paaswurd.',
 'passwordremindertitle' => 'Nei tidjwiis paaswurd för {{SITENAME}}',
 'passwordremindertext' => 'En brüker (woorskiinelk dü, faan IP adres $1) hää am en nei paaswurd för {{SITENAME}} ($4) fraaget.
@@ -578,7 +578,7 @@ Wees so gud an teew $1, iar dü det noch ans ferschükst.',
 'createacct-another-realname-tip' => 'Stäänt tu wool. Wan dü dan rochten nööm uundääst, koon hi mä din feranrangen ferbünjen wurd.',
 
 # Email sending
-'php-mail-error-unknown' => 'Ünbekäänd feeler mä det funktsjuun mail() faan PHP.',
+'php-mail-error-unknown' => 'Ünbekäänd feeler mä det funktjuun mail() faan PHP.',
 'user-mail-no-addy' => 'Küd nian e-mail schüür saner e-mail-adres.',
 'user-mail-no-body' => 'Dü wulst en e-mail saner tekst wechsjüür.',
 
@@ -609,10 +609,10 @@ of am en nei paaswurd uunfraaget.',
 'passwordreset-legend' => 'Paaswurd turagsaat',
 'passwordreset-disabled' => 'Dü könst din paaswurd uun detdiar wiki ei turagsaat.',
 'passwordreset-emaildisabled' => 'E-mail as üüb detheer Wiki ufknipset wurden.',
-'passwordreset-username' => 'Brükernoome:',
+'passwordreset-username' => 'Brükernööm:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Wel dü det e-mail nooracht uunluke?',
-'passwordreset-capture-help' => 'Wan dü detheer kasje uunkrüsagst, woort det e-mail nooracht mä det nei paaswurd uunwiset an tu di brüker sjüürd.',
+'passwordreset-capture-help' => 'Wan dü detheer kasche uunkrüsagst, woort det e-mail nooracht mä det nei paaswurd uunwiset an tu di brüker schüürd.',
 'passwordreset-email' => 'E-mail adres:',
 'passwordreset-emailtitle' => 'Brükerkonto aw {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Hoker mä det IP-Adres $1, woorskiinelk dü salew, wul hal brükerinformatsjuunen för {{SITENAME}} tusjüürd fu ($4). {{PLURAL:$3|Detdiar brükerkonto as|Jodiar brükerkontos san}} mä detdiar E-Mail-adres ferbünjen:
@@ -626,8 +626,8 @@ Dü skulst di uunmelde an en nei paaswurd iinracht. Wan hoker ööders detheer u
 $2
 
 {{PLURAL:$3|Detheer tidjwiis paaswurd lääpt|Joheer tidjwiis paaswurden luup}} efter {{PLURAL:$5|ään dai|$5 daar}} uf. Dü skulst di uunmelde an en nei paaswurd iinracht. Wan hoker ööders detheer uunfraag steld hää of dü din ual paaswurd käänst, säärst dü niks widjer onernem. Melde di ianfach mä din ual paaswurd uun.',
-'passwordreset-emailelement' => 'Brükernoome: $1
-Tidwis paasuurd: $2',
+'passwordreset-emailelement' => 'Brükernööm: $1
+Tidjwiis paaswurd: $2',
 'passwordreset-emailsent' => 'Diar as en E-Mail tu di onerwais.',
 'passwordreset-emailsent-capture' => 'Detdiar E-Mail, wat oner uunwiset woort, as tu di onerwais.',
 'passwordreset-emailerror-capture' => 'Detdiar E-Mail, wat oner uunwiset woort, wiar tu di onerwais, oober küd ei tu di {{GENDER:$2|brüker}} ufsjüürd wurd: $1',
@@ -693,7 +693,7 @@ Wan dü det sidj seekerst, woort det saner auerskraft auernimen.",
 'summary-preview' => 'Föörskau faan det tuupfaadang:',
 'subject-preview' => 'Föörskau faan det auerskraft:',
 'blockedtitle' => 'Brüker as speret',
-'blockedtext' => "'''Dan brükernööm of IP adres as speret wurden.'''
+'blockedtext' => "'''Dan brükernööm of din IP-adres as speret wurden.'''
 
 Det as maaget wurden faan $1.
 Di grünj as ''$2''.
@@ -704,11 +704,11 @@ Di grünj as ''$2''.
 
 Dü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.
 
-Dü könst ei det E-Mail-funktsjuun 'E-mail tu dideere brüker' brük, so loong dü nian E-Mail-adres uun din [[Special:Preferences|brükerkonto iinstelangen]] uunden heest of wan det E-Mail-funktsjuun för di speret wurden as.
+Dü könst ei det e-mail-funktjuun 'E-mail tu didiar brüker' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.
 
-Uugenblakelk as din IP addres $3, an det sper ID as #$5.
-För arke uunfraag wurd aal jo informatsjuunen boowen brükt.",
-'autoblockedtext' => "'''Din IP adres as speret wurden, auer det faan en öödern spereten brüker brükt wurden as.'''
+Uugenblakelk as din IP-addres $3, an det sper-ID as #$5.
+För arke uunfraag wurd aal jo informatjuunen boowen brükt.",
+'autoblockedtext' => "'''Din IP-adres as speret wurden, auer det faan en öödern spereten brüker brükt wurden as.'''
 
 Di grünj as:
 : ''$2''.
@@ -719,10 +719,10 @@ Di grünj as:
 
 Dü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.
 
-Dü könst ei det E-Mail-funktsjuun 'E-mail tu dideere brüker' brük, so loong dü nian E-Mail-adres uun din [[Special:Preferences|brükerkonto iinstelangen]] uunden heest of wan det E-Mail-funktsjuun för di speret wurden as.
+Dü könst ei det e-mail-funktjuun 'E-mail tu didiar brüker' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.
 
-Uugenblakelk as din IP addres $3, an det sper ID as #$5.
-För arke uunfraag wurd aal jo informatsjuunen boowen brükt.",
+Uugenblakelk as din IP-addres $3, an det sper-ID as #$5.
+För arke uunfraag wurd aal jo informatjuunen boowen brükt.",
 'blockednoreason' => 'nään grünj uunden',
 'whitelistedittext' => 'Dü skel di $1, am sidjen tu bewerkin.',
 'confirmedittext' => 'Dü skel iarst din e-mail-adres gudkään, iar dü began könst tu werkin. Maage det üüb det sidj mä din persöönelk [[Special:Preferences|iinstelangen]].',
@@ -976,7 +976,7 @@ Dü könst di ferskeel uunluke. Wan dü muar wed wel, luke iin uun't [{{fullurl:
 'revdelete-confirm' => 'Ferseekre noch ans, dat dü det würelk du wel, dat dü witjst, wat dü dääst, an dat det mä a [[{{MediaWiki:Policy-url}}|bestemangen]] auerian stemet.',
 'revdelete-suppress-text' => "Det skul '''bluas''' onertrakt wurd bi:
 * Persöönelk informatsjuunen, diar näämen wat uungung
-*: ''Adresen, Tilefoonnumern, Ferseekerangsnumern an sowat''",
+*: ''Adresen, tilefoonnumern, ferseekerangsnumern an sowat''",
 'revdelete-legend' => 'Iinstelangen, hüföl tu sen wees skal',
 'revdelete-hide-text' => 'Tekst faan det werjuun',
 'revdelete-hide-image' => 'Fersteeg, wat uun det datei stäänt',
@@ -1034,8 +1034,8 @@ Aachte diarüüb, dat di ferluup faan det sidj uk rocht as.',
 'mergehistory-into' => 'Ööder sidj:',
 'mergehistory-list' => 'Werjuunen, diar tuupfeerd wurd kön.',
 'mergehistory-merge' => 'Jodiar werjuunen faan „[[:$1]]“ kön efter „[[:$2]]“ auerdraanj wurd.
-Kääntiakne det wersjuun, wat üs leetst mä auerdraanj wurd skal.
-A nawigatjuun links saat ales weder turag üüb di ual stant.',
+Kääntiakne det werjuun, wat üs leetst mä auerdraanj wurd skal.
+A nawigatjuun-links saat ales weder turag üüb di ual stant.',
 'mergehistory-go' => 'Wise werjuunen, diar tuupfeerd wurd kön.',
 'mergehistory-submit' => 'Werjuunen tuupfeer',
 'mergehistory-empty' => 'Nian werjuunen kön tuupfeerd wurd.',
@@ -1475,7 +1475,7 @@ Arken koon det lees.',
 
 # Upload
 'upload' => 'Datei huuchschüür',
-'uploadbtn' => 'Datei huuchsjüür',
+'uploadbtn' => 'Datei huuchschüür',
 'reuploaddesc' => "Ufbreeg an turag tu't sidj för't huuchschüüren",
 'upload-tryagain' => 'Feranert dateibeskriiwang ufsjüür',
 'uploadnologin' => 'Ei uunmeldet',
@@ -1515,13 +1515,13 @@ Am en '''bil''' uun en artiikel tu brüken, brük en link faan det furem:
 'badfilename' => 'Det datei hää en neien nööm füngen an het nü „$1“.',
 'filetype-mime-mismatch' => 'Det dateiaanj „.$1“ paaset ei tu di MIME-Typ ($2).',
 'filetype-badmime' => 'Datein faan di MIME-Typ „$1“ mut ei huuchschüürd wurd.',
-'filetype-bad-ie-mime' => 'Detdiar datei koon ei huuchsjüürd wurd, auer di Internet Explorer det för en „$1“ häält, an di slach as ei tuläät, auer hi gefeerelk wees küd.',
+'filetype-bad-ie-mime' => 'Detdiar datei koon ei huuchschüürd wurd, auer di Internet Explorer det för en „$1“ häält, an di slach as ei tuläät, auer hi gefeerelk wees küd.',
 'filetype-unwanted-type' => "'''„.$1“''' as üs dateiformaat ei tuläät. Tuläät {{PLURAL:$3|as detdiar formaat|san jodiar formaaten}}: $2.",
 'filetype-banned-type' => "'''„.$1“''' {{PLURAL:$4|as nään tuläät slach faan datein|san nian tuläät slacher faan datein}}.
 {{PLURAL:$3|En tuläät slach as|Tuläät slacher san}} $2.",
-'filetype-missing' => 'Det datei, wat dü huuchsjüür wel, hää nian aanj (t.b. „.jpg“).',
-'empty-file' => 'Det datei, wat dü huuchsjüürd heest, as leesag.',
-'file-too-large' => 'Det datei, wat dü huuchsjüürd heest, as tu grat.',
+'filetype-missing' => 'Det datei, wat dü huuchschüür wel, hää nian aanj (t.b. „.jpg“).',
+'empty-file' => 'Det datei, wat dü huuchschüürd heest, as leesag.',
+'file-too-large' => 'Det datei, wat dü huuchschüürd heest, as tu grat.',
 'filename-tooshort' => 'Di dateinööm as tu kurt.',
 'filetype-banned' => 'Son slach faan datei as ei tuläät.',
 'verification-error' => 'Det datei hää det seekerhaidspreew ei bestenen.',
@@ -1533,8 +1533,8 @@ Am en '''bil''' uun en artiikel tu brüken, brük en link faan det furem:
 'tmp-write-error' => "Bi't skriiwen faan det tidjwiis datei as wat skiaf gingen.",
 'large-file' => 'Datein skul ei grater wees üs $1, wan mögelk. Detdiar datei as $2 grat.',
 'largefileserver' => 'Detdiar datei as grater, üs di server üüb iinsteld as.',
-'emptyfile' => 'Det datei, wat dü huuchsjüürd heest, as leesag. Ferlicht heest dü di ferskrewen. Luke noch ans, of dü würelk detdiar datei huuchsjüür wel.',
-'windows-nonascii-filename' => 'Detheer Wiki läät nian dateinöömer mä sondertiaken tu.',
+'emptyfile' => 'Det datei, wat dü huuchschüürd heest, as leesag. Ferlicht heest dü di ferskrewen. Luke noch ans, of dü würelk detdiar datei huuchschüür wel.',
+'windows-nonascii-filename' => 'Detheer wiki läät nian dateinöömer mä aparte tiakens tu.',
 'fileexists' => 'En datei mä didiar nööm jaft at al. Luke noch ans efter <strong>[[:$1]]</strong>, wan dü ei gans seeker beest, of dü det anre wel.
 [[$1|thumb]]',
 'filepageexists' => "En beskriiwangssidj för <strong>[[:$1]]</strong> as al diar, oober nian datei. Din beskriiwang woort ei apnimen. Det beskriiwangssidj mut do man efter't huuchschüüren noch ans efterluket wurd.
@@ -1543,26 +1543,26 @@ Am en '''bil''' uun en artiikel tu brüken, brük en link faan det furem:
 * Nööm faan det nei datei: <strong>[[:$1]]</strong>
 * Nööm faan det ual datei: <strong>[[:$2]]</strong>
 Wees so gud an nem en öödern nööm.',
-'fileexists-thumbnail-yes' => "Detdiar datei as was en letjer maaget bil ''(thumbnail)''. [[$1|thumb]]
+'fileexists-thumbnail-yes' => "Detdiar datei as was en sümnaielbil ''(thumbnail)''. [[$1|thumb]]
 Luke di det datei <strong>[[:$1]]</strong> noch ans uun.
-Wan det det originaal bil as, säärst dü nään letjer maaget bil huuchsjüür.",
-'file-thumbnail-no' => "Di dateinööm begant mä <strong>$1</strong>. Det as was en letjer maaget bil ''(thumbnail)''.
+Wan det det originaal bil as, säärst dü nian sümnaielbil huuchschüür.",
+'file-thumbnail-no' => "Di dateinööm begant mä <strong>$1</strong>. Det as was en sümnaielbil ''(thumbnail)''.
 Luke noch ans efter, of dü det bil uun fol grate diar heest, an do schüür det huuch.",
 'fileexists-forbidden' => 'En datei mä didiar nööm jaft at al an koon ei auerskrewen wurd.
 Gung noch ans turag an schüür det datei mä en öödern nööm huuch.
 [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => "En datei mä didiar nööm stäänt al uun't gemiansoom archiif. Wan dü det bil likes huuchsjüür wel, gung turag nem en öödern nööm.
+'fileexists-shared-forbidden' => "En datei mä didiar nööm stäänt al uun't gemiansoom archiif. Wan dü det bil likes huuchschüür wel, gung turag an nem en öödern nööm.
 [[File:$1|thumb|center|$1]]",
 'file-exists-duplicate' => 'Detdiar datei as en duplikaat faan {{PLURAL:$1|detdiar datei|$1 datein}}:',
 'file-deleted-duplicate' => "En duplikaat faan detdiar datei ([[:$1]]) as al ans stregen wurden. Luke iin uun logbuk för't striken, iar dü det noch ans huuchsjüürst.",
 'uploadwarning' => 'Wäärnang',
-'uploadwarning-text' => 'Feranre det datei-beskriiwang an fersjük det noch ans nei.',
+'uploadwarning-text' => 'Feranre det datei-beskriiwang an ferschük det noch ans nei.',
 'savefile' => 'Datei seekre',
 'uploadedimage' => 'hää "[[$1]]" huuchschüürd',
-'overwroteimage' => 'hää en nei werjuun faan „[[$1]]“ huuchsjüürd',
+'overwroteimage' => 'hää en nei werjuun faan „[[$1]]“ huuchschüürd',
 'uploaddisabled' => 'Huuchschüüren as ei aktiwiaret',
 'copyuploaddisabled' => 'Huuchschüüren faan URLs as ei aktiwiaret.',
-'uploadfromurl-queued' => 'Din huuchsjüürd datei teewt.',
+'uploadfromurl-queued' => 'Din huuchschüürd datei teewt.',
 'uploaddisabledtext' => 'Det huuchschüüren faan datein as ei aktiwiaret.',
 'php-uploaddisabledtext' => 'Det huuchschüüren faan datein as uun PHP ei aktiwiaret.
 Luke di det iinstelang faan <code>file_uploads</code> uun.',
@@ -1578,7 +1578,7 @@ Java-datein kön ei tuläät wurd, auer jo det seekerhaid uun fraag stel küd.',
 'upload-description' => 'Dateibeskriiwang',
 'upload-options' => "Iinstelangen för't huuchschüüren",
 'watchthisupload' => 'Luke efter detdiar datei',
-'filewasdeleted' => 'En datei mä didiar nööm as al ans huuchsjüürd an leederhen weder stregen wurden. Luke iarst ans iin uun $1, iar dü det datei würelk seekerst.',
+'filewasdeleted' => 'En datei mä didiar nööm as al ans huuchschüürd an leederhen weder stregen wurden. Luke iarst ans iin uun $1, iar dü det datei würelk seekerst.',
 'filename-bad-prefix' => "Di dateinööm begant mä '''„$1“'''. Sok nöömer kem miast faan digitaalkameras an sai ei föl ütj.
 Nem en beedern nööm för det datei.",
 'upload-success-subj' => 'Det huuchschüüren hää loket.',
@@ -1692,7 +1692,7 @@ För a seekerhaid as img_auth.php ei aktiwiaret.',
 'upload-curl-error6' => 'URL küd ei fünjen wurd',
 'upload-curl-error6-text' => 'Det URL küd ei fünjen wurd. Luke di det URL noch ans uun, an of det sidj uk würelk diar as.',
 'upload-curl-error28' => 'Det huuchschüüren hää tu loong düüret (time-out).',
-'upload-curl-error28-text' => 'Det sidj hää tu loong ei swaaret (time-out). Luke noch ans efter, of det sidj uk würelk diar as. Fersjük det beeder leeder noch ans weder.',
+'upload-curl-error28-text' => 'Det sidj hää tu loong ei swaaret (time-out). Luke noch ans efter, of det sidj uk würelk diar as. Ferschük det beeder leeder noch ans weder.',
 
 'license' => 'Lisens:',
 'license-header' => 'Lisens',
@@ -1754,7 +1754,7 @@ Ferlicht wel dü det [$2 beskriiwangssidj] feranre.',
 'sharedupload-desc-create' => 'Detdiar datei as faan $1 an koon faan ööder projekten brükt wurd.
 Ferlicht wel dü det [$2 beskriiwangssidj] feranre.',
 'filepage-nofile' => 'En datei mä didiar nööm jaft at ei.',
-'filepage-nofile-link' => 'En datei mä didiar nööm jaft at ei, man dü könst det [$1 huuchsjüür].',
+'filepage-nofile-link' => 'En datei mä didiar nööm jaft at ei, man dü könst det [$1 huuchschüür].',
 'uploadnewversion-linktext' => 'En nei werjuun faan detdiar datei huuchschüür',
 'shared-repo-from' => 'foon $1',
 'shared-repo' => 'en gemiansoom archiif',
@@ -1928,7 +1928,7 @@ Uun arke rä stun ferwisangen tu't iarst an ööder widjerfeerang an uk tu det s
 'usereditcount' => '{{PLURAL:$1|feranrang|$1 feranrangen}}',
 'usercreated' => '{{GENDER:$3|Maaget}} di $1 am a klook $2',
 'newpages' => 'Nei sidjen',
-'newpages-username' => 'Brükernoome:',
+'newpages-username' => 'Brükernööm:',
 'ancientpages' => 'Al loong ei muar bewerket sidjen',
 'move' => 'Fersküüw',
 'movethispage' => 'Detdiar sidj fersküüw',
@@ -2057,7 +2057,7 @@ Din aanj e-mail adres faan din [[Special:Preferences|iinstelangen]] woort uunwis
 'usermaildisabledtext' => 'Dü könst nian e-mail tu ööder brükern schüür.',
 'noemailtitle' => 'Nian e-mail adres',
 'noemailtext' => 'Didiar brüker hää nian gudkäänd e-mail adres uunden.',
-'nowikiemailtitle' => 'E-mail koon ei sjüürd wurd',
+'nowikiemailtitle' => 'E-mail koon ei wechschüürd wurd',
 'nowikiemailtext' => 'Didiar brüker maad nian e-mails faan ööder brükern fu.',
 'emailnotarget' => 'Didiar brükernööm as ei bekäänd of ei gudkäänd, am ham en e-mail tu schüüren',
 'emailtarget' => 'Brükernööm faan di ööder brüker iindu',
@@ -2269,7 +2269,7 @@ Dü könst det seekerhaid feranre, det feranert oober ei det seekerhaid faan jo
 'restriction-edit' => 'Bewerke',
 'restriction-move' => 'Fersküüw',
 'restriction-create' => 'Maage',
-'restriction-upload' => 'Huuchsjüür',
+'restriction-upload' => 'Huuchschüür',
 
 # Restriction levels
 'restriction-level-sysop' => 'seekert (bluas för administratooren)',
@@ -2801,6 +2801,7 @@ Dü könst di kweltekst uunluke.',
 'tooltip-undo' => 'Saat bluas det leetst feranrang turag an wiset det resultoot uun en föörskau uun. Uun det tuupfaadet beskriiwang skul en grünj för det turagsaaten uunden wurd.',
 'tooltip-preferences-save' => 'Iinstelangen seekre',
 'tooltip-summary' => 'Faade det kurt tuup',
+'interlanguage-link-title' => '$1 - $2',
 
 # Metadata
 'notacceptable' => 'Di Wiki-server koon a dooten ei för dan aperoot apwerke.',
@@ -2840,6 +2841,7 @@ Heer '''NIKS''' iindreeg!",
 'pageinfo-length' => 'Sidjenlengde (uun bytes)',
 'pageinfo-article-id' => 'Sidjenkäännumer (ID)',
 'pageinfo-language' => 'Sidjenspriak',
+'pageinfo-content-model' => 'Muude för sidjenteksten',
 'pageinfo-robot-policy' => 'Faan bots indisiaret',
 'pageinfo-robot-index' => 'Tuläät',
 'pageinfo-robot-noindex' => 'Ei tuläät',
@@ -2934,7 +2936,7 @@ $1",
 # Special:NewFiles
 'newimages' => 'Nei datein',
 'imagelisttext' => "Diar as en list faan '''$1''' {{PLURAL:$1|datei|datein}}, sortiaret $2.",
-'newimages-summary' => 'Detdiar spezial-sidj wiset a tuleetst huuchsjüürd datein uun.',
+'newimages-summary' => 'Detdiar spezial-sidj wiset a tuleetst huuchschüürd datein uun.',
 'newimages-legend' => 'Filter',
 'newimages-label' => 'Dateinööm (of en dial diarfaan):',
 'showhidebots' => '(Bots $1)',
@@ -3477,6 +3479,9 @@ Ferseekre, dat dü det sidj würelk nei maage wel.",
 'confirm-unwatch-button' => 'OK',
 'confirm-unwatch-top' => "Wel dü detdiar sidj ei muar uun't uug behual?",
 
+# Separators for various lists, etc.
+'quotation-marks' => '„$1“',
+
 # Multipage image navigation
 'imgmultipageprev' => '← leetst sidj (turag)',
 'imgmultipagenext' => 'naist sidj →',
@@ -3706,10 +3711,10 @@ An det woort so brükt: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special
 'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2}} hää stalswigin det uunlukin feranert faan werjuunen faan det sidj $3',
 'revdelete-content-hid' => 'Ferbürgen',
 'revdelete-summary-hid' => 'Ferbürgen tuupfaadang',
-'revdelete-uname-hid' => 'brükernoome ferstäägen',
+'revdelete-uname-hid' => 'brükernööm ferbürgen',
 'revdelete-content-unhid' => 'Ei muar ferberag',
 'revdelete-summary-unhid' => 'Tuupfaadang ei muar ferberag',
-'revdelete-uname-unhid' => 'brükernoome frijääwen',
+'revdelete-uname-unhid' => 'brükernööm weder tu sen',
 'revdelete-restricted' => 'mögelkhaiden för administratooren wechnimen',
 'revdelete-unrestricted' => 'mögelkhaiden för administratooren ütjwidjet',
 'logentry-move-move' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen.',
@@ -3756,12 +3761,12 @@ An det woort so brükt: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special
 'api-error-duplicate-archive' => 'Diar wiar al {{PLURAL:$1|[$2 ööder datei]|[$2 ööder datein]}} mä detsalew banen. {{PLURAL:$1|Hat as |Jo san}} oober stregen wurden.',
 'api-error-duplicate-archive-popup-title' => 'Dobelt {{PLURAL:$1|datei, diar al stregen wurden as|datein, diar al stregen wurden san}}.',
 'api-error-duplicate-popup-title' => 'Dobelt {{PLURAL:$1|datei|datein}}',
-'api-error-empty-file' => 'Det datei, wat dü huuchsjüürd heest, as leesag.',
+'api-error-empty-file' => 'Det datei, wat dü huuchschüürd heest, as leesag.',
 'api-error-emptypage' => 'Dü mutst nian leesag sidjen nei iinstel.',
 'api-error-fetchfileerror' => "Intern feeler: Bi't ufrepen faan det datei as wat skiaf gingen.",
 'api-error-fileexists-forbidden' => 'En datei mä di nööm „$1“ as al diar. Hat koon ei auerskrewen wurd.',
 'api-error-fileexists-shared-forbidden' => "En date mä di nööm „$1“ as al uun't gemiansoom archiif an koon ei auerskrewen wurd.",
-'api-error-file-too-large' => 'Det datei, wat dü huuchsjüürd heest, as tu grat.',
+'api-error-file-too-large' => 'Det datei, wat dü huuchschüürd heest, as tu grat.',
 'api-error-filename-tooshort' => 'Di dateinööm as tu kurt.',
 'api-error-filetype-banned' => 'Son slach faan datei as ei tuläät.',
 'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|as nään tuläät slach faan datein|san nian tuläät slacher faan datein}}.
index c8172dc..76a9b7d 100644 (file)
@@ -1465,8 +1465,8 @@ Is an téacs as na leagan scriosta seo ar fáil do riarthóirí amháin.',
 'sp-contributions-submit' => 'Cuardaigh',
 
 # What links here
-'whatlinkshere' => 'Naisc go dtí an lch seo',
-'whatlinkshere-title' => 'Naisc chuig $1',
+'whatlinkshere' => 'Naisc leis an lch seo',
+'whatlinkshere-title' => 'Naisc le $1',
 'whatlinkshere-page' => 'Leathanach:',
 'linkshere' => "Tá nasc chuig '''[[:$1]]''' ar na leathanaigh seo a leanas:",
 'nolinkshere' => "Níl leathanach ar bith ann a bhfuil nasc chuig '''[[:$1]]''' air.",
@@ -1759,6 +1759,9 @@ iarradh sábháil. Is dócha gur nasc chuig suíomh seachtrach ba chúis leis.',
 'spamprotectionmatch' => 'Truicear ár scagaire dramhála ag an téacs seo a leanas: $1',
 'spambot_username' => 'MediaWiki turscar glanadh',
 
+# Info page
+'pageinfo-toolboxlink' => 'Faoin leathanach seo',
+
 # Skin names
 'skinname-cologneblue' => 'Gorm Köln',
 'skinname-monobook' => 'MonoBook',
index 00a058c..3c4308b 100644 (file)
@@ -492,7 +492,7 @@ Na dìochuimhnich na [[Special:Preferences|roghainnean agad air {{SITENAME}}]] a
 'gotaccount' => 'A bheil cunntas agad mu thràth? $1.',
 'gotaccountlink' => 'Log a-steach',
 'userlogin-resetlink' => "Na dhìochuimhnich thu d' ainm is facal-faire?",
-'userlogin-resetpassword-link' => 'Ath-shuidhich am facal-faire agad',
+'userlogin-resetpassword-link' => 'Na dhìochuimhnich thu am facal-faire agad?',
 'helplogin-url' => "Help:A' clàradh a-steach",
 'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Cobhair leis a' chlàradh a-steach]]",
 'userlogin-loggedin' => 'Chaidh do chlàradh mar {{GENDER:$1|$1}} mu thràth.
@@ -569,7 +569,7 @@ Mus dèid post-d sam bith eile a chur dhan chunntas, feumaidh tu leantainn ris a
 Gus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.',
 'mailerror' => "Mearachd a' cur post: $1",
 'acct_creation_throttle_hit' => "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
-'emailauthenticated' => 'Chaidh an seòladh puist-dhealain agad a dhearbhadh $2 aig $3.',
+'emailauthenticated' => 'Chaidh an seòladh puist-d agad a dhearbhadh $2 aig $3.',
 'emailnotauthenticated' => 'Cha deach am post-d agad a dhearbhadh fhathast.
 Cha dèid post-d a chur airson gin dhe na feartan a leanas.',
 'noemailprefs' => 'Sònraich post-d sna roghainnean agad gus na feartan seo a chur an comas.',
@@ -1009,6 +1009,14 @@ Gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FUL
 'revdelete-show-file-submit' => 'Tha',
 'revdelete-selected' => "'''{{PLURAL:$2|Lèirmheas|Lèirmheasan}} de [[:$1]] a thagh thu:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|An tachartas loga|Na tachartasan loga}} a thagh thu:'''",
+'revdelete-text' => "'''Nochdaidh lèirmheasan is tachartasan fhathast ann an eachdraidh 's logaichean na duilleige ach bidh cuid a shusbaint ann nach fhaic am poball.'''
+Gheibh rianairean eile air {{SITENAME}} greim fhathast air an t-susbaint fhalaichte agus gabhaidh an sguabadh às a neo-dhèanamh a-rithist san aon eadar-aghaidh mur an deach cuingeachaidhean eile a shuidheachadh.",
+'revdelete-confirm' => "Dearbh gu bheil thu airson seo a dhèanamh, gu bheil thu a' tuigsinn na thachras ri linn agus gu bheil thu a' dèanamh seo a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].",
+'revdelete-suppress-text' => "Cha bu chòir dhut mùchadh a chleachdadh '''ach''' ann an suidheachaidhean mar seo:
+* Fiosrachadh a dh'fhaodadh a bhith dìteachail
+* Fiosrachadh pearsanta a tha cearr
+*: ''seòladh taige, àireamhan fòn, àireamhan NI is msaa.''",
+'revdelete-legend' => 'Suidhich cuingeachaidhean na faicsinneachd',
 'revdelete-hide-text' => "Teacsa a' mhùthaidh",
 'revdelete-hide-image' => 'Falaich susbaint an fhaidhle',
 'revdelete-hide-name' => 'Falaich an gnìomh agus an targaid',
@@ -1033,19 +1041,58 @@ $1",
 'revdel-restore-visible' => 'mùthaidhean faicsinneach',
 'pagehist' => 'Eachdraidh na duilleige',
 'deletedhist' => 'Eachdraidh a chaidh a sguabadh às',
+'revdelete-hide-current' => "Mearachd a' cur am falach an nì dhen $2, $1: Seo an lèirmheas làithreach. Cha ghabh a chur am falach.",
+'revdelete-show-no-access' => 'Mearachd a\' sealltainn an nì on $2, $1: Tha comharra ann a dh\'innseas gu bheil e "cuingichte".
+Chan eil cothrom agad air.',
+'revdelete-modify-no-access' => 'Mearachd ag atharrachadh an nì on $2, $1: Tha comharra ann a dh\'innseas gu bheil e "cuingichte".
+Chan eil cothrom agad air.',
+'revdelete-modify-missing' => 'Mearachd ag atharrachadh an nì leis an ID $1: Chan eil e san stòr-dàta!',
+'revdelete-no-change' => "'''Rabhadh:''' Bha na roghainnean faicsinneachd a dh'iarr thu aig an nì dhen $2, $1 mu thràth.",
+'revdelete-concurrent-change' => "Mearachd ag atharrachadh an nì on $2, $1: Tha coltas gun deach a staid atharrachadh le cuideigin dìreach nuair a dh'fheuch thusa ri atharrachadh.
+Thoir sùil air na logaichean.",
+'revdelete-only-restricted' => "Mearachd a' cur an nì on $2, $1 am falach: Chan urrainn dhut nithean le rianairean a mhùchadh gun a bhith a' taghadh aon dhe na roghainnean faicsinneachd eile cuideachd.",
+'revdelete-reason-dropdown' => "*Adhbharan cumanta airson sguabadh às rudan
+** Briseadh còrach-lethbhreac
+** Beachd no fiosrachadh pearsanta mì-iomchaidh
+** Ainm-cleachdaiche mì-iomchaidh
+** Fiosrachadh a dh'fhaodadh a bhith dìteachail",
 'revdelete-otherreason' => 'Adhbhar eile/a bharrachd:',
 'revdelete-reasonotherlist' => 'Adhbhar eile',
 'revdelete-edit-reasonlist' => 'Deasaich adhbharan an sguabaidh às',
 'revdelete-offender' => "Ùghdar a' mhùthaidh:",
 
+# Suppression log
+'suppressionlog' => 'Loga nam mùchaidhean',
+'suppressionlogtext' => "Chì thu liosta nan rudan a chaidh a sguabadh às agus a bhacadh gu h-ìosal, a' gabhail a-steach stuth a chaidh fhalach o rianairean. Faic [[Special:BlockList|liosta nam bacaidhean]] airson liosta nan toirmeasgan is bacaidhean beò.",
+
 # History merging
+'mergehistory' => 'Co-aonaich eachdraidhean na duilleige',
+'mergehistory-header' => 'Leigidh an duilleag seo leat na lèirmheasan aig aon duilleag a cho-aonadh le duilleag nas ùire.
+Dèan cinnteach gun glèidh an t-atharrachadh seo leantainneachd eachdraidh na duilleige.',
+'mergehistory-box' => 'Co-aonaich na lèirmheasan aig dà dhuilleag:',
 'mergehistory-from' => 'An duilleag thùsail:',
+'mergehistory-into' => 'An duilleag targaide:',
+'mergehistory-list' => 'Eachdraidh nan deasachaidhean a ghabhas a cho-aonadh',
+'mergehistory-merge' => 'Gabhaidh na lèirmheasan a leanas aig [[:$1]] a cho-aonadh le [[:$2]].
+Cleachd colbh nam putanan-rèidio gus dìreach na lèirmheasan a cho-aonadh a chaidh a chruthachadh aig an àm a chaidh a shònrachadh no roimhe sin.
+Thoir an aire gun dèid an colbh seo ath-shuidheachadh ma chleachdas tu ceanglaichean na seòladaireachd.',
+'mergehistory-go' => 'Seall na deasachaidhean a ghabhas a cho-aonadh',
+'mergehistory-submit' => 'Co-aonaich na lèirmheasan',
+'mergehistory-empty' => 'Chan eil lèirmheas sam bith ann a ghabhas a cho-aonadh.',
+'mergehistory-success' => 'Chaidh $3 {{PLURAL:$3|lèirmheas|lèirmheas|lèirmheasan|lèirmheas}} de [[:$1]] a cho-aonadh dha [[:$2]].',
+'mergehistory-fail' => "Cha ghabh an eachdraidh a cho-aonadh, thoir sùil air paramadairean na duilleige 's an ama.",
+'mergehistory-no-source' => 'Chan eil an tùs-duilleag $1 ann.',
+'mergehistory-no-destination' => 'Chan eil an an duilleag targaide $1 ann.',
+'mergehistory-invalid-source' => "Feumaidh an tùs-duilleag a bhith 'na thiotal dligheach.",
+'mergehistory-invalid-destination' => "Feumaidh an duilleag targaide a bhith 'na thiotal dligheach.",
 'mergehistory-autocomment' => 'Chaidh [[:$1]] a cho-aonadh dha [[:$2]]',
 'mergehistory-comment' => 'Chaidh [[:$1]] a cho-aonadh dha [[:$2]]: $3',
+'mergehistory-same-destination' => 'Chan fhaod an tùs-duilleag is an duilleag targaide a bhith co-ionnann',
 'mergehistory-reason' => 'Adhbhar:',
 
 # Merge log
 'mergelog' => "Loga a' cho-aonaidh",
+'pagemerge-logentry' => 'chaidh [[$1]] a cho-aonadh dha [[$2]] (lèirmheasan suas ri $3)',
 'revertmerge' => 'Dì-aontaich',
 
 # Diffs
index 40c829b..f6c773a 100644 (file)
@@ -561,7 +561,7 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Páxina',
-'nstab-user' => 'Páxina de {{GENDER:{{#titleparts:{{BASEPAGENAME}}|1}}|usuario|usuaria}}',
+'nstab-user' => 'Páxina de {{GENDER:{{ROOTPAGENAME}}|usuario|usuaria}}',
 'nstab-media' => 'Páxina multimedia',
 'nstab-special' => 'Páxina especial',
 'nstab-project' => 'Páxina do proxecto',
@@ -711,7 +711,7 @@ Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENA
 'gotaccount' => 'Xa ten unha conta? $1.',
 'gotaccountlink' => 'Acceda ao sistema',
 'userlogin-resetlink' => 'Esqueceu os seus datos de rexistro?',
-'userlogin-resetpassword-link' => 'Restablecer o seu contrasinal',
+'userlogin-resetpassword-link' => 'Esqueceu o contrasinal?',
 'helplogin-url' => 'Help:Rexistro',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Axuda co rexistro]]',
 'userlogin-loggedin' => 'Xa accedeu ao sistema como {{GENDER:$1|$1}}.
@@ -791,8 +791,9 @@ Para evitar o abuso do sistema só se enviará unha mensaxe de restablecemento c
 'mailerror' => 'Produciuse un erro ao enviar o correo electrónico: $1',
 'acct_creation_throttle_hit' => 'Alguén que visitou este wiki co seu enderezo IP creou, no último día, {{PLURAL:$1|unha conta|$1 contas}}, que é o máximo permitido neste período de tempo.
 Como resultado, os visitantes que usen este enderezo IP non poden crear máis contas nestes intres.',
-'emailauthenticated' => 'O seu enderezo de correo electrónico foi autenticado o $2 ás $3.',
-'emailnotauthenticated' => 'O seu enderezo de correo electrónico aínda <strong>non foi autenticado</strong>. Non se enviou ningunha mensaxe por algunha das seguintes razóns.',
+'emailauthenticated' => 'O seu enderezo de correo electrónico foi confirmado o $2 ás $3.',
+'emailnotauthenticated' => 'O seu enderezo de correo electrónico aínda non foi confirmado.
+Non se enviará ningunha mensaxe por ningunha das seguintes características.',
 'noemailprefs' => 'Especifique un enderezo de correo electrónico se quere que funcione esta opción.',
 'emailconfirmlink' => 'Confirmar o enderezo de correo electrónico',
 'invalidemailaddress' => 'Non se pode aceptar o enderezo de correo electrónico porque semella ter un formato incorrecto.
@@ -1233,19 +1234,20 @@ función, a revisión especificada non existe ou está intentando agochar a revi
 'revdelete-text' => "'''As revisións borradas seguirán aparecendo no historial da páxina e nos rexistros, pero partes do seu contido serán inaccesibles de cara ao público.'''
 Os demais administradores de {{SITENAME}} poderán acceder ao contido agochado e poderán restaurar a páxina de novo a través desta mesma interface, a non ser que se estableza algunha restrición adicional.",
 'revdelete-confirm' => 'Por favor, confirme que quere levar a cabo esta acción, que comprende as consecuencias e que o fai de acordo [[{{MediaWiki:Policy-url}}|coas políticas]].',
-'revdelete-suppress-text' => "A eliminación '''só''' debería ser usada nos seguintes casos:
+'revdelete-suppress-text' => "A eliminación '''unicamente''' debería utilizarse nos seguintes casos:
+* Información potencialmente difamatoria
 * Información persoal inapropiada
-*: ''domicilios e números de teléfono, números da seguridade social, etc.''",
+*: ''domicilios e números de teléfono, números da seguridade social etc.''",
 'revdelete-legend' => 'Aplicar restricións de visibilidade',
-'revdelete-hide-text' => 'Agochar o texto da revisión',
+'revdelete-hide-text' => 'Texto da revisión',
 'revdelete-hide-image' => 'Agochar o contido do ficheiro',
 'revdelete-hide-name' => 'Agochar a acción e o destino',
-'revdelete-hide-comment' => 'Agochar o resumo de edición',
-'revdelete-hide-user' => 'Agochar o nome de usuario ou o enderezo IP do editor',
+'revdelete-hide-comment' => 'Resumo de edición',
+'revdelete-hide-user' => 'Nome de usuario ou enderezo IP do editor',
 'revdelete-hide-restricted' => 'Eliminar os datos da vista dos administradores así coma da doutros',
 'revdelete-radio-same' => '(non cambiar)',
-'revdelete-radio-set' => 'Si',
-'revdelete-radio-unset' => 'Non',
+'revdelete-radio-set' => 'Visible',
+'revdelete-radio-unset' => 'Agochado',
 'revdelete-suppress' => 'Eliminar os datos da vista dos administradores así coma da doutros',
 'revdelete-unsuppress' => 'Retirar as restricións sobre as revisións restauradas',
 'revdelete-log' => 'Motivo:',
@@ -3127,6 +3129,7 @@ Pode ver o código fonte.',
 'tooltip-undo' => '"Desfacer" reverte esta edición e abre o formulario de edición nun modo previo. Permite engadir un motivo no resumo de edición.',
 'tooltip-preferences-save' => 'Gardar as preferencias',
 'tooltip-summary' => 'Escriba un breve resumo',
+'interlanguage-link-title' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/** O CSS que se coloque aquí será aplicado a todas as aparencias */',
@@ -3191,6 +3194,7 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 'pageinfo-length' => 'Lonxitude da páxina (en bytes)',
 'pageinfo-article-id' => 'ID da páxina',
 'pageinfo-language' => 'Lingua do contido da páxina',
+'pageinfo-content-model' => 'Modelo do contido da páxina',
 'pageinfo-robot-policy' => 'Indexación por robots',
 'pageinfo-robot-index' => 'Permitida',
 'pageinfo-robot-noindex' => 'Non permitida',
index fe133ad..0a235b2 100644 (file)
@@ -112,7 +112,7 @@ $messages = array(
 'vector-action-move' => 'Fuddem voch',
 'vector-action-protect' => 'Rakh',
 'vector-view-create' => 'Roch',
-'vector-view-edit' => 'sudar',
+'vector-view-edit' => 'Sudar',
 'vector-view-history' => 'Itihas polloi',
 'vector-view-view' => 'Vach',
 'vector-view-viewsource' => 'Mull polloi',
@@ -216,6 +216,7 @@ $messages = array(
 'nstab-category' => 'Vorg',
 
 # General errors
+'error' => 'Chuk',
 'missing-article' => 'Totv-kox (Database) hantun mellunk zai aslem tem mozkur "$1" $2 mellunk-nam.
 
 Horxim, oxem ek pornem frk vo eka panachem itihasachem zodd vogllailem, tedna zata.
@@ -223,6 +224,7 @@ Horxim, oxem ek pornem frk vo eka panachem itihasachem zodd vogllailem, tedna za
 Oxem nhoi zalear, tuka softwer-an chuk sampodlam zait.
 Upkar korun eka [[Special:ListUsers/sysop|karbhari]]chea nodrek hadd, Internet Zago Sodpi (URL) hachi nond gheun.',
 'missingarticle-rev' => '(uzollnni#: $1)',
+'missingarticle-diff' => '(Frk: $1, $2)',
 'badtitle' => 'Chukichem nanv',
 'badtitletext' => 'Tuven maglelem panache nanv chukichem, rintem, vo ek sarkem zodunk-naslelem bhase-modlem vo wiki-modlem nanv.
 
@@ -233,6 +235,7 @@ Tantun ek vo sabaar okxor asot jenka nanvanim uzar korunk zainan.',
 'welcomeuser' => 'Ievkar, $1!',
 'yourname' => 'Vapuddpeachem nanv:',
 'yourpassword' => 'Gupitutor:',
+'userlogin-yourpassword' => 'Gupitutor',
 'yourpasswordagain' => 'Gupit utor porot boroi:',
 'remembermypassword' => 'Hea internet browseran mhojem sotrachem ugdas dovor (chodan chod $1 {{PLURAL:$1|disak|disank}})',
 'login' => 'Sotrromb kor',
@@ -397,7 +400,7 @@ Dusre tuje xim sompork kortat tednam tuzo email potto tankam kollchenam.',
 'newuserlogpage' => 'Vapurpi rochnnechem sotr',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'hem pan bodol',
+'action-edit' => 'hem pan sudar',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|bodlop|bodlopam}}',
index 864ffa5..5bf0694 100644 (file)
@@ -3829,7 +3829,7 @@ $5
 
 # Database error messages
 'dberr-header' => 'આ વિકિમાં તકલીફ છે',
-'dberr-problems' => 'દિલàª\97à«\80રà«\80! àª\86 àª¸àª¾àª\87àª\9f àª¤àª\95નિàª\95à«\80 àª\85ડàª\9aણ અનુભવી રહી છે.',
+'dberr-problems' => 'માફ àª\95રશà«\8b! àª\86 àª¸àª¾àª\87àª\9f àª¤àª\95નિàª\95à«\80 àª\85ડàª\9aણà«\8b અનુભવી રહી છે.',
 'dberr-again' => 'થોડી વાર રાહ જોઈને ફરી પેજ લોડ કરવાનો પ્રયત્ન કરો.',
 'dberr-info' => '(માહિતી સંચય સર્વર : $1નો સંપર્ક નથી કરી શકાયો)',
 'dberr-info-hidden' => '(ડેટાબેઝ સર્વર સાથે જોડાણ થઇ શકતું નથી)',
index a617a02..332a8ae 100644 (file)
@@ -689,7 +689,7 @@ $1',
 'nosuchspecialpage' => 'אין דף מיוחד בשם זה',
 'nospecialpagetext' => '<strong>ביקשתם דף מיוחד שאינו קיים.</strong>
 
-ר×\90×\95 ×\92×\9d ×\90ת [[Special:SpecialPages|רש×\99×\9eת ×\94×\93פ×\99×\9d ×\94×\9e×\99×\95×\97×\93×\99×\9d ×\94תק×\99× ×\99×\9d]].',
+ראו את [[Special:SpecialPages|רשימת הדפים המיוחדים התקינים]].',
 
 # General errors
 'error' => 'שגיאה',
@@ -1021,7 +1021,7 @@ $2
 'headline_sample' => 'כותרת',
 'headline_tip' => 'כותרת – דרגה 2',
 'nowiki_sample' => 'טקסט לא מעוצב',
-'nowiki_tip' => '×\98קס×\98 ×\9c×\90 ×\9e×¢×\95צ×\91 (×\94תע×\9c×\9d ×\9eס×\99×\9e× ×\99 ×\95×\99ק×\99)',
+'nowiki_tip' => '×\94תע×\9c×\9e×\95ת ×\9e×¢×\99צ×\95×\91 ×\95×\99ק×\99',
 'image_tip' => 'קובץ המוצג בתוך הדף',
 'media_tip' => 'קישור לקובץ מדיה',
 'sig_tip' => 'חתימה + שעה',
@@ -1332,7 +1332,7 @@ $2
 'revdelete-suppress-text' => "יש להשתמש בהסתרה מלאה '''אך ורק''' במקרים הבאים:
 * מידע שעלול להיות לשון הרע
 * חשיפת מידע אישי
-*: '''×\9bת×\95×\91×\95ת ×\91ת×\99×\9d ×\95×\9eספר×\99 ×\98×\9cפ×\95×\9f, ×\9eספר×\99 ×\91×\99×\98×\95×\97 ×\9c×\90×\95×\9e×\99, וכדומה'''",
+*: '''×\9bת×\95×\91×\95ת ×\91ת×\99×\9d ×\95×\9eספר×\99 ×\98×\9cפ×\95×\9f, ×\9eספר×\99 ×\96×\99×\94×\95×\99 ×\9e×\93×\99נת×\99×\99×\9d, וכדומה'''",
 'revdelete-legend' => 'הגדרת הגבלות התצוגה',
 'revdelete-hide-text' => 'תוכן הגרסה',
 'revdelete-hide-image' => 'הסתרת תוכן הקובץ',
@@ -1590,9 +1590,9 @@ $1",
 'gender-unknown' => 'איני רוצה לומר',
 'gender-male' => 'הוא עורך דפים בוויקי',
 'gender-female' => 'היא עורכת דפים בוויקי',
-'prefs-help-gender' => '×\90×\99×\9f ×\97×\95×\91×\94 ×\9c×\9e×\9c×\90 ×\90ת ×\94×\94×¢×\93פ×\94 ×\94×\96×\90ת.
\94ת×\9b× ×\94 ×\9eשת×\9eשת ×\91×\9e×\99×\93×¢ ×\94×\96×\94 ×\9b×\93×\99 ×\9cפנ×\95ת ×\90×\9c×\99×\9a ×\90×\95 ×\90×\9c×\99×\99×\9a ×\95×\9c×\94×\96×\9b×\99ר ×\90×\95ת×\9a ×\9c×\90×\97ר×\99×\9d במין הדקדוקי הנכון.
\94×\9e×\99×\93×¢ ×\94×\96×\94 ×\99×\94×\99×\94 ×¦×\99×\91×\95ר×\99.',
+'prefs-help-gender' => '×\90×\99×\9f ×\97×\95×\91×\94 ×\9c×\9e×\9c×\90 ×\94×¢×\93פ×\94 ×\96×\95.
\94×\9eער×\9bת ×\9eשת×\9eשת ×\91×\9e×\99×\93×¢ ×\96×\94 ×\9b×\93×\99 ×\9cפנ×\95ת ×\90×\9c×\99×\9a\90×\9c×\99×\99×\9a ×\95×\9cצ×\99×\99×\9f ×\90ת ×©×\9d ×\94×\9eשת×\9eש ×©×\9c×\9a במין הדקדוקי הנכון.
+המידע יהיה ציבורי.',
 'email' => 'דוא"ל',
 'prefs-help-realname' => 'השם האמיתי הוא אופציונאלי.
 אם תבחרו לספקו, הוא ישמש לייחוס עבודתכם אליכם.',
@@ -3284,6 +3284,7 @@ $2',
 'pageinfo-length' => 'אורך הדף (בבתים)',
 'pageinfo-article-id' => 'מזהה הדף',
 'pageinfo-language' => 'שפת התוכן של הדף',
+'pageinfo-content-model' => 'סוג התוכן של הדף',
 'pageinfo-robot-policy' => 'איסוף על ידי רובוטים של מנועי חיפוש',
 'pageinfo-robot-index' => 'מותר',
 'pageinfo-robot-noindex' => 'אסור',
index 1c611e3..d8f2a63 100644 (file)
@@ -1240,7 +1240,7 @@ Ang imo adres sang e-mail wala ginapakita kon kontakon ka sang iban.',
 'group-all' => '(tanan)',
 
 'group-user-member' => '{{GENDER:$1|naga-usar}}',
-'group-autoconfirmed-member' => '{GENDER:$1|naga-usar nga awtomatikong nakompirma}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|naga-usar nga awtomatikong nakompirma}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
 'group-sysop-member' => '{{GENDER:$1|tagdumala}}',
 'group-bureaucrat-member' => '{{GENDER:$1|byurokratiko}}',
@@ -1417,7 +1417,7 @@ Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
 'upload-recreate-warning' => "'''Abiso: Ang isa ka file nga amo ang iya ngalan ginpanas na ukon ginsaylo'''
 
 Ang log sang pagpanas kag pagsaylo para sa sini nga panid ginahatag diri para sa imo nga kombinyensya.",
-'uploadtext' => "Usaron ang porma sa idalum para makakarga sang mga file. Para matan-aw ukon mapangita ang mga file nga ginkarga na, kadto sa:[Special:FileList|lista sang mga files nga ginkarga]], ang mga ginkarga liwat nakalista sa: [[Special:Log/upload|lista sang mga ginkarga]], ang mga ginpanas [[Special:Log/delete|lista sang mga ginpanas]].
+'uploadtext' => "Usaron ang porma sa idalum para makakarga sang mga file. Para matan-aw ukon mapangita ang mga file nga ginkarga na, kadto sa:[[Special:FileList|lista sang mga files nga ginkarga]], ang mga ginkarga liwat nakalista sa: [[Special:Log/upload|lista sang mga ginkarga]], ang mga ginpanas [[Special:Log/delete|lista sang mga ginpanas]].
 
 Para maupod ang isa ka file sa isa ka panid, usaron ang sini nga sugpon sa mga masunod nga mga porma:
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' para mausar ang bilog nga bersyon sang file
index 8fb7446..a69c6ce 100644 (file)
@@ -762,8 +762,10 @@ Ne zaboravite prilagoditi Vaše [[Special:Preferences|{{SITENAME}} postavke]].',
 'gotaccount' => "Već imate suradnički račun? '''$1'''.",
 'gotaccountlink' => 'Prijavite se',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
-'userlogin-resetpassword-link' => 'Ponovno postavi zaporku',
+'userlogin-resetpassword-link' => 'Zaboravili ste zaporku?',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavi]]',
+'userlogin-loggedin' => 'Već ste prijavljeni kao {{GENDER:$1|$1}}.
+Rabite donji obrazac da biste se prijavili kao drugi suradnik.',
 'userlogin-createanother' => 'Stvori još jedan račun',
 'createacct-join' => 'Upišite ispod svoje podatke.',
 'createacct-another-join' => 'Upišite dolje podatke o novom računu.',
@@ -822,16 +824,16 @@ koristiti staru lozinku.',
 'noemailcreate' => 'Morate navesti važeću e-mail adresu',
 'passwordsent' => 'Nova je lozinka poslana na e-mail adresu suradnika "$1"',
 'blocked-mailpassword' => 'Vašoj IP adresi je blokirano uređivanje stranica, a da bi se spriječila nedopuštena radnja, mogućnost zahtijevanja nove lozinke je također onemogućena.',
-'eauthentsent' => 'Na navedenu adresu poslan je e-mail s potvrdom.
-Prije nego što pošaljemo daljnje poruke, molimo Vas da otvorite e-mail i slijedite u njemu sadržana uputstva kako biste potvrdili da je e-mail adresa zaista Vaša.',
+'eauthentsent' => 'Na navedenu adresu poslana je e-poruka s potvrdom.
+Prije nego što pošaljemo daljnje poruke, molimo Vas otvorite e-poruku i slijedite u njemu sadržana uputstva kako biste potvrdili da je adresa e-pošte zaista Vaša.',
 'throttled-mailpassword' => 'Već Vam je poslan e-mail za promjenu zaporke, u {{PLURAL:$1|zadnjih sat vremena|zadnja $1 sata|zadnjih $1 sati}}.
 Da bi spriječili zloupotrebu, moguće je poslati samo jedan e-mail za promjenu zaporke {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.',
 '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.',
-'emailnotauthenticated' => 'Vaša e-mail adresa još nije ovjerena.
-Ne možemo poslati e-mail ni u jednoj od sljedećih naredbi.',
+'emailauthenticated' => 'Vaša adresa e-pošte potvrđena je $2 u $3.',
+'emailnotauthenticated' => 'Vaša adresa e-pošte još nije potvrđena.
+Ne možemo poslati e-poruku ni u jednoj od sljedećih naredbi.',
 'noemailprefs' => 'Nije navedena adresa elektroničke pošte, stoga sljedeće naredbe ne će raditi.',
 'emailconfirmlink' => 'Potvrdite svoju e-mail adresu',
 'invalidemailaddress' => 'Ne mogu prihvatiti e-mail adresu jer nije valjano oblikovana.
@@ -850,6 +852,8 @@ Molimo Vas pričekajte $1 prije nego što pokušate ponovno.',
 'login-abort-generic' => 'Vaša prijava bila je neuspješna - Prekinuto',
 'loginlanguagelabel' => 'Jezik: $1',
 'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer to izgleda kao da je poslan preko pokvarenog preglednika ili keširanog posrednika (proxyja).',
+'createacct-another-realname-tip' => 'Pravo ime nije obvezno. 
+Ako ga navedete, bit će korišteno za pripisivanje Vaših doprinosa.',
 
 # Email sending
 'php-mail-error-unknown' => 'Nepoznata pogrješka u funkciji PHP-poruke()',
@@ -877,6 +881,7 @@ Možda ste već uspješno promijenili Vašu lozinku ili ste zatražili novu priv
 # Special:PasswordReset
 'passwordreset' => 'Ponovno postavi lozinku',
 'passwordreset-text-one' => 'Ispunite ovaj obrazac ako želite ponovno postaviti Vašu zaporku.',
+'passwordreset-text-many' => '{{PLURAL:$1|Ispunite jedno od polja za ponovno postavljanje Vaše zaporke.}}',
 '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.',
@@ -3892,7 +3897,7 @@ Također možete koristiti [[Special:EditWatchlist|standardni editor]].',
 'version-license' => 'Licencija',
 'version-poweredby-credits' => "Ovaj wiki pogoni '''[//www.mediawiki.org/ MediaWiki]''', autorska prava © 2001-$1 $2.",
 'version-poweredby-others' => 'ostali',
-'version-credits-summary' => 'Željeli bismo se zahvaliti sljedećim suradnicima na njihovom doprinosu [[Special:Version|MediaWikiju]].',
+'version-credits-summary' => 'Željeli bismo zahvaliti sljedećim suradnicima na njihovom doprinosu [[Special:Version|MediaWikiju]].',
 'version-license-info' => 'MediaWiki je slobodni softver; možete ga distribuirati i/ili mijenjati pod uvjetima GNU opće javne licencije u obliku u kojem ju je objavila Free Software Foundation; bilo verzije 2 licencije, ili (Vama na izbor) bilo koje kasnije verzije.
 
 MediaWiki je distribuiran u nadi da će biti koristan, no BEZ IKAKVOG JAMSTVA; čak i bez impliciranog jamstva MOGUĆNOSTI PRODAJE ili PRIKLADNOSTI ZA ODREĐENU NAMJENU. Pogledajte GNU opću javnu licenciju za više detalja.
index 0795f8f..6324b72 100644 (file)
@@ -2264,7 +2264,7 @@ Támogatott {{PLURAL:$2|protokoll|protokollok}}: <code>$1</code> (http:// az ala
 
 # Special:ActiveUsers
 'activeusers' => 'Aktív szerkesztők listája',
-'activeusers-intro' => 'Ez a lap azon felhasználók listáját tartalmazza, akik csináltak valamilyen tevékenységet az elmúlt {{PLURAL:$1|egy|$1}} napban.',
+'activeusers-intro' => 'Ez a lap azon felhasználók listáját tartalmazza, akik végeztek valamilyen tevékenységet az elmúlt {{PLURAL:$1|egy|$1}} napban.',
 'activeusers-count' => '$1 szerkesztés az utolsó $3 napban',
 'activeusers-from' => 'Szerkesztők listázása a következő névtől kezdve:',
 'activeusers-hidebots' => 'Botok elrejtése',
index aa7b289..ca60280 100644 (file)
@@ -1371,6 +1371,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'right-upload' => 'Նիշքերի բեռնում',
 'right-upload_by_url' => 'Բեռնել նիշքեր ինտերնետային հասցեից',
 'right-delete' => 'Էջերի ջնջում',
+'right-rollback' => 'Արագ հետ գլորել տվյալ էջը վերջին անգամ խմբագրած մասնակցի խմբագրումները',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Մասնակիցների գրանցման տեղեկամատյան',
@@ -1390,6 +1391,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'action-delete' => 'Ջնջել այս էջը',
 'action-deleterevision' => 'Ջնջել այս փոփոխությունը',
 'action-deletedhistory' => 'Դիտել այս էջի ջնջված պատմությունը',
+'action-rollback' => 'արագ հետ գլորել էջը վերջին անգամ խմբագրած մասնակցի կատարած փոփոխությունները',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|փոփոխություն|փոփոխություն}}',
@@ -1905,11 +1907,12 @@ $NEWPAGE
 'rollback' => 'Հետ գլորել խմբագրումները',
 'rollback_short' => 'Հետ գլորել',
 'rollbacklink' => 'հետ գլորել',
+'rollbacklinkcount' => 'հետ գլորել $1 {{PLURAL:$1|խմբագրում}}',
 'rollbackfailed' => 'Հետ գլորումը ձախողվեց',
 'cantrollback' => 'Չհաջողվեց հետ շրջել խմբագրումը։ Վերջին ներդրումը կատարվել է էջի միակ հեղինակի կողմից։',
-'alreadyrolled' => 'Õ\89Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö\81 Õ°Õ¥Õ¿ Õ£Õ¬Õ¸Ö\80Õ¥Õ¬ [[:$1]] Õ§Õ»Õ« Õ¾Õ¥Ö\80Õ»Õ«Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ¶Õ¥Ö\80Õ¨Õ\9d Õ¯Õ¡Õ¿Õ¡Ö\80Õ¾Õ¡Õ® [[User:$2|$2]] ([[User talk:$2|Õ\94Õ¶Õ¶Õ¡Ö\80Õ¯Õ¸Ö\82Õ´]]) Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« Õ¯Õ¸Õ²Õ´Õ«Ö\81Ö\89 Õ\84Õ¥Õ¯ Õ¸Ö\82Ö\80Õ«Õ·Õ¨ Õ¡Ö\80Õ¤Õ¥Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¥Õ¬ Õ§ Õ¯Õ¡Õ´ Õ°Õ¥Õ¿ Õ§ Õ£Õ¬Õ¸Ö\80Õ¥Õ¬ էջը։
+'alreadyrolled' => 'Õ\89Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö\81 Õ°Õ¥Õ¿ Õ£Õ¬Õ¸Ö\80Õ¥Õ¬ [[:$1]] Õ§Õ»Õ¸Ö\82Õ´ [[User:$2|$2]] ([[User talk:$2|Õ\94Õ¶Õ¶Õ¡Ö\80Õ¯Õ¸Ö\82Õ´]]) Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« Õ¾Õ¥Ö\80Õ»Õ«Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ¶Õ¥Ö\80Õ¨â\80¤ Õ´Õ¥Õ¯ Õ¸Ö\82Ö\80Õ«Õ·Õ¶ Õ¡Ö\80Õ¤Õ¥Õ¶ Õ°Õ¥Õ¿ Õ§ Õ£Õ¬Õ¸Ö\80Õ¥Õ¬ Õ¯Õ¡Õ´ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¥Õ¬ Õ§ էջը։
 
\8eÕ¥Ö\80Õ»Õ«Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ¨ Õ¯Õ¡Õ¿Õ¡Ö\80Õ¾Õ¥Õ¬ Õ§ [[User:$3|$3]] ([[User talk:$3|Õ\94Õ¶Õ¶Õ¡Ö\80Õ¯Õ¸Ö\82Õ´]]) Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« Õ¯Õ¸Õ²Õ´Õ«Ö\81։',
\8eÕ¥Ö\80Õ»Õ«Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ¨ Õ¯Õ¡Õ¿Õ¡Ö\80Õ¥Õ¬ Õ§ [[User:$3|$3]] ([[User talk:$3|Õ\94Õ¶Õ¶Õ¡Ö\80Õ¯Õ¸Ö\82Õ´]]) Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö\81Õ¨։',
 'editcomment' => "Խմբագրման մեկնաբանումն էր. «''$1''»։",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|քննարկում]]) մասնակցի խմբագրումները հետ են շրջվել [[User:$1|$1]] մասնակցի վերջին տարբերակին։',
 'revertpage-nouser' => 'Հետ շրջվեց (անունը ջնջված է) մասնակցի խմբագրումը՝ [[User:$1|$1]] մասնակցի տարբերակին',
index 54d9372..5b4d84b 100644 (file)
@@ -602,7 +602,7 @@ Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].
 'gotaccount' => "Tu jam ha un conto? '''$1'''.",
 'gotaccountlink' => 'Aperir session',
 'userlogin-resetlink' => 'Datos de authentication oblidate?',
-'userlogin-resetpassword-link' => 'Reinitialisar contrasigno',
+'userlogin-resetpassword-link' => 'Contrasigno oblidate?',
 'helplogin-url' => 'Help:Aperir session',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Adjuta a aperir session]]',
 'userlogin-loggedin' => 'Tu ha jam aperite session como {{GENDER:$1|$1}}.
@@ -1136,7 +1136,8 @@ function, o le version specificate non existe, o tu essaya celar le version actu
 Altere administratores in {{SITENAME}} continuara a poter acceder al contento celate e pote restaurar lo per medio de iste mesme interfacie, si non se ha definite restrictiones additional.",
 'revdelete-confirm' => 'Per favor confirma que tu ha le intention de facer isto, que tu comprende le consequentias, e que tu face isto in accordo con [[{{MediaWiki:Policy-url}}|le politica]].',
 'revdelete-suppress-text' => "Le suppression debe '''solmente''' esser usate pro le sequente casos:
-* Informationes personal inappropriate
+* Information potentialmente diffamatori
+* Information personal inappropriate
 *: ''adresses de domicilio e numeros de telephono, numeros de securitate social, etc.''",
 'revdelete-legend' => 'Definir restrictiones de visibilitate',
 'revdelete-hide-text' => 'Texto del version',
@@ -3106,6 +3107,7 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'pageinfo-length' => 'Dimension del pagina (in bytes)',
 'pageinfo-article-id' => 'ID del pagina',
 'pageinfo-language' => 'Lingua del contento del pagina',
+'pageinfo-content-model' => 'Modello de contento de pagina',
 'pageinfo-robot-policy' => 'Indexation per robots',
 'pageinfo-robot-index' => 'Permittite',
 'pageinfo-robot-noindex' => 'Non permittite',
@@ -3762,6 +3764,9 @@ Per favor confirma que tu realmente vole recrear iste pagina.",
 'confirm-unwatch-button' => 'OK',
 'confirm-unwatch-top' => 'Remover iste pagina de tu observatorio?',
 
+# Separators for various lists, etc.
+'quotation-marks' => '“$1”',
+
 # Multipage image navigation
 'imgmultipageprev' => '← precedente pagina',
 'imgmultipagenext' => 'sequente pagina →',
index 55ab30d..2903293 100644 (file)
@@ -2965,6 +2965,7 @@ Daytoy ket mabalin a gapuanan babaen ti silpo a naiparit ti akin ruar a pagsaada
 'pageinfo-length' => 'Kaatiddog ti panid (kadagiti byte)',
 'pageinfo-article-id' => 'ID ti panid',
 'pageinfo-language' => 'Pagsasao ti naglaon a panid',
+'pageinfo-content-model' => 'Modelo ti linaon ti panid',
 'pageinfo-robot-policy' => 'Panagpasurot babaen dagiti robot',
 'pageinfo-robot-index' => 'Maipalubos',
 'pageinfo-robot-noindex' => 'Saan a maipalubos',
index b633869..bf94c90 100644 (file)
@@ -1233,8 +1233,9 @@ In quanto amministratore puoi visualizzare questo confronto di versioni; potrebb
 'revdelete-text' => "'''Le versioni cancellate restano visibili nella cronologia della pagina, mentre il testo contenuto non è accessibile al pubblico.'''
 Gli altri amministratori di {{SITENAME}} potranno accedere comunque ai contenuti nascosti e ripristinarli attraverso questa stessa interfaccia, se non sono state impostate altre limitazioni in fase di installazione del sito.",
 'revdelete-confirm' => 'Per favore conferma che questo è quanto intendi fare, che sei consapevole delle conseguenze, e che stai facendo questo nel rispetto delle [[{{MediaWiki:Policy-url}}|linee guida]].',
-'revdelete-suppress-text' => "La rimozione deve essere utilizzata '''unicamente''' nei seguenti casi:
-* Dati personali inopportuni
+'revdelete-suppress-text' => "La rimozione dovrebbe essere utilizzata '''unicamente''' nei seguenti casi:
+* informazioni potenzialmente diffamatorie
+* dati personali inopportuni
 *: ''indirizzi, numeri di telefono, codici fiscali, ecc.''",
 'revdelete-legend' => 'Imposta le seguenti limitazioni sulle versioni cancellate:',
 'revdelete-hide-text' => 'Testo della versione',
@@ -1244,8 +1245,8 @@ Gli altri amministratori di {{SITENAME}} potranno accedere comunque ai contenuti
 'revdelete-hide-user' => "Nome o indirizzo IP dell'autore",
 'revdelete-hide-restricted' => 'Nascondi le informazioni indicate anche agli amministratori',
 'revdelete-radio-same' => '(non cambiare)',
-'revdelete-radio-set' => 'Visibile',
-'revdelete-radio-unset' => 'Nascosto',
+'revdelete-radio-set' => 'Nascondi',
+'revdelete-radio-unset' => 'Mostra',
 'revdelete-suppress' => 'Nascondi le informazioni anche agli amministratori',
 'revdelete-unsuppress' => 'Elimina le limitazioni sulle revisioni ripristinate',
 'revdelete-log' => 'Motivo:',
@@ -3130,6 +3131,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'pageinfo-length' => 'Lunghezza della pagina (in byte)',
 'pageinfo-article-id' => 'ID della pagina',
 'pageinfo-language' => 'Lingua del contenuto della pagina',
+'pageinfo-content-model' => 'Modello del contenuto della pagina',
 'pageinfo-robot-policy' => 'Indicizzazione per i robot',
 'pageinfo-robot-index' => 'Consentito',
 'pageinfo-robot-noindex' => 'Non consentito',
@@ -3785,6 +3787,7 @@ Per favore, conferma che vuoi veramente ricreare questa pagina.",
 
 # Separators for various lists, etc.
 'percent' => '$1&#160;%',
+'quotation-marks' => '«$1»',
 
 # Multipage image navigation
 'imgmultipageprev' => '← pagina precedente',
index 364e212..fcc9758 100644 (file)
@@ -1365,7 +1365,7 @@ $3が示した理由: ''$2''",
 'revdelete-suppress-text' => "秘匿は、'''以下の場合に限って'''使用すべきです:
 * 名誉毀損のおそれがある記述
 * 非公開個人情報
-*: ''自宅の住所、電話番号、社会保障番号など''",
+*: ''自宅の住所、電話番号、個人を識別できる公的な番号など''",
 'revdelete-legend' => '閲覧レベル制限を設定',
 'revdelete-hide-text' => '版の本文',
 'revdelete-hide-image' => 'ファイル内容を隠す',
@@ -1374,8 +1374,8 @@ $3が示した理由: ''$2''",
 'revdelete-hide-user' => '投稿者の利用者名/IPアドレス',
 'revdelete-hide-restricted' => '他の利用者と同様に管理者からもデータを隠す',
 'revdelete-radio-same' => '(変更しない)',
-'revdelete-radio-set' => '表示',
-'revdelete-radio-unset' => 'é\9d\9e表示',
+'revdelete-radio-set' => '非公開',
+'revdelete-radio-unset' => 'é\96²è¦§å\8f¯è\83½',
 'revdelete-suppress' => '他の利用者と同様に管理者からもデータを隠す',
 'revdelete-unsuppress' => '復元版に対する制限を除去',
 'revdelete-log' => '理由:',
@@ -3295,6 +3295,7 @@ $2',
 'tooltip-undo' => '「取り消し」はこの編集を差し戻し、編集画面をプレビュー付きで開きます。要約欄に理由を追加できます。',
 'tooltip-preferences-save' => '設定を保存する',
 'tooltip-summary' => '短い要約を入力してください',
+'interlanguage-link-title' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/* ここに記述したCSSはすべての外装に反映されます */',
@@ -3359,6 +3360,7 @@ $2',
 'pageinfo-length' => 'ページの長さ (バイト単位)',
 'pageinfo-article-id' => 'ページ ID',
 'pageinfo-language' => 'ページ本文の言語',
+'pageinfo-content-model' => 'ページのコンテンツ モデル',
 'pageinfo-robot-policy' => 'ロボットによるインデックス作成',
 'pageinfo-robot-index' => '許可',
 'pageinfo-robot-noindex' => '不許可',
index 5a69ad8..e92b511 100644 (file)
@@ -689,9 +689,8 @@ $2',
 'passwordsent' => 'ახალი პაროლი გაიგზავნა ელ-ფოსტით მომხმარებელს "$1".
 გთხოვთ შეხვიდეთ სისტემაში მისი მიღების შემდეგ.',
 'blocked-mailpassword' => 'თქვენი IP მისამართი რედაქტირებისთვის დაბლოკილია, ამიტომ არ შეგიძლიათ პაროლის აღდგენის გამოყენება კონფლიქტის გამო.',
-'eauthentsent' => 'დამადასტურებელი შეტყობინება გაიგზავნა თქვენს მიერ მითითებულ ელ. ფოსტის მისამართზე.
-სანამ ნებისმიერი სხვა შეტყობინება გაიგზავნებოდეს თქვენს ანგარიშზე, გთხოვთ მიჰყვეთ ელ.
-ფოსტაში მითითებულ ინსტრუქციებს, რათა დაადასტუროთ რომ ანგარიში ნამდვილად თქვენია.',
+'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' => 'პაროლის შეხსენება უკვე გაგზავნილია ბოლო {{PLURAL:$1|საათის|$1 საათის}} განმავლობაში.
 ბოროტად გამოყენების თავიდან აცილებისთვის, მხოლოდ ერთი შეხსენება იგზავნება ყოველ {{PLURAL:$1|საათში|$1 საათში}}.',
 'mailerror' => 'შეცდომა ფოსტის გაგზავნაში: $1',
@@ -713,8 +712,8 @@ $2',
 
 შეგიძლიათ ყურადღება არ მიაქციოთ ამ შეტყობინებას, თუ ანგარიში შეცდომით შეიქმნა.',
 'usernamehasherror' => 'მომხმარებლის სახელი არ უნდა შეიცავდეს დიეზის სიმბოლოს.',
-'login-throttled' => 'თქვენ განახორციელეთ ძალიან ბევრი პაროლის შეყვანა ამ ანგარიშისთვის.
-გამორებით შეყვანამდე გთხოვთ დაელოდოთ.',
+'login-throttled' => 'You have made too many recent login attempts.
+Please wait $1 before trying again.',
 'login-abort-generic' => 'თქვენი ავტორიზაცია წარუმატებელია – გაუქმდა',
 'loginlanguagelabel' => 'ენა: $1',
 'suspicious-userlogout' => 'თქვენი მოთხოვნა გასვლის შესახებ გაუქმებულია, რადგანაც იგი გავს ქეშირებადი პროქსის ან არაკორექტული ბრაუზერის მოთხოვნას.',
@@ -1011,7 +1010,7 @@ $2
 
 # Content models
 'content-model-wikitext' => 'ვიკიტექსტი',
-'content-model-text' => 'á\83£á\83\91á\83 á\83\90á\83\9aá\83\9d ტექსტი',
+'content-model-text' => 'á\83©á\83\95á\83\94á\83£á\83\9aá\83\94á\83\91á\83 á\83\98á\83\95á\83\98 ტექსტი',
 'content-model-javascript' => 'ჯავასკრიპტი',
 'content-model-css' => 'CSS',
 
@@ -1717,7 +1716,7 @@ $1",
 'savefile' => 'ფაილის შენახვა',
 'uploadedimage' => 'აიტვირთა „[[$1]]“',
 'overwroteimage' => 'ატვირთულია „[[$1]]-ის“ ახალი ვერსია',
-'uploaddisabled' => 'á\83\90á\83¢á\83\95á\83\98á\83 á\83\97á\83\95á\83\90 á\83¨á\83\94á\83£á\83«á\83\9aá\83\94á\83\91á\83\94á\83\9aá\83\98á\83\90',
+'uploaddisabled' => 'á\83\90á\83¢á\83\95á\83\98á\83 á\83\97á\83\95á\83\90 á\83\92á\83\90á\83\9bá\83\9dá\83 á\83\97á\83£á\83\9aá\83\98á\83\90.',
 'copyuploaddisabled' => 'URL ატვირთვა გაღიშულია',
 'uploadfromurl-queued' => 'თქვენი ატვირთვა რიგში ჩადგა.',
 'uploaddisabledtext' => 'ფაილების ატვირთვა შეუძლებელია.',
@@ -2515,7 +2514,7 @@ $1',
 'blanknamespace' => '(მთავარი)',
 
 # Contributions
-'contributions' => '{{GENDER:$1|á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\98}} წვლილი',
+'contributions' => '{{GENDER:$1|á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡}} წვლილი',
 'contributions-title' => 'მომხმარებლის წვლილი $1',
 'mycontris' => 'წვლილი',
 'contribsub2' => 'მომხმარებელი {{GENDER:$3|$1}} წვლილი ($2)',
@@ -2986,7 +2985,7 @@ $2',
 'tooltip-undo' => 'შეტანილი ცვლილებების გაუქმება და წინასწარ გადახედვის ჩვენება, გაუქმების მიზეზის სქოლიოში ჩაწერასთან ერთად.',
 'tooltip-preferences-save' => 'შეინახეთ კონფიგურაცია',
 'tooltip-summary' => 'შეიყვანეთ მოკლე სქოლიო',
-'tooltip-iwiki' => '$1 — $2',
+'interlanguage-link-title' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/** აქ ჩასმული CSS გამოყენებული იქნება გაფორმების ყველა გარეკანზე */',
@@ -3696,20 +3695,18 @@ $5
 
 წერილი მოძველდება $4.',
 'confirmemail_body_set' => 'ვიღაცამ, შესაძლოა თქვენ, IP მისამართით $1,
\83¨á\83\94á\83ªá\83\95á\83\90á\83\9aá\83\90 á\83\90á\83\9cá\83\90á\83 á\83\98á\83¨á\83\98á\83¡ á\83\98á\83\9bá\83\94á\83\98á\83\9aá\83\98 "$2" á\83\90á\83\9b á\83\94á\83\9a\83¤á\83\9dá\83¡á\83¢á\83\98á\83¡ á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\98á\83\97 {{SITENAME}}-á\83\96á\83\94.
\83\9eá\83 á\83\9dá\83\94á\83¥á\83¢á\83¨á\83\98 {{SITENAME}} á\83¨á\83\94á\83ªá\83\95á\83\90á\83\9aá\83\90 á\83\94á\83\9a\83¤á\83\9dá\83¡á\83¢á\83\98á\83¡ á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\98 á\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83\98á\83¡á\83\90á\83\97á\83\95á\83\98á\83¡ "$2" á\83\90á\83\9b á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\98á\83\97.
 
 იმის დასადასტურებლად, რომ ეს ანგარიში ნამდვილად თქვენ გეკუთვნით
-და ელ-ფოსტის შესაძლებლობების  გადააქტიურებლად {{SITENAME}} გვერდზე,
-
-გახსენით ეს ბმული თქვენს ბრაუზერში:
+და ელ.ფოსტის შესაძლებლობების  გასააქტიურებლად საიტზე {{SITENAME}}, გახსენით ეს ბმული თქვენს ბრაუზერში:
 
 $3
 
\83\97á\83£ á\83\94á\83¡ á\83\97á\83¥á\83\95á\83\94á\83\9c *á\83\90á\83 * á\83\98á\83§á\83\90á\83\95á\83\98á\83\97, á\83\9bá\83\90á\83¨á\83\98á\83\9c á\83\9cá\83£ á\83¨á\83\94á\83®á\83\95á\83\90á\83\9aá\83\97 á\83\9bá\83\98á\83§á\83\94á\83\95á\83\98á\83\97 á\83\90á\83\9b á\83\91á\83\9bá\83£á\83\9aá\83¡ á\83\98á\83\9bá\83\94á\83\98á\83\9aá\83\98á\83¡ á\83¨á\83\94á\83\9bá\83\9dá\83¬á\83\9bá\83\94á\83\91á\83\98á\83¡ á\83\92á\83\90á\83¡á\83\90á\83\97á\83\98á\83¨á\83\90á\83\93.
\83\97á\83£ á\83\94á\83¡ á\83\97á\83¥á\83\95á\83\94á\83\9c *á\83\90á\83 * á\83\98á\83§á\83\90á\83\95á\83\98á\83\97, á\83\9bá\83\90á\83¨á\83\98á\83\9c á\83\94á\83\9a\83¤á\83\9dá\83¡á\83¢á\83\98á\83¡ á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\98á\83¡ á\83\93á\83\90á\83¡á\83¢á\83£á\83 á\83\94á\83\91á\83\98á\83¡ á\83\92á\83\90á\83¡á\83\90á\83£á\83¥á\83\9bá\83\94á\83\91á\83\9aá\83\90á\83\93, á\83\92á\83\90á\83\93á\83\90á\83\93á\83\98á\83\97 á\83\90á\83\9b á\83\91á\83\9bá\83£á\83\9aá\83\96á\83\94:
 
 $5
 
-წერილი მოძველდება $4.',
+წერილის ვადის გასვლის თარიღია $4.',
 'confirmemail_invalidated' => 'ელ-ფოსტის დადასტურება გაუქმდა',
 'invalidateemail' => 'ელ-ფოსტის დადასტურების გაუქმება',
 
index 36c0437..4632570 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Erdemaslancan
+ * @author Gorizon
  * @author Mirzali
  */
 
@@ -280,7 +281,7 @@ $1',
 'pool-errorunknown' => 'Xeta nêzanıtiye',
 
 # 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' => 'Heqa {{SITENAME}} de',
+'aboutsite' => 'Heqdé {{SITENAME}}',
 'aboutpage' => 'Project:Heqa',
 'copyright' => 'Zerrek bınê $1 dero.',
 'copyrightpage' => '{{ns:project}}:Telifheqiye',
index 8163914..27ae6c3 100644 (file)
@@ -1027,7 +1027,7 @@ IP-мекенжайыңыз бұл беттің түзету тарихында
 'blockednoreason' => 'еш себебі келтірілмеген',
 'whitelistedittext' => 'Беттерді өңдеу үшін сізде $1 болуы керек.',
 'confirmedittext' => 'Беттерді өңдеу үшін алдын ала Е-пошта мекенжайыңызды құптауыңыз жөн.
-Е-пошта мекенжайыңызды [Special:Preferences}}|қатысушы бапталымдарыңыз]] арқылы қойыңыз да жарамдылығын тексеріп шығыңыз.',
+Е-пошта мекенжайыңызды [[Special:Preferences|қатысушы бапталымдарыңыз]] арқылы қойыңыз да жарамдылығын тексеріп шығыңыз.',
 'nosuchsectiontitle' => 'Бұл бөлімді табу мүмкін емес',
 'nosuchsectiontext' => 'Сіз бұрын болмаған бөлімді өзгертпекшісіз.
 Мүмкін бұл бетті қарап жатқаныңызда ол бөлім жойылған немесе басқа орынға көшірілген.',
index 98fd3f7..8bf3c4b 100644 (file)
@@ -1346,8 +1346,8 @@ $2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개
 'revdelete-hide-user' => '편집자의 사용자 이름/IP 주소',
 'revdelete-hide-restricted' => '관리자도 보지 못하게 숨기기',
 'revdelete-radio-same' => '(바꾸지 않음)',
-'revdelete-radio-set' => '보이기',
-'revdelete-radio-unset' => '숨기기',
+'revdelete-radio-set' => '숨겨짐',
+'revdelete-radio-unset' => '보여짐',
 'revdelete-suppress' => '문서 내용을 관리자에게도 보이지 않게 숨기기',
 'revdelete-unsuppress' => '되살린 판에 대한 제한을 해제',
 'revdelete-log' => '이유:',
@@ -3252,7 +3252,7 @@ $2',
 'tooltip-undo' => '"편집 취소" 기능을 사용하면 이 편집이 되돌려지고 차이 보기 기능이 미리 보기 형식으로 나타납니다. 편집 요약에 이 편집을 왜 되돌리는지에 대한 이유를 쓸 수 있습니다.',
 'tooltip-preferences-save' => '환경 설정 저장하기',
 'tooltip-summary' => '짧은 요약을 적어주세요',
-'tooltip-iwiki' => '$2 - $1',
+'interlanguage-link-title' => '$2 - $1',
 
 # Stylesheets
 'common.css' => '/* 이 CSS 설정은 모든 스킨에 동일하게 적용됩니다 */',
@@ -3317,6 +3317,7 @@ $2',
 'pageinfo-length' => '문서 길이 (바이트)',
 'pageinfo-article-id' => '문서 ID',
 'pageinfo-language' => '문서 내용 언어',
+'pageinfo-content-model' => '문서 콘텐츠 모델',
 'pageinfo-robot-policy' => '로봇에 의한 색인',
 'pageinfo-robot-index' => '허용됨',
 'pageinfo-robot-noindex' => '불허됨',
index d7a4bbc..8ca6999 100644 (file)
@@ -1449,7 +1449,7 @@ Adspectum graciliorem potes facere modum indicum, nomen usoris (cave litteras ma
 'allnotinnamespace' => 'Omnes paginae (quibus in spatio nominali $1 exclusis)',
 'allpagesprev' => 'Superior',
 'allpagesnext' => 'Proxima',
-'allpagessubmit' => 'Ire',
+'allpagessubmit' => 'Adhibere',
 'allpagesprefix' => 'Monstrare paginas quibus est praeverbium:',
 'allpagesbadtitle' => 'Nomen paginae datum fuit invalidum aut praverbium interlinguale vel interviciale habuit. Fortasse insunt una aut plus litterarum quae in titulis non possunt inscribier.',
 'allpages-bad-ns' => 'Non est spatium nominale "$1" apud {{grammar:accusative|{{SITENAME}}}}.',
@@ -1719,6 +1719,7 @@ Si pagina nova cum ipso nomine post deletionem creata est, emendationes restitut
 # Namespace form on various pages
 'namespace' => 'Spatium nominale:',
 'invert' => 'Selectionem invertere',
+'namespace_association' => 'Spatium nominale pertinens',
 'blanknamespace' => '(principale)',
 
 # Contributions
index 8fab4fb..d0cfffc 100644 (file)
@@ -1152,8 +1152,8 @@ Aner {{SITENAME}}-Administrateure kënnen de geläschten Inhalt oder aner geläs
 'revdelete-hide-user' => 'Dem Auteur säi Benotzernumm/IP-Adress',
 'revdelete-hide-restricted' => 'Donnéeën och fir Administrateuren suppriméieren geneesou wéi fir déi Aner',
 'revdelete-radio-same' => '(net änneren)',
-'revdelete-radio-set' => 'Visibel',
-'revdelete-radio-unset' => 'Verstoppt',
+'revdelete-radio-set' => 'Verstoppt',
+'revdelete-radio-unset' => 'Visibel',
 'revdelete-suppress' => 'Grond vum Läschen och fir Administrateure verstoppt',
 'revdelete-unsuppress' => 'Limitatiounen fir restauréiert Versiounen ophiewen',
 'revdelete-log' => 'Grond:',
@@ -3002,7 +3002,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 Erlaabt et e Grond an de Resumé derbäizesetzen.',
 'tooltip-preferences-save' => 'Astellunge späicheren',
 'tooltip-summary' => 'Gitt e kuerze Resumé an',
-'tooltip-iwiki' => '$1 - $2',
+'interlanguage-link-title' => '$1 - $2',
 
 # Stylesheets
 'common.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Chick''  */",
@@ -3052,6 +3052,7 @@ Fëllt dëst '''NET''' aus!",
 'pageinfo-length' => 'Gréisst vun der Säit (a Bytes)',
 'pageinfo-article-id' => 'ID (Nummer) vun der Säit',
 'pageinfo-language' => 'Sprooch vum Inhalt vun der Säit',
+'pageinfo-content-model' => 'Modell vun enger Säit mat Inhalt',
 'pageinfo-robot-policy' => 'Indexéierung duerch Botten',
 'pageinfo-robot-index' => 'Erlaabt',
 'pageinfo-robot-noindex' => 'Net erlaabt',
index 1cf0f51..801fdec 100644 (file)
@@ -1334,9 +1334,10 @@ $2
 'revdelete-text' => "'''Избришаните измени и настани сѐ уште ќе се појавуваат во историјата на страницата и дневниците, но делови од нивната содржина ќе бидат недостапни за јавноста.'''
 Други администратори на {{SITENAME}} сѐ уште ќе имаат пристап до скриената содржина и ќе можат да ја вратат преку истиот посредник, освен ако не се поставени дополнителни ограничувања.",
 'revdelete-confirm' => 'Потврдете дека сакате да го направите ова, дека ги сфаќате последиците, и дека тоа го правите во согласност со [[{{MediaWiki:Policy-url}}|правилата]].',
-'revdelete-suppress-text' => "Ограничувањето '''се користи''' само во следниве случаи:
+'revdelete-suppress-text' => "Притајувањето се користи '''само''' во следниве случаи:
+* Потенцијално клеветнички информации
 * Несоодветни лични информации
-*: ''домашни адреси и телефонски броеви, матични броеви, и.т.н.''",
+*: ''домашни адреси и телефонски броеви, матични броеви и тн.''",
 'revdelete-legend' => 'Постави ограничувања за видливост',
 'revdelete-hide-text' => 'Текст на ревизијата',
 'revdelete-hide-image' => 'Скриј содржина на податотека',
@@ -3244,7 +3245,7 @@ $2',
 'tooltip-undo' => '„Откажи“ го поништува ова уредување и ве носи на уредувањето во режим на преглед. Дава можност за наведување на причина во описот.',
 'tooltip-preferences-save' => 'Зачувај',
 'tooltip-summary' => 'Внесете краток опис',
-'tooltip-iwiki' => '$1 — $2',
+'interlanguage-link-title' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/* Тука поставениот CSS ќе се применува врз сите рува */',
@@ -3309,6 +3310,7 @@ $2',
 'pageinfo-length' => 'Должина на страницата (во бајти)',
 'pageinfo-article-id' => 'Назнака на страницата',
 'pageinfo-language' => 'Јазик на содржината на страницата',
+'pageinfo-content-model' => 'Модел на содржината на страницата',
 'pageinfo-robot-policy' => 'Индексирање со роботи',
 'pageinfo-robot-index' => 'Дозволено',
 'pageinfo-robot-noindex' => 'Недозволено',
@@ -4035,6 +4037,7 @@ $5
 
 # Separators for various lists, etc.
 'percent' => '$1&#160;%',
+'quotation-marks' => '„$1“',
 
 # Multipage image navigation
 'imgmultipageprev' => '&larr; претходна страница',
index e4f438e..f8549a6 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Abhishek Jacob
+ * @author Akhilan
  * @author Anoopan
  * @author Chrisportelli
  * @author Deepugn
@@ -2169,6 +2170,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 
 'pageswithprop' => 'താളിന്റെ സവിശേഷതകളുള്ള താളുകൾ',
 'pageswithprop-legend' => 'ഒരു താൾ സവിശേഷതയുള്ള താളുകൾ',
+'pageswithprop-prop' => 'ഗുണം:',
 'pageswithprop-submit' => 'പോകൂ',
 
 'doubleredirects' => 'ഇരട്ട തിരിച്ചുവിടലുകൾ',
index 4edacf7..e6fcd03 100644 (file)
@@ -186,11 +186,11 @@ $messages = array(
 'hidden-categories' => '{{PLURAL:$1|ဝှက်ထားသော ကဏ္ဍ|ဝှက်ထားသော ကဏ္ဍများ}}',
 'hidden-category-category' => 'ဝှက်ထားသော ကဏ္ဍများ',
 'category-subcat-count' => '{{PLURAL:$2|ဤကဏ္ဍတွင် အောက်ပါ ကဏ္ဍခွဲသာ ရှိသည်။ |ဤကဏ္ဍတွင် စုစုပေါင်း $2 ခု အနက်မှ အောက်ပါ {{PLURAL:$1|ကဏ္ဍခွဲ|ကဏ္ဍခွဲ $1 ခု}} ရှိသည်။}}',
-'category-subcat-count-limited' => 'ဤကဏ္ဍတွင် အောက်ပါ {PLURAL:$1|ကဏ္ဍခွဲ|$1 ကဏ္ဍခွဲများ}} ရှိသည်။',
+'category-subcat-count-limited' => 'ဤကဏ္ဍတွင် အောက်ပါ {{PLURAL:$1|ကဏ္ဍခွဲ|$1 ကဏ္ဍခွဲများ}} ရှိသည်။',
 'category-article-count' => '{{PLURAL:$2|ဤကဏ္ဍတွင် အောက်ပါစာမျက်နှာသာ ရှိသည်။|စုစုပေါင်း $2 အနက်မှ အောက်ပါ {{PLURAL:$1|စာမျက်နှာသည်|စာမျက်နှာ $1 ခုသည်}} ဤကဏ္ဍတွင် ရှိသည်။}}',
 'category-article-count-limited' => 'အောက်ပါ{{PLURAL:$1|စာမျက်နှာ|$1 စာမျက်နှာများ}} သည် လက်ရှိကဏ္ဍတွင် ရှိသည်။',
 'category-file-count' => '{{PLURAL:$2|ဤကဏ္ဍတွင် အောက်ပါဖိုင်သာ ရှိသည်။|စုစုပေါင်း $2 အနက်မှ အောက်ပါ {{PLURAL:$1|ဖိုင် သည်|ဖိုင် $1 ခုသည်}} ဤကဏ္ဍတွင် ရှိသည်။}}',
-'category-file-count-limited' => 'အောက်ပါ {PLURAL:$1|စာမျက်နှာ|$1 စာမျက်နှာများ}} သည် လက်ရှိစာမျက်နှာတွင် ရှိသည်။',
+'category-file-count-limited' => 'အောက်ပါ {{PLURAL:$1|စာမျက်နှာ|$1 စာမျက်နှာများ}} သည် လက်ရှိစာမျက်နှာတွင် ရှိသည်။',
 'listingcontinuesabbrev' => 'ပံ့ပိုး',
 'index-category' => 'အက္ခရာစဉ် စာမျက်နှာများ',
 'noindex-category' => 'အက္ခရာစဉ် စာမျက်နှာများမရှိ',
index a9eba0c..432caf8 100644 (file)
@@ -208,7 +208,7 @@ $messages = array(
 'create-this-page' => 'Khai-sí siá chit ia̍h',
 'delete' => 'Thâi',
 'deletethispage' => 'Thâi chit ia̍h',
-'undelete_short' => 'Kiù {{PLURAL:$1|$1|$1} ê siu-kái',
+'undelete_short' => 'Kiù {{PLURAL:$1|$1|$1}} ê siu-kái',
 'viewdeleted_short' => 'Khoàⁿ {{PLURAL:$1|chi̍t-ê thâi tiàu--ê pian-chi̍p|$1 ê thâi tiàu--ê pian-chi̍p}}',
 'protect' => 'Pó-hō·',
 'protect_change' => 'kái-piàn',
index cd16f34..13c991e 100644 (file)
@@ -324,12 +324,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Skjul patruljerte redigeringer i siste endringer',
 'tog-newpageshidepatrolled' => 'Skjul patruljerte sider fra listen over nye sider',
 'tog-extendwatchlist' => 'Utvid overvåkningslisten til å vise alle endringer, ikke bare de siste',
-'tog-usenewrc' => 'Grupper endringer i siste endringer og overvåkingslistte (krever JavaScript)',
+'tog-usenewrc' => 'Gruppeendringer per side i siste endringer samt overvåkingsliste',
 'tog-numberheadings' => 'Autonummerer overskrifter',
-'tog-showtoolbar' => 'Vis verktøylinje (krever JavaScript)',
-'tog-editondblclick' => 'Rediger sider ved å dobbeltklikke (krever JavaScript)',
+'tog-showtoolbar' => 'Vis verktøylinje',
+'tog-editondblclick' => 'Rediger sider ved å dobbeltklikke',
 'tog-editsection' => 'Rediger avsnitt ved hjelp av [rediger]-lenke',
-'tog-editsectiononrightclick' => 'Rediger avsnitt ved å høyreklikke på avsnittsoverskrift (JavaScript)',
+'tog-editsectiononrightclick' => 'Rediger avsnitt ved å høyreklikke på avsnittsoverskrift',
 'tog-showtoc' => 'Vis innholdsfortegnelse (for sider med flere enn tre avsnitt)',
 'tog-rememberpassword' => 'Husk meg i denne nettleseren (i høyst $1 {{PLURAL:$1|dag|dager}})',
 'tog-watchcreations' => 'Legg til sider jeg oppretter og filer jeg laster opp i min overvåkingsliste',
@@ -347,7 +347,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Vis antall brukere som overvåker',
 'tog-oldsig' => 'Nåværende signatur:',
 'tog-fancysig' => 'Behandle signaturen som wikitekst (uten automatisk lenke)',
-'tog-uselivepreview' => 'Bruk levende forhåndsvisning (eksperimentell JavaScript)',
+'tog-uselivepreview' => 'Bruk levende forhåndsvisning (eksperimentelt)',
 'tog-forceeditsummary' => 'Advar meg når jeg ikke gir noen redigeringsforklaring',
 'tog-watchlisthideown' => 'Skjul mine endringer fra overvåkningslisten',
 'tog-watchlisthidebots' => 'Skjul robotendringer fra overvåkningslisten',
@@ -564,7 +564,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' => 'Om {{SITENAME}}',
 'aboutpage' => 'Project:Om',
-'copyright' => 'Innholdet er tilgjengelig under $1.',
+'copyright' => 'Innholdet er tilgjengelig under $1 med mindre annet er spesifikt angitt.',
 'copyrightpage' => '{{ns:project}}:Opphavsrett',
 'currentevents' => 'Aktuelt',
 'currentevents-url' => 'Project:Aktuelt',
@@ -827,13 +827,13 @@ og fortsette å bruke det gamle passordet.',
 'passwordsent' => 'Et nytt passord har blitt sendt til e-postadressen registrert for «$1».
 Logg inn når du har mottatt det nye passordet.',
 'blocked-mailpassword' => 'IP-adressen din er blokkert fra å redigere, og for å forhindre misbruk kan du heller ikke bruke funksjonen som gir deg nytt passord.',
-'eauthentsent' => 'En bekreftelsesmelding ble sendt til gitte e-postadresse. Før andre e-poster kan sendes til kontoen må du følge instruksjonene i e-posten for å bekrefte at kontoen faktisk er din.',
+'eauthentsent' => 'En bekreftelsesmelding ble sendt til oppgitt e-postadresse. Før andre e-poster kan sendes til kontoen må du følge instruksjonene i e-posten for å bekrefte at kontoen faktisk er din.',
 'throttled-mailpassword' => 'En passordtilbakestillingsepost har allerede blitt sendt for mindre enn {{PLURAL:$1|en time|$1 timer}} siden.
 For å forhindre misbruk kan kun én passordtilbakestillingsepost sendes per {{PLURAL:$1|time|$1 timer}}.',
 'mailerror' => 'Feil under sending av e-post: $1',
 'acct_creation_throttle_hit' => 'Gjester med samme IP-adresse som deg har opprettet {{PLURAL:$1|én konto|$1 kontoer}} det siste døgnet, og det er ikke tillatt å opprette flere.
 Som et resultat kan det ikke opprettes flere kontoer fra denne IP-adressen.',
-'emailauthenticated' => 'Din e-postadresse ble bekreftet $2 $3.',
+'emailauthenticated' => 'Din e-postadresse ble bekreftet den $2 kl. $3.',
 'emailnotauthenticated' => 'Din e-postadresse er ikke bekreftet. Du vil ikke kunne motta e-post for noen av følgende egenskaper.',
 'noemailprefs' => 'Oppgi en e-postadresse for at disse funksjonene skal fungere.',
 'emailconfirmlink' => 'Bekreft e-postadressen din.',
@@ -1278,7 +1278,7 @@ Andre administratorer på {{SITENAME}} vil fortsatt kunne se det skjulte innhold
 'revdelete-hide-image' => 'Skjul filinnhold',
 'revdelete-hide-name' => 'Skjul handling og mål',
 'revdelete-hide-comment' => 'Skjul redigeringsforklaring',
-'revdelete-hide-user' => 'Skjul bidragsyters brukernavn eller IP',
+'revdelete-hide-user' => 'Skjul bidragsyters brukernavn eller IP-adresse',
 'revdelete-hide-restricted' => 'La disse begrensningene gjelde for administratorer også',
 'revdelete-radio-same' => '(ikke endre)',
 'revdelete-radio-set' => 'Ja',
@@ -1462,7 +1462,7 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
 'prefs-rendering' => 'Utseende',
 'saveprefs' => 'Lagre',
 'resetprefs' => 'Tilbakestill ulagrede endringer',
-'restoreprefs' => 'Tilbakestill til standardinnstillinger overalt',
+'restoreprefs' => 'Tilbakestill alt til standardinnstillinger',
 'prefs-editing' => 'Redigering',
 'rows' => 'Rader:',
 'columns' => 'Kolonner',
@@ -1708,8 +1708,8 @@ Informasjonen vil være offentlig.',
 'action-block' => 'blokkere denne brukeren fra å redigere',
 'action-protect' => 'endre denne sidens beskyttelsesnivåer',
 'action-rollback' => 'raskt tilbakestille endringene til den siste brukeren som redigerte en bestemt side',
-'action-import' => 'importere denne siden fra en annen wiki',
-'action-importupload' => 'importere denne siden fra en opplastet fil',
+'action-import' => 'importere sider fra en annen wiki',
+'action-importupload' => 'importere sider fra en filopplasting',
 'action-patrol' => 'merke andre brukeres redigeringer som patruljert',
 'action-autopatrol' => 'merke redigeringene dine som patruljert',
 'action-unwatchedpages' => 'vise listen over uovervåkede sider',
@@ -1758,7 +1758,7 @@ Informasjonen vil være offentlig.',
 'rc_categories_any' => 'Alle',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte}} etter endring',
 'newsectionsummary' => '/* $1 */ ny seksjon',
-'rc-enhanced-expand' => 'Vis detaljer (krever JavaScript)',
+'rc-enhanced-expand' => 'Vis detaljer',
 'rc-enhanced-hide' => 'Skjul detaljer',
 'rc-old-title' => 'opprinnelig opprettet som «$1»',
 
@@ -2502,9 +2502,11 @@ Se $2 for en oversikt over de siste slettingene.',
 'deleteotherreason' => 'Annen/utdypende grunn:',
 'deletereasonotherlist' => 'Annen grunn',
 'deletereason-dropdown' => '* Vanlige grunner for sletting
-** På forfatters forespørsel
+** Spam
+** Vandalisme
 ** Opphavsrettsbrudd
-** Vandalisme',
+** På forfatters forespørsel 
+** Råtten omdirigering',
 'delete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
 'delete-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Muligheten til å slette slike sider er begrenset for å unngå utilsiktet forstyrring av {{SITENAME}}.',
 'delete-warning-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Sletting av denne siden kan forstyrre databasen til {{SITENAME}}; vær varsom.',
index a7dd270..6a03476 100644 (file)
@@ -759,7 +759,7 @@ Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] an te pas
 'gotaccount' => "Stao'j al in-eschreven? '''$1'''.",
 'gotaccountlink' => 'Anmelden',
 'userlogin-resetlink' => "Bi'j de anmeldgegevens kwiet?",
-'userlogin-resetpassword-link' => 'Joew wachtwoord opniej instellen',
+'userlogin-resetpassword-link' => 'Joew wachtwoord vergeten?',
 'helplogin-url' => 'Help:Anmelden',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulpe bie t anmelden]]',
 'userlogin-loggedin' => 'Je bin al an-emeld as {{GENDER:$1|$1}}.
@@ -827,7 +827,7 @@ en blief joew bestaonde wachtwoord gebruken.',
 'noemailcreate' => 'Je mutten n geldig netpostadres opgeven',
 'passwordsent' => 'Der is n niej wachtwoord verstuurd naor t netpostadres van gebruker "$1". Meld an, a\'j t wachtwoord ontvangen.',
 'blocked-mailpassword' => "Dit IP-adres is eblokkeerd. Dit betekent da'j niet bewarken kunnen en dat {{SITENAME}} joew wachtwoord niet weerummehaolen kan, dit wörden edaon um misbruuk tegen te gaon.",
-'eauthentsent' => "Der is n bevestigingsberich naor t op-egeven netpostadres verstuurd. Veurdat der veerdere berichten naor dit netpostadres verstuurd kunnen wörden, mu'j de instruksies volgen in t toe-esturen berich, um te bevestigen da'j joe eigen daodwarkelik an-emeld hebben.",
+'eauthentsent' => "Der is n bevestigingsbericht naor t op-egeven netpostadres verstuurd. Veurdat der veerdere berichten naor dit netpostadres verstuurd kunnen wörden, mu'j de instruksies volgen in t toe-estuurden bericht, um te bevestigen da'j joew eigen daodwarkelik an-emeld hebben.",
 'throttled-mailpassword' => 'In {{PLURAL:$1|t veurbieje ure|de veurbieje $1 uren}} is der al n wachtwoordherinnering estuurd.
 Um misbruuk te veurkoemen wörden der mer één wachtwoordherinnering per {{PLURAL:$1|ure|$1 uren}} verstuurd.',
 'mailerror' => 'Fout bie t versturen van bericht: $1',
@@ -1262,15 +1262,15 @@ Beheerders van {{SITENAME}} kunnen de verbörgen inhoud bekieken en t weerummepl
 * Ongepassen persoonlike informasie
 *: ''adressen en tillefoonnummers, burgerservicenummers, en gao zo mer deur.''",
 'revdelete-legend' => 'Stel versiebeparkingen in:',
-'revdelete-hide-text' => 'Verbarg de bewarken tekste',
+'revdelete-hide-text' => 'Versietekste',
 'revdelete-hide-image' => 'Verbarg bestaandsinhoud',
 'revdelete-hide-name' => 'Verbarg logboekaksie',
-'revdelete-hide-comment' => 'Verbarg bewarkingssamenvatting',
-'revdelete-hide-user' => 'Verbarg gebrukersnamen en IP-adressen van aandere luui.',
+'revdelete-hide-comment' => 'Bewarkingssamenvatting',
+'revdelete-hide-user' => 'Gebrukersnaam/IP-adres van disse gebruker',
 'revdelete-hide-restricted' => 'Gegevens veur beheerders en aander volk onderdrokken',
 'revdelete-radio-same' => '(niet wiezigen)',
-'revdelete-radio-set' => 'Ja',
-'revdelete-radio-unset' => 'Nee',
+'revdelete-radio-set' => 'Zichtbaor',
+'revdelete-radio-unset' => 'Verbörgen',
 'revdelete-suppress' => 'Gegevens veur beheerders en aander volk onderdrokken',
 'revdelete-unsuppress' => 'Beparkingen veur weerummezetten versies vortdoon',
 'revdelete-log' => 'Reden:',
@@ -3119,7 +3119,7 @@ De tiedelike map is niet anwezig.',
 Iej könt in de bewearkingssamenvatting n reden opgeven.',
 'tooltip-preferences-save' => 'Vuurkeuren opsloan',
 'tooltip-summary' => 'Voer ne korte samenvatting in',
-'tooltip-iwiki' => '$1 – $2',
+'interlanguage-link-title' => '$1 – $2',
 
 # Metadata
 'notacceptable' => 'De wikiserver kan de gegevens niet leveren in n vorm die joew kliënt kan lezen.',
@@ -3160,6 +3160,7 @@ Hier '''NIKS''' invullen!",
 'pageinfo-length' => 'Ziedlengte (in bytes)',
 'pageinfo-article-id' => 'Zied-ID',
 'pageinfo-language' => 'Taal veur de zied',
+'pageinfo-content-model' => 'Ziedinhoudsmodel',
 'pageinfo-robot-policy' => 'Indexering deur bots',
 'pageinfo-robot-index' => 'Toe-estaon',
 'pageinfo-robot-noindex' => 'Niet toe-estaon',
@@ -3801,6 +3802,9 @@ De bevestigingskode zal verlopen op $4.',
 'confirm-unwatch-button' => 'Oké',
 'confirm-unwatch-top' => 'Disse zied van joew volglieste aofhaolen?',
 
+# Separators for various lists, etc.
+'quotation-marks' => '"$1"',
+
 # Multipage image navigation
 'imgmultipageprev' => '&larr; veurige',
 'imgmultipagenext' => 'volgende &rarr;',
@@ -3911,7 +3915,7 @@ Samen mit dit programma heur je n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de
 # Special:Redirect
 'redirect' => 'Deurverwiezen op bestaandsnaam, gebrukersnummer of versienummer',
 'redirect-legend' => 'Deurverwiezen naor n bestaand of zied',
-'redirect-summary' => 'Disse spesiale zied verwis deur naor n bestaand (as n bestaandsnaam op-egeven wörden), n zied (as n versienummer op-egeven wörden) of n gebrukerszied (as t gebrukersnummer op-egeven wörden).',
+'redirect-summary' => 'Disse spesiale zied verwis deur naor n bestaand (as de bestaandsnaam op-egeven wörden), n zied (as n versienummer op-egeven wörden) of n gebrukerszied (as t gebrukersnummer op-egeven wörden). Gebruuk: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], of [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Zeuk',
 'redirect-lookup' => 'Opzeuken:',
 'redirect-value' => 'Weerde:',
index 99a16bf..4504bda 100644 (file)
@@ -849,6 +849,11 @@ $2
 'edit-already-exists' => 'नयाँ पृष्ठ बनाउन सकिएन ।
 यो पहिले देखि नै रहेको छ।',
 
+# Content models
+'content-model-wikitext' => 'विकिपाठ',
+'content-model-text' => 'साधारण पाठ',
+'content-model-javascript' => 'जाभास्क्रिप्ट',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''चेतावनी:''' यस पृष्टका अति धेरै संख्याका महँगा पार्सर फंक्सन कल्स (expensive parser function calls)  छन्।
 यसमा $2 भन्दा कम {{PLURAL:$2|कल|कल्स}} हुनुपर्छ,  यहाँ {{PLURAL:$1|अहिले $1 कल छ|अहिले $1 कल्स छ्न्}}.",
@@ -952,10 +957,10 @@ $2
 'revdelete-selected' => "'''[[:$1]]को {{PLURAL:$2|छानिएको संस्करण|छानिएका संस्करणहरु}}  :'''",
 'logdelete-selected' => "'''{{PLURAL:$1|छानिएको लग घटना|छानिएका लग घटनाहरु}}:'''",
 'revdelete-legend' => 'दृष्टि बन्देज मिलाउने',
-'revdelete-hide-text' => 'पुनरावलोकन पाठ लुकाउने',
+'revdelete-hide-text' => 'पुनरावलोकन पाठ',
 'revdelete-hide-image' => 'फाइल कमेन्ट लुकाउने',
 'revdelete-hide-name' => 'कार्य र गन्तब्य लुकाउने',
-'revdelete-hide-comment' => 'सम्पादन टिप्पणी लुकाउने',
+'revdelete-hide-comment' => 'सम्पादन टिप्पणी',
 'revdelete-hide-user' => 'सम्पादकको प्रयोगकर्ता नाम/IP लुकाउने',
 'revdelete-hide-restricted' => 'प्रवन्धक वा अरुबाट डेटा कम लिने',
 'revdelete-radio-same' => '(परिवर्तन नगर्नुहोस्)',
@@ -1115,6 +1120,7 @@ $1",
 'prefs-beta' => 'बिटा गुणहरु',
 'prefs-datetime' => 'मिति र समय',
 'prefs-labs' => 'प्रयोगशाला गुणहरु',
+'prefs-user-pages' => 'प्रयोगकर्ता पृष्ठहरू',
 'prefs-personal' => 'प्रयोगकर्ताको विवरण',
 'prefs-rc' => 'नयाँ परिवर्तनहरु',
 'prefs-watchlist' => 'अवलोकन पृष्ठ',
@@ -1207,6 +1213,8 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'prefs-dateformat' => 'मिति ढाँचा',
 'prefs-timeoffset' => 'समय अफसेट',
 'prefs-advancedediting' => 'सामान्य विकल्पहरू',
+'prefs-editor' => 'सम्पादक',
+'prefs-preview' => 'पूर्वावलोकन',
 'prefs-advancedrc' => 'उन्नत विकल्पहरू',
 'prefs-advancedrendering' => 'उन्नत विकल्पहरु',
 'prefs-advancedsearchoptions' => 'उन्नत विकल्पहरू',
@@ -1214,6 +1222,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'prefs-displayrc' => 'प्रदर्शन विकल्पहरू',
 'prefs-displaysearchoptions' => 'प्रदर्शन विकल्पहरू',
 'prefs-displaywatchlist' => 'प्रदर्शन विकल्पहरू',
+'prefs-tokenwatchlist' => 'टोकन',
 'prefs-diffs' => 'diffs(भिन्नता)',
 
 # User preference: email validation using jQuery
@@ -1372,6 +1381,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरु}}',
+'enhancedrc-history' => 'इतिहास',
 'recentchanges' => 'नयाँ परिवर्तनहरु',
 'recentchanges-legend' => 'हालैको परिवर्तन विकल्पहरु',
 'recentchanges-summary' => 'विकिका भर्खरका परिवर्तनहरुलाई यस पृष्ठमा पहिल्याउने',
@@ -1587,6 +1597,8 @@ $1',
 'listfiles_size' => 'आकार',
 'listfiles_description' => 'वर्णन',
 'listfiles_count' => 'संस्करणहरु',
+'listfiles-latestversion-yes' => 'हो',
+'listfiles-latestversion-no' => 'हैन',
 
 # File description page
 'file-anchor-link' => 'फाईल',
@@ -1901,7 +1913,7 @@ $1',
 'notanarticle' => 'सामाग्री सहितको पेज हैन',
 'notvisiblerev' => 'पूर्वावलोकन हटाइयो',
 'watchlist-details' => 'तपाईको निगरानी सूचीमा रहेका{{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठहरु}}वार्तालापमा पृष्ठमा गनिएका छैनन् ।',
-'wlheader-enotif' => 'ईमेलद्वारा जानकारी गराउने तरिका सक्रिय गरियो ।',
+'wlheader-enotif' => 'ईमेल जानकारी सक्रिय गरियो ।',
 'wlheader-showupdated' => "तपाइले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई '''गाढा''' गरेर देखाइएको छ ।",
 'watchmethod-recent' => 'निगरानी सुचीमा रहेका पृष्ठमा गरिएका सम्पादनहरु जाँच्दै',
 'watchmethod-list' => 'सम्पदान गरिएका निगरानी सुचीमा रहेका पृष्ठहरुको सम्पादन जाँच्दै',
index 4ec34de..4ad3125 100644 (file)
@@ -3286,7 +3286,7 @@ U kunt wel de broncode bekijken.',
 'tooltip-undo' => 'Met "ongedaan maken" draait u deze bewerking terug en komt in het bewerkingsvenster. U kunt in de bewerkingssamenvatting een reden opgeven.',
 'tooltip-preferences-save' => 'Voorkeuren opslaan',
 'tooltip-summary' => 'Voer een korte samenvatting in',
-'tooltip-iwiki' => '$1 – $2',
+'interlanguage-link-title' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/** CSS die hier wordt geplaatst heeft invloed op alle skins */',
@@ -3477,13 +3477,13 @@ $1',
 'hours-ago' => '$1 {{PLURAL:$1|uur}} geleden',
 'minutes-ago' => '$1 {{PLURAL:$1|minuut|minuten}} geleden',
 'seconds-ago' => '$1 {{PLURAL:$1|seconde|seconden}} geleden',
-'monday-at' => 'Maandag om $1',
-'tuesday-at' => 'Dinsdag om $1',
-'wednesday-at' => 'Woensdag om $1',
-'thursday-at' => 'Donderdag om $1',
-'friday-at' => 'Vrijdag om $1',
-'saturday-at' => 'Zaterdag om $1',
-'sunday-at' => 'Zondag om $1',
+'monday-at' => 'maandag om $1',
+'tuesday-at' => 'dinsdag om $1',
+'wednesday-at' => 'woensdag om $1',
+'thursday-at' => 'donderdag om $1',
+'friday-at' => 'vrijdag om $1',
+'saturday-at' => 'zaterdag om $1',
+'sunday-at' => 'zondag om $1',
 'yesterday-at' => 'Gisteren om $1',
 
 # Bad image list
index caa64ac..0f5cfb8 100644 (file)
@@ -745,7 +745,7 @@ Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SI
 'gotaccount' => "Ja avètz un compte ? '''$1'''.",
 'gotaccountlink' => 'Identificatz-vos',
 'userlogin-resetlink' => 'Avètz doblidat vòstres detalhs de connexion ?',
-'userlogin-resetpassword-link' => 'Reïnicializar lo senhal',
+'userlogin-resetpassword-link' => 'Senhal doblidat ?',
 '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}}.
@@ -816,8 +816,8 @@ Abans qu’un autre corrièr sià mandat a aqueste compte, vos caldrà seguir la
 'mailerror' => 'Error en mandant lo corrièr electronic : $1',
 'acct_creation_throttle_hit' => "De visitors d'aqueste wiki qu'utilizan vòstra adreça IP an creat $1 {{PLURAL:$1|compte|comptes}} lo jorn darrièr, aquò es lo limit maximum autorizat pendent aqueste periòde.
 Atal los visitors qu'utilizan aquesta adreça IP pòdon pas crear mai de compte novèl pel moment.",
-'emailauthenticated' => 'Vòstra adreça de corrièr electronic es estada autentificada lo $2 a $3.',
-'emailnotauthenticated' => 'Vòstra adreça de corrièr electronic es <strong>pas encara autentificada</strong>. Cap corrièr serà pas mandat per caduna de las foncions seguentas.',
+'emailauthenticated' => 'Vòstra adreça de corrièr electronic es estada confirmada lo $2 a $3.',
+'emailnotauthenticated' => 'Vòstra adreça de corrièr electronic es pas encara confirmada. Cap de corrièr serà pas mandat per caduna de las foncions seguentas.',
 'noemailprefs' => "Cap d'adreça electronica es pas estada indicada, las foncions seguentas seràn pas disponiblas.",
 'emailconfirmlink' => 'Confirmatz vòstra adreça de corrièr electronic',
 'invalidemailaddress' => "Aquesta adreça de corrièr electronic pòt pas èsser acceptada perque sembla qu'a un format incorrècte.
@@ -1437,6 +1437,9 @@ Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
 'recentchangesdays-max' => '(maximum $1 {{PLURAL:$1|jorn|jorns}})',
 'recentchangescount' => "Nombre de modificacions d'afichar per defaut :",
 'prefs-help-recentchangescount' => 'Aquò inclutz las modificacions recentas, las paginas d’istorics e los jornals.',
+'prefs-help-watchlist-token2' => 'Aquí la clau secreta del flux Web de vòstra lista de seguiment.
+Tota persona que la coneis poirà legir vòstra lista de seguiment, doncas, la comuniquetz pas.
+[[Special:ResetTokens|Clicatz aicí se la vos cal reïnicializar]].',
 'savedprefs' => 'Las preferéncias son estadas salvadas.',
 'timezonelegend' => 'Fus orari :',
 'localtime' => 'Ora locala :',
@@ -1538,6 +1541,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 '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.",
+'userrights-removed-self' => 'Avètz suprimit vòstres pròpris dreches corrèctament. Del còp, podètz pas mai accedir a aquela pagina.',
 
 # Groups
 'group' => 'Grop :',
@@ -1612,6 +1616,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'right-editmyusercss' => 'Modificar vòstres pròpris fichièrs CSS utilizaire',
 'right-editmyuserjs' => 'Modificar vòstres pròpris fichièrs JavaScript utilizaire',
 'right-viewmywatchlist' => 'Afichar vòstra pròpria lista de seguiment',
+'right-editmywatchlist' => 'Modificar vòstra pròpria lista de seguiment. Remarcatz que certanas accions apondràn encara de paginas sens aqueste drech.',
 'right-viewmyprivateinfo' => 'Veire vòstras donadas personalas (exemple adreça, nom vertadièr)',
 'right-editmyprivateinfo' => 'Modificar vòstras donadas personalas (exemple adreça, nom vertadièr)',
 'right-editmyoptions' => 'Modificar vòstras preferéncias',
@@ -1688,6 +1693,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'recentchanges' => 'Darrièrs cambiaments',
 'recentchanges-legend' => 'Opcions dels darrièrs cambiaments',
 'recentchanges-summary' => 'Vaquí sus aquesta pagina, los darrièrs cambiaments de {{SITENAME}}.',
+'recentchanges-noresult' => 'Pas cap de modificacion que correspond a aqueles critèris sul periòde indicat.',
 'recentchanges-feed-description' => "Seguissètz los darrièrs cambiaments d'aqueste wiki dins un flux.",
 'recentchanges-label-newpage' => 'Aquesta modificacion a creat una pagina novèla',
 'recentchanges-label-minor' => 'Aqueste cambiament es menor',
@@ -2099,6 +2105,7 @@ Doblidetz pas de verificar se i a pas d’autre ligam cap als modèls abans de l
 'statistics-edits' => 'Modificacions de paginas dempuèi que {{SITENAME}} foguèt installat',
 'statistics-edits-average' => 'Modificacions mejanas per pagina',
 'statistics-views-total' => 'Visitas totalas',
+'statistics-views-total-desc' => 'Las vistas de las paginas non existentas e de las paginas especialas son pas inclusas',
 'statistics-views-peredit' => 'Visitas per modificacions',
 'statistics-users' => '[[Special:ListUsers|Utilizaires]] enregistrats',
 'statistics-users-active' => 'Utilizaires actius',
@@ -4032,18 +4039,27 @@ Ensajatz la previsualizacion normala.',
 'api-error-filetype-banned' => 'Aqueste tipe de fichièr es interdich',
 '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-http' => 'Error intèrna : se pòt pas connectar al servidor.',
 'api-error-illegal-filename' => 'Lo nom del fichièr es pas autorizat.',
+'api-error-internal-error' => "Error intèrna : Quicòm s'es mal passat al moment del tractament de vòstre impòrt sul wiki.",
+'api-error-invalid-file-key' => "Error intèrna : cap de fichièr pas trobat dins l'emmagazinatge temporari.",
+'api-error-missingparam' => 'Error intèrna : Manca de paramètres dins la requèsta.',
+'api-error-missingresult' => 'Error intèrna : Avèm pas pogut determinar se la còpia aviá capitat.',
 '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-publishfailed' => 'Error intèrna: Lo servidor a pas pogut publicar lo fichièr temporari.',
+'api-error-timeout' => 'Lo servidor a pas respondut dins lo relambi pervist.',
 'api-error-unclassified' => "Una error desconeguda s'es producha.",
 'api-error-unknown-code' => 'Error desconeguda : « $1 »',
+'api-error-unknown-error' => 'Error intèrna : Quicòm a mal virat al moment del mandadís de vòstre fichièr.',
 'api-error-unknown-warning' => 'Avertiment desconegut : $1',
 'api-error-unknownerror' => 'Error desconeguda : « $1 »',
 'api-error-uploaddisabled' => 'Lo cargament es desactivat sus aqueste wiki.',
+'api-error-verification-error' => 'Aqueste fichièr pòt èsser corromput, o son extension es incorrècta.',
 
 # Durations
 'duration-seconds' => '$1 segonda{{PLURAL:$1||s}}',
index 54fe1db..d6587cf 100644 (file)
@@ -3227,6 +3227,7 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-length' => 'Długość strony (w bajtach)',
 'pageinfo-article-id' => 'Identyfikator strony',
 'pageinfo-language' => 'Język zawartości strony',
+'pageinfo-content-model' => 'Model zawartości',
 'pageinfo-robot-policy' => 'Indeksowanie przez roboty',
 'pageinfo-robot-index' => 'Dozwolone',
 'pageinfo-robot-noindex' => 'Niedozwolone',
@@ -3894,6 +3895,7 @@ Czy na pewno chcesz ją ponownie utworzyć?",
 
 # Separators for various lists, etc.
 'percent' => '$1&#160;%',
+'quotation-marks' => '„$1”',
 
 # Multipage image navigation
 'imgmultipageprev' => '← poprzednia strona',
@@ -4043,7 +4045,7 @@ Powinieneś otrzymać [{{SERVER}}{{SCRIPTPATH}}/COPYING kopię licencji GNU Gene
 # Special:Redirect
 'redirect' => 'Przekierowanie według pliku, użytkownika albo identyfikatora wersji',
 'redirect-legend' => 'Przekieruj do pliku lub strony',
-'redirect-summary' => 'Ta strona specjalna przekierowuje do: pliku (o podanej nazwie), do strony (o podanym numerze wersji) albo do strony użytkownika (o podanym identyfikatorze numerycznym). Sposób użycia: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] albo [[{{#Special:Redirect}}/user/103]].',
+'redirect-summary' => 'Ta strona specjalna przekierowuje do: pliku (o podanej nazwie), do strony (o podanym numerze wersji) albo do strony użytkownika (o podanym identyfikatorze numerycznym). Sposób użycia: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] albo [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Przejdź',
 'redirect-lookup' => 'Wyszukaj:',
 'redirect-value' => 'Wartość:',
index ee5e336..5fc7998 100644 (file)
@@ -999,8 +999,9 @@ Chiel a peul ancora s-ciairé costa diferensa; a peulo essje pì 'd detaj ant ë
 'revdelete-text' => "Le version scancelà e j'event a së s-ciaireran sempe ant la stòria dla pàgina e ant ij registr, ma sò test al pùblich a j'andrà pì nen.'''
 J'àutri aministrator dzora a {{SITENAME}} a saran ancó sempe bon a s-ciairé ël contnù stërmà e a podran disdëscancelelo andré con la midema antërfacia, sempe che a sia nen stàita butà na restrission adissional.",
 'revdelete-confirm' => "Për piasì, ch'a confema ch'a veul fé sòn, ch'as rend cont dle conseguense, e ch'a lo fa an acòrd con [[{{MediaWiki:Policy-url}}|le régole]].",
-'revdelete-suppress-text' => "La scancelassion a dovrìa '''mach''' esse dovrà për cost cas:
-* Anformassion përsonaj nen aproprià
+'revdelete-suppress-text' => "La scancelassion a dovrìa '''mach''' esse dovrà an costi cas:
+* Anformassion ch'a podrìo esse difamatòrie
+* Anformassion përsonaj inapropià
 *: ''adrësse ëd ca e nùmer ëd teléfon, còdes fiscaj, e via fòrt''",
 'revdelete-legend' => 'But-je coste limitassion-sì a le version scancelà:',
 'revdelete-hide-text' => 'Test dla revision',
@@ -1010,8 +1011,8 @@ J'àutri aministrator dzora a {{SITENAME}} a saran ancó sempe bon a s-ciairé 
 'revdelete-hide-user' => "Stranòm/adrëssa IP dl'utent",
 'revdelete-hide-restricted' => "Stërmé j'anformassion a j'aministrator tan-me a j'àutri",
 'revdelete-radio-same' => '(cambia pa)',
-'revdelete-radio-set' => 'Visìbil',
-'revdelete-radio-unset' => 'Stërmà',
+'revdelete-radio-set' => 'Stërmà',
+'revdelete-radio-unset' => 'Visìbil',
 'revdelete-suppress' => "Smon-je pa ij dat gnanca a j'aministrator",
 'revdelete-unsuppress' => "Gava le limitassion da 'nt le version ciapà andaré",
 'revdelete-log' => 'Rason:',
@@ -2939,6 +2940,7 @@ Compilé '''NEN''' sòn!",
 'pageinfo-length' => 'Longheur ëd la pàgina (an byte)',
 'pageinfo-article-id' => 'Identificativ ëd la pàgina',
 'pageinfo-language' => 'Lenga dël contnù dla pàgina',
+'pageinfo-content-model' => 'Model dël contnù ëd le pàgine',
 'pageinfo-robot-policy' => 'Indicisassion con robò',
 'pageinfo-robot-index' => 'Autorisà',
 'pageinfo-robot-noindex' => 'Vietà',
@@ -3592,6 +3594,9 @@ Për piasì, che an conferma che da bon a veul torna creélo.",
 'confirm-unwatch-button' => 'Va bin',
 'confirm-unwatch-top' => 'Gavé sta pàgina-sì da la lista dle ròbe che as ten-o sot euj?',
 
+# Separators for various lists, etc.
+'quotation-marks' => '«$1»',
+
 # Multipage image navigation
 'imgmultipageprev' => '← pàgina andré',
 'imgmultipagenext' => 'pàgina anans →',
index 576bf13..3c2fdab 100644 (file)
@@ -70,6 +70,7 @@
  * @author Lejonel
  * @author Li-sung
  * @author Liangent
+ * @author Liuxinyu970226
  * @author Lloffiwr
  * @author MF-Warburg
  * @author Malafaya
@@ -2448,14 +2449,14 @@ There are three radio buttons in each row, and the captions above each column re
 * {{msg-mw|Revdelete-radio-same}}
 * {{msg-mw|Revdelete-radio-set}}
 * {{msg-mw|Revdelete-radio-unset}}
-{{Identical|Visible}}',
+{{Identical|Hidden}}',
 'revdelete-radio-unset' => 'This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature. The message is a caption for a column of radioboxes inside a box with {{msg-mw|Revdelete-legend}} as a title.
 [[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]
 There are three radio buttons in each row, and the captions above each column read:
 * {{msg-mw|Revdelete-radio-same}}
 * {{msg-mw|Revdelete-radio-set}}
 * {{msg-mw|Revdelete-radio-unset}}
-{{Identical|Hidden}}',
+{{Identical|Visible}}',
 'revdelete-suppress' => 'Option for oversight; used in [[Special:RevisionDelete]].
 
 See also:
@@ -4480,7 +4481,8 @@ See also:
 'file-anchor-link' => '{{Identical|File}}',
 'filehist' => 'Text shown on a media description page. Heads the section where the different versions of the file are displayed.',
 'filehist-help' => 'In file description page',
-'filehist-deleteall' => 'Link in image description page for admins.',
+'filehist-deleteall' => 'Link in image description page for admins.
+{{Identical|Delete all}}',
 'filehist-deleteone' => 'Link description on file description page to delete an earlier version of a file.
 
 {{Identical|Delete}}',
@@ -5911,6 +5913,7 @@ Example (in English):
 {{Identical|View}}
 {{Identical|Restore}}',
 'undeleteviewlink' => 'First part of {{msg-mw|undeletelink}}.
+Display name of link to view a deleted page used on [[Special:Log/delete]].
 {{Identical|View}}',
 'undeletereset' => 'Shown on [[Special:Undelete]] as button caption.
 {{Identical|Reset}}',
@@ -7842,7 +7845,8 @@ See also:
 * {{msg-mw|Summary}}
 * {{msg-mw|Accesskey-summary}}
 * {{msg-mw|Tooltip-summary}}',
-'tooltip-iwiki' => 'Format of a sidebar interwiki link tooltip. Parameters:
+'interlanguage-link-title' => '{{Optional}}
+Format of a sidebar interwiki link tooltip. Parameters:
 * $1 - page name in the target wiki
 * $2 - target wiki language autonym',
 
@@ -8012,7 +8016,7 @@ The label and the input box are always hidden.',
 'pageinfo-language' => 'Language in which the page content is written.',
 'pageinfo-content-model' => 'The model in which the page content is written.
 
-Used as label. Followed by one of the following messages:
+Used as label at [{{fullurl:Main Page|action=info}} action=info]. Followed by one of the following messages:
 * {{msg-mw|Content-model-wikitext}}
 * {{msg-mw|Content-model-javascript}}
 * {{msg-mw|Content-model-css}}
@@ -8250,7 +8254,7 @@ Non-animated images use {{msg-mw|svg-long-desc}}.',
 * $1 - the error message
 See also:
 * {{msg-mw|Thumbnail error}}',
-'show-big-image' => 'Displayed under an image at the image description page, when it is displayed smaller there than it was uploaded.',
+'show-big-image' => 'Displayed under the file on file description pages, when a reduced-size thumbnail of the original file is being displayed.',
 'show-big-image-preview' => 'Message shown under the image description page thumbnail.
 
 Can be followed by {{msg-mw|Show-big-image-other}}.
@@ -8289,7 +8293,9 @@ This message may be overridden by a more specific message:
 
 # Special:NewFiles
 'newimages' => 'Page title of [[Special:NewImages]].',
-'imagelisttext' => 'This is text on [[Special:NewImages]]. $1 is the number of files. $2 is the message {{msg-mw|Bydate}}.',
+'imagelisttext' => 'This is text on [[Special:NewImages]]. Parameters:
+* $1 - the number of files
+* $2 - the message {{msg-mw|Bydate}}',
 'newimages-summary' => 'This message is displayed at the top of [[Special:NewImages]] to explain what is shown on that special page.',
 'newimages-legend' => 'Caption of the fieldset for the filter on [[Special:NewImages]]
 
@@ -9558,6 +9564,12 @@ Most languages use a space, but some Asian languages, such as Thai and Chinese,
 'percent' => '{{optional}}',
 'parentheses' => '{{optional}}',
 'brackets' => '{{Optional}}',
+'quotation-marks' => 'Quotation marks, for quoting, sometimes titles etc., depending on the language.
+
+See: [[w:Non-English usage of quotation marks|Non-English usage of quotation marks on Wikipedia]].
+
+Parameters: 
+* $1 - text to be wrapped in quotation marks',
 
 # Multipage image navigation
 'imgmultipageprev' => '{{Identical|Previous page}}',
index d2fefa0..9af5e22 100644 (file)
@@ -1263,8 +1263,9 @@ funcție, fie versiunea specificată nu există, ori sunteți pe cale să ascund
 'revdelete-text' => "'''Versiunile șterse vor apărea în istoricul paginii, dar conținutul lor nu va fi accesibil publicului.''' Administratorii {{SITENAME}} pot accesa conținutul șters și îl pot recupera prin aceeași interfață, dacă nu este impusă altă restricție de către operatorii sitului.",
 'revdelete-confirm' => 'Vă rugăm să confirmați că intenționați să faceți acest lucru, că înțelegeți consecințele și că faceți asta în conformitate cu [[{{MediaWiki:Policy-url}}|politica]].',
 'revdelete-suppress-text' => "Suprimarea trebuie folosită '''doar''' în următoarele cazuri:
+* Informații potențial calomnioase
 * Informații personale inadecvate
-*: ''adrese și numere de telefon personale, CNP, numere de securitate socială, etc.''",
+*: ''adrese și numere de telefon personale, CNP, numere de securitate socială etc.''",
 'revdelete-legend' => 'Restricții de afișare',
 'revdelete-hide-text' => 'Textul versiunii',
 'revdelete-hide-image' => 'Șterge conținutul fișierului',
@@ -2107,9 +2108,7 @@ Această pagină specială permite căutarea fișierelor în funcție de tipul M
 * Imagini animate : <code>image/gif</code>
 * Fișiere sunet : <code>audio/ogg</code>, <code>audio/x-ogg</code>
 * Fișiere video : <code>video/ogg</code>, <code>video/x-ogg</code>
-* Fișiere PDF : <code>application/pdf</code>
-
-Lista tipurilor MIME recunoscute de MediaWiki poate fi găsită la [http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/includes/mime.types?view=markup fișiere mime.types].',
+* Fișiere PDF : <code>application/pdf</code>',
 'mimetype' => 'Tip MIME:',
 'download' => 'descarcă',
 
@@ -3147,7 +3146,7 @@ Un dosar temporar lipsește.',
 Permite adăugarea unui motiv în descrierea modificărilor',
 'tooltip-preferences-save' => 'Salvează preferințele',
 'tooltip-summary' => 'Descrieți pe scurt modificarea',
-'tooltip-iwiki' => '$1 – $2',
+'interlanguage-link-title' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/** CSS plasate aici vor fi aplicate tuturor aparițiilor */',
@@ -3195,6 +3194,7 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 'pageinfo-length' => 'Lungimea paginii (în octeți)',
 'pageinfo-article-id' => 'ID pagină',
 'pageinfo-language' => 'Limba conținutului paginii',
+'pageinfo-content-model' => 'Modelul conținutului paginii',
 'pageinfo-robot-policy' => 'Indexare de către roboți',
 'pageinfo-robot-index' => 'Permisă',
 'pageinfo-robot-noindex' => 'Nepermisă',
@@ -3844,6 +3844,9 @@ Vă rugăm să confirmați faptul că într-adevăr doriți să recreați acest
 'confirm-unwatch-button' => 'OK',
 'confirm-unwatch-top' => 'Eliminați această pagină din lista de pagini urmărite?',
 
+# Separators for various lists, etc.
+'quotation-marks' => '„$1”',
+
 # Multipage image navigation
 'imgmultipageprev' => '← pagina anterioară',
 'imgmultipagenext' => 'pagina următoare →',
index 4656a2b..9fd5270 100644 (file)
@@ -1413,7 +1413,7 @@ $3 {{GENDER:$3|указал|указала}} следующую причину:
 Администраторы проекта {{SITENAME}} будут иметь доступ к скрытому содержанию и смогут восстановить его через этот же интерфейс, за исключением случаев, когда установлено дополнительное ограничение.",
 'revdelete-confirm' => 'Пожалуйста, подтвердите, что вы действительно желаете совершить это действие, осознаёте последствия, делаете это в соответствии с [[{{MediaWiki:Policy-url}}|правилами]].',
 'revdelete-suppress-text' => "Сокрытие может производиться '''только''' в следующих случаях:
-
+* Потенциально клеветническая информация
 * Неуместная личная информация
 *: ''домашний адрес, номера телефонов, номер паспорта и т. д.''",
 'revdelete-legend' => 'Установить ограничения:',
@@ -1424,8 +1424,8 @@ $3 {{GENDER:$3|указал|указала}} следующую причину:
 'revdelete-hide-user' => 'Имя участника/IP-адрес',
 'revdelete-hide-restricted' => 'Скрыть данные также и от администраторов',
 'revdelete-radio-same' => '(не изменять)',
-'revdelete-radio-set' => 'Ð\92идимая',
-'revdelete-radio-unset' => 'СкÑ\80Ñ\8bÑ\82ая',
+'revdelete-radio-set' => 'СкÑ\80Ñ\8bÑ\82ая',
+'revdelete-radio-unset' => 'Ð\92идимая',
 'revdelete-suppress' => 'Скрывать данные также и от администраторов',
 'revdelete-unsuppress' => 'Снять ограничения с восстановленных версий',
 'revdelete-log' => 'Причина:',
@@ -3287,7 +3287,7 @@ $2',
 'tooltip-undo' => 'Убрать внесённую правку и показать предпросмотр, с возможностью указать причину отмены',
 'tooltip-preferences-save' => 'Сохранить настройки',
 'tooltip-summary' => 'Введите краткое описание',
-'tooltip-iwiki' => '$1 — $2',
+'interlanguage-link-title' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/* Размещённый здесь CSS будет применяться ко всем темам оформления */',
@@ -3353,6 +3353,7 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-length' => 'Длина страницы (в байтах)',
 'pageinfo-article-id' => 'Идентификатор страницы',
 'pageinfo-language' => 'Язык страницы',
+'pageinfo-content-model' => 'Модель содержимого страницы',
 'pageinfo-robot-policy' => 'Индексация поисковыми роботами',
 'pageinfo-robot-index' => 'Разрешено',
 'pageinfo-robot-noindex' => 'Не разрешено',
@@ -4025,6 +4026,7 @@ $5
 'word-separator' => '&#32;',
 'ellipsis' => '…',
 'parentheses' => '($1)',
+'quotation-marks' => '«$1»',
 
 # Multipage image navigation
 'imgmultipageprev' => '← предыдущая страница',
index 1272862..198eefc 100644 (file)
@@ -3702,7 +3702,7 @@ $5
 'version-license' => 'अनुज्ञापत्रम्',
 'version-poweredby-credits' => "इयं विकिः अनेन सञ्चालिता '''[//www.mediawiki.org/ MediaWiki]''', स्वामित्वम् © 2001 - $1  $2 ।",
 'version-poweredby-others' => 'अन्य',
-'version-credits-summary' => '[[Special:Version|MediaWiki] इत्यत्र योगदानार्थं वयं अधोलिखितान् जनान् प्रशंसितुमिच्छामः।',
+'version-credits-summary' => '[[Special:Version|MediaWiki]] इत्यत्र योगदानार्थं वयं अधोलिखितान् जनान् प्रशंसितुमिच्छामः।',
 'version-license-info' => 'मिडियाविकिः तु निश्शुल्कतन्त्रांशः ; भवान् पुनः वितर्तुं शक्नोति अथवा GNU सामान्यसार्वजनिकानुज्ञपत्रस्य नियमानुगुणं द्वीतीयावृत्तिम् अथवा अन्यनूतनावृतिं संस्कर्तुं शक्नोति । 
 
 एषा बहूपयोगाय भवेत् इति धिया मिडियाविकिः वितीर्णा । किन्तु केनापि प्रमाणत्वेन विना दत्ता । अथवा निर्दिष्टोद्देशर्थे अनुकूलकरं वेति अपरिशील्य अथवा वाणिज्यस्य आनुषङ्गिकानुज्ञापत्रेण विना अपि मीडियाविकिः प्रदत्ता । विशेषविवरणप्राप्तये GNU सर्वजनसामान्यम् अनुज्ञापत्रं पश्यतु ।
index 35fbfed..2e717bf 100644 (file)
@@ -264,7 +264,7 @@ $1',
 Ẓr [[Special:Version|ayyaw tasna]].',
 
 'ok' => 'Waxxa',
-'pagetitle' => '(MediaWiki)$1 - {{SITENAME}}',
+'pagetitle' => '$1 - {{SITENAME}}',
 'pagetitle-view-mainpage' => '{{SITENAME}}',
 'retrievedfrom' => 'Yurrid z "$1"',
 'youhavenewmessages' => 'Illa dark $1 ($2).',
index fb9d616..f451c66 100644 (file)
@@ -291,7 +291,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Skryť strážené úpravy v Posledných úpravách',
 'tog-newpageshidepatrolled' => 'Skryť strážené stránky zo zoznamu nových stránok',
 'tog-extendwatchlist' => 'Rozšíriť zoznam sledovaných stránok, aby zobrazoval všetky zmeny, nie len posledné',
-'tog-usenewrc' => 'Zoskupiť v posledných úpravách a na zozname sledovaných stránok podľa stránky (vyžaduje JavaScript)',
+'tog-usenewrc' => 'Zoskupiť zmeny v posledných úpravách a na zozname sledovaných stránok podľa stránky',
 'tog-numberheadings' => 'Automaticky číslovať nadpisy',
 'tog-showtoolbar' => 'Zobraziť panel nástrojov úprav',
 'tog-editondblclick' => 'Upravovať stránky po dvojitom kliknutí',
@@ -617,6 +617,7 @@ Zoznam platných špeciálnych stránok nájdete na [[Special:SpecialPages|{{int
 'databaseerror' => 'Chyba v databáze',
 'databaseerror-text' => 'Došlo k chybe pri otázke do databázy.
 Môže to byť spôsobené chybou v softvéri.',
+'databaseerror-textcl' => 'Vyskytla sa chyba dopytu do databázy.',
 'databaseerror-query' => 'Otázka: $1',
 'databaseerror-function' => 'Funkcia: $1',
 'databaseerror-error' => 'Chyba: $1',
@@ -739,7 +740,7 @@ Nezabudnite zmeniť svoje [[Special:Preferences|Predvoľby {{GRAMMAR:genitív|{{
 'gotaccount' => "Máte už vytvorený účet? '''$1'''.",
 'gotaccountlink' => 'Prihlásiť',
 'userlogin-resetlink' => 'Zabudli ste svoje prihlasovacie údaje?',
-'userlogin-resetpassword-link' => 'Obnoviť heslo',
+'userlogin-resetpassword-link' => 'Zabudli ste heslo?',
 'helplogin-url' => 'Help:Prihlasovanie',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc s prihlásením]]',
 'userlogin-loggedin' => 'Ste už {{GENDER:$1|prihĺasený|prihlásená}} ako $1.
@@ -805,14 +806,15 @@ používateľa „$1“.
 Prosím, prihláste sa znovu, keď ho dostanete.',
 'blocked-mailpassword' => 'Boli zablokované úpravy z vašej IP adresy, a tak nie je dovolené použiť funkciu znovuvyžiadania hesla, aby sa zabránilo zneužitiu.',
 'eauthentsent' => 'Email s potvrdením bol zaslaný na uvedenú emailovú adresu.
-Predtým ako sa na účet pošle akákoľvek ďalšia pošta, musíte splniť inštrukcie v emaili, aby sa potvrdilo, že účet je skutočne váš.',
+Predtým ako sa na účet pošle akákoľvek ďalšia pošta, musíte splniť inštrukcie v emaili, aby ste potvrdili, že účet je skutočne váš.',
 'throttled-mailpassword' => 'E-mail na obnovenie hesla už bol odoslaný v priebehu {{PLURAL:$1|poslednej $1 hodiny|posledných $1 hodín}}.
 Aby sa zabránilo zneužitiu, obnovenie hesla emailom je možné vykonať iba raz za {{PLURAL:$1|$1 hodinu|$1 hodiny|$1 hodín}}.',
 'mailerror' => 'Chyba pri posielaní e-mailu: $1',
 'acct_creation_throttle_hit' => 'Návštevníci tejto wiki z vašej IP adresy už za posledný deň vytvorili {{PLURAL:$1|$1 účet|$1 účty|$1 účtov}}, čo je maximálny počet povolený za toto časové obdobie.
 Z tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť ďalšie účty.',
 'emailauthenticated' => 'Vaša emailová adresa bola overená $2 $3.',
-'emailnotauthenticated' => 'Vaša e-mailová adresa ešte nebola overená. Preto nemôžete prijať emaily pre žiadnu z nasledovných funkcií.',
+'emailnotauthenticated' => 'Vaša e-mailová adresa ešte nebola overená.
+Preto nemôžete prijať emaily pre žiadnu z nasledovných funkcií.',
 'noemailprefs' => 'Tieto nástroje budú prístupné po vyplnení emailovej adresy vo vašich nastaveniach.',
 'emailconfirmlink' => 'Potvrďte svoju e-mailovú adresu',
 'invalidemailaddress' => 'Emailovú adresu nemožno akceptovať, pretože sa zdá, že má neplatný formát. Zadajte adresu v správnom tvare alebo nechajte príslušné políčko prázdne.',
@@ -831,6 +833,8 @@ Prosím, počkajte $1 predtým, než to skúsite znova.',
 'login-abort-generic' => 'Vaše prihlásenie nebolo úspešné - zrušené',
 'loginlanguagelabel' => 'Jazyk: $1',
 'suspicious-userlogout' => 'Vaša požiadavka odhlásiť sa bola zamietnutá, pretože to vyzerá, že ju poslal pokazený prehliadač alebo proxy server.',
+'createacct-another-realname-tip' => 'Skutočné meno je nepovinné.
+Ak sa rozhodnete ho poskytnúť, použije sa na označenie vašej práce.',
 
 # Email sending
 'php-mail-error-unknown' => 'Neznáma chyba vo funkcii PHP mail()',
@@ -846,7 +850,7 @@ Prosím, počkajte $1 predtým, než to skúsite znova.',
 'newpassword' => 'Nové heslo:',
 'retypenew' => 'Nové heslo (ešte raz):',
 'resetpass_submit' => 'Nastaviť heslo a prihlásiť sa',
-'changepassword-success' => 'Vaše heslo bolo úspešne zmenené! Prebieha prihlasovanie...',
+'changepassword-success' => 'Vaše heslo bolo úspešne zmenené!',
 'resetpass_forbidden' => 'Heslá nie je možné zmeniť',
 'resetpass-no-info' => 'Aby ste mohli priamo pristupovať k tejto stránke, musíte sa prihlásiť.',
 'resetpass-submit-loggedin' => 'Zmeniť heslo',
@@ -891,7 +895,7 @@ ignorovať a ďalej používať vaše staré heslo.',
 Dočasné heslo:$2',
 'passwordreset-emailsent' => 'Email s novým heslom bol odoslaný.',
 'passwordreset-emailsent-capture' => 'Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie.',
-'passwordreset-emailerror-capture' => 'Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať používateľovi: $1',
+'passwordreset-emailerror-capture' => 'Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať {{GENDER:$2|používateľovi}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Zmeniť emailovú adresu',
@@ -906,7 +910,17 @@ Dočasné heslo:$2',
 'changeemail-cancel' => 'Zrušiť',
 
 # Special:ResetTokens
+'resettokens' => 'Obnoviť tokeny',
+'resettokens-text' => 'Tu môžete obnoviť tokeny, ktoré umožňujú prístup k určitým súkromným údajom spojeným s vaším účtom.
+
+Mali by ste to urobiť, ak ste ich omylom niekomu poskytli alebo ak bolo vaše konto zneužité.',
+'resettokens-no-tokens' => 'Neexistujú žiadne tokeny, ktoré by bolo možné obnoviť.',
+'resettokens-legend' => 'Obnoviť tokeny',
 'resettokens-tokens' => 'Tokeny:',
+'resettokens-token-label' => '$1 (aktuálna hodnota: $2)',
+'resettokens-watchlist-token' => 'Token pre webový kanál (Atom/RSS) [[Special:Watchlist|zmien na stránkach, ktoré sledujete]]',
+'resettokens-done' => 'Tokeny boli obnovené.',
+'resettokens-resetbutton' => 'Obnoviť zvolené tokeny.',
 
 # Edit page toolbar
 'bold_sample' => 'Tučný text',
@@ -987,9 +1001,7 @@ Možno bola presunutá alebo zmazaná odkedy ste si stránku zobrazili.',
 'loginreqlink' => 'prihlásiť',
 'loginreqpagetext' => 'Aby ste mohli prezerať ďalšie stránky, musíte sa $1.',
 'accmailtitle' => 'Heslo bolo odoslané.',
-'accmailtext' => "Náhodne vytvorené heslo pre používateľa [[User talk:$1|$1]] bolo poslané na $2.
-
-Heslo tohto nového účtu je možné zmeniť na stránke ''[[Special:ChangePassword|zmena hesla]]'' po prihlásení.",
+'accmailtext' => "Náhodne vytvorené heslo pre používateľa [[User talk:$1|$1]] bolo poslané na $2. Je možné ho zmeniť na stránke ''[[Special:ChangePassword|zmena hesla]]'' po prihlásení.",
 'newarticle' => '(Nový)',
 'newarticletext' => "Sledovali ste odkaz na stránku, ktorá zatiaľ neexistuje.
 Stránku vytvoríte tak, že začnete písať do dolného poľa a potom stlačíte tlačidlo „Uložiť stránku“.
@@ -1000,8 +1012,7 @@ Preto musíme na jeho identifikáciu použiť numerickú IP adresu. Je možné,
 Ak ste anonymný používateľ a máte pocit, že vám boli adresované irelevantné diskusné príspevky, [[Special:UserLogin/signup|vytvorte si konto]] alebo sa [[Special:UserLogin|prihláste]], aby sa zamedzilo budúcim zámenám s inými anonymnými používateľmi.''",
 'noarticletext' => 'Na tejto stránke sa momentálne nenachádza žiadny text.
 Môžete [[Special:Search/{{PAGENAME}}|vyhľadávať názov tejto stránky]] v obsahu iných stránok,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vyhľadávať v súvisiacich záznamoch],
-alebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} upravovať túto stránku]</span>.',
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vyhľadávať v súvisiacich záznamoch] alebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} upravovať túto stránku]</span>.',
 'noarticletext-nopermission' => 'Táto stránka momentálne neobsahuje žiadny text.
 Môžete [[Special:Search/{{PAGENAME}}|hľadať názov tejto stránky]] v texte iných stránok
 alebo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hľadať v súvisiacich záznamoch]</span>, ale nemáte oprávnenie túto stránku vytvoriť.',
@@ -1150,6 +1161,7 @@ Tieto argumenty boli vynechané.',
 'undo-failure' => 'Úpravu nie je možné vrátiť kvôli konfliktným medziľahlým úpravám.',
 'undo-norev' => 'Túto úpravu nie je možné vrátiť, pretože neexistuje alebo bola zmazaná.',
 'undo-summary' => 'Revízia $1 používateľa [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusia]]) bola vrátená',
+'undo-summary-username-hidden' => 'Vrátiť revíziu $1, ktorú vykonal skrytý používateľ',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Nie je možné vytvoriť účet',
@@ -1169,7 +1181,7 @@ Dôvod, ktorý $3 uviedol, je ''$2''",
 'currentrevisionlink' => 'Aktuálna úprava',
 'cur' => 'aktuálna',
 'next' => 'ďalšia',
-'last' => 'posledná',
+'last' => 'predošlá',
 'page_first' => 'prvá',
 'page_last' => 'posledná',
 'histlegend' => 'Porovnanie zmien: označte výberové políčka revízií, ktoré sa majú porovnať a kliknite na tlačidlo dolu.<br />
@@ -1239,18 +1251,19 @@ Ako správca si môžete tento rozdiel zobraziť; podrobnosti môžete nájsť v
 Iní správcovia {{GRAMMAR:genitív|{{SITENAME}}}} budú stále môcť pristupovať k skrytému obsahu a môžu ho znova obnoviť použitím tohto rozhrania v prípade, že nie sú stanovené ďalšie obmedzenia.",
 'revdelete-confirm' => 'Prosím, potvrďte, že to naozaj chcete vykonať, rozumiete následkom a že to robíte v súlade s [[{{MediaWiki:Policy-url}}|politikou]].',
 'revdelete-suppress-text' => "Zatajenie by sa malo používať '''výlučne''' v nasledovných prípadoch:
+* Potenciálne hanlivé informácie
 * Nevhodné osobné údaje
-*: ''adresy, telefóne čísla, rodné čísla a pod.''",
+*: ''domáce adresy, telefóne čísla, rodné čísla a pod.''",
 'revdelete-legend' => 'Nastaviť obmedzenia viditeľnosti',
-'revdelete-hide-text' => 'Skryť text revízie',
+'revdelete-hide-text' => 'Text revízie',
 'revdelete-hide-image' => 'Skryť obsah súboru',
 'revdelete-hide-name' => 'Skryť činnosť a cieľ',
-'revdelete-hide-comment' => 'Skryť zhrnutie úprav',
-'revdelete-hide-user' => 'Skryť používateľské meno/IP',
+'revdelete-hide-comment' => 'Zhrnutie úprav',
+'revdelete-hide-user' => 'Používateľské meno/IP redaktora',
 'revdelete-hide-restricted' => 'Zatajiť údaje pred všetkými, aj pred správcami',
 'revdelete-radio-same' => '(nezmeniť)',
-'revdelete-radio-set' => 'Áno',
-'revdelete-radio-unset' => 'Nie',
+'revdelete-radio-set' => 'Viditeľné',
+'revdelete-radio-unset' => 'Skryté',
 'revdelete-suppress' => 'Skryť údaje pred správcami rovnako ako pred ostatnými',
 'revdelete-unsuppress' => 'Odstrániť obmedzenia obnovených revízií',
 'revdelete-log' => 'Dôvod:',
@@ -1429,7 +1442,7 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'prefs-rendering' => 'Vzhľad',
 'saveprefs' => 'Uložiť nastavenia',
 'resetprefs' => 'Obnoviť pôvodné nastavenia',
-'restoreprefs' => 'Obnoviť všetky nastavenia na štandardné hodnoty',
+'restoreprefs' => 'Obnoviť všetky predvolené nastavenia (vo všetkých sekciách)',
 'prefs-editing' => 'Úpravy',
 'rows' => 'Riadky:',
 'columns' => 'Stĺpce:',
@@ -1441,6 +1454,9 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'recentchangesdays-max' => '(maximálne $1 {{PLURAL:$1|deň|dni|dní}})',
 'recentchangescount' => 'Štandardne zobrazovaný počet úprav:',
 'prefs-help-recentchangescount' => 'Toto sa týka posledných úprav, histórií stránok a záznamov.',
+'prefs-help-watchlist-token2' => 'Toto je tajný kľúč k webovému kanálu vášho zoznamu sledovaných stránok.
+každý, kto ho pozná si bude môcť prečítať váš zoznam sledovaných stránok, preto ho nezverejňujte.
+[[Special:ResetTokens|Kliknite sem, ak potrebujete vytvoriť nový]].',
 'savedprefs' => 'Vaše nastavenia boli uložené.',
 'timezonelegend' => 'Časové pásmo:',
 'localtime' => 'Miestny čas:',
@@ -1472,8 +1488,8 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 Túto operáciu nemožno vrátiť.',
 'prefs-emailconfirm-label' => 'Potvrdenie emailu:',
 'youremail' => 'Váš e-mail²',
-'username' => 'Používateľské meno:',
-'uid' => 'ID používateľa:',
+'username' => '{{GENDER:$1|Používateľské meno}}:',
+'uid' => 'ID {{GENDER:$1|používateľa}}:',
 'prefs-memberingroups' => '{{GENDER:$2|Člen|Členovia}} {{PLURAL:$1|skupiny|skupín}}:',
 'prefs-registration' => 'Čas registrácie:',
 'yourrealname' => 'Skutočné meno *:',
@@ -1485,11 +1501,12 @@ Túto operáciu nemožno vrátiť.',
 'badsig' => 'Neplatný podpis v pôvodnom tvare; skontrolujte HTML značky.',
 'badsiglength' => 'Váš podpis je príliš dlhý.
 Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
-'yourgender' => 'Pohlavie:',
-'gender-unknown' => 'Neuvedené',
-'gender-male' => 'Muž',
-'gender-female' => 'Žena',
-'prefs-help-gender' => 'Nepovinné: používa softvér na správne oslovenie v závislosti od rodu. Táto informácia bude verejná.',
+'yourgender' => 'Ako si želáte byť označovaný?',
+'gender-unknown' => 'Radšej nechcem uviesť',
+'gender-male' => 'On upravuje wiki stránky',
+'gender-female' => 'Ona upravuje wiki stránky',
+'prefs-help-gender' => 'Nastavenie tejto voľby nie je povinné.
+Softvér používa toto nastavenie na správne oslovenie a označenie vás ostatným v závislosti od gramatického rodu. Táto informácia bude verejná.',
 'email' => 'E-mail',
 'prefs-help-realname' => '¹ Skutočné meno (nepovinné): ak sa rozhodnete ho poskytnúť, bude použité na označenie vašej práce.',
 'prefs-help-email' => 'Emailová adresa je nepovinný údaj, ale je potrebná v prípade, že ak zabudnete heslo, môžete si na email vyžiadať nové.',
@@ -1500,7 +1517,8 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'prefs-signature' => 'Podpis',
 'prefs-dateformat' => 'Formát dátumu',
 'prefs-timeoffset' => 'Časový posun',
-'prefs-advancedediting' => 'Rozšírené možnosti',
+'prefs-advancedediting' => 'Všeobecné možnosti',
+'prefs-editor' => 'Redaktor',
 'prefs-preview' => 'Náhľad',
 'prefs-advancedrc' => 'Rozšírené možnosti',
 'prefs-advancedrendering' => 'Rozšírené možnosti',
@@ -1510,6 +1528,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'prefs-displaysearchoptions' => 'Možnosti zobrazenia',
 'prefs-displaywatchlist' => 'Možnosti zobrazenia',
 'prefs-diffs' => 'Rozdiely',
+'prefs-help-prefershttps' => 'Táto voľba sa prejaví pri vašom ďalšom prihlásení.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Formát e-mailovej adresa vyzerá byť správny',
@@ -1533,9 +1552,11 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'userrights-no-interwiki' => 'Nemáte oprávnenie upravovať práva používateľov na iných wiki.',
 'userrights-nodatabase' => 'Databáza $1 neexistuje alebo nie je lokálna.',
 'userrights-nologin' => 'Aby ste mohli prideľovať používateľom oprávnenia, musíte sa [[Special:UserLogin|prihlásiť]] s účtom správcu.',
-'userrights-notallowed' => 'Váš účet nemá oprávnenie prideľovať alebo odoberať používateľom oprávnenia.',
+'userrights-notallowed' => 'Nemáte oprávnenie prideľovať alebo odoberať používateľom oprávnenia.',
 'userrights-changeable-col' => 'Skupiny, ktoré môžete zmeniť',
 'userrights-unchangeable-col' => 'Skupiny, ktoré nemôžete zmeniť',
+'userrights-conflict' => 'Konflikt zmien práv používateľov! Prosím, skontrolujte ho a potvrďte svoje zmeny.',
+'userrights-removed-self' => 'Úspešne ste odstránili svoje vlastné práva. Z toho dôvodu už nebudete mať prístup k tejto stránke.',
 
 # Groups
 'group' => 'Skupina:',
@@ -1579,7 +1600,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'right-reupload-shared' => 'Nahrávať lokálne súbory, ktoré majú prednosť pred zdieľaným úložiskom',
 'right-upload_by_url' => 'Nahrávať súbor z URL adresy',
 'right-purge' => 'Čistiť vyrovnávaciu pamäť stránky bez potvrdzovacej stránky',
-'right-autoconfirmed' => 'Upravovať čiastočne zamknuté stránky',
+'right-autoconfirmed' => 'Neovplyvnený obmedzeniami na základe IP adresy',
 'right-bot' => 'Byť považovaný za automatický proces',
 'right-nominornewtalk' => 'Pri drobných úpravách diskusnej stránky nevypisovať hlásenie o nových správach',
 'right-apihighlimits' => 'Používať vyššie limity v požiadavkách API',
@@ -1599,13 +1620,20 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'right-hideuser' => 'Zablokovať používateľské meno tak, že bude verejnosti skryté',
 'right-ipblock-exempt' => 'Obchádzať blokovanie IP adries, rozsahov a automatické blokovanie',
 'right-proxyunbannable' => 'Obchádzať automatické blokovanie proxy serverov',
-'right-unblockself' => 'Odblokovať samých seba',
-'right-protect' => 'Meniť úroveň zamknutia a upravovať zamknuté stránky',
-'right-editprotected' => 'Upravovať zamknuté schránky (bez kaskádovej ochrany)',
+'right-unblockself' => 'Odblokovať seba samého',
+'right-protect' => 'Meniť úroveň zamknutia a upravovať kaskádovito zamknuté stránky',
+'right-editprotected' => 'Upravovať stránky zamknuté ako „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'Upravovať stránky zamknuté ako „{{int:protect-level-autoconfirmed}}“',
 'right-editinterface' => 'Upravovať správy používateľského rozhrania',
 'right-editusercssjs' => 'Upravovať CSS a JS súbory ostatných používateľov',
 'right-editusercss' => 'Upravovať CSS súbory ostatných používateľov',
 'right-edituserjs' => 'Upravovať JS súbory ostatných používateľov',
+'right-editmyusercss' => 'Upraviť svoje vlastné používateľské súbory CSS',
+'right-editmyuserjs' => 'Upraviť svoje vlastné používateľské súbory JavaScript',
+'right-viewmywatchlist' => 'Zobraziť vlastný zoznam sledovaných stránok',
+'right-editmywatchlist' => 'Upraviť vlastný zoznam sledovaných stránok. Všimnite si, že niektoré operácie budú môcť pridať stránky aj bez tohto oprávnenia.',
+'right-viewmyprivateinfo' => 'Zobraziť vlastné súkromné údaje (napríklad e-mailovú adresu, skutočné meno)',
+'right-editmyprivateinfo' => 'Upraviť vlastné súkromné údaje (napríklad e-mailovú adresu, skutočné meno)',
 'right-editmyoptions' => 'Upraviť vlastné nastavenia',
 'right-rollback' => 'Rýchlo vrátiť úpravy posledného používateľa, ktorý upravoval danú stránku',
 'right-markbotedits' => 'Označiť vrátené úpravy ako úpravy robota',
@@ -1658,8 +1686,8 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'action-block' => 'zablokovať úpravy tohto používateľa',
 'action-protect' => 'zmeniť úrovne ochrany tejto stránky',
 'action-rollback' => 'rýchlo vrátiť úpravy posledného používateľa, ktorý upravoval danú stránku',
-'action-import' => 'importovať túto stránku z inej wiki',
-'action-importupload' => 'importovať túto stránku z nahraného súboru',
+'action-import' => 'importovať stránky z inej wiki',
+'action-importupload' => 'importovať stránky z nahraného súboru',
 'action-patrol' => 'označiť úpravy iných ako strážené',
 'action-autopatrol' => 'označiť vlastné úpravy ako strážené',
 'action-unwatchedpages' => 'zobraziť zoznam nesledovaných stránok',
@@ -1675,6 +1703,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|od poslednej návštevy}}',
 'enhancedrc-history' => 'história',
 'recentchanges' => 'Posledné úpravy',
 'recentchanges-legend' => 'Možnosti posledných zmien',
@@ -1697,7 +1726,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'rclinks' => 'Zobraziť posledných $1 úprav v posledných $2 dňoch<br />$3',
 'diff' => 'rozdiel',
 'hist' => 'história',
-'hide' => 'skryť',
+'hide' => 'Skryť',
 'show' => 'zobraziť',
 'minoreditletter' => 'd',
 'newpageletter' => 'N',
@@ -2114,6 +2143,8 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'pageswithprop-text' => 'Táto stránka obsahuje stránky, ktoré používajú konkrétnu vlastnosť stránky.',
 'pageswithprop-prop' => 'Názov vlastnosti:',
 'pageswithprop-submit' => 'Vykonať',
+'pageswithprop-prophidden-long' => 'dlhá hodnota textovej vlastnosti bola skrytá ($1)',
+'pageswithprop-prophidden-binary' => 'hodnota binárnej vlastnosti bola skrytá ($1)',
 
 'doubleredirects' => 'Dvojité presmerovania',
 'doubleredirectstext' => 'Táto stránka obsahuje zoznam stránok, ktoré presmerovávajú na iné presmerovacie stránky.
@@ -2187,6 +2218,7 @@ Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riad
 'listusers' => 'Zoznam používateľov',
 'listusers-editsonly' => 'Vynechať používateľov bez úprav',
 'listusers-creationsort' => 'Zoradiť podľa dátumu vytvorenia',
+'listusers-desc' => 'Zoradiť zostupne',
 'usereditcount' => '$1 {{PLURAL:$1|úprava|úpravy|úprav}}',
 'usercreated' => '{{GENDER:$3|Registrovaný|Registrovaná|Registrovaný(á)}} $1 $2',
 'newpages' => 'Nové stránky',
@@ -2282,7 +2314,7 @@ Povinná je minimálne doména najvyššej úrovne, napr. „*.org“.<br />
 # Special:ActiveUsers
 'activeusers' => 'Zoznam aktívnych používateľov',
 'activeusers-intro' => 'Toto je zoznam používateľov, ktorí $1 {{PLURAL:$1|za posledný 1 deň|za posledné $1 dni|za posledných $1 dní}} vykonali nejakú aktivitu.',
-'activeusers-count' => '$1 {{PLURAL:$1|úprava|úpravy|úprav}} za {{PLURAL:$3|posledný deň|posledné $3 dni|posledných $3 dní}}',
+'activeusers-count' => '$1 {{PLURAL:$1|operácia|operácie|operácií}} za {{PLURAL:$3|posledný deň|posledné $3 dni|posledných $3 dní}}',
 'activeusers-from' => 'Zobraziť používateľov počínajúc:',
 'activeusers-hidebots' => 'Skryť robotov',
 'activeusers-hidesysops' => 'Skryť správcov',
@@ -2443,10 +2475,12 @@ Na $2 nájdete zoznam posledných zmazaní.',
 'deletecomment' => 'Dôvod:',
 'deleteotherreason' => 'Iný/ďalší dôvod:',
 'deletereasonotherlist' => 'Iný dôvod',
-'deletereason-dropdown' => '*Bežné dôvody zmazania
-** Na žiadosť autora
+'deletereason-dropdown' => '* Bežné dôvody zmazania
+** Spam
+** Vandalizmus
 ** Porušenie autorských práv
-** Vandalizmus',
+** Na žiadosť autora
+** Chybné presmerovanie',
 'delete-edit-reasonlist' => 'Upraviť dôvody zmazania',
 'delete-toobig' => 'Táto stránka má veľkú históriu úprav, viac ako $1 {{PLURAL:$1|revíziu|revízie|revízií}}. Mazanie takýchto stránok bolo obmedzené, aby sa zabránilo náhodnému poškodeniu {{GRAMMAR:genitív|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Táto stránka má veľkú históriu úprav, viac ako $1 {{PLURAL:$1|revíziu|revízie|revízií}}. Jej zmazanie by mohlo narušiť databázové operácie {{GRAMMAR:genitív|{{SITENAME}}}}; postupujte opatrne.',
@@ -2454,7 +2488,7 @@ Na $2 nájdete zoznam posledných zmazaní.',
 # Rollback
 'rollback' => 'Vrátiť späť úpravy',
 'rollback_short' => 'Vrátiť',
-'rollbacklink' => 'rollback',
+'rollbacklink' => 'vrátiť',
 'rollbacklinkcount' => 'vrátenie $1 {{PLURAL:$1|úpravy|úprav}}',
 'rollbacklinkcount-morethan' => 'vrátiť viac ako $1 {{PLURAL:$1|úpravu|úprav}}',
 'rollbackfailed' => 'Rollback neúspešný',
@@ -2464,7 +2498,7 @@ Na $2 nájdete zoznam posledných zmazaní.',
 Autorom poslednej úpravy je [[User:$3|$3]] ([[User talk:$3|Diskusia]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Zhrnutie úpravy bolo: „''$1''“.",
 'revertpage' => 'Posledné úpravy používateľa [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusia]]) vrátené; bola obnovená posledná úprava $1',
-'revertpage-nouser' => 'Vrátené úpravy (meno používateľa odstránené) na poslednú revíziu od [[User:$1|$1]]',
+'revertpage-nouser' => 'Vrátené úpravy od skrytého používateľa na poslednú revíziu od {{GENDER:$1|[[User:$1|$1]]}}',
 'rollback-success' => 'Úpravy $1 vrátené; obnovená posledná verzia od $2.',
 
 # Edit tokens
@@ -2604,7 +2638,7 @@ $1',
 'contributions' => 'Príspevky {{GENDER:$1|používateľa|používateľky}}',
 'contributions-title' => 'Príspevky používateľa pre $1',
 'mycontris' => 'Príspevky',
-'contribsub2' => 'Príspevky $1 ($2)',
+'contribsub2' => 'Príspevky {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Neboli nájdené úpravy, ktoré by zodpovedali týmto kritériám.',
 'uctop' => '(aktuálne)',
 'month' => 'Mesiac:',
@@ -2726,7 +2760,7 @@ z/od momentálne zablokovanej IP adresy/používateľa.',
 'ipblocklist-empty' => 'Zoznam blokovaní je prázdny.',
 'ipblocklist-no-results' => 'Požadovaná IP adresa alebo používateľské meno nie je blokovaná.',
 'blocklink' => 'zablokovať',
-'unblocklink' => 'odblokuj',
+'unblocklink' => 'odblokovať',
 'change-blocklink' => 'zmeniť blokovanie',
 'contribslink' => 'príspevky',
 'emaillink' => 'poslať email',
@@ -2764,6 +2798,7 @@ blokované IP adresy nie sú zahrnuté. Pozri zoznam
 '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.',
 '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.',
+'xffblockreason' => 'IP adresa prítomná v hlavičke X-Forwarded-For patriaca buď vám alebo proxy serveru, ktorý používate, je zablokovaná. Pôvodný dôvod zablokovania bol: $1',
 'cant-block-while-blocked' => 'Nemôžete blokovať iných používateľov, kým ste zablokovaný.',
 'cant-see-hidden-user' => 'Používateľ, ktorého sa pokúšate zablokovať už bol zablokovaný a skrytý. Pretože nemáte právo hideuser, nemôžete vidieť ani upravovať blokovanie používateľa.',
 'ipbblocked' => 'Nemôžete zablokovať ani odblokovať iných používateľov, pretože ste sami zablokovaní',
@@ -2868,7 +2903,7 @@ Prosím, zlúčte ich ručne.'''",
 'movesubpagetext' => 'Táto stránka má $1 {{PLURAL:$1|podstránku, ktorá je zobrazená nižšie|podstránky, ktoré sú zobrazené nižšie|podstránok, ktoré sú zobrazené nižšie}}.',
 'movenosubpage' => 'Táto stránka nemá podstránky.',
 'movereason' => 'Dôvod:',
-'revertmove' => 'obnova',
+'revertmove' => 'obnov',
 'delete_and_move' => 'Vymazať a presunúť',
 'delete_and_move_text' => '==Je potrebné zmazať stránku==
 
@@ -2896,7 +2931,7 @@ Cieľová stránka „[[:$1]]“ už existuje. Chcete ho vymazať a vytvoriť ta
 Prosím, zvoľte iný názov.',
 
 # Export
-'export' => 'Export stránok',
+'export' => 'Exportovať stránky',
 'exporttext' => 'Môžete exportovať text a históriu úprav konkrétnej
 stránky alebo množiny stránok do XML; tieto môžu byť potom importované do inej
 wiki používajúceho MediaWiki softvér pomocou stránky Special:Import.
@@ -3023,16 +3058,16 @@ Uložte ho na svoj disk a nahrajte sem.',
 'tooltip-pt-anonuserpage' => 'Používateľská stránka pre ip adresu, ktorú upravujete ako',
 'tooltip-pt-mytalk' => 'Vaša diskusná stránka',
 'tooltip-pt-anontalk' => 'Diskusia o úpravách z tejto ip adresy',
-'tooltip-pt-preferences' => 'Moje nastavenia',
+'tooltip-pt-preferences' => 'Vaše nastavenia',
 'tooltip-pt-watchlist' => 'Zoznam stránok, na ktorých sledujete zmeny.',
 'tooltip-pt-mycontris' => 'Zoznam vašich príspevkov',
 'tooltip-pt-login' => 'Odporúčame vám prihlásiť sa, nie je to však povinné.',
 'tooltip-pt-anonlogin' => 'Odporúčame vám prihlásiť sa, nie je to však povinné.',
 'tooltip-pt-logout' => 'Odhlásiť',
 'tooltip-ca-talk' => 'Diskusia o obsahu stránky',
-'tooltip-ca-edit' => 'Môžete upravovať túto stránku. Prosíme, pred uložením použite tlačidlo Zobraziť náhľad.',
+'tooltip-ca-edit' => 'Môžete upravovať túto stránku. Prosím, pred uložením použite tlačidlo Zobraziť náhľad.',
 'tooltip-ca-addsection' => 'Začať novú sekciu',
-'tooltip-ca-viewsource' => 'Táto stránka je zamknutá. Môžete však vidieť jej zdrojový text.',
+'tooltip-ca-viewsource' => 'Táto stránka je zamknutá. Môžete však zobraziť jej zdrojový text.',
 'tooltip-ca-history' => 'Minulé verzie tejto stránky.',
 'tooltip-ca-protect' => 'Zamknúť túto stránku',
 'tooltip-ca-unprotect' => 'Zmeniť stav ochrany tejto stránky',
@@ -3044,34 +3079,34 @@ Uložte ho na svoj disk a nahrajte sem.',
 'tooltip-search' => 'Vyhľadávanie na {{GRAMMAR:datív|{{SITENAME}}}}',
 'tooltip-search-go' => 'Prejsť na stránku s presne takýmto názvom, ak existuje',
 'tooltip-search-fulltext' => 'Hľadať tento text na stránkach',
-'tooltip-p-logo' => 'Hlavná stránka',
+'tooltip-p-logo' => 'Navštívte Hlavnú stránku',
 'tooltip-n-mainpage' => 'Navštíviť Hlavnú stránku',
 'tooltip-n-mainpage-description' => 'Navštíviť hlavnú stránku',
 'tooltip-n-portal' => 'O projekte, ako môžete prispieť, kde čo nájsť',
 'tooltip-n-currentevents' => 'Aktuálne udalosti a ich pozadie',
-'tooltip-n-recentchanges' => 'Zoznam posledných úprav vo wiki.',
-'tooltip-n-randompage' => 'Zobrazenie náhodnej stránky',
-'tooltip-n-help' => 'Pozrieť si pomoc.',
+'tooltip-n-recentchanges' => 'Zoznam posledných úprav na wiki.',
+'tooltip-n-randompage' => 'Zobraziť náhodnú stránku',
+'tooltip-n-help' => 'Miesto, kde sa môžete dozvedieť',
 'tooltip-t-whatlinkshere' => 'Zoznam všetkých wiki stránok, ktoré sem odkazujú',
-'tooltip-t-recentchangeslinked' => 'Posledné úpravy v stránkach, ktoré odkazujú na túto stránku',
+'tooltip-t-recentchangeslinked' => 'Posledné úpravy v stránkach, na ktoré odkazuje táto stránka',
 'tooltip-feed-rss' => 'RSS feed pre túto stránku',
-'tooltip-feed-atom' => 'Atom feed pre túto stránku',
+'tooltip-feed-atom' => 'Kanál Atom pre túto stránku',
 'tooltip-t-contributions' => 'Pozrieť si zoznam príspevkov od tohto používateľa',
 'tooltip-t-emailuser' => 'Poslať e-mail tomuto používateľovi',
-'tooltip-t-upload' => 'Nahranie obrázkových alebo multimediálnych súborov',
+'tooltip-t-upload' => 'Nahranie súborov',
 'tooltip-t-specialpages' => 'Zoznam všetkých špeciálnych stránok',
 'tooltip-t-print' => 'Verzia tejto stránky pre tlač',
 'tooltip-t-permalink' => 'Trvalý odkaz na túto verziu stránky',
-'tooltip-ca-nstab-main' => 'Pozrieť si obsah stránky',
+'tooltip-ca-nstab-main' => 'Zobraziť obsah stránky',
 'tooltip-ca-nstab-user' => 'Pozrieť si stránku používateľa',
 'tooltip-ca-nstab-media' => 'Pozrieť si stránku médií',
 'tooltip-ca-nstab-special' => 'Toto je špeciálna stránka, nemôžete ju upravovať.',
 'tooltip-ca-nstab-project' => 'Pozrieť si stránku projektu',
 'tooltip-ca-nstab-image' => 'Zobraziť popisnú stránku súboru',
 'tooltip-ca-nstab-mediawiki' => 'Pozrieť si systémovú stránku',
-'tooltip-ca-nstab-template' => 'Pozrieť si šablónu',
+'tooltip-ca-nstab-template' => 'Zobraziť šablónu',
 'tooltip-ca-nstab-help' => 'Pozrieť si stránku Pomocníka',
-'tooltip-ca-nstab-category' => 'Pozrieť si stránku s kategóriami',
+'tooltip-ca-nstab-category' => 'Zobraziť stránku s kategóriami',
 'tooltip-minoredit' => 'Označiť túto úpravu ako drobnú',
 'tooltip-save' => 'Uložiť vaše úpravy',
 'tooltip-preview' => 'Náhľad úprav, prosím použite pred uložením!',
@@ -3151,13 +3186,14 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
 'pageinfo-length' => 'Dĺžka stránky (v bajtoch)',
 'pageinfo-article-id' => 'ID stránky',
 'pageinfo-language' => 'Jazyk obsahu stránok',
-'pageinfo-robot-policy' => 'Stav vyhľadávača',
-'pageinfo-robot-index' => 'Indexovať stránku',
-'pageinfo-robot-noindex' => 'Neindexovať stránku',
+'pageinfo-content-model' => 'Model obsahu stránky',
+'pageinfo-robot-policy' => 'Indexovanie pomocou robotov',
+'pageinfo-robot-index' => 'Povolené',
+'pageinfo-robot-noindex' => 'Nepovolené',
 'pageinfo-views' => 'Počet zobrazení',
 'pageinfo-watchers' => 'Počet používateľov sledujúcich stránku',
 'pageinfo-few-watchers' => 'Menej ako $1 {{PLURAL:$1|sledujúci|sledujúci|sledujúcich}}',
-'pageinfo-redirects-name' => 'Presmerovania na túto stránku',
+'pageinfo-redirects-name' => 'Počet presmerovaní na túto stránku',
 'pageinfo-subpages-name' => 'Podstránky tejto stránky',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|presmerovanie|presmerovania|presmerovaní}}; $3 {{PLURAL:$3|nie je presmerovanie|nie sú presmerovania}})',
 'pageinfo-firstuser' => 'Tvorca stránky',
@@ -3765,7 +3801,7 @@ ktorý zruší potvrdenie emailovej adresy:
 $5
 
 Platnosť tohto potvrdzovacieho kódu vyprší $4.',
-'confirmemail_body_set' => 'Niekto, pravdepodobne vy, z IP adresy $1
+'confirmemail_body_set' => 'Niekto, pravdepodobne vy, z IP adresy $1
 nastavil e-mailovú adresu účtu „$2“ na túto adresu na {{GRAMMAR:genitív|{{SITENAME}}}}.
 
 Ak chcete potvrdiť, že tento účet skutočne patrí vám a aktivovať
@@ -3774,7 +3810,7 @@ e-mailové funkcie na {{GRAMMAR:genitív|{{SITENAME}}}}, otvorte tento odkaz vo
 $3
 
 Ak účet nie je *nepatrí* patrí k vám, nasledujte tento odkaz,
-ktorú zruší potvrdenie e-mailovej adresy:
+ktorý zruší potvrdenie e-mailovej adresy:
 
 $5
 
@@ -3807,6 +3843,9 @@ Prosím, potvrďte, že túto stránku chcete skutočne znovu vytvoriť.",
 'confirm-unwatch-button' => 'OK',
 'confirm-unwatch-top' => 'Odstrániť túto stránku z vášho zoznamu sledovaných?',
 
+# Separators for various lists, etc.
+'quotation-marks' => '„$1“',
+
 # Multipage image navigation
 'imgmultipageprev' => '&larr; predošlá stránka',
 'imgmultipagenext' => 'ďalšia stránka &rarr;',
@@ -3915,7 +3954,7 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 # Special:Redirect
 'redirect' => 'Presmerovanie podľa súboru, používateľa alebo ID revízie',
 'redirect-legend' => 'Presmerovanie na súbor alebo stránku',
-'redirect-summary' => 'Táto špeciálna stránka presmerováva na súbor (podľa názvu), stránku (podľa identifikátora revízie) alebo používateľa (podľa číselného identifikátora používateľa).',
+'redirect-summary' => 'Táto špeciálna stránka presmerováva na súbor (podľa názvu súboru), stránku (podľa identifikátora revízie) alebo používateľa (podľa číselného identifikátora používateľa). Použitie: [[{{#Special:Redirect}}/file/Príklad.jpg]], [[{{#Special:Redirect}}/revision/328429]], resp. [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Ísť',
 'redirect-lookup' => 'Vyhľadať:',
 'redirect-value' => 'Hodnota:',
@@ -3978,6 +4017,7 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'tags-tag' => 'Názov značky',
 'tags-display-header' => 'Vzhľad v zoznamoch úprav',
 'tags-description-header' => 'Úplný popis významu',
+'tags-active-header' => 'Aktívny?',
 'tags-hitcount-header' => 'Označené úpravy',
 'tags-active-yes' => 'Áno',
 'tags-active-no' => 'Nie',
@@ -4138,6 +4178,14 @@ V opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš k
 'rotate-comment' => 'Obrázok otočený o $1 {{PLURAL:$1|stupeň|stupne|stupňov}} v smere hodinových ručičiek',
 
 # Limit report
+'limitreport-title' => 'Profilovacie údaje analyzátora:',
+'limitreport-cputime' => 'Čas využitia procesora',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunda|sekundy|sekúnd}}',
+'limitreport-walltime' => 'Reálny čas využitia',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunda|sekundy|sekúnd}}',
+'limitreport-ppvisitednodes' => 'Počet uzlov, ktoré preprocesor navštívil',
+'limitreport-ppgeneratednodes' => 'Počet uzlov, ktoré preprocesor vytvoril',
+'limitreport-postexpandincludesize' => 'Veľkosť vloženého objektu po rozbalení',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtov}}',
 'limitreport-templateargumentsize' => 'Veľkosť argumentov šablón',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtov}}',
index 0614566..66c4041 100644 (file)
@@ -727,8 +727,8 @@ Za preprečevanje zlorab lahko na {{PLURAL:$1|uro|$1 uri|$1 ure|$1 ur}} pošljem
 
 Če urejate prek AOL ali iz Bližnjega vzhoda, Afrike, Avstralije, Nove Zelandije ali iz šole, knjižnice ali podjetja, si IP-naslov morda delite z drugimi uporabniki. Če je tako, ste to sporočilo morda prejeli, čeprav niste ustvarili še nobenega računa. Znova se lahko poskusite registrirati po nekaj urah.',
 'emailauthenticated' => 'Vaš e-poštni naslov je bil potrjen dne $2 ob $3.',
-'emailnotauthenticated' => 'Vaš e-poštni naslov še ni potrjen. Za navedene
-možnosti se e-pošte ne bo pošiljalo.',
+'emailnotauthenticated' => 'Vaš e-poštni naslov še ni potrjen.
+Za navedene možnosti e-pošte ne bomo pošiljali.',
 'noemailprefs' => 'E-poštnega naslova niste vnesli, zato naslednje možnosti ne bodo delovale.',
 'emailconfirmlink' => 'Potrdite svoj e-poštni naslov',
 'invalidemailaddress' => 'E-poštni naslov zaradi neveljavne oblike ni sprejemljiv.
@@ -1168,15 +1168,15 @@ Do skrite vsebine bodo še vedno lahko dostopali drugi administratorji {{GRAMMAR
 * Neprimerni osebni podatki
 *: ''domači naslovi in telefonske številke, številke socialnega zavarovanja, etc.''",
 'revdelete-legend' => 'Nastavi omejitve vidnosti',
-'revdelete-hide-text' => 'Skrij besedilo redakcije',
+'revdelete-hide-text' => 'Besedilo redakcije',
 'revdelete-hide-image' => 'Skrij vsebino datoteke.',
 'revdelete-hide-name' => 'Skrij dejanje in cilj',
-'revdelete-hide-comment' => 'Skrij povzetek urejanja',
-'revdelete-hide-user' => 'Skrij uporabniško ime/IP-naslov urejevalca',
+'revdelete-hide-comment' => 'Povzetek urejanja',
+'revdelete-hide-user' => 'Uporabniško ime/IP-naslov urejevalca',
 'revdelete-hide-restricted' => 'Zadrži podatke od administratorjev kakor tudi od ostalih',
 'revdelete-radio-same' => '(ne spremeni)',
-'revdelete-radio-set' => 'Da',
-'revdelete-radio-unset' => 'Ne',
+'revdelete-radio-set' => 'Vidno',
+'revdelete-radio-unset' => 'Skrito',
 'revdelete-suppress' => 'Zadrži podatke od administratorjev kakor tudi od ostalih',
 'revdelete-unsuppress' => 'Odpraviti omejitve na obnovljenih redakcijah.',
 'revdelete-log' => 'Razlog:',
@@ -3071,6 +3071,7 @@ Prosimo, poskusite znova.',
 Omogoča vnos pojasnila v povzetku urejanja.',
 'tooltip-preferences-save' => 'Shrani nastavitve',
 'tooltip-summary' => 'Vnesite kratek povzetek',
+'interlanguage-link-title' => '$1 – $2',
 
 # Metadata
 'notacceptable' => 'V obliki, ki jo lahko bere vaš odjemalec, wikistrežnik podatkov ne more ponuditi.',
@@ -3110,6 +3111,7 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 'pageinfo-length' => 'Dolžina strani (v bajtih)',
 'pageinfo-article-id' => 'ID strani',
 'pageinfo-language' => 'Jezik vsebine strani',
+'pageinfo-content-model' => 'Model vsebine strani',
 'pageinfo-robot-policy' => 'Robotsko indeksiranje',
 'pageinfo-robot-index' => 'Dovoljeno',
 'pageinfo-robot-noindex' => 'Nedovoljeno',
@@ -3877,7 +3879,7 @@ Skupaj s programom bi morali bi prejeti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopijo
 # Special:Redirect
 'redirect' => 'Preusmeri po datoteki, uporabniku ali ID-ju redakcije',
 'redirect-legend' => 'Preusmeritev na datoteko ali stran',
-'redirect-summary' => 'Posebna stran preusmeri na datoteko (če podate ime datoteke), stran (če podate ID redakcije) ali uporabniško stran (če podatek številski ID uporabnika).',
+'redirect-summary' => 'Posebna stran preusmeri na datoteko (če podate ime datoteke), stran (če podate ID redakcije) ali uporabniško stran (če podate številski ID uporabnika). Primer: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] ali [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Pojdi',
 'redirect-lookup' => 'Iskanje:',
 'redirect-value' => 'Vrednost:',
index afc6b4c..58c76a6 100644 (file)
@@ -854,7 +854,7 @@ $2',
 'gotaccount' => 'Већ имате налог? Идите на страницу „$1“.',
 'gotaccountlink' => 'Пријава',
 'userlogin-resetlink' => 'Заборавили сте податке за пријаву?',
-'userlogin-resetpassword-link' => 'РеÑ\81еÑ\82Ñ\83Ñ\98Ñ\82е Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83',
+'userlogin-resetpassword-link' => 'Ð\97абоÑ\80авили Ñ\81Ñ\82е Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83?',
 'helplogin-url' => 'Help:Logging in',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помоћ при пријављивању]]',
 'userlogin-createanother' => 'Отвори још један налог',
@@ -1266,7 +1266,7 @@ $2
 Проверите разлике испод, па сачувајте измене.',
 'undo-failure' => 'Не могу да вратим измену због постојања сукобљених међуизмена.',
 'undo-norev' => 'Не могу да вратим измену јер не постоји или је обрисана.',
-'undo-summary' => 'Поништена измена $1  {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])',
+'undo-summary' => 'Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])',
 'undo-summary-username-hidden' => 'Поништи измену $1 скривеног корисника',
 
 # Account creation failure
@@ -1360,15 +1360,15 @@ $2
 * Неприкладни лични подаци
 *: ''кућна адреса и број телефона, број банковне картице итд.''",
 'revdelete-legend' => 'Ограничења видљивости',
-'revdelete-hide-text' => 'сакриј текст измене',
+'revdelete-hide-text' => 'Текст ревизије',
 'revdelete-hide-image' => 'Сакриј садржај датотеке',
 'revdelete-hide-name' => 'Сакриј радњу и одредиште',
 'revdelete-hide-comment' => 'сакриј опис измене',
-'revdelete-hide-user' => 'сакриј име уређивача',
+'revdelete-hide-user' => 'Кориснчко име уредника/ИП адреса',
 'revdelete-hide-restricted' => 'Сакриј податке од администратора и других корисника',
 'revdelete-radio-same' => '(не мењај)',
-'revdelete-radio-set' => 'да',
-'revdelete-radio-unset' => 'не',
+'revdelete-radio-set' => 'Ð\92идÑ\99иво',
+'revdelete-radio-unset' => 'СакÑ\80ивено',
 'revdelete-suppress' => 'Сакриј податке од администратора и других корисника',
 'revdelete-unsuppress' => 'Уклони ограничења на враћеним изменама',
 'revdelete-log' => 'Разлог:',
@@ -1435,7 +1435,7 @@ $1",
 'mergehistory-reason' => 'Разлог:',
 
 # Merge log
-'mergelog' => 'Ð\98Ñ\81Ñ\82оÑ\80иÑ\98а спајања',
+'mergelog' => 'Ð\94невник спајања',
 'pagemerge-logentry' => 'страница [[$1]] је спојена у [[$2]] (све до измене $3)',
 'revertmerge' => 'растави',
 'mergelogpagetext' => 'Испод се налази списак скорашњих спајања историја страница.',
@@ -2598,7 +2598,7 @@ $UNWATCHURL
 'actionfailed' => 'Радња није успела',
 'deletedtext' => "Страница „$1“ је обрисана.
 Погледајте ''$2'' за више детаља.",
-'dellogpage' => 'Ð\98Ñ\81Ñ\82оÑ\80иÑ\98а брисања',
+'dellogpage' => 'Ð\94невник брисања',
 'dellogpagetext' => 'Испод је списак последњих брисања.',
 'deletionlog' => 'дневник брисања',
 'reverted' => 'Враћено на ранију измену',
@@ -4100,7 +4100,7 @@ $5
 'table_pager_empty' => 'Нема резултата',
 
 # Auto-summaries
-'autosumm-blank' => 'Ð\9fоÑ\82пÑ\83но Ð¾Ð±Ñ\80иÑ\81ана Ñ\81Ñ\82Ñ\80аниÑ\86а',
+'autosumm-blank' => 'УклоÑ\9aен Ñ\86елокÑ\83пан Ñ\81адÑ\80жаÑ\98а Ñ\81Ñ\82Ñ\80аниÑ\86е',
 'autosumm-replace' => 'Замена садржаја странице са „$1“',
 'autoredircomment' => 'Преусмерење на [[$1]]',
 'autosumm-new' => 'Нова страница: $1',
index 6845eb0..0b78a60 100644 (file)
@@ -752,7 +752,7 @@ Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još pr
 'gotaccount' => 'Već imate nalog? Idite na stranicu „$1“.',
 'gotaccountlink' => 'Prijava',
 'userlogin-resetlink' => 'Zaboravili ste podatke za prijavu?',
-'userlogin-resetpassword-link' => 'Resetuj lozinku',
+'userlogin-resetpassword-link' => 'Zaboravili ste lozinku?',
 'helplogin-url' => 'Help:Logging in',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]',
 'createacct-join' => 'Unesite svoje podatke ispod.',
@@ -932,7 +932,7 @@ Privremena lozinka: $2',
 'watchthis' => 'nadgledaj ovu stranicu',
 'savearticle' => 'Sačuvaj stranicu',
 'preview' => 'Pregled',
-'showpreview' => 'Pregledaj',
+'showpreview' => 'Prikaži pretpregled',
 'showlivepreview' => 'Trenutni pregled',
 'showdiff' => 'Prikaži izmene',
 'anoneditwarning' => "'''Upozorenje:''' niste prijavljeni.
@@ -1320,7 +1320,7 @@ Korišćenje navigacionih veza će poništiti ovu kolonu.',
 'mergehistory-reason' => 'Razlog:',
 
 # Merge log
-'mergelog' => 'Istorija spajanja',
+'mergelog' => 'Dnevnik spajanja',
 'pagemerge-logentry' => 'stranica [[$1]] je spojena u [[$2]] (sve do izmene $3)',
 'revertmerge' => 'rastavi',
 'mergelogpagetext' => 'Ispod se nalazi spisak skorašnjih spajanja istorija stranica.',
@@ -2457,7 +2457,7 @@ Potvrdite svoju nameru, da razumete posledice i da ovo radite u skladu s [[{{Med
 'actionfailed' => 'Radnja nije uspela',
 'deletedtext' => "Stranica „$1“ je obrisana.
 Pogledajte ''$2'' za više detalja.",
-'dellogpage' => 'Istorija brisanja',
+'dellogpage' => 'Dnevnik brisanja',
 'dellogpagetext' => 'Ispod je spisak poslednjih brisanja.',
 'deletionlog' => 'dnevnik brisanja',
 'reverted' => 'Vraćeno na raniju izmenu',
@@ -3941,7 +3941,7 @@ Potvrdite da stvarno želite da napravite stranicu.",
 'table_pager_empty' => 'Nema rezultata',
 
 # Auto-summaries
-'autosumm-blank' => 'Potpuno obrisana stranica',
+'autosumm-blank' => 'Uklonjen celokupan sadržaja stranice',
 'autosumm-replace' => 'Zamena sadržaja stranice sa „$1“',
 'autoredircomment' => 'Preusmerenje na [[$1]]',
 'autosumm-new' => 'Nova stranica: $1',
index de062c2..c1b1808 100644 (file)
@@ -1491,7 +1491,7 @@ Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
 'recentchangescount' => 'Antal redigeringar som visas som standard:',
 'prefs-help-recentchangescount' => 'Detta inkluderar senaste ändringarna, sidhistorik och loggar.',
 'prefs-help-watchlist-token2' => 'Detta är den hemliga nyckeln till webbflödet i din bevakningslista.
-Någon som vet den kommer att kunna läsa din bevakningslista, så inte dela ut den.
+Någon som vet den kommer att kunna läsa din bevakningslista, så dela inte ut den.
 [[Special:ResetTokens|Klicka här om du behöver återställa den]].',
 'savedprefs' => 'Dina inställningar har sparats',
 'timezonelegend' => 'Tidszon:',
@@ -3161,7 +3161,7 @@ Vänligen använd förhandsgranskningsknappen innan du sparar.',
 Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
 'tooltip-preferences-save' => 'Spara inställningar',
 'tooltip-summary' => 'Skriv en kort sammanfattning',
-'tooltip-iwiki' => '$1 - $2',
+'interlanguage-link-title' => '$1 - $2',
 
 # Stylesheets
 'common.css' => '/* CSS som skrivs här påverkar alla skal */',
index d8ef376..88e85d3 100644 (file)
@@ -2183,7 +2183,7 @@ $1',
 'contributions' => 'Michango ya {{GENDER:$1|mtumiaji}}',
 'contributions-title' => 'Michango ya mtumiaji $1',
 'mycontris' => 'Michango',
-'contribsub2' => 'Kwa $1 ($2)',
+'contribsub2' => 'Kwa {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Mabadiliko yanayolingana na vigezo vilivyoulizwa hayakupatikana.',
 'uctop' => '(ya kisasa)',
 'month' => 'Kutoka mwezi (na zamani zaidi):',
index cc9e5fc..b3c1417 100644 (file)
@@ -568,8 +568,8 @@ Jak bydźesz chćoł, coby wysyłoło Ći e-brify, pjyrwyj go przeczytej. Bydźe
 Coby powstrzimać nadużyća, mogebność wysyłańo przipůmńyń nasztalowano na jydne bez {{PLURAL:$1|godźina|$1 godźiny}}.',
 'mailerror' => 'Przi wysyłańu e-brifa zdorził śe feler: $1',
 'acct_creation_throttle_hit' => 'Przikro nom, założůł(a)żeś już {{PLURAL:$1|1 kůnto|$1 kůnta}}. Ńy możesz założyć kolejnygo.',
-'emailauthenticated' => 'Twůj adres e-brifa zostoł uwjerzitelńůny $2 uo $3.',
-'emailnotauthenticated' => 'Twůj adres e-brifa ńy je uwjerzitelńůny. Půniższe funkcyje poczty ńy bydům dźołać.',
+'emailauthenticated' => 'Twůj ausdruk e-brifa zostoł powjerzitelńůny $2 uo $3.',
+'emailnotauthenticated' => 'Twůj adres e-brifa ńy je powjerzitelńůny. Půniższe funkcyje poczty ńy dźołajům.',
 'noemailprefs' => 'Muśisz podać adres e-brifa, coby te funkcyje dźołały.',
 'emailconfirmlink' => 'Potwjyrdź swůj adres e-brifa',
 'invalidemailaddress' => 'E-brif ńy bydźe zaakceptůwany skiż tygo co jigo format ńy spełńo formalnych wymagań. Prosza naszkryflać poprowny adres e-brifa abo wyczyśćić pole.',
@@ -711,18 +711,15 @@ Możesz to zrobić we [[Special:Preferences|swojich sztalowańach]].',
 'loginreqlink' => 'zaloguj śe',
 'loginreqpagetext' => 'Muśisz $1 coby můc przeglůndać inksze zajty.',
 'accmailtitle' => 'Hasło posłane.',
-'accmailtext' => '!Hasło użytkowńika "[[User talk:$1|$1]]" zostauo wysłane pod adres $2.
-
-Hasło można pomjyńyć [[Special:ChangePassword|tu]].',
+'accmailtext' => "Cufalńe hasło lo [[User talk:$1|$1]] uostoło posłane do $2. Hasło lo tygo nowygo kůnta po zalogowańu je mogebność pomjyńić na zajće ''[[Special:ChangePassword|pomjyńańe hasła]]''.",
 'newarticle' => '(Nowy)',
 'newarticletext' => 'Ńy mo sam jeszcze artikla uo takijj titli. Eli chcesz go sprowjać, naszkryflej niżyj jego tekst (wjyncy informacyj nojdźesz [[{{MediaWiki:Helppage}}|na zajće půmocy]]). Eli żeś chćoł zrobić cośik inksze, naćiś ino knefel "Nazod".',
 'anontalkpagetext' => "---- ''To je zajta godki lo anůnimowych używoczy  - takich, kerzi ńy majům jeszcze swojigo kůnta abo ńy chcům go terozki używać.
 By jejich idyntyfikować, używomy numerůw IP.
 Eli jeżeś anůnimowym używoczym a wydowo Ći śe, aże zamjyszczůne sam kůmyntorze ńy sům skjyrowane do Ćebje, [[Special:UserLogin|utwůrz prosza kůnto]] abo [[Special:UserLogin|zalůguj śe]] - beztůż uńikńesz potym podobnych ńyporozumjyń.''",
 'noarticletext' => 'Ńy můmy zajta uo takij titli. Mogesz [{{fullurl:{{FULLPAGENAME}}|action=edit}} wćepać artikel {{FULLPAGENAME}}] abo [[Special:Search/{{PAGENAME}}|sznupać {{PAGENAME}} we inkszych]].',
-'noarticletext-nopermission' => 'Na tyj zajće ńy mo jeszcze artikla.
-Mogesz [[Special:Search/{{PAGENAME}}|wysznupać ta titla]] we treśći inkszych zajtůw
-abo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przesznupać powjůnzane logi].</span>',
+'noarticletext-nopermission' => 'Ta zajta terozki je pusto.
+Mogesz [[Special:Search/{{PAGENAME}}|wysznupać ta titla]] we treśćach inkszych zajtůw, abo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przesznupać powjůnzane rejery]</span>, nale ńy mosz uprowńyń coby ta zajta wćepać',
 'userpage-userdoesnotexist' => 'Użytkowńik "<nowiki>$1</nowiki>" ńy je zarejesztrowany. Sprowdź eli na pewno chćołżeś stworzyć/pomjynić gynał ta zajta.',
 'userpage-userdoesnotexist-view' => "Konto sprowjorza ''$1'' ńy istnieje.",
 'blocked-notice-logextract' => '{{GENDER:$1|Tyn sprowjorz|Ta sprowjorka}} mo zawrzite sprowjyńa.',
@@ -740,7 +737,7 @@ abo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}
 'updated' => '(Pomjyńano)',
 'note' => "'''Pozůr:'''",
 'previewnote' => "'''To je ino podglůnd - artikel jeszcze ńy je spamjyntany!'''",
-'continue-editing' => 'Sprowjej dalej',
+'continue-editing' => 'Przyndź do pola sprowjańo',
 'previewconflict' => 'Wersyjo podglůndano uodnośi śe do tekstu ze pola edycyje na wjyrchu. Tak bydźe wyglůndać zajta jeli zdecydujesz śe jům naszkryflać.',
 'session_fail_preview' => "'''Přeprašomy! Serwer ńy može přetwořyć tygo sprowjyńo skuli utraty danych ze sesyji. Sprůbuj ješče roz. Kejby to ńy pomoguo - wylůguj śe i zalogůj uod nowa.'''",
 'session_fail_preview_html' => "'''Přeprašomy! Serwer ńy može přetwořyć tygo sprowjyńo skuli utraty danych ze sesyji.'''
@@ -791,7 +788,7 @@ Možeš sprowjać te co juž sům, abo [[Special:UserLogin|zalogować śe, abo z
 'nocreate-loggedin' => 'Ńy moš uprowńyń do twořyńo nowych zajtůw.',
 'sectioneditnotsupported-title' => 'Sprowjańy tajli ńymogebne',
 'sectioneditnotsupported-text' => 'Sprowjańy tajli ńymogebne na tyj zajće.',
-'permissionserrors' => 'Felerne uprowńyńa',
+'permissionserrors' => 'Felerne uprawńyńo',
 'permissionserrorstext' => 'Ńy moš uprowńyń do takij akcyje {{PLURAL:$1|skuli tego, co:|bestůž, co:}}',
 'permissionserrorstext-withaction' => 'Ńy mogesz $2, ze {{PLURAL:$1|takigo powodu|takich powodůw}}:',
 'recreate-moveddeleted-warn' => "'''ůostrzeżyńy: Wćepujesz samo zajta, kery bůu poprzedńo wyćepany.'''
@@ -854,8 +851,8 @@ Skuli: ''$2''",
 Legynda: (akt.) - růżńice s wersyjům bjeżůncům, (poprz.) - růżńice s wersyjům poprzedzajůncům, d - drobne zmjany',
 'history-fieldset-title' => 'Przeglůndej gyszichta',
 'history-show-deleted' => 'Jyno wyćepane',
-'histfirst' => 'uod počůnku',
-'histlast' => 'uod uostatka',
+'histfirst' => 'nojstarsze',
+'histlast' => 'nojnowsze',
 'historysize' => '({{PLURAL:$1|1 bajt|$1 bajty|$1 bajtůw}})',
 'historyempty' => '(blank)',
 
@@ -1295,7 +1292,7 @@ $1',
 'rc_categories' => 'Uůgrańič do katygorii (oddźelej za půmocům "|")',
 'rc_categories_any' => 'Wšyskie',
 'newsectionsummary' => '/* $1 */ nowo tajla',
-'rc-enhanced-expand' => 'Pokož Å¡Ä\8dygůuy (wymogo JavaScript)',
+'rc-enhanced-expand' => 'Pokoż szczygůÅ\82y',
 'rc-enhanced-hide' => 'Schrůń detajle',
 
 # Recent changes linked
@@ -1710,8 +1707,8 @@ Adres e-brifa, kery zostoł bez Ćebje wkludzůny we [[Special:Preferences|Twoji
 'emailuserfooter' => 'Wjadůmość e-brif zostoła wysłano s {{GRAMMAR:D.lp|{{SITENAME}}}} ku $2 bez $1 s użyćym „Wyślij e-brif ku tym użytkowńikowi”.',
 
 # Watchlist
-'watchlist' => 'Pozorlista',
-'mywatchlist' => 'Mojo pozůrlista',
+'watchlist' => 'Pozůrlista',
+'mywatchlist' => 'Pozůrlista',
 'watchlistfor2' => 'Lo $1 ($2)',
 'nowatchlist' => 'Ńy ma žodnych pozycyji na liśće zajtůw, na kere dowoš pozůr.',
 'watchlistanontext' => '$1 coby uobejřeć abo sprowjać elymynty listy zajtůw, na kere dowoš pozůr',
@@ -1942,12 +1939,12 @@ $1',
 'blanknamespace' => '(przodńo)',
 
 # Contributions
-'contributions' => 'Ajnzac sprowjorza',
+'contributions' => 'Ajnzac {{GENDER:$1|używocza|używoczki}}',
 'contributions-title' => 'Wkłod użytkowńika $1',
-'mycontris' => 'Uody mje sprowjane',
-'contribsub2' => 'Do užytkowńika $1 ($2)',
+'mycontris' => 'Sprowjyńa',
+'contribsub2' => 'Lo {{GENDER:$3|używocza|używoczki}} $1 ($2)',
 'nocontribs' => 'Brak pomjyńań uodpowjadajůncych tym kryterjům.',
-'uctop' => '(uostatnio)',
+'uctop' => '(teroźńo)',
 'month' => 'Uod mjeśůnca (i downiyjše):',
 'year' => 'Uod roku (i dowńijše):',
 
@@ -1981,7 +1978,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 {{PLURAL:$1|punkńyńćy|punkńyńćo|puńkńyńć}}',
 'whatlinkshere-hidetrans' => '$1 {{PLURAL:$1|dokuplowańy|dokuplowańo|dokuplowań}}',
 'whatlinkshere-hidelinks' => '$1 {{PLURAL:$1|link|linki|linkůw}}',
-'whatlinkshere-hideimages' => '$1 linki s grafik',
+'whatlinkshere-hideimages' => '$1 linki ze plikůw',
 'whatlinkshere-filters' => 'Filtery',
 
 # Block/unblock
@@ -2445,8 +2442,8 @@ Eli plik był modyfikowany, dane mogům w tajli ńy być we zgodźe ze parametr
 'exif-colorspace' => 'Přestřyń kolorůw',
 'exif-componentsconfiguration' => 'Značyńy skuadowych',
 'exif-compressedbitsperpixel' => 'Skůmpresowanych bitůw na piksel',
-'exif-pixelydimension' => 'Prawiduowa šyrokość uobrozu',
-'exif-pixelxdimension' => 'Prawiduowo wysokość uobrozu',
+'exif-pixelydimension' => 'Prawidłowa szyrzka uobrozu',
+'exif-pixelxdimension' => 'Prawidłowo wyżka uobrozu',
 'exif-usercomment' => 'Kůmyntoř užytkowńika',
 'exif-relatedsoundfile' => 'Powjůnzany plik audjo',
 'exif-datetimeoriginal' => 'Data i čas utwořyńo uoryginouu',
@@ -2460,8 +2457,8 @@ Eli plik był modyfikowany, dane mogům w tajli ńy być we zgodźe ze parametr
 'exif-exposureprogram' => 'Progrům ekspozycyji',
 'exif-spectralsensitivity' => 'Čuuość widmowa',
 'exif-isospeedratings' => 'Šybkość aparatu zgodńy ze ISO12232',
-'exif-shutterspeedvalue' => 'Šybkość migawki',
-'exif-aperturevalue' => 'Přisuůna uobjektywu',
+'exif-shutterspeedvalue' => 'Wartkość migawki',
+'exif-aperturevalue' => 'Przisłůna uobjektywu',
 'exif-brightnessvalue' => 'Jasność',
 'exif-exposurebiasvalue' => 'Uodchylyńy ekspozycyji',
 'exif-maxaperturevalue' => 'Maksymalno wartość přisuůny',
@@ -2535,9 +2532,9 @@ Eli plik był modyfikowany, dane mogům w tajli ńy być we zgodźe ze parametr
 'exif-orientation-3' => 'uobroz uobrůcůny uo 180°',
 'exif-orientation-4' => 'uodbiće we źřadle w pjůńy',
 'exif-orientation-5' => 'uobroz uobrůcůny uo 90° přećiwńy do ruchu wskazůwek zygora i uodbiće we źřadle w pjůńy',
-'exif-orientation-6' => 'uobroz uobrůcůny uo 90° zgodńy s ruchym wskazůwek zygora',
+'exif-orientation-6' => 'Uobroz uobrůcůny uo 90° przećiwńy lo ruchu wskazůwek zygora',
 'exif-orientation-7' => 'uobrůt uo 90° zgodńy ze wskazůwkůma zygora i uodbiće we źřadle w pjůńy',
-'exif-orientation-8' => 'uobrůt uo 90° přećiwńy do wskazůwek zygora',
+'exif-orientation-8' => 'uobrůt uo 90° zgodńy do ruchu wskazůwek zygora',
 
 'exif-planarconfiguration-1' => 'format masywny',
 'exif-planarconfiguration-2' => 'format powjeřchńowy',
@@ -2753,10 +2750,10 @@ Potwjerdź chęć wćepańo nazod tygo artikla.",
 'table_pager_empty' => 'Brak wynikůw',
 
 # Auto-summaries
-'autosumm-blank' => 'POZŮR! Usůńjyńće treśći (zajta pozostoua pusto)!',
+'autosumm-blank' => 'POZŮR! Usůńjyńće treśći (zajta pozostoła pusto)!',
 'autosumm-replace' => 'POZŮR! Zastůmpjyńy treśći hasua bardzo krůtkym tekstym: „$1”',
 'autoredircomment' => 'Překerowańy do [[$1]]',
-'autosumm-new' => 'Nowo zajta: $1',
+'autosumm-new' => 'Wćepano nowo zajta: "$1"',
 
 # Live preview
 'livepreview-loading' => 'Trwo uadowańy…',
@@ -2773,9 +2770,9 @@ Potwjerdź chęć wćepańo nazod tygo artikla.",
 'watchlistedit-noitems' => 'Twoja lista artikli na kere dowoš pozůr je pusto.',
 'watchlistedit-normal-title' => 'Sprowjej lista zajtůw na kere dowom pozůr',
 'watchlistedit-normal-legend' => 'Wyćep zajty s listy artikli na kere dowoš pozůr',
-'watchlistedit-normal-explain' => 'PůÅ\84¾y moÅ¡ lista artikli na kere dowoÅ¡ pozůr.
-Coby wyćepać s ńij jako zajta,zaznač pole při ńij i naćiś knefel "Wyćep zaznačůne pozycyje".
-MožeÅ¡ tyž skoÅ\99istaÄ\87 ze [[Special:EditWatchlist/raw|tekstowygo edytora listy artikli na kere dowoÅ¡ pozůr]].',
+'watchlistedit-normal-explain' => 'PůÅ\84¼yj mosz lista artikli na kere dowosz pozůr.
+Coby wyćepać z ńij jako zajta, zaznocz pole przi ńij i naćiś knefel „{{int:Watchlistedit-normal-submit}}”.
+Możesz tyż skorzistaÄ\87 ze [[Special:EditWatchlist/raw|tekstowygo sprowjorza listy artikli na kere dowosz pozůr]].',
 'watchlistedit-normal-submit' => 'Wyćep s listy',
 'watchlistedit-normal-done' => 'Z Twoi listy artikli na kere dowoš pozůr {{PLURAL:$1|zostoua wyćepano 1 zajta|zostouy wyćepane $1 zajty|zostouo wyćepanych $1 zajtůw}}:',
 'watchlistedit-raw-title' => 'Tekstowy edytor listy artikli na kere dowoš pozůr',
@@ -2833,14 +2830,14 @@ Možeš tyž [[Special:EditWatchlist|užyć standardowygo edytora]].',
 * <strong class="mw-specialpagerestricted">Ekstra zajty do kerych dostymp je uograńiczůny.</strong>',
 'specialpages-group-maintenance' => 'Raporty kůnserwacyjne',
 'specialpages-group-other' => 'Inkše ekstra zajty',
-'specialpages-group-login' => 'Lůgowańy / rejerowańy',
+'specialpages-group-login' => 'Logowańy / regisztrowańy',
 'specialpages-group-changes' => 'Pomjyńane na uostatku a rejery',
 'specialpages-group-media' => 'Pliki',
 'specialpages-group-users' => 'Użytkowńiki i uprawńyńa',
 'specialpages-group-highuse' => 'Zajty čynsto užywane',
-'specialpages-group-pages' => 'Zajty',
+'specialpages-group-pages' => 'Listy zajt',
 'specialpages-group-pagetools' => 'Nořyńdźa zajtůw',
-'specialpages-group-wiki' => 'Informacyje a nořyńdźa wiki',
+'specialpages-group-wiki' => 'Informacyje a werkcojgi wiki',
 'specialpages-group-redirects' => 'Ekstra zajty, kere kerujům',
 'specialpages-group-spam' => 'Nořyńdźa do wyćepywanio spamu',
 
index c1a0ebf..26c3b55 100644 (file)
@@ -1895,8 +1895,8 @@ $1',
 'ancientpages' => 'மிகப்பழைய கட்டுரைகள்',
 'move' => 'நகர்த்தவும்',
 'movethispage' => 'இப்பக்கத்தை நகர்த்து',
-'unusedimagestext' => 'à®\95à¯\80à®´à¯\8dவரà¯\81à®®à¯\8d à®\95à¯\8bபà¯\8dபà¯\81à®\95ளà¯\8d à®\89ணà¯\8dà®\9fà¯\81, ஆனாலும் அவை எந்த ஒரு பக்கத்திலும் இணைக்கப்படவில்லை.
-இக்கோப்பு ஏனைய இணையத்தளங்களினால் நேரடியான இணையமுகவரியை பயன்படுத்தி இனைக்கப்பட்டிருக்கக் கூடுமென்பதுடன், செயல்படு பயன்பாட்டில் இருந்தும் கூட இங்கே பட்டியலிடப்பட்டிருக்கக்கூடும் என்பதையும் கவனிக்கவும்.',
+'unusedimagestext' => 'à®\95à¯\80à®´à¯\8dவரà¯\81à®®à¯\8d à®\95à¯\8bபà¯\8dபà¯\81à®\95ளà¯\8d à®\87à®°à¯\81நà¯\8dதாலà¯\81à®®à¯\8d, ஆனாலும் அவை எந்த ஒரு பக்கத்திலும் இணைக்கப்படவில்லை.
+இக்கோப்புகள் ஏனைய இணையத்தளங்களினால் இணையமுகவரியை பயன்படுத்தி நேரடியாக இனைக்கப்பட்டிருக்கக் கூடுமென்பதால் இவை பயன்பாட்டில் இருந்தாலும் இங்கே பட்டியலிடப்பட்டிருக்கக்கூடும் என்பதை கவனத்தில் கொள்ளவும்.',
 'unusedcategoriestext' => 'பின்வரும் பகுப்புகள் உருவாக்கப்பட்டுள்ளன எனினும் வேறு எந்தப் பக்கமோ அல்லது பகுப்போ இதைப் பயன்படுத்தவில்லை.',
 'notargettitle' => 'இலக்கு இல்லை',
 'notargettext' => 'நீங்கள் இந்தச் செயலை எந்தப் பயனர் அல்லது பக்கம் தொடர்பில் செய்வது என்பதைக் குறிப்பிடவில்லை.',
@@ -2737,7 +2737,7 @@ $1',
 'tooltip-undo' => '"பின்வாங்கு" என்பது முன்பு செய்த தொகுப்புக்களை இல்லாது செய்கிறது. மேலும் தாங்கள் செய்த தொகுப்பினை முன்தோற்ற நிலைக்கு கொண்டுவந்து காட்டும். அது தங்களுக்குச் சிறுகுறிப்புப் பகுதியில் அதற்கான காரணத்தைக் கூற அனுமதிக்கிறது.',
 'tooltip-preferences-save' => 'விருப்பங்களை சேமி',
 'tooltip-summary' => 'குறுகிய சுருக்கத்தை உள்ளிடவும்.',
-'tooltip-iwiki' => '$1 - $2',
+'interlanguage-link-title' => '$1 - $2',
 
 # Metadata
 'notacceptable' => 'உங்களது சேவையாளர் வாசிக்க கூடிய விதத்தில் இந்த விக்கியால தரவுகளை வழங்க முடியாது.',
index d2f86bc..d0dc0b2 100644 (file)
@@ -552,6 +552,7 @@ $2',
 'yourname' => 'వాడుకరి పేరు:',
 'userlogin-yourname' => 'వాడుకరి పేరు',
 'userlogin-yourname-ph' => 'మీ వాడుకరి పేరును ఇవ్వండి',
+'createacct-another-username-ph' => 'మీ వాడుకరి పేరును ఇవ్వండి',
 'yourpassword' => 'సంకేతపదం:',
 'userlogin-yourpassword' => 'సంకేతపదం',
 'userlogin-yourpassword-ph' => 'మీ సంకేతపదాన్ని ఇవ్వండి',
@@ -580,7 +581,7 @@ $2',
 'gotaccount' => 'ఇప్పటికే మీకు ఖాతా ఉందా? $1.',
 'gotaccountlink' => 'ప్రవేశించండి',
 'userlogin-resetlink' => 'మీ ప్రవేశ వివరాలను మరచిపోయారా?',
-'userlogin-resetpassword-link' => 'à°®à±\80 à°¦à°¾à°\9fà±\81మాà°\9fà°¨à±\81 à°®à°¾à°°à±\8dà°\9aà±\81à°\95à±\8bà°\82à°¡à°¿',
+'userlogin-resetpassword-link' => 'à°®à±\80 à°¸à°\82à°\95à±\87తపదానà±\8dని à°®à°°à±\8dà°\9aà°¿à°ªà±\8bయారా?',
 'helplogin-url' => 'Help:ప్రవేశించడం',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ప్రవేశించడానికి సహాయం]]',
 'createacct-join' => 'మీ సమాచారాన్ని క్రింద ఇవ్వండి.',
@@ -1334,7 +1335,7 @@ $1",
 'group-bot-member' => '{{GENDER:$1|బాట్}}',
 'group-sysop-member' => '{{GENDER:$1|నిర్వాహకుడు|నిర్వాహకురాలు}}',
 'group-bureaucrat-member' => '{{GENDER:$1|అధికారి|అధికారిణి}}',
-'group-suppress-member' => '{{GENDER:$1| పూర్తి   తొలగింపు}}',
+'group-suppress-member' => 'పూర్తి   తొలగింపు',
 
 'grouppage-user' => '{{ns:project}}:వాడుకరులు',
 'grouppage-autoconfirmed' => '{{ns:project}}:ఆటోమాటిగ్గా నిర్ధారించబడిన వాడుకరులు',
index b1d1b3a..a5142ae 100644 (file)
@@ -1654,9 +1654,9 @@ bumalik at ikarga ang talaksan na ito sa bagong pangalan. [[File:$1|thumb|center
 'uploadscripted' => 'Naglalaman ang talaksan na ito ng HTML o kodigong script na maaaring mali ang pagkaintindi ng isang web browser.',
 'uploadvirus' => 'Naglalaman ng virus ang talaksan! Mga detalye: $1',
 'uploadjava' => 'Ang talaksan ay isang talaksang ZIP na naglalaman ng isang .klase ng talaksan. na Java.  Hindi pinapayagan ang pagkakarga ng mga talaksang Java, dahil nakasasanhi sila ng mga paglilimita ng kaligtasan na kailangang lampasan.',
-'upload-source' => 'Pinagmulang talaksan',
+'upload-source' => 'Batayang talaksan',
 'sourcefilename' => 'Pangalan ng panggagalingang talaksan:',
-'sourceurl' => 'Pinagmulang URL:',
+'sourceurl' => 'Batayang URL:',
 'destfilename' => 'Pangalan ng patutunguhang talaksan:',
 'upload-maxfilesize' => 'Pinakamataas na sukat ng talaksan: $1',
 'upload-description' => 'Paglalarawan ng talaksan',
@@ -2029,12 +2029,11 @@ Pakitandaan lamang na ang iba mga websayt ay maaaring nakakawing sa isang talaks
 'querypage-disabled' => 'Hindi pinagagana ang natatanging pahinang ito para sa mga dahilan ng pagganap.',
 
 # Book sources
-'booksources' => 'Mapagkukuhanang mga aklat',
+'booksources' => 'Mga mapagkukunang aklat',
 'booksources-search-legend' => 'Maghanap ng mapagkukunang aklat',
 'booksources-isbn' => 'ISBN:',
-'booksources-go' => 'Punta',
-'booksources-text' => 'Matatagpuan sa ibaba ang mga tala ng mga ugnay sa ibang mga websayt na nagbebenta ng bago at nagamit na mga aklat, at maaring mayroon din
-na iba pang impormasyon tungkol sa mga aklat na hinahanap mo:',
+'booksources-go' => 'Puntahan',
+'booksources-text' => 'Matatagpuan sa ibaba ang isang tala ng mga kawing patungo sa ibang mga websayt na nanininda ng mga bago at gamit na aklat, at maaaring may iba pang impormasyon ito tungkol sa mga aklat na hinahanap mo:',
 'booksources-invalid-isbn' => 'Tila mukhang hindi yata katanggap-tanggap ang ibinigay na ISBN; pakisuri kung may mga kamalian ang pagkakasip/pagkakakopya mula sa orihinal na pinagmulan.',
 
 # Special:Log
@@ -2250,7 +2249,7 @@ Tugon at karagdagang tulong:
 'excontentauthor' => "ang nilalaman ay: '$1' (at ang tanging nag-ambag ay si '[[Special:Contributions/$2|$2]]')",
 'exbeforeblank' => "nilalaman bago nablangko: '$1'",
 'exblank' => 'walang laman ang pahina',
-'delete-confirm' => 'Burahin "$1"',
+'delete-confirm' => 'Burahin ang "$1"',
 'delete-legend' => 'Burahin',
 'historywarning' => "'''Babala''': May kasaysayan ang pahinang buburahin mo na tinatayang may $1 {{PLURAL:$1|pagbabago|mga pagbabago}}:",
 'confirmdeletetext' => 'Lubos mo nang buburahin ang pahinang ito pati ang kalahatan ng kasaysayan nito.
@@ -2773,7 +2772,7 @@ Pakidalaw ang [//www.mediawiki.org/wiki/Localisation Lokalisasyong MediaWiki] at
 'import-interwiki-text' => 'Pumili ng isang wiki at pamagat ng pahina na iaangkat.
 Mapapanatili ang mga petsa ng pagbabago at mga pangalan ng patnugot.
 Naitatala sa [[Special:Log/import|tala ng inangkat]] ang lahat ng mga transwiking aksyon para sa pag-angkat.',
-'import-interwiki-source' => 'Pinagmulang wiki/pahina:',
+'import-interwiki-source' => 'Batayang wiki/pahina:',
 'import-interwiki-history' => 'Kopyahin ang lahat ng mga bersyon ng kasaysayan para sa pahinang ito',
 'import-interwiki-templates' => 'Isama ang lahat ng mga suleras',
 'import-interwiki-submit' => 'Mag-angkat',
index aad3464..911839a 100644 (file)
@@ -13,6 +13,7 @@
  * @author Kaganer
  * @author Reedy
  * @author Sahran
+ * @author Tel'et
  */
 
 $rtl = true;
@@ -55,10 +56,10 @@ $messages = array(
 'tog-extendwatchlist' => 'كۈچەيتىلگەن كۆزەت تىزىملىكىدە يېقىنقى ئۆزگەرتىشنىلا كۆرسەتمەي بەلكى ھەممە ئۆزگەرتىشنى كۆرسەت',
 'tog-usenewrc' => 'بەت گۇرۇپپىلىنىشىغا ئاساسەن يېقىنقى ئۆزگەرتىش ۋە كۆزەت تىزىمى (JavaScript زۆرۈر)',
 'tog-numberheadings' => 'ماۋزۇغا ئۆزلۈكىدىن تەرتىپ نومۇرى قوش',
-'tog-showtoolbar' => 'تەھرىر قورال بالداقنى كۆرسەت (JavaScript زۆرۈر)',
-'tog-editondblclick' => 'قوش چەككەندە بەت تەھرىرلە (JavaScript زۆرۈر)',
+'tog-showtoolbar' => 'تەھرىر قورال بالداقنى كۆرسەت',
+'tog-editondblclick' => 'قوش چەككەندە بەت تەھرىرلە',
 'tog-editsection' => '[تەھرىر] ئۇلانمىسىنى چېكىپ ئابزاس تەھرىرلەشكە يول قوي',
-'tog-editsectiononrightclick' => 'ماۋزۇنى چاشقىنەكتە ئوڭ چېكىپ ئابزاس تەھرىرلەشكە يول قوي (JavaScript زۆرۈر)',
+'tog-editsectiononrightclick' => 'تېمىنى ئوڭ چېكىپ ئابزاس تەھرىرلەشكە يول قوي',
 'tog-showtoc' => 'مەزمۇن جەدۋىلى كۆرسەت (بىر بەتتە 3 تىن ئارتۇق ماۋزۇ بار بەتكە قارىتىلغان)',
 'tog-rememberpassword' => 'بۇ كومپيۇتېردا كىرگىنىمنى ئەستە ساقلا(ئەڭ ئۇزۇن بولغاندا $1 {{PLURAL:$1|كۈن|كۈن}})',
 'tog-watchcreations' => 'مەن قۇرغان بەت ۋە يۈكلىگەن ھۆججەتلەرنى كۆزەت تىزىملىكىمگە قوش',
@@ -76,7 +77,7 @@ $messages = array(
 'tog-shownumberswatching' => 'بۇ بەتنى كۆزىتىۋاتقان ئىشلەتكۈچى سانىنى كۆرسەت',
 'tog-oldsig' => 'نۆۋەتتىكى ئىمزا:',
 'tog-fancysig' => 'ئىمزاغا wiki تېكستى سۈپىتىدە مۇئامىلە قىل (ئۆزلۈكىدىن ئۇلانما ھاسىل بولمايدۇ)',
-'tog-uselivepreview' => 'رÙ\89ئاÙ\84 Û\8bاÙ\82Ù\89تÙ\84Ù\89Ù\82 Ø¦Ø§Ù\84دÙ\89Ù\86 Ù\83Û\86زÙ\89تÙ\89Ø´Ù\86Ù\89 Ø¦Ù\89Ø´Ù\84Û\95ت (JavaScript Ø²Û\86رÛ\88ر) (سىناق)',
+'tog-uselivepreview' => 'جاÙ\86Ù\84Ù\89Ù\82 Ø¦Ø§Ù\84دÙ\89Ù\86 Ù\83Û\86زÙ\89تÙ\89Ø´Ù\86Ù\89 Ø¦Ù\89Ø´Ù\84Û\95ت (سىناق)',
 'tog-forceeditsummary' => 'ئۈزۈندە كىرگۈزمىگەندە مېنى ئەسكەرت',
 'tog-watchlisthideown' => 'كۆزەت تىزىملىكىدىن مېنىڭ تەھرىرلىگىنىمنى يوشۇر',
 'tog-watchlisthidebots' => 'كۆزەت تىزىملىكىدىن ماشىنا ئادەم تەھرىرلىگەننى يوشۇر',
@@ -152,6 +153,18 @@ $messages = array(
 'oct' => 'ئۆكتەبىر',
 'nov' => 'نويابىر',
 'dec' => 'دېكابىر',
+'january-date' => '$1- يانۋار',
+'february-date' => '$1- فېۋرال',
+'march-date' => '$1- مارت',
+'april-date' => '$1- ئاپرىل',
+'may-date' => '$1- ماي',
+'june-date' => '$1- ئىيۇن',
+'july-date' => '$1- ئىيۇل',
+'august-date' => '$1- ئاۋغۇست',
+'september-date' => '$1- سىنتەبىر',
+'october-date' => '$1- ئۆكتەبىر',
+'november-date' => '$1- نويابىر',
+'december-date' => '$1- دىكابىر',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|تۈر|تۈرلەر}}',
@@ -178,7 +191,7 @@ $messages = array(
 'newwindow' => '(يېڭى كۆزنەكتە ئاچ)',
 'cancel' => 'ۋاز كەچ',
 'moredotdotdot' => 'تەپسىلىي…',
-'morenotlisted' => 'تÛ\95پسÙ\89Ù\84اتÙ\89 Ù\83Û\86رسÙ\89تÙ\89Ù\84Ù\85Ù\89Ú¯Û\95Ù\86Ù\84Ù\89رÙ\89â\80¦',
+'morenotlisted' => 'بÛ\87 ØªÙ\89زÙ\89Ù\85Ù\84Ù\89Ù\83 ØªÙ\88Ù\84Û\87Ù\82 Ø¦Û\95Ù\85Û\95س.',
 'mypage' => 'بەتىم',
 'mytalk' => 'مۇنازىرە بېتىم',
 'anontalk' => 'بۇ IP نىڭ مۇنازىرە بېتى',
@@ -234,6 +247,7 @@ $messages = array(
 'create-this-page' => 'بۇ بەتنى قۇر',
 'delete' => 'ئۆچۈر',
 'deletethispage' => 'بۇ بەتنى ئۆچۈر',
+'undeletethispage' => ' بۇ بەتنى ئەسلىگە كەلتۈر',
 'undelete_short' => 'ئۆچۈرۈلگەن {{PLURAL:$1|بىر تەھرىر|$1 تەھرىر}} ئەسلىگە كەلتۈرۈلدى',
 'viewdeleted_short' => '{{PLURAL:$1|بىر ئۆچۈرۈلگەن نەشرى|$1 ئۆچۈرۈلگەن نەشرى}}نى كۆرسەت',
 'protect' => 'قوغدا',
@@ -250,7 +264,7 @@ $messages = array(
 'articlepage' => 'مەزمۇن بېتىنى كۆرسەت',
 'talk' => 'مۇنازىرە',
 'views' => 'كۆرۈنۈش',
-'toolbox' => 'قورال ساندۇقى',
+'toolbox' => 'قوراللار',
 'userpage' => 'ئىشلەتكۈچى بېتىنى كۆرسەت',
 'projectpage' => 'قۇرۇلۇش بېتىنى كۆرسەت',
 'imagepage' => 'ھۆججەت بېتىنى كۆرسەت',
@@ -373,6 +387,8 @@ URL نى خاتا كىرگۈزۈپ قالدىڭىز ياكى خاتا ئۇلان
 # General errors
 'error' => 'خاتالىق',
 'databaseerror' => 'ساندان خاتالىقى',
+'databaseerror-function' => 'فۇنكىسىيە: $1',
+'databaseerror-error' => 'خاتا: $1',
 'laggedslavemode' => 'ئاگاھلاندۇرۇش: بەت يېقىنقى يېڭىلاشنى ئۆز ئىچىگە ئالمىغان بولۇشى مۇمكىن.',
 'readonly' => 'ساندان قۇلۇپلانغان',
 'enterlockreason' => 'قۇلۇپلىنىش سەۋەبىنى كىرگۈزۈڭ، قايتا ئېچىشنىڭ مۆلچەر ۋاقتىنىمۇ ئۆز ئىچىگە ئالىدۇ',
@@ -470,9 +486,19 @@ $2',
 
 [[Special:Preferences|{{SITENAME}} تەڭشىكىڭىزنى تەڭشەشنى ئۇنتۇپ قالماڭ]].',
 'yourname' => 'ئىشلەتكۈچى ئاتى:',
-'yourpassword' => 'ئىم:',
+'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' => 'بۇ سانداننى دەلىللەش خاتالىقى ياكى سىرتقى ھېساباتىڭىزنى يېڭىلاشنى چەكلىگەنلىكتىن بولغان بولۇشى مۇمكىن.',
@@ -484,18 +510,42 @@ $2',
 'logout' => 'تىزىمدىن چىق',
 'userlogout' => 'تىزىمدىن چىق',
 'notloggedin' => 'تىزىمغا كىرمىدى',
+'userlogin-noaccount' => 'ھېساباتىڭىز يوقمۇ؟',
+'userlogin-joinproject' => '{{SITENAME}} قا ئەزا بولۇش',
 'nologin' => "ھېساباتىڭىز يوقمۇ؟ '''$1'''.",
 'nologinlink' => 'ھېساباتتىن بىرنى قۇر',
 'createaccount' => 'ھېسابات قۇر',
 'gotaccount' => "ھېساباتىم بار؟ '''$1'''.",
 'gotaccountlink' => 'تىزىمغا كىر',
 'userlogin-resetlink' => 'تىزىمغا كىرىش تەپسىلاتىنى ئۇنۇتتىڭىز؟',
+'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' => 'ئېلخەت ئادرېسى (ئىختىيارى)',
+'createacct-email-ph' => 'ئېلخەت ئادرېسىڭىزنى كىرگۈزۈڭ',
+'createacct-another-email-ph' => 'ئېلخەت ئادرېسى كىرگۈزۈڭ',
 'createaccountmail' => 'ۋاقىتلىق ئىختىيارىي بىر ئېمنى ئىشلىتىدۇ ھەمدە تۆۋەندىكى بەلگىلەنگەن تورخەت ئادرېسىغا ئەۋەتىدۇ',
+'createacct-realname' => 'ھەقىقى ئىسمىڭىز (ئىختىيارى)',
 'createaccountreason' => 'سەۋەب:',
-'badretype' => 'سىز كىرگۈزگەن ئىم ماس كەلمىدى.',
+'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|بەت}}',
+'badretype' => 'سىز كىرگۈزگەن پارول ماس كەلمىدى.',
 'userexists' => 'كىرگۈزگەن ئىشلەتكۈچى ئاتى ئىشلىتىلىۋاتىدۇ.
 باشقا ئاتنى تاللاڭ.',
 'loginerror' => 'تىزىمغا كىرىش خاتالىقى',
+'createacct-error' => 'ھېسابات قۇرۇش خاتالىقى',
 'createaccounterror' => 'ھېسابات قۇرالمىدى: $1',
 'nocookiesnew' => 'ئىشلەتكۈچى ھېساباتى قۇرۇلدى ئەمما سىز تېخى كىرمىدىڭىز..
 
@@ -522,15 +572,15 @@ cookies نى قوزغاتقانلىقىڭىزنى جەزملەڭ، بۇ بەتن
 كىرگۈزگىنىڭىزنى تەكشۈرۈڭ.',
 'nouserspecified' => 'ئىشلەتكۈچى ئاتىدىن بىرنى بەلگىلەڭ.',
 'login-userblocked' => 'بۇ ئىشلەتكۈچى چەكلەنگەن. تىزىمغا كىرىشكە يول قويۇلمايدۇ.',
-'wrongpassword' => 'كىرگۈزگەن ئىم خاتا.
+'wrongpassword' => 'كىرگۈزگەن پارول خاتا.
 قايتا سىناڭ.',
-'wrongpasswordempty' => 'ئىم كىرگۈزمىدىڭىز
+'wrongpasswordempty' => 'پارول كىرگۈزمىدىڭىز
 قايتا سىناڭ.',
 'passwordtooshort' => 'ئىم ئاز دېگەندە {{PLURAL:$1|1 ھەرپ|$1 ھەرپ}} بولۇشى لازىم.',
-'password-name-match' => 'ئىم ئىشلەتكۈچى ئاتىڭىزدىن پەرقلىنىشى لازىم.',
-'password-login-forbidden' => 'بۇ ئىشلەتكۈچى ئاتى ۋە ئىم چەكلەنگەن.',
+'password-name-match' => 'پارولىڭىز ئىشلەتكۈچى نامىڭىزدىن پەرقلىنىشى لازىم.',
+'password-login-forbidden' => 'بۇ ئىشلەتكۈچى نامى ۋە پارول چەكلەنگەن.',
 'mailmypassword' => 'يېڭى ئىمنى ئېخەتكە ئەۋەت',
-'passwordremindertitle' => '{{SITENAME}} ئۈچۈن يېڭى ۋاقىتلىق ئىم',
+'passwordremindertitle' => '{{SITENAME}} ئۈچۈن يېڭى ۋاقىتلىق پارول',
 'passwordremindertext' => 'باشقىلار (بەلكىم سىز، IP ئادرېسى $1)
 {{SITENAME}} بېكەتنىڭ يېڭى ئىم ($4) نى ئىلتىماس قىلدى .
  "$2" ئىشلەتكۈچىنىڭ يېڭى ۋاقىتلىق ئىمنى "$3" غا تەڭشىدى.
@@ -552,7 +602,7 @@ cookies نى قوزغاتقانلىقىڭىزنى جەزملەڭ، بۇ بەتن
 'mailerror' => 'ئېلخەت يوللىغاندا خاتالىق كۆرۈلدى:$1',
 'acct_creation_throttle_hit' => 'Wiki ئىشلىتىدىغان زىيارەتچى IP ئادرېسىڭىزنى ئىشلىتىپ {{PLURAL:$1|1 ھېسابات|$1 ھېسابات}} قۇردى.
 مۇشۇ پەيتتە يەنە ھېسابات قۇرالمايسىز.',
-'emailauthenticated' => 'ئېلخەت ئادرېسىڭىز $2 $3 ئىناۋەتلىك ئىكەنلىكى دەلىللەندى.',
+'emailauthenticated' => 'ئېلخەت ئادرېسىڭىز $2 سائەت $3 دە دەلىللەندى.',
 'emailnotauthenticated' => 'ئېلخەت ئادرېسىڭىز تېخى دەلىللەنمىدى.
 تۆۋەندىكى ئىقتىدارى ھېچقانداق ئېلخەت ئەۋەتمەيدۇ.',
 'noemailprefs' => 'بۇ ئىقتىدارنى ئىشلىتىش ئۈچۈن مايىللىق تەڭشىكىڭىزدە ئېلخەت ئادرېسى بەلگىلەڭ.',
@@ -581,25 +631,25 @@ cookies نى قوزغاتقانلىقىڭىزنى جەزملەڭ، بۇ بەتن
 'user-mail-no-body' => 'بوش ياكى مەزمۇنى قىسقا مۇۋاپىق بولمىغان تورخەت ئەۋەتىشنى سىنىدى.',
 
 # Change password dialog
-'resetpass' => 'ئىم ئۆزگەرت',
+'resetpass' => 'پارولنى ئۆزگەرتىش',
 'resetpass_announce' => 'سىز ۋاقىتلىق ئېلخەت جەزملەش كودىدا تىزىمغا كىرگەن.
 تىزىمغا كىرىشنى تاماملاشتا، بۇ جايدا يېڭى ئىم بەلگىلىشىڭىز لازىم:',
 'resetpass_text' => '<!-- بۇ يەرگە تېكست قوشۇڭ -->',
 'resetpass_header' => 'ھېسابات ئىمنى ئۆزگەرت',
-'oldpassword' => 'كونا ئىم:',
-'newpassword' => 'يېڭى ئىم:',
-'retypenew' => 'يېڭى ئىمنى قايتا كىرگۈزۈڭ:',
-'resetpass_submit' => 'ئىم بەلگىلەپ تىزىمغا كىرىڭ',
+'oldpassword' => 'كونا پارول:',
+'newpassword' => 'يېڭى پارول:',
+'retypenew' => 'يېڭى پارولنى قايتا كىرگۈزۈڭ:',
+'resetpass_submit' => 'پارول بەلگىلەپ تىزىمغا كىرىڭ',
 'changepassword-success' => 'سىز ئىمنى مۇۋەپپەقىيەتلىك ئۆزگەرتتىڭىز!
  تىزىمغا كىرىۋاتىسىز…',
 'resetpass_forbidden' => 'ئىمنى ئۆزگەرتەلمىدى',
 'resetpass-no-info' => 'سىز تىزىمغا كىرگەندىن كېيىن بىۋاسىتە بۇ بەتكە كىرىشىڭىز لازىم.',
-'resetpass-submit-loggedin' => 'ئىم ئۆزگەرت',
+'resetpass-submit-loggedin' => 'پارولنى ئۆزگەرتىش',
 'resetpass-submit-cancel' => 'ۋاز كەچ',
 'resetpass-wrong-oldpass' => 'ۋاقىتلىق ياكى نۆۋەتتىكى ئىم ئىناۋەتسىز.
 
 ئىمنى ئاللىبۇرۇن ئۆزگەرتىپ بولدىڭىز ياكى يېڭى ۋاقىتلىق ئىم ئىلتىماس قىلدىڭىز.',
-'resetpass-temp-password' => 'ۋاقىتلىق ئىم:',
+'resetpass-temp-password' => 'ۋاقىتلىق پارول:',
 
 # Special:PasswordReset
 'passwordreset' => 'ئىمنى ئەسلىگە قايتۇرماق',
@@ -642,7 +692,7 @@ $2
 'changeemail-oldemail' => 'نۆۋەتتىكى ئېلخەت ئادرېسى:',
 'changeemail-newemail' => 'يېڭى ئېلخەت ئادرېسى:',
 'changeemail-none' => '(يوق)',
-'changeemail-password' => '{{SITENAME}} دىكى ئىم:',
+'changeemail-password' => '{{SITENAME}} دىكى پارولىڭىز:',
 'changeemail-submit' => 'ئېلخەت ئۆزگەرت',
 'changeemail-cancel' => 'ۋاز كەچ',
 
@@ -723,7 +773,7 @@ $2
 'loginreqtitle' => 'تىزىمغا كىرىڭ',
 'loginreqlink' => 'تىزىمغا كىر',
 'loginreqpagetext' => '$1 بولغاندىلا ئاندىن باشقا بەتلەرنى كۆرەلەيسىز.',
-'accmailtitle' => 'ئىم يوللاندى.',
+'accmailtitle' => 'پارول يوللاندى.',
 'accmailtext' => "[[User talk:$1|$1]] ئىختىيارىي قۇرۇلغان ئىم  $2 غا يوللاندى.
 
 يېڭى ھېساباتقا قۇرغان ئىمنى تىزىمغا كىرىپ''[[Special:ChangePassword|ئىم ئۆزگەرت]]'' بېتىدىن ئۆزگەرتەلەيسىز.",
@@ -920,8 +970,8 @@ $3 تەمىنلىگەن چەكلەش سەۋەبى ''$2''",
  '''{{int:minoreditletter}}''' ئازراقلا ئۆزگەرتىش.",
 'history-fieldset-title' => 'كۆز يۈگۈرتۈش تارىخى',
 'history-show-deleted' => 'ئۆچۈرۈلگەنلا',
-'histfirst' => 'تÛ\87Ù\86جÙ\89',
-'histlast' => 'ئاخىرقى',
+'histfirst' => 'ئÛ\95Ú­ Ù\83Ù\88Ù\86ا',
+'histlast' => 'ئەڭ يېڭى',
 'historysize' => '$1 {{PLURAL:$1|بايت|بايت}}',
 'historyempty' => '(بوش)',
 
@@ -987,7 +1037,7 @@ $3 تەمىنلىگەن چەكلەش سەۋەبى ''$2''",
 'revdelete-hide-image' => 'ھۆججەت مەزمۇنىنى يوشۇر',
 'revdelete-hide-name' => 'مەشغۇلات ۋە نىشاننى يوشۇر',
 'revdelete-hide-comment' => 'تەھرىر ئىزاھاتىنى يوشۇر',
-'revdelete-hide-user' => 'تەھرىرلىگۈچىنىڭ ئىشلەتكۈچى ئاتى/IP ئادرېس يوشۇر',
+'revdelete-hide-user' => 'تەھرىرلىگۈچىنىڭ نامى/IP ئادرېسىنى يوشۇر',
 'revdelete-hide-restricted' => 'مەشغۇلاتچى ۋە باشقا ئىشلەتكۈچىنىڭ سانلىق مەلۇمات كۆرۈشىنىمۇ چەكلە',
 'revdelete-radio-same' => '(ئۆزگەرتمە)',
 'revdelete-radio-set' => 'ھەئە',
@@ -1120,7 +1170,7 @@ $1",
 'search-interwiki-default' => '$1 نەتىجە:',
 'search-interwiki-more' => '(تېخىمۇ كۆپ)',
 'search-relatedarticle' => 'ئالاقىدار',
-'mwsuggest-disable' => 'AJAX تەكلىپىنى چەكلە',
+'mwsuggest-disable' => 'ئىزدەش تەكلىپىنى چەكلە',
 'searcheverything-enable' => 'ھەممە ئات بوشلۇقىدىن ئىزدە',
 'searchrelated' => 'ئالاقىدار',
 'searchall' => 'ھەممىسى',
@@ -1148,7 +1198,7 @@ $1",
 'prefs-edits' => 'تەھرىر سانى:',
 'prefsnologin' => 'تىزىمغا كىرمىدى',
 'prefsnologintext' => 'سىز ئالدى بىلەن <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} تىزىمغا كىر]</span>سىڭىز ئاندىن ئىشلەتكۈچى مايىللىقنى تەڭشىيەلەيسىز.',
-'changepassword' => 'ئىم ئۆزگەرت',
+'changepassword' => 'پارولنى ئۆزگەرتىش',
 'prefs-skin' => 'تېرە',
 'skin-preview' => 'ئالدىن كۆزەت',
 'datedefault' => 'مايىللىق يوق',
@@ -1165,7 +1215,7 @@ $1",
 'prefs-watchlist-edits-max' => 'ئەڭ كۆپ سانى: 1000',
 'prefs-watchlist-token' => 'كۆزەت تىزىملىك نىشانى:',
 'prefs-misc' => 'ئارىلاشما تۈر',
-'prefs-resetpass' => 'ئىم ئۆزگەرت',
+'prefs-resetpass' => 'پارولنى ئۆزگەرتىش',
 'prefs-changeemail' => 'ئېلخەت ئۆزگەرت',
 'prefs-setemail' => 'ئېلخەت ئادرېس تەڭشەك',
 'prefs-email' => 'ئېلخەت تاللانما',
@@ -1253,6 +1303,8 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 'prefs-dateformat' => 'چېسلا فورماتى',
 'prefs-timeoffset' => 'ۋاقىت پەرقى',
 'prefs-advancedediting' => 'ئالىي تاللانما',
+'prefs-editor' => 'تەھرىرلىگۈچ',
+'prefs-preview' => 'ئالدىن كۆزەت',
 'prefs-advancedrc' => 'ئالىي تاللانما',
 'prefs-advancedrendering' => 'ئالىي تاللانما',
 'prefs-advancedsearchoptions' => 'ئالىي تاللانما',
@@ -1260,6 +1312,7 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 'prefs-displayrc' => 'كۆرسىتىش تاللانما',
 'prefs-displaysearchoptions' => 'كۆرسىتىش تاللانما',
 'prefs-displaywatchlist' => 'كۆرسىتىش تاللانما',
+'prefs-tokenwatchlist' => 'ئاچقۇچ',
 'prefs-diffs' => 'پەرقلەر',
 
 # User preference: email validation using jQuery
@@ -1359,6 +1412,8 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 'right-editusercssjs' => 'باشقا ئىشلەتكۈچىنىڭ CSS ۋە JS ھۆججىتىنى تەھرىرلە',
 'right-editusercss' => 'باشقا ئىشلەتكۈچىنىڭ CSS ھۆججىتىنى تەھرىرلە',
 'right-edituserjs' => 'باشقا ئىشلەتكۈچىنىڭ  JS ھۆججىتىنى تەھرىرلە',
+'right-editmyusercss' => 'ئۆزىڭىزنىڭ CSS ھۆججىتىڭىزنى تەھرىرلەڭ',
+'right-editmyuserjs' => 'ئۆزىڭىزنىڭ JavaScript ھۆججىتىڭىزنى تەھرىرلەڭ',
 'right-rollback' => 'ئاخىرقى ئىشلەتكۈچىنىڭ مەلۇم بەتكە ئېلىپ بارغان تەھرىرىنى تېزلىكتە ئەسلىگە كەلتۈر',
 'right-markbotedits' => 'ئەسلىگە كەلتۈرۈلگەن تەھرىرنى ماشىنا ئادەم تەھرىرى دەپ بەلگە قوي',
 'right-noratelimit' => 'چاستوتا چەكلىمىسى ئىشلىتىلمىدى',
@@ -1423,6 +1478,7 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ئۆزگەرتىش|ئۆزگەرتىش}}',
+'enhancedrc-history' => 'تارىخ',
 'recentchanges' => 'يېقىنقى ئۆزگەرتىشلەر',
 'recentchanges-legend' => 'يېقىنقى ئۆزگەرتىش تاللانمىسى',
 'recentchanges-summary' => 'بۇ wiki نىڭ يېقىنقى ئۆزگىرىشىنى ئىز قوغلا.',
@@ -1455,7 +1511,7 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 'rc-change-size' => '$1',
 'rc-change-size-new' => 'ئۆزگەرتكەندىن كېيىن $1 {{PLURAL:$1|بايت}}',
 'newsectionsummary' => '* $1 * يېڭى ئابزاس',
-'rc-enhanced-expand' => 'تەپسىلاتىنى كۆرسەت (JavaScript قوللىشى زۆرۈر)',
+'rc-enhanced-expand' => 'تەپسىلاتىنى كۆرسەت',
 'rc-enhanced-hide' => 'تەپسىلاتىنى يوشۇر',
 'rc-old-title' => 'ئەڭ دەسلەپتە "$1" سۈپىتىدە قۇرۇلغان',
 
@@ -1728,6 +1784,9 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 'listfiles_size' => 'چوڭلۇقى',
 'listfiles_description' => 'چۈشەندۈرۈش',
 'listfiles_count' => 'نەشرى',
+'listfiles-latestversion' => 'نۆۋەتتىكى نەشرى',
+'listfiles-latestversion-yes' => 'ھەئە',
+'listfiles-latestversion-no' => 'ياق',
 
 # File description page
 'file-anchor-link' => 'ھۆججەت',
@@ -1825,6 +1884,11 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 'randompage' => 'ئىختىيارىي بەت',
 'randompage-nopages' => 'تۆۋەندىكى {{PLURAL:$2|ئات بوشلۇقى|ئات بوشلۇقى}}دا بەت يوق: $1.',
 
+# Random page in category
+'randomincategory' => 'تۈردىكى ئىختىيارى بەت',
+'randomincategory-invalidcategory' => '«$1» ئىناۋەتلىك تۈر نامى ئەمەس',
+'randomincategory-nopages' => '[[:Category:$1|$1]] تۈرىدە ھىچقانداق بەت يوق.',
+
 # Random redirect
 'randomredirect' => 'ئىختىيارىي قايتا نىشانلانغان بەت',
 'randomredirect-nopages' => '"$1" ئات بوشلۇقىدا قايتا نىشانلانغان بەت يوق.',
@@ -2355,9 +2419,9 @@ $1',
 'contributions' => '{{$1:GENDER|ئىشلەتكۈچى}} تۆھپىسى',
 'contributions-title' => '$1 نىڭ ئىشلەتكۈچى تۆھپىسى',
 'mycontris' => 'تۆھپە',
-'contribsub2' => '$1 نىڭ تۆھپىسى ($2)',
+'contribsub2' => '{{GENDER:$3|$1}} ($2) ئۈچۈن',
 'nocontribs' => 'بۇ ئۆلچەمگە ماس كېلىدىغان ئۆزگەرتىش تېپىلمىدى.',
-'uctop' => '(ئۈستى)',
+'uctop' => '(نۆۋەتتىكى)',
 'month' => 'ئايدىن بۇيان (ياكى ئىلگىرى):',
 'year' => 'يىلدىن بۇيان (ياكى ئىلگىرى):',
 
@@ -2906,8 +2970,8 @@ $1',
 'pageinfo-article-id' => 'بەت ID',
 'pageinfo-language' => 'بەت مەزمۇن تىلى',
 'pageinfo-robot-policy' => 'ئىزدەش ماتور ھالىتى',
-'pageinfo-robot-index' => 'ئىندېكىسلاشچان',
-'pageinfo-robot-noindex' => 'ئىندېكىسلانمايدىغان',
+'pageinfo-robot-index' => 'چەكلەنمىگەن',
+'pageinfo-robot-noindex' => 'چەكلەنگەن',
 'pageinfo-views' => 'كۆرۈنۈش سانى',
 'pageinfo-watchers' => 'بەت كۆزەتكۈچىلەر سانى',
 'pageinfo-redirects-name' => 'بۇ بەتكە قايتا نىشانلايدۇ',
@@ -3030,6 +3094,16 @@ $1',
 'ago' => '$1 بۇرۇن',
 'just-now' => 'بايا',
 
+# Human-readable timestamps
+'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' => 'تۆۋەندىكى فورماتتا يېزىڭ:
 
@@ -3277,7 +3351,7 @@ Variants for Chinese language
 'exif-compression-4' => 'CCITT نىڭ 4-گۇرۇپپا فاكس كودلىنىشى',
 
 'exif-copyrighted-true' => 'نەشر ھوقۇقى',
-'exif-copyrighted-false' => 'ئاممىۋى دائىرە',
+'exif-copyrighted-false' => 'نەشىر ھوقۇقى ھالىتى بېكىتىلمىگەن',
 
 'exif-unknowndate' => 'نامەلۇم چېسلا',
 
@@ -3669,6 +3743,7 @@ $5
 'version-license' => 'ئىجازەتنامە',
 'version-poweredby-credits' => "بۇ ۋىكىنى '''[//www.mediawiki.org/ MediaWiki]''' تېخنىكىلىق قوللايدۇ، نەشر ھوقۇقى © 2001-$1 $2",
 'version-poweredby-others' => 'باشقا',
+'version-poweredby-translators' => 'translatewiki.net تەرجىمانلىرى',
 'version-credits-summary' => 'تۆۋەندىكى كىشىنىڭ [[Special:Version|MediaWiki]] غا تۆھپە قوشقانلىقىغا رەھمەت ئېيتىمىز.',
 'version-license-info' => 'MediaWiki ئەركىن يۇمشاق دېتال؛ سىز ئەركىن يۇمشاق دېتال ۋەخپىسىنىڭ ئېلان قىلغان GNU ئاممىباپ ئاممىۋى ئىجازەت ماددىلىرىدىكى بەلگىمىلەرگە ئاساسەن، بۇ پىروگراممىنى قايتا تارقىتىپ ياكى ئۆزگەرتەلەيسىز؛ مەيلى سىز مەزكۇر ئىجازەتنامىنىڭ ئىككىنچى نەشرى ياكى (ئۆزىڭىز تاللىغان) خالىغان كۈندە تارقىتىلغان نەشرىنى ئاساس قىلسىڭىز بولۇۋېرىدۇ.
 
@@ -3682,6 +3757,11 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئېلان 
 'version-entrypoints-header-entrypoint' => 'كىرىش نۇقتىسى',
 'version-entrypoints-header-url' => 'URL',
 
+# Special:Redirect
+'redirect-value' => 'قىممىتى:',
+'redirect-file' => 'ھۆججەت نامى',
+'redirect-not-exists' => 'قىممىتى تېپىلمىدى',
+
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'تەكرار ھۆججەت ئىزدە',
 'fileduplicatesearch-summary' => 'چاچما (hash) قىممىتىگە ئاساسەن تەكرار ھۆججەت ئىزدە.',
@@ -3734,7 +3814,10 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئېلان 
 '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|ئۆزگەرتىش|ئۆزگەرتىش}}',
 
@@ -3755,6 +3838,7 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئېلان 
 'dberr-problems' => 'كەچۈرۈڭ! بۇ بېكەتتە تېخنىكىلىق قىيىنچىلىق كۆرۈلدى.',
 'dberr-again' => 'بىر قانچە مىنۇت كۈتۈپ ئاندىن قايتا يۈكلەڭ.',
 'dberr-info' => '(ساندان مۇلازىمىتىرىغا ئۇلىنالمىدى:  $1)',
+'dberr-info-hidden' => '(ساندان مۇلازىمېتىرىغا ئۇلىنالمىدى)',
 'dberr-usegoogle' => 'بۇ ۋاقىتتا Google ئىزدىگۈچتىن ئىزدەشنى سىناپ بېقىڭ.',
 'dberr-outofdate' => 'دىققەت ئۇلار ئىندىكېسلىغان مەزمۇن ئەڭ يېڭى بولماسلىقى مۇمكىن.',
 'dberr-cachederror' => 'بۇ ئىلتىماس قىلغان بەتنىڭ غەملەنگەن كۆپەيتىلمىسى، ئەڭ يېڭىسى بولماسلىقى مۇمكىن.',
@@ -3770,14 +3854,17 @@ 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-delete' => '$1 $3 بەتنى {{GENDER:$2|ئۆچۈرىۋەتتى}}',
+'logentry-delete-restore' => '$1 $3 بەتنى {{GENDER:$2|ئەسلىگە قايتۇردى}}',
 'logentry-delete-event' => '$1 ئىشلەتكۈچى $3 دىكى {{PLURAL:$5|خاتىرە ھادىسە}}سىنىڭ كۆۈنۈشچانلىقىنى ئۆزگەرتتى: $4',
 'logentry-delete-revision' => '$1 ئىشلەتكۈچى $3 بەتتىكى {{PLURAL:$5|تۈزىتىلگەن نەشرى}}نىڭ كۆرۈنۈشچانلىقىنى ئۆزگەرتتى: $4',
 'logentry-delete-event-legacy' => '$3 دىكى خاتىرە كۆرۈنۈشچانلىقنى $1 ئۆزگەرتتى',
@@ -3883,4 +3970,10 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئېلان 
 'duration-centuries' => '$1 {{PLURAL:$1|ئەسىر}}',
 'duration-millennia' => '$1 {{PLURAL:$1|مىڭ يىل}}',
 
+# Limit report
+'limitreport-cputime' => 'CPU ئىشلەتكەن ۋاقىت',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|سېكۇنت}}',
+'limitreport-walltime' => 'ئەمەلىي كەتكەن ۋاقىت',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|سېكۇنت}}',
+
 );
index f426d59..fd70746 100644 (file)
@@ -1339,14 +1339,14 @@ $3 зазначив таку причину: ''$2''",
 крім випадків, коли були встановлені додаткові обмеження власниками сайту.",
 'revdelete-confirm' => 'Будь ласка, підтвердить, що ви справді бажаєте це здійснити, усвідомлюєте наслідки та робите це згідно з [[{{MediaWiki:Policy-url}}|правилами]].',
 'revdelete-suppress-text' => "Приховування може відбуватися '''лише''' в таких випадках:
-
-* Ð\9dепоÑ\82Ñ\80Ñ\96бна особиста інформація
+* Потенційно наклепницькі відомості
+* Ð\9dедоÑ\80еÑ\87на особиста інформація
 *: ''домашні адреси, номери телефонів, номер паспорта тощо.''",
-'revdelete-legend' => 'УÑ\81Ñ\82ановиÑ\82и Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ\8f',
-'revdelete-hide-text' => 'ТекÑ\81Ñ\82 Ð²Ð¸Ð¿Ñ\80авленÑ\8c',
+'revdelete-legend' => 'Ð\92Ñ\81Ñ\82ановиÑ\82и Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ\8f Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ñ\81Ñ\82Ñ\96',
+'revdelete-hide-text' => 'ТекÑ\81Ñ\82 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97 Ñ\81Ñ\82оÑ\80Ñ\96нки',
 'revdelete-hide-image' => 'Приховати вміст файлу',
 'revdelete-hide-name' => "Приховати дію та її об'єкт",
-'revdelete-hide-comment' => 'Ð\9fÑ\96дÑ\81Ñ\83мок Ð·Ð¼Ñ\96н',
+'revdelete-hide-comment' => 'Ð\9aоменÑ\82аÑ\80 Ñ\80едагÑ\83ваннÑ\8f',
 'revdelete-hide-user' => "Ім'я автора/IP адреса",
 'revdelete-hide-restricted' => 'Приховати дані також і від адміністраторів',
 'revdelete-radio-same' => '(не змінювати)',
@@ -3226,7 +3226,7 @@ $2',
 'tooltip-undo' => 'Прибрати внесені зміни і показати попередній перегляд. Дозволяє зазначити причину скасування.',
 'tooltip-preferences-save' => 'Зберегти налаштування',
 'tooltip-summary' => 'Введіть короткий опис',
-'tooltip-iwiki' => '$1 — $2',
+'interlanguage-link-title' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/** Розміщений тут CSS буде застосовуватися до всіх тем оформлення */',
@@ -3292,6 +3292,7 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-length' => 'Довжина сторінки (в байтах)',
 'pageinfo-article-id' => 'ID сторінки',
 'pageinfo-language' => 'Мова вмісту сторінки',
+'pageinfo-content-model' => 'Модель вмісту сторінки',
 'pageinfo-robot-policy' => 'Індексація пошуковими системами',
 'pageinfo-robot-index' => 'Індексується',
 'pageinfo-robot-noindex' => 'Не індексується',
@@ -4047,6 +4048,7 @@ $5
 'ellipsis' => '...',
 'percent' => '$1%',
 'parentheses' => '($1)',
+'quotation-marks' => '„$1“',
 
 # Multipage image navigation
 'imgmultipageprev' => '← попередня сторінка',
index 1d6e405..3829b69 100644 (file)
@@ -835,12 +835,12 @@ Nếu bạn không yêu cầu gửi mật khẩu mới, hoặc bạn đã nhớ
 'noemailcreate' => 'Bạn cần cung cấp một địa chỉ thư điện tử hợp lệ',
 'passwordsent' => 'Mật khẩu mới đã được gửi tới thư điện tử của thành viên “$1”. Xin đăng nhập lại sau khi nhận thư.',
 'blocked-mailpassword' => 'Địa chỉ IP của bạn bị cấm không được sửa đổi, do đó cũng không được phép dùng chức năng phục hồi mật khẩu để tránh sai phạm.',
-'eauthentsent' => 'Thư xác nhận đã được gửi. Trước khi dùng chức năng nhận thư, bạn cần thực hiện hướng dẫn trong thư xác nhận, để đảm bảo tài khoản thuộc về bạn.',
+'eauthentsent' => 'Thư xác nhận đã được gửi cho địa chỉ thư điện tử được chỉ định. Trước khi bạn có thể nhận thư, bạn cần thực hiện hướng dẫn trong thư để xác nhận tài khoản thuộc về bạn.',
 'throttled-mailpassword' => 'Mật khẩu đã được gửi đến cho bạn trong vòng {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ trở lại. Để tránh lạm dụng, chỉ có thể gửi mật khẩu $1 giờ đồng hồ một lần.',
 'mailerror' => 'Lỗi gửi thư : $1',
 'acct_creation_throttle_hit' => 'Ai đó cùng [[địa chỉ IP]] với bạn đã mở {{PLURAL:$1|một tài khoản|$1 tài khoản}} ở đây trong vòng 24 giờ. Vì quy định hạn chế số tài khoản mở trên một địa chỉ IP nên bạn hiện không thể mở thêm được nữa dùng địa chỉ IP này.',
 'emailauthenticated' => 'Địa chỉ thư điện tử của bạn được xác nhận vào lúc $3 $2.',
-'emailnotauthenticated' => 'Địa chỉ thư điện tử của bạn chưa được xác nhận. Chức năng thư điện tử chưa bật.',
+'emailnotauthenticated' => 'Địa chỉ thư điện tử của bạn chưa được xác nhận. Các chức năng sau sẽ không gửi thư điện tử.',
 'noemailprefs' => 'Hãy ghi một địa chỉ thư điện tử trong tùy chọn cá nhân để có thể sử dụng tính năng này.',
 'emailconfirmlink' => 'Xác nhận địa chỉ thư điện tử',
 'invalidemailaddress' => 'Địa chỉ thư điện tử không được chấp nhận vì định dạng thư có vẻ sai.
@@ -1030,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' => "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.",
+'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''' (hoặc Trở lại, Quay 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.
@@ -1275,17 +1275,17 @@ Các quản lý khác ở {{SITENAME}} vẫn có thể truy nhập vào nội du
 'revdelete-suppress-text' => "Việc ẩn giấu '''chỉ''' nên dùng trong các trường hợp sau:
 * Thông tin có thể phỉ báng
 * Thông tin cá nhân không thích hợp
-*: ''địa chỉ nhà và số điện thoại, số an sinh xã hội, v.v.''",
+*: ''địa chỉ nhà và số điện thoại, số chứng minh nhân dân, số an sinh xã hội, v.v.''",
 'revdelete-legend' => 'Thiết lập hạn chế khả kiến',
-'revdelete-hide-text' => 'Ẩn nội dung phiên bản',
+'revdelete-hide-text' => 'Nội dung phiên bản',
 'revdelete-hide-image' => 'Ẩn nội dung tập tin',
 'revdelete-hide-name' => 'Ẩn tác vụ và đích của tác vụ',
-'revdelete-hide-comment' => 'Ẩn tóm lược sửa đổi',
-'revdelete-hide-user' => 'Ẩn tên người dùng hay địa chỉ IP của người viết trang',
+'revdelete-hide-comment' => 'Tóm lược sửa đổi',
+'revdelete-hide-user' => 'Tên người dùng hay địa chỉ IP của người viết trang',
 'revdelete-hide-restricted' => 'Ẩn giấu thông tin khỏi các Quản lý lẫn thành viên khác',
 'revdelete-radio-same' => '(không đổi)',
-'revdelete-radio-set' => '',
-'revdelete-radio-unset' => 'n',
+'revdelete-radio-set' => 'Ẩn',
+'revdelete-radio-unset' => 'Hiện',
 'revdelete-suppress' => 'Che dữ liệu đối với bảo quản viên cũng như các thành viên khác',
 'revdelete-unsuppress' => 'Bỏ các hạn chế trên các phiên bản được phục hồi',
 'revdelete-log' => 'Lý do:',
@@ -2731,9 +2731,10 @@ $1',
 'ipbreason' => 'Lý do:',
 'ipbreasonotherlist' => 'Lý do khác',
 'ipbreason-dropdown' => '*Một số lý do cấm thường gặp
+** Phá hoại
 ** Thêm thông tin sai lệch
 ** Xóa nội dung trang
-** Đăng liên kết thư rác đến trang Web bên ngoài
+** Đăng liên kết thư rác dẫn đến trang Web bên ngoài
 ** Cho thông tin rác vào trang
 ** Có thái độ dọa dẫm/quấy rối
 ** Lạm dụng nhiều tài khoản
@@ -3141,7 +3142,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'tooltip-undo' => '“Lùi lại” sẽ lùi sửa đổi này và mở trang sửa đổi ở chế độ xem trước. Cho phép thêm lý do vào tóm lược.',
 'tooltip-preferences-save' => 'Lưu tùy chọn',
 'tooltip-summary' => 'Hãy nhập câu tóm lược',
-'tooltip-iwiki' => '$1 – $2',
+'interlanguage-link-title' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/* Mã CSS đặt ở đây sẽ áp dụng cho mọi hình dạng */',
@@ -3206,6 +3207,7 @@ Xin '''ĐỪNG''' điền gì vào!",
 'pageinfo-length' => 'Chiều dài của trang (byte)',
 'pageinfo-article-id' => 'Mã số trang',
 'pageinfo-language' => 'Ngôn ngữ nội dung trang',
+'pageinfo-content-model' => 'Kiểu nội dung trang',
 'pageinfo-robot-policy' => 'Ghi chỉ mục bởi robot',
 'pageinfo-robot-index' => 'Cho phép',
 'pageinfo-robot-noindex' => 'Không cho phép',
@@ -3913,6 +3915,7 @@ Xin hãy xác nhận bạn thực sự muốn tạo lại trang này.",
 
 # Separators for various lists, etc.
 'ellipsis' => '…',
+'quotation-marks' => '“$1”',
 
 # Multipage image navigation
 'imgmultipageprev' => '← trang trước',
@@ -4080,7 +4083,7 @@ hoặc [//www.gnu.org/licenses/old-licenses/gpl-2.0.html đọc nó trực tuy
 # Special:Redirect
 'redirect' => 'Đổi hướng đến tập tin, người dùng, hoặc số phiên bản',
 'redirect-legend' => 'Đổi hướng đến tập tin hoặc trang',
-'redirect-summary' => 'Trang đặc biệt này đổi hướng đến một tập tin (theo tên tập tin được cho vào), trang (theo số phiên bản được cho vào), hoặc trang cá nhân (theo số thành viên).',
+'redirect-summary' => 'Trang đặc biệt này đổi hướng đến một tập tin (theo tên tập tin được cho vào), trang (theo số phiên bản được cho vào), hoặc trang cá nhân (theo số thành viên). Cách sử dụng: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], hoặc [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Đi',
 'redirect-lookup' => 'Tra cứu:',
 'redirect-value' => 'Giá trị:',
index 14db086..4d1cd6a 100644 (file)
@@ -2076,7 +2076,7 @@ Makikit-an nimo an ginkuhaaan',
 'tooltip-undo' => '"Igpawara an ginbuhat (undo)" in nagbabalik hinin nga pagliwat ngan nabuklad hin pagliwat nga porma ha pahiuna-nga-paggawas nga kahimtang.  Natugot liwat pagdugang hin katadungan ha dinalikyat nga sumat.',
 'tooltip-preferences-save' => 'Tipiga an mga karuyag',
 'tooltip-summary' => 'Pagbutang hin dalikyat nga sumat',
-'tooltip-iwiki' => '$1 – $2',
+'interlanguage-link-title' => '$1 – $2',
 
 # Attribution
 'siteuser' => '{{SITENAME}} gumaramit $1',
index 3ca4da0..d6ef525 100644 (file)
@@ -1666,7 +1666,7 @@ $1",
 'tooltip-rollback' => '揿一记“回转”就回退到上一位贡献者个编辑状态',
 'tooltip-undo' => '“撤销”可以恢复该编辑并且垃拉预览模式下头打开编辑表单。渠允许垃拉摘要里向说明原因。',
 'tooltip-summary' => '打进短摘要',
-'tooltip-iwiki' => '̩$1 - $2',
+'interlanguage-link-title' => '̩$1 - $2',
 
 # Attribution
 'anonymous' => '{{SITENAME}}浪个匿名用户',
index 21dc8dc..5a1dd26 100644 (file)
@@ -1171,9 +1171,10 @@ $2
 'revdelete-text' => "'''אויסגעמעקטע רעוויזיעס און געשעענישן וועלן בלייבן אין דער בלאט היסטאריע און די לאגביכער, אבער טיילן פון זייער אינהאלט וועט ווערן אומגרייכלעך צום קהל. '''
 אנדערע סיסאפן אויף {{SITENAME}} וועלן נאך האבן צוטריט צום באהאלטענעם אינהאלט און קענען אים צוריקשטעלן דורך דעם זעלבן אייבערפלאך,  אחוץ ווען מען שטעלט נאך באגרענעצונגען.",
 'revdelete-confirm' => 'זייט אזוי גוט און באשטעטיקט אז דאס איז טאקע אייער כוונה, אז איר פארשטייט די קאנסעקווענצן, און אז איר טוט דאס לויט  [[{{MediaWiki:Policy-url}}|דער פאליסי]].',
-'revdelete-suppress-text' => "באהאלטן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגענדע פעלער:
+'revdelete-suppress-text' => "אונטערדרוקן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגנדע פעלער:
+* אינפארמאציע וואס קען זיין מוציא שם רע
 * אויפדעקונג פון פריוואטקייט אינפארמאציע
-* ''היים אדרעסן, טעלעפאן נומערן, אדער סאשעל סעקיורעטי, א.א.וו.:'''",
+*: ''היים אדרעסן, טעלעפאן נומערן, נאציאנאלע אידענטיפיקאציע נומערן, א.א.וו.''",
 'revdelete-legend' => 'שטעלט ווייזונג באגרענעצונגען',
 'revdelete-hide-text' => 'ווערסיע טעקסט',
 'revdelete-hide-image' => 'באהאלט טעקע אינהאלט',
@@ -1182,8 +1183,8 @@ $2
 'revdelete-hide-user' => "רעדאַקטאר'ס באניצער-נאמען/IP-אַדרעס",
 'revdelete-hide-restricted' => 'באהאלט אינפארמאציע אויך פון אדמיניסטראטורן פונקט ווי פשוטע באנוצער',
 'revdelete-radio-same' => '(נישט ענדערן)',
-'revdelete-radio-set' => '×\96×¢×\91×\90ר',
-'revdelete-radio-unset' => 'פֿ×\90ַר×\91×\90ָר×\92×\9f',
+'revdelete-radio-set' => 'פֿ×\90ַר×\91×\90ָר×\92×\9f',
+'revdelete-radio-unset' => '×\96×¢×\91×\90ר',
 'revdelete-suppress' => 'באַהאַלטן אינפֿארמאַציע פון אַדמיניסטראַטארן ווי אויך אנדערע',
 'revdelete-unsuppress' => 'טוה אפ באגרענעצונגן אין גענדערטע רעוויזיעס',
 'revdelete-log' => 'אורזאַך:',
@@ -1558,6 +1559,7 @@ $1",
 'right-editmyusercss' => 'רעדאקטירע אײַערע אייגענע באניצער CSS טעקעס',
 'right-editmyuserjs' => 'רעדאקטירן אײַערע אייגענע באניצער JavaScript טעקעס',
 'right-viewmywatchlist' => 'באקוקן אייער אייגענע אויפפאסונג ליסטע',
+'right-editmywatchlist' => 'רעדאקטירן אייער אייגענע אויפפאסונג ליסטער. טייל פעולות וועלן דאך צולייגן בלעטער אפילו אן דעם רעכט.',
 'right-viewmyprivateinfo' => 'באקוקן אײַער אייגענע פריוואטע דאטן (צ"ב ע־פאסט אדרעס, אמתער נאמען)',
 'right-editmyprivateinfo' => 'רעדאקטירן אײַער אייגענע פריוואטע דאטן (צ"ב ע־פאסט אדרעס, אמתער נאמען)',
 'right-editmyoptions' => 'רעדאקטירן אײַערע אייגענע פרעפערענצן',
@@ -2102,6 +2104,7 @@ $1",
 'listusers' => 'באַניצער ליסטע',
 'listusers-editsonly' => 'ווייזן נאר באניצערס מיט רעדאקטירונגען',
 'listusers-creationsort' => 'סארטירן לויט דער שאַפן דאַטע',
+'listusers-desc' => 'סארטירן אין אראפרשטייגעדיקן סדר',
 'usereditcount' => '{{PLURAL:$1|רעדאַקטירונג|$1 רעדאַקטירונגען}}',
 'usercreated' => '{{GENDER:$3|געשאַפֿן}} אום $2, $1',
 'newpages' => 'נייע בלעטער',
index 852116e..ea0153a 100644 (file)
@@ -512,7 +512,7 @@ $messages = array(
 'mytalk' => '讨论',
 'anontalk' => '该IP地址的讨论',
 'navigation' => '导航',
-'and' => '和',
+'and' => '&#32;和',
 
 # Cologne Blue skin
 'qbfind' => '查找',
@@ -1159,8 +1159,8 @@ $2
 
 它应该少过$2次呼叫,现在有$1次呼叫。',
 'expensive-parserfunction-category' => '页面中有太多耗费的语法功能呼叫',
-'post-expand-template-inclusion-warning' => '警告:包含模板大小过大。
-一些模板将不会包含。',
+'post-expand-template-inclusion-warning' => "'''警告:'''包含模板大小过大。
+一些模板将不会包含。",
 'post-expand-template-inclusion-category' => '模板包含上限已经超过的页面',
 'post-expand-template-argument-warning' => "'''警告:'''本页面包含至少一个模板参数有过大扩展大小。这些参数会被略过。",
 'post-expand-template-argument-category' => '包含着略过模板参数的页面',
@@ -1254,10 +1254,10 @@ $3的理由是''$2''",
 'revdelete-text' => "'''删除的版本仍将显示在页面历史及日志中,但公众已不能访问其文本内容。'''
 在{{SITENAME}}的其他管理员将仍能访问隐藏的内容并通过该界面恢复删除的版本,除非进行了额外限制。",
 'revdelete-confirm' => '请确认该操作,明白其后果,并确保该操作符合[[{{MediaWiki:Policy-url}}|方针]]。',
-'revdelete-suppress-text' => "阻止应该'''只'''在以下情形使用
-*潜在的诽谤信息
-*不合适的个人信息
-*:''家庭地址、电话号码和社保号码等。''",
+'revdelete-suppress-text' => "阻止应'''仅'''用于以下情况
+* 潜在的诽谤信息
+* 不合适的个人信息
+*: ''家庭地址、电话号码和社保号码等。''",
 'revdelete-legend' => '设置可见性之限制',
 'revdelete-hide-text' => '修订文字',
 'revdelete-hide-image' => '隐藏文件内容',
@@ -1266,8 +1266,8 @@ $3的理由是''$2''",
 'revdelete-hide-user' => '编辑者的用户名/IP地址',
 'revdelete-hide-restricted' => '同时阻止管理员与其他用户查看数据',
 'revdelete-radio-same' => '(不要更改)',
-'revdelete-radio-set' => '可见',
-'revdelete-radio-unset' => '隐藏',
+'revdelete-radio-set' => '隐藏',
+'revdelete-radio-unset' => '可见',
 'revdelete-suppress' => '同时阻止管理员与其他用户查看数据',
 'revdelete-unsuppress' => '在已恢复的修订中移除限制',
 'revdelete-log' => '原因:',
@@ -1396,7 +1396,7 @@ $1",
 'searchall' => '所有',
 'showingresults' => "下面显示从第'''$2'''条结果开始的'''$1'''条结果。",
 'showingresultsnum' => "下面显示从第'''$2'''条结果开始的'''$3'''条结果。",
-'showingresultsheader' => "关于'''$4'''的{{PLURAL:$5|第'''$1'''条结果,共'''$3'''条结果|第'''$1-$2'''条结果,共'''$3'''条结果}}",
+'showingresultsheader' => "关于'''$4'''的{{PLURAL:$5|第'''$1'''条结果,共'''$3'''条结果|第'''$1~$2'''条结果,共'''$3'''条结果}}",
 'nonefound' => "'''注意''':只有某些名字空间被默认搜索。请尝试给你的搜索内容添加前缀“all:”以搜索全部内容(包括讨论页面、模板等)或使用期望的名字空间作为前缀。",
 'search-nonefound' => '找不到和查询相匹配的结果。',
 'powersearch' => '高级搜索',
@@ -1979,7 +1979,7 @@ $1',
 'listfiles_date' => '日期',
 'listfiles_name' => '名称',
 'listfiles_user' => '用户',
-'listfiles_size' => '大å°\8f',
+'listfiles_size' => '尺寸',
 'listfiles_description' => '说明',
 'listfiles_count' => '版本',
 'listfiles-show-all' => '包括图片的旧版本',
@@ -2208,7 +2208,7 @@ $1',
 'querypage-disabled' => '本特殊页面因性能问题而停用。',
 
 # Book sources
-'booksources' => '图书来源',
+'booksources' => '网络书源',
 'booksources-search-legend' => '搜索图书来源',
 'booksources-isbn' => 'ISBN:',
 'booksources-go' => '提交',
@@ -2521,8 +2521,8 @@ $UNWATCHURL
 'protect-expiry-options' => '1小时:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year,无限期:infinite',
 'restriction-type' => '权限:',
 'restriction-level' => '限制级别:',
-'minimum-size' => 'æ\9c\80å°\8f大å°\8f',
-'maximum-size' => 'æ\9c\80大大å°\8f:',
+'minimum-size' => 'æ\9c\80å°\8f尺寸',
+'maximum-size' => 'æ\9c\80大尺寸:',
 'pagesize' => '(字节)',
 
 # Restrictions (nouns)
@@ -3005,14 +3005,15 @@ $2',
 'tooltip-ca-talk' => '关于内容页面的讨论',
 'tooltip-ca-edit' => '你可以编辑本页面。请在保存前使用预览按钮',
 'tooltip-ca-addsection' => '开始新段落',
-'tooltip-ca-viewsource' => '本页面受到保护。你可以查看其源代码。',
+'tooltip-ca-viewsource' => '本页面受到保护。
+您可以查看其源代码',
 'tooltip-ca-history' => '本页面过去的版本',
 'tooltip-ca-protect' => '保护本页',
 'tooltip-ca-unprotect' => '更改本页面的保护',
 'tooltip-ca-delete' => '删除本页',
 'tooltip-ca-undelete' => '将这个页面恢复到被删除以前的状态',
 'tooltip-ca-move' => '移动本页',
-'tooltip-ca-watch' => '添加本页面至的监视列表',
+'tooltip-ca-watch' => '添加本页面至的监视列表',
 'tooltip-ca-unwatch' => '从你的监视列表删除本页面',
 'tooltip-search' => '搜索{{SITENAME}}',
 'tooltip-search-go' => '如果相同的标题存在的话便直接前往该页面',
@@ -3059,7 +3060,7 @@ $2',
 'tooltip-undo' => '“撤销”可以恢复该编辑并在预览模式下打开编辑表单。它允许在摘要中加入原因。',
 'tooltip-preferences-save' => '保存系统设置',
 'tooltip-summary' => '请输入简短的摘要',
-'tooltip-iwiki' => '$1 – $2',
+'interlanguage-link-title' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/* 此处的 CSS 将应用于所有的皮肤 */',
@@ -3124,6 +3125,7 @@ $2',
 'pageinfo-length' => '页面长度(字节)',
 'pageinfo-article-id' => '页面ID',
 'pageinfo-language' => '页面内容语言',
+'pageinfo-content-model' => '页面内容模式',
 'pageinfo-robot-policy' => '爬虫索引',
 'pageinfo-robot-index' => '允许',
 'pageinfo-robot-noindex' => '不允许',
@@ -3197,12 +3199,12 @@ $1',
 
 # Media information
 'mediawarning' => "'''警告''':该文件类型可能含有恶意代码。执行后你的系统可能受损。",
-'imagemaxsize' => '图像大小限制:<br /><u>(文件描述页)</u>',
-'thumbsize' => '缩ç\95¥å\9b¾å¤§å°\8f:',
+'imagemaxsize' => "图像尺寸限制:<br />''(文件说明页面)''",
+'thumbsize' => '缩ç\95¥å\9b¾å°ºå¯¸:',
 'widthheightpage' => '$1×$2,$3页',
 'file-info' => '文件大小:$1,MIME类型:$2',
-'file-info-size' => '$1×$2像素,文件大小:$3,MIME类型:$4',
-'file-info-size-pages' => '$1×$2像素,文件大小:$3,MIME类型:$4,$5页',
+'file-info-size' => '$1 × $2像素,文件大小:$3,MIME类型:$4',
+'file-info-size-pages' => '$1 × $2像素,文件大小:$3,MIME类型:$4,$5页',
 'file-nohires' => '没有更高的分辨率。',
 'svg-long-desc' => 'SVG文件,尺寸为$1 × $2像素,文件大小:$3',
 'svg-long-desc-animated' => '动画SVG文件,尺寸为$1 × $2像素,文件大小:$3',
@@ -3797,6 +3799,7 @@ $5
 'colon-separator' => ':',
 'word-separator' => '',
 'parentheses' => '($1)',
+'quotation-marks' => '“$1”',
 
 # Multipage image navigation
 'imgmultipageprev' => '← 上一页',
index c69e21d..0b4ed98 100644 (file)
@@ -1201,8 +1201,9 @@ $2
 'revdelete-text' => "'''刪除的修訂仍將顯示在頁面歷史中, 但它們的文字內容已不能被公眾訪問。'''
 在{{SITENAME}}的其他管理員將仍能訪問隱藏的內容並透過與此相同的介面恢復刪除,除非網站工作者進行了一些附加的限制。",
 'revdelete-confirm' => '請確認您肯定去做的話,您就要明白到後果,以及這個程序符合[[{{MediaWiki:Policy-url}}|政策]]。',
-'revdelete-suppress-text' => "壓制'''只'''應在以下的情況下進行:
-* 不合適的個人資料
+'revdelete-suppress-text' => "禁制應'''僅'''於下述情形之一時使用:
+* 潛在誹謗性資訊
+* 不合適個人資料
 *: ''住家地址、電話號碼、社群保安號碼等。''",
 'revdelete-legend' => '設定可見性之限制',
 'revdelete-hide-text' => '修訂文字',
@@ -1212,8 +1213,8 @@ $2
 'revdelete-hide-user' => '編輯者的用戶名/IP位址',
 'revdelete-hide-restricted' => '同時廢止由操作員以及其他用戶的資料',
 'revdelete-radio-same' => '(不要更改)',
-'revdelete-radio-set' => '可見',
-'revdelete-radio-unset' => '隱藏',
+'revdelete-radio-set' => '隱藏',
+'revdelete-radio-unset' => '可見',
 'revdelete-suppress' => '同時廢止由操作員以及其他用戶的資料',
 'revdelete-unsuppress' => '在已恢復的修訂中移除限制',
 'revdelete-log' => '理由:',
@@ -3041,7 +3042,7 @@ $2',
 'tooltip-undo' => '「復原」可以在編輯模式上開啟編輯表格以便恢復。它容許在摘要中加入原因。',
 'tooltip-preferences-save' => '儲存使用偏好',
 'tooltip-summary' => '輸入一個簡短的摘要',
-'tooltip-iwiki' => '$1 – $2',
+'interlanguage-link-title' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/* 此處的 CSS 將應用於所有的面板 */',
@@ -3102,6 +3103,7 @@ $2',
 'pageinfo-length' => '頁面長度 (以位元組為單位)',
 'pageinfo-article-id' => '頁面編號',
 'pageinfo-language' => '頁面內容語言',
+'pageinfo-content-model' => '頁面內容模型',
 'pageinfo-robot-policy' => '機械人索引',
 'pageinfo-robot-index' => '容許',
 'pageinfo-robot-noindex' => '阻止',
@@ -3772,6 +3774,7 @@ $5
 'colon-separator' => ':',
 'word-separator' => '',
 'parentheses' => '($1)',
+'quotation-marks' => '“$1”',
 
 # Multipage image navigation
 'imgmultipageprev' => '← 上一頁',
diff --git a/maintenance/archives/patch-val_ip.sql b/maintenance/archives/patch-val_ip.sql
deleted file mode 100644 (file)
index 9214218..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
--- Column added 2005-05-24
-
-ALTER TABLE /*$wgDBprefix*/validate
-  ADD COLUMN val_ip varchar(20) NOT NULL default '';
diff --git a/maintenance/archives/patch-validate.sql b/maintenance/archives/patch-validate.sql
deleted file mode 100644 (file)
index 9701083..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
--- For article validation
-
-DROP TABLE IF EXISTS /*$wgDBprefix*/validate;
-CREATE TABLE /*$wgDBprefix*/validate (
-  `val_user` int(11) NOT NULL default '0',
-  `val_page` int(11) unsigned NOT NULL default '0',
-  `val_revision` int(11) unsigned NOT NULL default '0',
-  `val_type` int(11) unsigned NOT NULL default '0',
-  `val_value` int(11) default '0',
-  `val_comment` varchar(255) NOT NULL default '',
-  `val_ip` varchar(20) NOT NULL default '',
-  KEY `val_user` (`val_user`,`val_revision`)
-) /*$wgDBTableOptions*/;
index 2300694..24b63a8 100644 (file)
@@ -38,6 +38,7 @@ class UploadStashCleanup extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Clean up abandoned files in temporary uploaded file stash";
+               $this->setBatchSize( 50 );
        }
 
        public function execute() {
@@ -97,17 +98,22 @@ class UploadStashCleanup extends Maintenance {
                $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir, 'adviseStat' => 1 ) );
                $this->output( "Deleting old thumbnails...\n" );
                $i = 0;
+               $batch = array(); // operation batch
                foreach ( $iterator as $file ) {
                        if ( wfTimestamp( TS_UNIX, $tempRepo->getFileTimestamp( "$dir/$file" ) ) < $cutoff ) {
-                               $status = $tempRepo->quickPurge( "$dir/$file" );
-                               if ( !$status->isOK() ) {
-                                       $this->error( print_r( $status->getErrorsArray(), true ) );
-                               }
-                               if ( ( ++$i % 100 ) == 0 ) {
+                               $batch[] = array( 'op' => 'delete', 'src' => "$dir/$file" );
+                               if ( count( $batch ) >= $this->mBatchSize ) {
+                                       $this->doOperations( $tempRepo, $batch );
+                                       $i += count( $batch );
+                                       $batch = array();
                                        $this->output( "$i\n" );
                                }
                        }
                }
+               if ( count( $batch ) ) {
+                       $this->doOperations( $tempRepo, $batch );
+                       $i += count( $batch );
+               }
                $this->output( "$i done\n" );
 
                // Apparently lots of stash files are not registered in the DB...
@@ -118,26 +124,31 @@ class UploadStashCleanup extends Maintenance {
                        $this->error( "Temp repo is not using the temp container.", 1 ); // die
                }
                $i = 0;
+               $batch = array(); // operation batch
                foreach ( $iterator as $file ) {
-                       // Absolute sanity check for stashed files and file segments
-                       $base = basename( $file );
-                       // @TODO: why are there thumbnails stored in here?
-                       if ( !preg_match( '#(^\d{14}!|\.\d+\.\w+\.\d+$|-\w{12}\.\w{6}\.\d+\.)#', $base ) ) {
-                               $this->output( "Skipped non-stash $file\n" );
-                               continue;
-                       }
                        if ( wfTimestamp( TS_UNIX, $tempRepo->getFileTimestamp( "$dir/$file" ) ) < $cutoff ) {
-                               $status = $tempRepo->quickPurge( "$dir/$file" );
-                               if ( !$status->isOK() ) {
-                                       $this->error( print_r( $status->getErrorsArray(), true ) );
-                               }
-                               if ( ( ++$i % 100 ) == 0 ) {
+                               $batch[] = array( 'op' => 'delete', 'src' => "$dir/$file" );
+                               if ( count( $batch ) >= $this->mBatchSize ) {
+                                       $this->doOperations( $tempRepo, $batch );
+                                       $i += count( $batch );
+                                       $batch = array();
                                        $this->output( "$i\n" );
                                }
                        }
                }
+               if ( count( $batch ) ) {
+                       $this->doOperations( $tempRepo, $batch );
+                       $i += count( $batch );
+               }
                $this->output( "$i done\n" );
        }
+
+       protected function doOperations( FileRepo $tempRepo, array $ops ) {
+               $status = $tempRepo->getBackend()->doQuickOperations( $ops );
+               if ( !$status->isOK() ) {
+                       $this->error( print_r( $status->getErrorsArray(), true ) );
+               }
+       }
 }
 
 $maintClass = "UploadStashCleanup";
index 21ef4ff..49af0b8 100644 (file)
@@ -35,7 +35,8 @@ require_once __DIR__ . '/Maintenance.php';
  * @ingroup Maintenance
  */
 class CopyFileBackend extends Maintenance {
-       protected $statCache = array();
+       /** @var Array|null (path sha1 => stat) Pre-computed dst stat entries from listings */
+       protected $statCache = null;
 
        public function __construct() {
                parent::__construct();
@@ -98,7 +99,7 @@ class CopyFileBackend extends Maintenance {
                                if ( $dstPathsRel === null ) {
                                        $this->error( "Could not list files in $container.", 1 ); // die
                                }
-                               $this->statCache = array(); // clear
+                               $this->statCache = array();
                                foreach ( $dstPathsRel as $dstPathRel ) {
                                        $path = $dst->getRootStoragePath() . "/$backendRel/$dstPathRel";
                                        $this->statCache[sha1( $path )] = $dst->getFileStat( array( 'src' => $path ) );
@@ -338,9 +339,14 @@ class CopyFileBackend extends Maintenance {
                $skipHash = $this->hasOption( 'skiphash' );
                $srcStat = $src->getFileStat( array( 'src' => $sPath ) );
                $dPathSha1 = sha1( $dPath );
-               $dstStat = isset( $this->statCache[$dPathSha1] )
-                       ? $this->statCache[$dPathSha1]
-                       : $dst->getFileStat( array( 'src' => $dPath ) );
+               if ( $this->statCache !== null ) {
+                       // All dst files are already in stat cache
+                       $dstStat = isset( $this->statCache[$dPathSha1] )
+                               ? $this->statCache[$dPathSha1]
+                               : false;
+               } else {
+                       $dstStat = $dst->getFileStat( array( 'src' => $dPath ) );
+               }
                return (
                        is_array( $srcStat ) // sanity check that source exists
                        && is_array( $dstStat ) // dest exists
index e9d8c86..4e845f1 100644 (file)
@@ -1,7 +1,4 @@
 <?php
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die();
-}
 /**
  * Statistic output classes.
  *
@@ -27,57 +24,77 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  */
 
 /** A general output object. Need to be overriden */
-class statsOutput {
+class StatsOutput {
        function formatPercent( $subset, $total, $revert = false, $accuracy = 2 ) {
-               return @sprintf( '%.' . $accuracy . 'f%%', 100 * $subset / $total );
+               wfSuppressWarnings();
+               $return = sprintf( '%.' . $accuracy . 'f%%', 100 * $subset / $total );
+               wfRestoreWarnings();
+               return $return;
        }
 
        # Override the following methods
        function heading() {
        }
+
        function footer() {
        }
+
        function blockstart() {
        }
+
        function blockend() {
        }
+
        function element( $in, $heading = false ) {
        }
 }
 
 /** Outputs WikiText */
-class wikiStatsOutput extends statsOutput {
+class WikiStatsOutput extends statsOutput {
        function heading() {
                global $wgDummyLanguageCodes;
                $version = SpecialVersion::getVersion( 'nodb' );
                echo "'''Statistics are based on:''' <code>" . $version . "</code>\n\n";
-               echo "'''Note:''' These statistics can be generated by running <code>php maintenance/language/transstat.php</code>.\n\n";
-               echo "For additional information on specific languages (the message names, the actual problems, etc.), run <code>php maintenance/language/checkLanguage.php --lang=foo</code>.\n\n";
+               echo "'''Note:''' These statistics can be generated by running " .
+                       "<code>php maintenance/language/transstat.php</code>.\n\n";
+               echo "For additional information on specific languages (the message names, the actual " .
+                       "problems, etc.), run <code>php maintenance/language/checkLanguage.php --lang=foo</code>.\n\n";
                echo 'English (en) is excluded because it is the default localization';
                if ( is_array( $wgDummyLanguageCodes ) ) {
                        $dummyCodes = array();
                        foreach ( $wgDummyLanguageCodes as $dummyCode => $correctCode ) {
                                $dummyCodes[] = Language::fetchLanguageName( $dummyCode ) . ' (' . $dummyCode . ')';
                        }
-                       echo ', as well as the following languages that are not intended for system message translations, usually because they redirect to other language codes: ' . implode( ', ', $dummyCodes );
+                       echo ', as well as the following languages that are not intended for ' .
+                               'system message translations, usually because they redirect to other ' .
+                               'language codes: ' . implode( ', ', $dummyCodes );
                }
                echo ".\n\n"; # dot to end sentence
-               echo '{| class="sortable wikitable" border="2" style="background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse; clear:both; width:100%;"' . "\n";
+               echo '{| class="sortable wikitable" border="2" style="background-color: #F9F9F9; ' .
+                       'border: 1px #AAAAAA solid; border-collapse: collapse; clear:both; width:100%;"' . "\n";
        }
+
        function footer() {
                echo "|}\n";
        }
+
        function blockstart() {
                echo "|-\n";
        }
+
        function blockend() {
                echo '';
        }
+
        function element( $in, $heading = false ) {
                echo ( $heading ? '!' : '|' ) . "$in\n";
        }
+
        function formatPercent( $subset, $total, $revert = false, $accuracy = 2 ) {
-               $v = @round( 255 * $subset / $total );
+               wfSuppressWarnings();
+               $v = round( 255 * $subset / $total );
+               wfRestoreWarnings();
+
                if ( $revert ) {
                        # Weigh reverse with factor 20 so coloring takes effect more quickly as
                        # this option is used solely for reporting 'bad' percentages.
@@ -100,25 +117,28 @@ class wikiStatsOutput extends statsOutput {
                $color = $red . $green . $blue;
 
                $percent = parent::formatPercent( $subset, $total, $revert, $accuracy );
+
                return 'style="background-color:#' . $color . ';"|' . $percent;
        }
 }
 
 /** Output text. To be used on a terminal for example. */
-class textStatsOutput extends statsOutput {
+class TextStatsOutput extends statsOutput {
        function element( $in, $heading = false ) {
                echo $in . "\t";
        }
+
        function blockend() {
                echo "\n";
        }
 }
 
 /** csv output. Some people love excel */
-class csvStatsOutput extends statsOutput {
+class CsvStatsOutput extends statsOutput {
        function element( $in, $heading = false ) {
                echo $in . ";";
        }
+
        function blockend() {
                echo "\n";
        }
index 381ddae..5d48244 100644 (file)
@@ -67,8 +67,7 @@ if ( $runTest ) {
        $messagesFileC = $messagesDir . 'Messages' . $langCodeFC . '.php';
        if ( file_exists( $messagesFile ) && file_exists( $messagesFileC ) ) {
                $run = true;
-       }
-       else {
+       } else {
                echo "Messages file(s) could not be found.\nMake sure both files are exists.\n";
        }
 }
index 4b49ada..ac70ead 100644 (file)
@@ -89,7 +89,7 @@ class CheckLanguageCLI {
                        $this->output = $options['output'];
                }
 
-               $this->L = new languages( $this->includeExif );
+               $this->L = new Languages( $this->includeExif );
        }
 
        /**
@@ -182,21 +182,25 @@ class CheckLanguageCLI {
                return array(
                        'untranslated' => '$1 message(s) of $2 are not translated to $3, but exist in en:',
                        'duplicate' => '$1 message(s) of $2 are translated the same in en and $3:',
-                       'obsolete' => '$1 message(s) of $2 do not exist in en or are in the ignore list, but exist in $3:',
+                       'obsolete' =>
+                               '$1 message(s) of $2 do not exist in en or are in the ignore list, but exist in $3:',
                        'variables' => '$1 message(s) of $2 in $3 don\'t match the variables used in en:',
                        'plural' => '$1 message(s) of $2 in $3 don\'t use {{plural}} while en uses:',
                        'empty' => '$1 message(s) of $2 in $3 are empty or -:',
                        'whitespace' => '$1 message(s) of $2 in $3 have trailing whitespace:',
                        'xhtml' => '$1 message(s) of $2 in $3 contain illegal XHTML:',
-                       'chars' => '$1 message(s) of $2 in $3 include hidden chars which should not be used in the messages:',
+                       'chars' =>
+                               '$1 message(s) of $2 in $3 include hidden chars which should not be used in the messages:',
                        'links' => '$1 message(s) of $2 in $3 have problematic link(s):',
                        'unbalanced' => '$1 message(s) of $2 in $3 have unbalanced {[]}:',
                        'namespace' => '$1 namespace name(s) of $2 are not translated to $3, but exist in en:',
-                       'projecttalk' => '$1 namespace name(s) and alias(es) in $3 are project talk namespaces without the parameter:',
+                       'projecttalk' =>
+                               '$1 namespace name(s) and alias(es) in $3 are project talk namespaces without the parameter:',
                        'magic' => '$1 magic word(s) of $2 are not translated to $3, but exist in en:',
                        'magic-old' => '$1 magic word(s) of $2 do not exist in en, but exist in $3:',
                        'magic-over' => '$1 magic word(s) of $2 in $3 do not contain the original en word(s):',
-                       'magic-case' => '$1 magic word(s) of $2 in $3 change the case-sensitivity of the original en word:',
+                       'magic-case' =>
+                               '$1 magic word(s) of $2 in $3 change the case-sensitivity of the original en word:',
                        'special' => '$1 special page alias(es) of $2 are not translated to $3, but exist in en:',
                        'special-old' => '$1 special page alias(es) of $2 do not exist in en, but exist in $3:',
                );
@@ -216,35 +220,49 @@ Parameters:
        --all: Check all customized languages.
        --level: Show the following display level (default: 2):
                * 0: Skip the checks (useful for checking syntax).
-               * 1: Show only the stub headers and number of wrong messages, without list of messages.
-               * 2: Show only the headers and the message keys, without the message values.
-               * 3: Show both the headers and the complete messages, with both keys and values.
+               * 1: Show only the stub headers and number of wrong messages, without
+                    list of messages.
+               * 2: Show only the headers and the message keys, without the message
+                    values.
+               * 3: Show both the headers and the complete messages, with both keys and
+                    values.
        --links: Link the message values (default off).
        --prefix: prefix to add to links.
-       --wikilang: For the links, what is the content language of the wiki to display the output in (default en).
-       --noexif: Do not check for Exif messages (a bit hard and boring to translate), if you know
-               that they are currently not translated and want to focus on other problems (default off).
+       --wikilang: For the links, what is the content language of the wiki to
+           display the output in (default en).
+       --noexif: Do not check for Exif messages (a bit hard and boring to
+           translate), if you know what they are currently not translated and want
+           to focus on other problems (default off).
        --whitelist: Do only the following checks (form: code,code).
        --blacklist: Do not do the following checks (form: code,code).
-       --easy: Do only the easy checks, which can be treated by non-speakers of the language.
-
-Check codes (ideally, all of them should result 0; all the checks are executed by default (except language-specific check blacklists in checkLanguage.inc):
-       * untranslated: Messages which are required to translate, but are not translated.
-       * duplicate: Messages which translation equal to fallback
-       * obsolete: Messages which are untranslatable or do not exist, but are translated.
-       * variables: Messages without variables which should be used, or with variables which should not be used.
+       --easy: Do only the easy checks, which can be treated by non-speakers of
+           the language.
+
+Check codes (ideally, all of them should result 0; all the checks are executed
+by default (except language-specific check blacklists in checkLanguage.inc):
+       * untranslated: Messages which are required to translate, but are not
+         translated.
+       * duplicate: Messages which translation equal to fallback.
+       * obsolete: Messages which are untranslatable or do not exist, but are
+         translated.
+       * variables: Messages without variables which should be used, or with
+         variables which should not be used.
        * empty: Empty messages and messages that contain only -.
        * whitespace: Messages which have trailing whitespace.
-       * xhtml: Messages which are not well-formed XHTML (checks only few common errors).
+       * xhtml: Messages which are not well-formed XHTML (checks only few common
+         errors).
        * chars: Messages with hidden characters.
        * links: Messages which contains broken links to pages (does not find all).
-       * unbalanced: Messages which contains unequal numbers of opening {[ and closing ]}.
+       * unbalanced: Messages which contains unequal numbers of opening {[ and
+         closing ]}.
        * namespace: Namespace names that were not translated.
-       * projecttalk: Namespace names and aliases where the project talk does not contain $1.
+       * projecttalk: Namespace names and aliases where the project talk does not
+         contain $1.
        * magic: Magic words that were not translated.
        * magic-old: Magic words which do not exist.
        * magic-over: Magic words that override the original English word.
-       * magic-case: Magic words whose translation changes the case-sensitivity of the original English word.
+       * magic-case: Magic words whose translation changes the case-sensitivity of
+         the original English word.
        * special: Special page names that were not translated.
        * special-old: Special page names which do not exist.
 
@@ -291,6 +309,17 @@ ENDS;
                                $this->results[$this->code] = $this->checkLanguage( $this->code );
                        }
                }
+
+               $results = $this->results;
+               foreach ( $results as $code => $checks ) {
+                       foreach ( $checks as $check => $messages ) {
+                               foreach ( $messages as $key => $details ) {
+                                       if ( $this->isCheckBlacklisted( $check, $code, $key ) ) {
+                                               unset( $this->results[$code][$check][$key] );
+                                       }
+                               }
+                       }
+               }
        }
 
        /**
@@ -298,9 +327,53 @@ ENDS;
         * @return array The list of checks which should not be executed.
         */
        protected function getCheckBlacklist() {
+               static $blacklist = null;
+
+               if ( $blacklist !== null ) {
+                       return $blacklist;
+               }
+
+               // @codingStandardsIgnoreStart Ignore that globals should have a "wg" prefix.
                global $checkBlacklist;
+               // @codingStandardsIgnoreEnd
+
+               $blacklist = $checkBlacklist;
+
+               wfRunHooks( 'LocalisationChecksBlacklist', array( &$blacklist ) );
+
+               return $blacklist;
+       }
+
+       /**
+        * Verify whether a check is blacklisted.
+        *
+        * @param string $check Check name
+        * @param string $code Language code
+        * @param string|bool $message Message name, or False for a whole language
+        * @return bool Whether the check is blacklisted
+        */
+       protected function isCheckBlacklisted( $check, $code, $message ) {
+               $blacklist = $this->getCheckBlacklist();
+
+               foreach ( $blacklist as $item ) {
+                       if ( isset( $item['check'] ) && $check !== $item['check'] ) {
+                               continue;
+                       }
 
-               return $checkBlacklist;
+                       if ( isset( $item['code'] ) && !in_array( $code, $item['code'] ) ) {
+                               continue;
+                       }
+
+                       if ( isset( $item['message'] ) &&
+                               ( $message === false || !in_array( $message, $item['message'] ) )
+                       ) {
+                               continue;
+                       }
+
+                       return true;
+               }
+
+               return false;
        }
 
        /**
@@ -319,11 +392,8 @@ ENDS;
                }
 
                $checkFunctions = $this->getChecks();
-               $checkBlacklist = $this->getCheckBlacklist();
                foreach ( $this->checks as $check ) {
-                       if ( isset( $checkBlacklist[$code] ) &&
-                               in_array( $check, $checkBlacklist[$code] )
-                       ) {
+                       if ( $this->isCheckBlacklisted( $check, $code, false ) ) {
                                $results[$check] = array();
                                continue;
                        }
@@ -407,7 +477,8 @@ ENDS;
         */
        function outputWiki() {
                $detailText = '';
-               $rows[] = '! Language !! Code !! Total !! ' . implode( ' !! ', array_diff( $this->checks, $this->nonMessageChecks() ) );
+               $rows[] = '! Language !! Code !! Total !! ' .
+                       implode( ' !! ', array_diff( $this->checks, $this->nonMessageChecks() ) );
                foreach ( $this->results as $code => $results ) {
                        $detailTextForLang = "==$code==\n";
                        $numbers = array();
@@ -447,6 +518,7 @@ ENDS;
                $tableRows = implode( "\n|-\n", $rows );
 
                $version = SpecialVersion::getVersion( 'nodb' );
+               // @codingStandardsIgnoreStart Long line.
                echo <<<EOL
 '''Check results are for:''' <code>$version</code>
 
@@ -458,6 +530,7 @@ $tableRows
 $detailText
 
 EOL;
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -539,19 +612,19 @@ class CheckExtensionsCLI extends CheckLanguageCLI {
                if ( $extension == 'all' ) {
                        foreach ( MessageGroups::singleton()->getGroups() as $group ) {
                                if ( strpos( $group->getId(), 'ext-' ) === 0 && !$group->isMeta() ) {
-                                       $this->extensions[] = new extensionLanguages( $group );
+                                       $this->extensions[] = new ExtensionLanguages( $group );
                                }
                        }
                } elseif ( $extension == 'wikimedia' ) {
                        $wikimedia = MessageGroups::getGroup( 'ext-0-wikimedia' );
                        foreach ( $wikimedia->wmfextensions() as $extension ) {
                                $group = MessageGroups::getGroup( $extension );
-                               $this->extensions[] = new extensionLanguages( $group );
+                               $this->extensions[] = new ExtensionLanguages( $group );
                        }
                } elseif ( $extension == 'flaggedrevs' ) {
                        foreach ( MessageGroups::singleton()->getGroups() as $group ) {
                                if ( strpos( $group->getId(), 'ext-flaggedrevs-' ) === 0 && !$group->isMeta() ) {
-                                       $this->extensions[] = new extensionLanguages( $group );
+                                       $this->extensions[] = new ExtensionLanguages( $group );
                                }
                        }
                } else {
@@ -559,7 +632,7 @@ class CheckExtensionsCLI extends CheckLanguageCLI {
                        foreach ( $extensions as $extension ) {
                                $group = MessageGroups::getGroup( 'ext-' . $extension );
                                if ( $group ) {
-                                       $extension = new extensionLanguages( $group );
+                                       $extension = new ExtensionLanguages( $group );
                                        $this->extensions[] = $extension;
                                } else {
                                        print "No such extension $extension.\n";
@@ -603,34 +676,50 @@ class CheckExtensionsCLI extends CheckLanguageCLI {
         */
        protected function help() {
                return <<<ENDS
-Run this script to check the status of a specific language in extensions, or all of them.
-Command line settings are in form --parameter[=value], except for the first one.
+Run this script to check the status of a specific language in extensions, or
+all of them. Command line settings are in form --parameter[=value], except for
+the first one.
 Parameters:
-       * First parameter (mandatory): Extension name, multiple extension names (separated by commas), "all" for all the extensions, "wikimedia" for extensions used by Wikimedia or "flaggedrevs" for all FLaggedRevs extension messages.
+       * First parameter (mandatory): Extension name, multiple extension names
+         (separated by commas), "all" for all the extensions, "wikimedia" for
+         extensions used by Wikimedia or "flaggedrevs" for all FLaggedRevs
+         extension messages.
        * lang: Language code (default: the installation default language).
        * help: Show this help.
        * level: Show the following display level (default: 2).
        * links: Link the message values (default off).
-       * wikilang: For the links, what is the content language of the wiki to display the output in (default en).
+       * wikilang: For the links, what is the content language of the wiki to
+         display the output in (default en).
        * whitelist: Do only the following checks (form: code,code).
        * blacklist: Do not perform the following checks (form: code,code).
-       * easy: Do only the easy checks, which can be treated by non-speakers of the language.
-Check codes (ideally, all of them should result 0; all the checks are executed by default (except language-specific check blacklists in checkLanguage.inc):
-       * untranslated: Messages which are required to translate, but are not translated.
-       * duplicate: Messages which translation equal to fallback
+       * easy: Do only the easy checks, which can be treated by non-speakers of
+         the language.
+
+Check codes (ideally, all of them should result 0; all the checks are executed
+by default (except language-specific check blacklists in checkLanguage.inc):
+       * untranslated: Messages which are required to translate, but are not
+         translated.
+       * duplicate: Messages which translation equal to fallback.
        * obsolete: Messages which are untranslatable, but translated.
-       * variables: Messages without variables which should be used, or with variables which should not be used.
+       * variables: Messages without variables which should be used, or with
+         variables which should not be used.
        * empty: Empty messages.
        * whitespace: Messages which have trailing whitespace.
-       * xhtml: Messages which are not well-formed XHTML (checks only few common errors).
+       * xhtml: Messages which are not well-formed XHTML (checks only few common
+         errors).
        * chars: Messages with hidden characters.
        * links: Messages which contains broken links to pages (does not find all).
-       * unbalanced: Messages which contains unequal numbers of opening {[ and closing ]}.
+       * unbalanced: Messages which contains unequal numbers of opening {[ and
+         closing ]}.
+
 Display levels (default: 2):
        * 0: Skip the checks (useful for checking syntax).
-       * 1: Show only the stub headers and number of wrong messages, without list of messages.
-       * 2: Show only the headers and the message keys, without the message values.
-       * 3: Show both the headers and the complete messages, with both keys and values.
+       * 1: Show only the stub headers and number of wrong messages, without list
+         of messages.
+       * 2: Show only the headers and the message keys, without the message
+         values.
+       * 3: Show both the headers and the complete messages, with both keys and
+         values.
 
 ENDS;
        }
@@ -675,52 +764,21 @@ ENDS;
        }
 }
 
-# Blacklist some checks for some languages
+// Blacklist some checks for some languages or some messages
+// Possible keys of the sub arrays are: 'check', 'code' and 'message'.
 $checkBlacklist = array(
-#'code'        => array( 'check1', 'check2' ... )
-       'az' => array( 'plural' ),
-       'bo' => array( 'plural' ),
-       'cdo' => array( 'plural' ),
-       'dz' => array( 'plural' ),
-       'id' => array( 'plural' ),
-       'fa' => array( 'plural' ),
-       'gan' => array( 'plural' ),
-       'gan-hans' => array( 'plural' ),
-       'gan-hant' => array( 'plural' ),
-       'gn' => array( 'plural' ),
-       'hak' => array( 'plural' ),
-       'hu' => array( 'plural' ),
-       'ja' => array( 'plural' ), // Does not use plural
-       'jv' => array( 'plural' ),
-       'ka' => array( 'plural' ),
-       'kk-arab' => array( 'plural' ),
-       'kk-cyrl' => array( 'plural' ),
-       'kk-latn' => array( 'plural' ),
-       'km' => array( 'plural' ),
-       'kn' => array( 'plural' ),
-       'ko' => array( 'plural' ),
-       'lzh' => array( 'plural' ),
-       'mn' => array( 'plural' ),
-       'ms' => array( 'plural' ),
-       'my' => array( 'plural', 'chars' ), // Uses a lot zwnj
-       'sah' => array( 'plural' ),
-       'sq' => array( 'plural' ),
-       'tet' => array( 'plural' ),
-       'th' => array( 'plural' ),
-       'to' => array( 'plural' ),
-       'tr' => array( 'plural' ),
-       'vi' => array( 'plural' ),
-       'wuu' => array( 'plural' ),
-       'xmf' => array( 'plural' ),
-       'yo' => array( 'plural' ),
-       'yue' => array( 'plural' ),
-       'zh' => array( 'plural' ),
-       'zh-classical' => array( 'plural' ),
-       'zh-cn' => array( 'plural' ),
-       'zh-hans' => array( 'plural' ),
-       'zh-hant' => array( 'plural' ),
-       'zh-hk' => array( 'plural' ),
-       'zh-sg' => array( 'plural' ),
-       'zh-tw' => array( 'plural' ),
-       'zh-yue' => array( 'plural' ),
+       array(
+               'check' => 'plural',
+               'code' => array( 'az', 'bo', 'cdo', 'dz', 'id', 'fa', 'gan', 'gan-hans',
+                       'gan-hant', 'gn', 'hak', 'hu', 'ja', 'jv', 'ka', 'kk-arab',
+                       'kk-cyrl', 'kk-latn', 'km', 'kn', 'ko', 'lzh', 'mn', 'ms',
+                       'my', 'sah', 'sq', 'tet', 'th', 'to', 'tr', 'vi', 'wuu', 'xmf',
+                       'yo', 'yue', 'zh', 'zh-classical', 'zh-cn', 'zh-hans',
+                       'zh-hant', 'zh-hk', 'zh-sg', 'zh-tw', 'zh-yue'
+               ),
+       ),
+       array(
+               'check' => 'chars',
+               'code' => array( 'my' ),
+       ),
 );
index 95a7154..1cb24ab 100644 (file)
@@ -50,7 +50,7 @@ class CountMessages extends Maintenance {
                        // print "$code: $numMessages\n";
                        $total += $numMessages;
                        if ( $numMessages > 0 ) {
-                               $nonZero ++;
+                               $nonZero++;
                        }
                }
                $this->output( "\nTotal: $total\n" );
index fcf2c96..db6c315 100644 (file)
@@ -158,7 +158,8 @@ class GenerateCollationData extends Maintenance {
                // people like to use that as a fake no header symbol.
                $category = substr( $data['gc'], 0, 1 );
                if ( strpos( 'LNPS', $category ) === false
-                       && $data['cp'] !== '0020' ) {
+                       && $data['cp'] !== '0020'
+               ) {
                        return;
                }
                $cp = hexdec( $data['cp'] );
@@ -178,8 +179,8 @@ class GenerateCollationData extends Maintenance {
                // Calculate implicit weight per UTS #10 v6.0.0, sec 7.1.3
                if ( $data['UIdeo'] === 'Y' ) {
                        if ( $data['block'] == 'CJK Unified Ideographs'
-                               || $data['block'] == 'CJK Compatibility Ideographs' )
-                       {
+                               || $data['block'] == 'CJK Compatibility Ideographs'
+                       {
                                $base = 0xFB40;
                        } else {
                                $base = 0xFB80;
@@ -248,8 +249,8 @@ class GenerateCollationData extends Maintenance {
                        }
                        $this->weights[$cp] = $primary;
                        if ( $tertiary === '.0008'
-                               || $tertiary === '.000E' )
-                       {
+                               || $tertiary === '.000E'
+                       {
                                $goodTertiaryChars[$cp] = true;
                        }
                }
@@ -325,7 +326,7 @@ class GenerateCollationData extends Maintenance {
                        $char = codepointToUtf8( $cp );
                        $headerChars[] = $char;
                        if ( $primaryCollator->compare( $char, $prevChar ) <= 0 ) {
-                               $numOutOfOrder ++;
+                               $numOutOfOrder++;
                                /*
                                printf( "Out of order: U+%05X > U+%05X\n",
                                        utf8ToCodepoint( $prevChar ),
@@ -390,6 +391,7 @@ class UcdXmlReader {
                }
                while ( $this->xml->name !== 'ucd' && $this->xml->read() );
                $this->xml->read();
+
                return $this->xml;
        }
 
@@ -403,6 +405,7 @@ class UcdXmlReader {
                while ( $this->xml->moveToNextAttribute() ) {
                        $attrs[$this->xml->name] = $this->xml->value;
                }
+
                return $attrs;
        }
 
@@ -460,9 +463,9 @@ class UcdXmlReader {
                        }
                }
                $xml->close();
+
                return $this->blocks;
        }
-
 }
 
 $maintClass = 'GenerateCollationData';
index 216445e..b638b63 100644 (file)
@@ -44,7 +44,8 @@ class GenerateNormalizerData extends Maintenance {
                if ( !$this->hasOption( 'unicode-data-file' ) ) {
                        $this->dataFile = 'UnicodeData.txt';
                        if ( !file_exists( $this->dataFile ) ) {
-                               $this->error( "Unable to find UnicodeData.txt. Please specify its location with --unicode-data-file=<FILE>" );
+                               $this->error( "Unable to find UnicodeData.txt. Please specify " .
+                                       "its location with --unicode-data-file=<FILE>" );
                                exit( 1 );
                        }
                } else {
@@ -104,15 +105,15 @@ class GenerateNormalizerData extends Maintenance {
 
                        $code = base_convert( $data['Code'], 16, 10 );
                        if ( ( $code >= 0xFB50 && $code <= 0xFDFF ) # Arabic presentation forms A
-                               || ( $code >= 0xFE70 && $code <= 0xFEFF ) # Arabic presentation forms B
-                       {
+                               || ( $code >= 0xFE70 && $code <= 0xFEFF ) # Arabic presentation forms B
+                       {
                                if ( $data['Decomposition_Type_Mapping'] === '' ) {
                                        // No decomposition
                                        continue;
                                }
                                if ( !preg_match( '/^ *(<\w*>) +([0-9A-F ]*)$/',
-                                       $data['Decomposition_Type_Mapping'], $m ) )
-                               {
+                                       $data['Decomposition_Type_Mapping'], $m )
+                               {
                                        $this->error( "Can't parse Decomposition_Type/Mapping on line $lineNum" );
                                        $this->error( $line );
                                        continue;
index 14485f9..32cfcd7 100644 (file)
@@ -43,7 +43,7 @@ class LangMemUsage extends Maintenance {
                        $this->error( "You must compile PHP with --enable-memory-limit", true );
                }
 
-               $langtool = new languages();
+               $langtool = new Languages();
                $memlast = $memstart = memory_get_usage();
 
                $this->output( "Base memory usage: $memstart\n" );
index 6070f4a..61ee424 100644 (file)
 /**
  * @ingroup MaintenanceLanguage
  */
-class languages {
-       protected $mLanguages; # List of languages
+class Languages {
+       /** @var array List of languages */
+       protected $mLanguages; #
 
-       protected $mRawMessages; # Raw list of the messages in each language
-       protected $mMessages; # Messages in each language (except for English), divided to groups
-       protected $mFallback; # Fallback language in each language
-       protected $mGeneralMessages; # General messages in English, divided to groups
-       protected $mIgnoredMessages; # All the messages which should be exist only in the English file
-       protected $mOptionalMessages; # All the messages which may be translated or not, depending on the language
+       /** @var array Raw list of the messages in each language  */
+       protected $mRawMessages;
 
-       protected $mNamespaceNames; # Namespace names
-       protected $mNamespaceAliases; # Namespace aliases
-       protected $mMagicWords; # Magic words
-       protected $mSpecialPageAliases; # Special page aliases
+       /** @var array Messages in each language (except for English), divided to groups */
+       protected $mMessages;
+
+       /** @var array Fallback language in each language */
+       protected $mFallback;
+
+       /** @var array General messages in English, divided to groups */
+       protected $mGeneralMessages;
+
+       /** @var array All the messages which should be exist only in the English file */
+       protected $mIgnoredMessages;
+
+       /** @var array All the messages which may be translated or not, depending on the language */
+       protected $mOptionalMessages;
+
+       /** @var array Namespace names */
+       protected $mNamespaceNames;
+
+       /** @var array Namespace aliases */
+       protected $mNamespaceAliases;
+
+       /** @var array Magic words */
+       protected $mMagicWords;
+
+       /** @var  array Special page aliases */
+       protected $mSpecialPageAliases;
 
        /**
         * Load the list of languages: all the Messages*.php
@@ -96,7 +115,8 @@ class languages {
                        isset( $this->mNamespaceNames[$code] ) &&
                        isset( $this->mNamespaceAliases[$code] ) &&
                        isset( $this->mMagicWords[$code] ) &&
-                       isset( $this->mSpecialPageAliases[$code] ) ) {
+                       isset( $this->mSpecialPageAliases[$code] )
+               ) {
                        return;
                }
                $this->mRawMessages[$code] = array();
@@ -130,12 +150,16 @@ class languages {
        }
 
        /**
-        * Load the messages for a specific language (which is not English) and divide them to groups:
+        * Load the messages for a specific language (which is not English) and divide them to
+        * groups:
         * all - all the messages.
         * required - messages which should be translated in order to get a complete translation.
-        * optional - messages which can be translated, the fallback translation is used if not translated.
-        * obsolete - messages which should not be translated, either because they do not exist, or they are ignored messages.
-        * translated - messages which are either required or optional, but translated from English and needed.
+        * optional - messages which can be translated, the fallback translation is used if not
+        *   translated.
+        * obsolete - messages which should not be translated, either because they do not exist,
+        *   or they are ignored messages.
+        * translated - messages which are either required or optional, but translated from
+        *   English and needed.
         *
         * @param $code string The language code.
         */
@@ -166,10 +190,13 @@ class languages {
        /**
         * Load the messages for English and divide them to groups:
         * all - all the messages.
-        * required - messages which should be translated to other languages in order to get a complete translation.
-        * optional - messages which can be translated to other languages, but it's not required for a complete translation.
+        * required - messages which should be translated to other languages in order to get a
+        *   complete translation.
+        * optional - messages which can be translated to other languages, but it's not required
+        *   for a complete translation.
         * ignored - messages which should not be translated to other languages.
-        * translatable - messages which are either required or optional, but can be translated from English.
+        * translatable - messages which are either required or optional, but can be translated
+        *   from English.
         */
        private function loadGeneralMessages() {
                if ( isset( $this->mGeneralMessages ) ) {
@@ -199,9 +226,12 @@ class languages {
         * fallback language messages, divided to groups:
         * all - all the messages.
         * required - messages which should be translated in order to get a complete translation.
-        * optional - messages which can be translated, the fallback translation is used if not translated.
-        * obsolete - messages which should not be translated, either because they do not exist, or they are ignored messages.
-        * translated - messages which are either required or optional, but translated from English and needed.
+        * optional - messages which can be translated, the fallback translation is used if not
+        *   translated.
+        * obsolete - messages which should not be translated, either because they do not exist,
+        *   or they are ignored messages.
+        * translated - messages which are either required or optional, but translated from
+        *   English and needed.
         *
         * @param $code string The language code.
         *
@@ -209,21 +239,26 @@ class languages {
         */
        public function getMessages( $code ) {
                $this->loadMessages( $code );
+
                return $this->mMessages[$code];
        }
 
        /**
         * Get all the general English messages, divided to groups:
         * all - all the messages.
-        * required - messages which should be translated to other languages in order to get a complete translation.
-        * optional - messages which can be translated to other languages, but it's not required for a complete translation.
+        * required - messages which should be translated to other languages in
+        *   order to get a complete translation.
+        * optional - messages which can be translated to other languages, but it's
+        *   not required for a complete translation.
         * ignored - messages which should not be translated to other languages.
-        * translatable - messages which are either required or optional, but can be translated from English.
+        * translatable - messages which are either required or optional, but can be
+        *   translated from English.
         *
         * @return array The general English messages.
         */
        public function getGeneralMessages() {
                $this->loadGeneralMessages();
+
                return $this->mGeneralMessages;
        }
 
@@ -236,6 +271,7 @@ class languages {
         */
        public function getFallback( $code ) {
                $this->loadFile( $code );
+
                return $this->mFallback[$code];
        }
 
@@ -248,6 +284,7 @@ class languages {
         */
        public function getNamespaceNames( $code ) {
                $this->loadFile( $code );
+
                return $this->mNamespaceNames[$code];
        }
 
@@ -260,6 +297,7 @@ class languages {
         */
        public function getNamespaceAliases( $code ) {
                $this->loadFile( $code );
+
                return $this->mNamespaceAliases[$code];
        }
 
@@ -272,6 +310,7 @@ class languages {
         */
        public function getMagicWords( $code ) {
                $this->loadFile( $code );
+
                return $this->mMagicWords[$code];
        }
 
@@ -284,6 +323,7 @@ class languages {
         */
        public function getSpecialPageAliases( $code ) {
                $this->loadFile( $code );
+
                return $this->mSpecialPageAliases[$code];
        }
 
@@ -297,6 +337,7 @@ class languages {
        public function getUntranslatedMessages( $code ) {
                $this->loadGeneralMessages();
                $this->loadMessages( $code );
+
                return array_diff_key( $this->mGeneralMessages['required'], $this->mMessages[$code]['required'] );
        }
 
@@ -316,6 +357,7 @@ class languages {
                                $duplicateMessages[$key] = $value;
                        }
                }
+
                return $duplicateMessages;
        }
 
@@ -329,6 +371,7 @@ class languages {
        public function getObsoleteMessages( $code ) {
                $this->loadGeneralMessages();
                $this->loadMessages( $code );
+
                return $this->mMessages[$code]['obsolete'];
        }
 
@@ -348,11 +391,13 @@ class languages {
                        $missing = false;
                        foreach ( $variables as $var ) {
                                if ( preg_match( "/$var/sU", $this->mGeneralMessages['translatable'][$key] ) &&
-                                       !preg_match( "/$var/sU", $value ) ) {
+                                       !preg_match( "/$var/sU", $value )
+                               ) {
                                        $missing = true;
                                }
                                if ( !preg_match( "/$var/sU", $this->mGeneralMessages['translatable'][$key] ) &&
-                                       preg_match( "/$var/sU", $value ) ) {
+                                       preg_match( "/$var/sU", $value )
+                               ) {
                                        $missing = true;
                                }
                        }
@@ -360,6 +405,7 @@ class languages {
                                $mismatchMessages[$key] = $value;
                        }
                }
+
                return $mismatchMessages;
        }
 
@@ -375,10 +421,13 @@ class languages {
                $this->loadMessages( $code );
                $messagesWithoutPlural = array();
                foreach ( $this->mMessages[$code]['translated'] as $key => $value ) {
-                       if ( stripos( $this->mGeneralMessages['translatable'][$key], '{{plural:' ) !== false && stripos( $value, '{{plural:' ) === false ) {
+                       if ( stripos( $this->mGeneralMessages['translatable'][$key], '{{plural:' ) !== false &&
+                               stripos( $value, '{{plural:' ) === false
+                       ) {
                                $messagesWithoutPlural[$key] = $value;
                        }
                }
+
                return $messagesWithoutPlural;
        }
 
@@ -398,6 +447,7 @@ class languages {
                                $emptyMessages[$key] = $value;
                        }
                }
+
                return $emptyMessages;
        }
 
@@ -417,6 +467,7 @@ class languages {
                                $messagesWithWhitespace[$key] = $value;
                        }
                }
+
                return $messagesWithWhitespace;
        }
 
@@ -445,6 +496,7 @@ class languages {
                                $nonXHTMLMessages[$key] = $value;
                        }
                }
+
                return $nonXHTMLMessages;
        }
 
@@ -482,6 +534,7 @@ class languages {
                                $wrongCharsMessages[$key] = $value;
                        }
                }
+
                return $wrongCharsMessages;
        }
 
@@ -500,17 +553,18 @@ class languages {
                foreach ( $this->mMessages[$code]['translated'] as $key => $value ) {
                        $matches = array();
                        preg_match_all( "/\[\[([{$tc}]+)(?:\\|(.+?))?]]/sDu", $value, $matches );
-                       for ( $i = 0; $i < count( $matches[0] ); $i++ ) {
+                       $numMatches = count( $matches[0] );
+                       for ( $i = 0; $i < $numMatches; $i++ ) {
                                if ( preg_match( "/.*project.*/isDu", $matches[1][$i] ) ) {
                                        $messages[$key][] = $matches[0][$i];
                                }
                        }
 
-
                        if ( isset( $messages[$key] ) ) {
                                $messages[$key] = implode( $messages[$key], ", " );
                        }
                }
+
                return $messages;
        }
 
@@ -547,8 +601,8 @@ class languages {
                        if ( $a !== $b || $c !== $d ) {
                                $messages[$key] = "$a, $b, $c, $d";
                        }
-
                }
+
                return $messages;
        }
 
@@ -566,6 +620,7 @@ class languages {
                if ( isset( $namespacesDiff[NS_MAIN] ) ) {
                        unset( $namespacesDiff[NS_MAIN] );
                }
+
                return $namespacesDiff;
        }
 
@@ -614,6 +669,7 @@ class languages {
                                $magicWords[$key] = $value[1];
                        }
                }
+
                return $magicWords;
        }
 
@@ -633,6 +689,7 @@ class languages {
                                $magicWords[$key] = $value[1];
                        }
                }
+
                return $magicWords;
        }
 
@@ -662,6 +719,7 @@ class languages {
                                }
                        }
                }
+
                return $magicWords;
        }
 
@@ -685,6 +743,7 @@ class languages {
                                $magicWords[$key] = $local[0];
                        }
                }
+
                return $magicWords;
        }
 
@@ -704,6 +763,7 @@ class languages {
                                $specialPageAliases[$key] = $value[0];
                        }
                }
+
                return $specialPageAliases;
        }
 
@@ -723,12 +783,12 @@ class languages {
                                $specialPageAliases[$key] = $value[0];
                        }
                }
+
                return $specialPageAliases;
        }
 }
 
-class extensionLanguages extends languages {
-
+class ExtensionLanguages extends Languages {
        /**
         * @var MessageGroup
         */
index 267666d..746f14f 100644 (file)
@@ -484,7 +484,7 @@ $wgOptionalMessages = array(
        'limitreport-ppgeneratednodes-value',
        'limitreport-expansiondepth-value',
        'limitreport-expensivefunctioncount-value',
-       'tooltip-iwiki',
+       'interlanguage-link-title',
 );
 
 /** Exif messages, which may be set as optional in several checks, but are generally mandatory */
index 17658a0..09bd302 100644 (file)
@@ -287,7 +287,6 @@ $wgMessageStructure = array(
                'disclaimerpage',
                'edithelp',
                'edithelppage',
-               'help',
                'helppage',
                'mainpage',
                'mainpage-description',
@@ -1090,7 +1089,6 @@ $wgMessageStructure = array(
                'prefs-namespaces',
                'defaultns',
                'default',
-               'defaultns',
                'prefs-files',
                'prefs-custom-css',
                'prefs-custom-js',
@@ -1517,7 +1515,6 @@ $wgMessageStructure = array(
                'lockmanager-fail-deletelock',
                'lockmanager-fail-acquirelock',
                'lockmanager-fail-openlock',
-               'lockmanager-fail-acquirelock',
                'lockmanager-fail-releaselock',
                'lockmanager-fail-db-bucket',
                'lockmanager-fail-db-release',
@@ -1769,7 +1766,6 @@ $wgMessageStructure = array(
                'nmembers',
                'nrevisions',
                'nviews',
-               'nchanges',
                'nimagelinks',
                'ntransclusions',
                'specialpage-empty',
@@ -2724,7 +2720,7 @@ $wgMessageStructure = array(
                'tooltip-undo',
                'tooltip-preferences-save',
                'tooltip-summary',
-               'tooltip-iwiki',
+               'interlanguage-link-title',
        ),
        'stylesheets' => array(
                'common.css',
@@ -3523,6 +3519,7 @@ $wgMessageStructure = array(
                'percent',
                'parentheses',
                'brackets',
+               'quotation-marks',
        ),
        'imgmulti' => array(
                'imgmultipageprev',
@@ -3583,9 +3580,6 @@ $wgMessageStructure = array(
                'lag-warn-normal',
                'lag-warn-high',
        ),
-       'watch' => array(
-               'confirm-watch-button',
-       ),
        'watchlisteditor' => array(
                'editwatchlist-summary',
                'watchlistedit-numitems',
@@ -3821,9 +3815,6 @@ $wgMessageStructure = array(
                'sqlite-has-fts',
                'sqlite-no-fts',
        ),
-       'unwatch' => array(
-               'confirm-unwatch-button',
-       ),
        'logging' => array(
                'logentry-delete-delete',
                'logentry-delete-restore',
@@ -3882,8 +3873,6 @@ $wgMessageStructure = array(
                'newuserlog-create-entry',
                'newuserlog-create2-entry',
                'newuserlog-autocreate-entry',
-               'suppressedarticle',
-               'deletedarticle',
                // 'uploadedimage',
                // 'overwroteimage',
                'rightslogentry',
@@ -3987,244 +3976,247 @@ $wgMessageStructure = array(
 
 /** Comments for each block */
 $wgBlockComments = array(
-       'sidebar'             => "The sidebar for MonoBook is generated from this message, lines that do not
+       'sidebar' => "The sidebar for MonoBook is generated from this message, lines that do not
 begin with * or ** are discarded, furthermore lines that do begin with ** and
 do not contain | are also discarded, but do not depend on this behavior for
 future releases. Also note that since each list value is wrapped in a unique
 (X)HTML id it should only appear once and include characters that are legal
 (X)HTML id names.",
-       'toggles'             => 'User preference toggles',
-       'underline'           => '',
-       'editfont'            => 'Font style option in Special:Preferences',
-       'dates'               => 'Dates',
-       'categorypages'       => 'Categories related messages',
-       'mainpage'            => '',
-       'miscellaneous1'      => '',
-       'cologneblue'         => 'Cologne Blue skin',
-       'vector'              => 'Vector skin',
-       'miscellaneous2'      => '',
-       'links'               => '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).',
-       'badaccess'           => '',
-       'versionrequired'     => '',
-       'miscellaneous3'      => '',
-       'nstab'               => "Short words for each namespace, by default used in the namespace tab in monobook",
-       'main'                => 'Main script and global functions',
-       'errors'              => 'General errors',
-       'virus'               => 'Virus scanner',
-       'login'               => 'Login and logout pages',
-       'mail'                => 'Email sending',
-       'passwordstrength'    => 'JavaScript password checks',
-       'resetpass'           => 'Change password dialog',
-       'passwordreset'       => 'Special:PasswordReset',
-       'changeemail'         => 'Special:ChangeEmail',
-       'resettokens'         => 'Special:ResetTokens',
-       'toolbar'             => 'Edit page toolbar',
-       'edit'                => 'Edit pages',
-       'parserwarnings'      => 'Parser/template warnings',
-       'contentmodels'       => 'Content models',
-       'undo'                => '"Undo" feature',
-       'cantcreateaccount'   => 'Account creation failure',
-       'history'             => 'History pages',
-       'history-feed'        => 'Revision feed',
-       'revdelete'           => 'Revision deletion',
-       'suppression'         => 'Suppression log',
-       'mergehistory'        => 'History merging',
-       'mergelog'            => 'Merge log',
-       'diffs'               => 'Diffs',
-       'search'              => 'Search results',
-       'opensearch'          => 'OpenSearch description',
-       'preferences'         => 'Preferences page',
-       'preferences-email'   => 'User preference: email validation using jQuery',
-       'userrights'          => 'User rights',
-       'group'               => 'Groups',
-       'group-member'        => '',
-       'grouppage'           => '',
-       'right'               => 'Rights',
-       'action'              => 'Associated actions - in the sentence "You do not have permission to X"',
-       'rightslog'           => 'User rights log',
-       'recentchanges'       => 'Recent changes',
+       'toggles' => 'User preference toggles',
+       'underline' => '',
+       'editfont' => 'Font style option in Special:Preferences',
+       'dates' => 'Dates',
+       'categorypages' => 'Categories related messages',
+       'mainpage' => '',
+       'miscellaneous1' => '',
+       'cologneblue' => 'Cologne Blue skin',
+       'vector' => 'Vector skin',
+       'miscellaneous2' => '',
+       'links' => '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).',
+       'badaccess' => '',
+       'versionrequired' => '',
+       'miscellaneous3' => '',
+       'nstab' => "Short words for each namespace, by default used in the namespace tab in monobook",
+       'main' => 'Main script and global functions',
+       'errors' => 'General errors',
+       'virus' => 'Virus scanner',
+       'login' => 'Login and logout pages',
+       'mail' => 'Email sending',
+       'passwordstrength' => 'JavaScript password checks',
+       'resetpass' => 'Change password dialog',
+       'passwordreset' => 'Special:PasswordReset',
+       'changeemail' => 'Special:ChangeEmail',
+       'resettokens' => 'Special:ResetTokens',
+       'toolbar' => 'Edit page toolbar',
+       'edit' => 'Edit pages',
+       'parserwarnings' => 'Parser/template warnings',
+       'contentmodels' => 'Content models',
+       'undo' => '"Undo" feature',
+       'cantcreateaccount' => 'Account creation failure',
+       'history' => 'History pages',
+       'history-feed' => 'Revision feed',
+       'revdelete' => 'Revision deletion',
+       'suppression' => 'Suppression log',
+       'mergehistory' => 'History merging',
+       'mergelog' => 'Merge log',
+       'diffs' => 'Diffs',
+       'search' => 'Search results',
+       'opensearch' => 'OpenSearch description',
+       'preferences' => 'Preferences page',
+       'preferences-email' => 'User preference: email validation using jQuery',
+       'userrights' => 'User rights',
+       'group' => 'Groups',
+       'group-member' => '',
+       'grouppage' => '',
+       'right' => 'Rights',
+       'action' => 'Associated actions - in the sentence "You do not have permission to X"',
+       'rightslog' => 'User rights log',
+       'recentchanges' => 'Recent changes',
        'recentchangeslinked' => 'Recent changes linked',
-       'upload'              => 'Upload',
-       'zip'                 => 'ZipDirectoryReader',
-       'upload-errors'       => '',
-       'filebackend-errors'  => 'File backend',
-       'filejournal-errors'  => 'File journal errors',
-       'lockmanager-errors'  => 'Lock manager',
-       'uploadstash'         => 'Special:UploadStash',
-       'img-auth'            => 'img_auth script messages',
-       'http-errors'         => 'HTTP errors',
-       'upload-curl-errors'  => 'Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>',
-       'licenses'            => '',
-       'filelist'            => 'Special:ListFiles',
-       'filedescription'     => 'File description page',
-       'filerevert'          => 'File reversion',
-       'filedelete'          => 'File deletion',
-       'mimesearch'          => 'MIME search',
-       'unwatchedpages'      => 'Unwatched pages',
-       'listredirects'       => 'List redirects',
-       'unusedtemplates'     => 'Unused templates',
-       'randompage'          => 'Random page',
-       'randomincategory'    => 'Random page in category',
-       'randomredirect'      => 'Random redirect',
-       'statistics'          => 'Statistics',
-       'pageswithprop'       => '',
-       'doubleredirects'     => '',
-       'brokenredirects'     => '',
-       'withoutinterwiki'    => '',
-       'fewestrevisions'     => '',
-       'specialpages'        => 'Miscellaneous special pages',
-       'booksources'         => 'Book sources',
-       'magicwords'          => 'Magic words',
-       'logpages'            => 'Special:Log',
-       'allpages'            => 'Special:AllPages',
-       'categories'          => 'Special:Categories',
-       'deletedcontribs'     => 'Special:DeletedContributions',
-       'linksearch'          => 'Special:LinkSearch',
-       'listusers'           => 'Special:ListUsers',
-       'activeusers'         => 'Special:ActiveUsers',
-       'newuserlog'          => 'Special:Log/newusers',
-       'listgrouprights'     => 'Special:ListGroupRights',
-       'emailuser'           => 'Email user',
-       'usermessage'         => 'User Messenger',
-       'watchlist'           => 'Watchlist',
-       'watching'            => 'Displayed when you click the "watch" button and it is in the process of watching',
-       'enotif'              => '',
-       'delete'              => 'Delete',
-       'rollback'            => 'Rollback',
-       'edittokens'          => 'Edit tokens',
-       'protect'             => 'Protect',
-       'restrictions'        => 'Restrictions (nouns)',
-       'restriction-levels'  => 'Restriction levels',
-       'undelete'            => 'Undelete',
-       'nsform'              => 'Namespace form on various pages',
-       'contributions'       => 'Contributions',
-       'sp-contributions'    => '',
-       'whatlinkshere'       => 'What links here',
-       'block'               => 'Block/unblock',
-       'developertools'      => 'Developer tools',
-       'movepage'            => 'Move page',
-       'export'              => 'Export',
-       'allmessages'         => 'Namespace 8 related',
-       'thumbnails'          => 'Thumbnails',
-       'import'              => 'Special:Import',
-       'importlog'           => 'Import log',
-       'javaccripttest'      => 'JavaScriptTest',
-       'accesskeys'          => 'Keyboard access keys for power users',
-       'tooltips'            => 'Tooltip help for the actions',
-       'stylesheets'         => 'Stylesheets',
-       'scripts'             => 'Scripts',
-       'metadata_cc'         => 'Metadata',
-       'attribution'         => 'Attribution',
-       'spamprotection'      => 'Spam protection',
-       'info'                => 'Info page',
-       'skin'                => 'Skin names',
-       'patrolling'          => 'Patrolling',
-       'patrol-log'          => 'Patrol log',
-       'imagedeletion'       => 'Image deletion',
-       'browsediffs'         => 'Browsing diffs',
-       'newfiles'            => 'Special:NewFiles',
-       'video-info'          => 'Video information, used by Language::formatTimePeriod() to format lengths in the above messages',
-       'human-timestamps'    => 'Human-readable timestamps',
-       'badimagelist'        => 'Bad image list',
-       'variantname-zh'      => "Short names for language variants used for language conversion links.
+       'upload' => 'Upload',
+       'zip' => 'ZipDirectoryReader',
+       'upload-errors' => '',
+       'filebackend-errors' => 'File backend',
+       'filejournal-errors' => 'File journal errors',
+       'lockmanager-errors' => 'Lock manager',
+       'uploadstash' => 'Special:UploadStash',
+       'img-auth' => 'img_auth script messages',
+       'http-errors' => 'HTTP errors',
+       'upload-curl-errors' => 'Some likely curl errors. More could be added from ' .
+               '<http://curl.haxx.se/libcurl/c/libcurl-errors.html>',
+       'licenses' => '',
+       'filelist' => 'Special:ListFiles',
+       'filedescription' => 'File description page',
+       'filerevert' => 'File reversion',
+       'filedelete' => 'File deletion',
+       'mimesearch' => 'MIME search',
+       'unwatchedpages' => 'Unwatched pages',
+       'listredirects' => 'List redirects',
+       'unusedtemplates' => 'Unused templates',
+       'randompage' => 'Random page',
+       'randomincategory' => 'Random page in category',
+       'randomredirect' => 'Random redirect',
+       'statistics' => 'Statistics',
+       'pageswithprop' => '',
+       'doubleredirects' => '',
+       'brokenredirects' => '',
+       'withoutinterwiki' => '',
+       'fewestrevisions' => '',
+       'specialpages' => 'Miscellaneous special pages',
+       'booksources' => 'Book sources',
+       'magicwords' => 'Magic words',
+       'logpages' => 'Special:Log',
+       'allpages' => 'Special:AllPages',
+       'categories' => 'Special:Categories',
+       'deletedcontribs' => 'Special:DeletedContributions',
+       'linksearch' => 'Special:LinkSearch',
+       'listusers' => 'Special:ListUsers',
+       'activeusers' => 'Special:ActiveUsers',
+       'newuserlog' => 'Special:Log/newusers',
+       'listgrouprights' => 'Special:ListGroupRights',
+       'emailuser' => 'Email user',
+       'usermessage' => 'User Messenger',
+       'watchlist' => 'Watchlist',
+       'watching' => 'Displayed when you click the "watch" button and it is in the process of watching',
+       'enotif' => '',
+       'delete' => 'Delete',
+       'rollback' => 'Rollback',
+       'edittokens' => 'Edit tokens',
+       'protect' => 'Protect',
+       'restrictions' => 'Restrictions (nouns)',
+       'restriction-levels' => 'Restriction levels',
+       'undelete' => 'Undelete',
+       'nsform' => 'Namespace form on various pages',
+       'contributions' => 'Contributions',
+       'sp-contributions' => '',
+       'whatlinkshere' => 'What links here',
+       'block' => 'Block/unblock',
+       'developertools' => 'Developer tools',
+       'movepage' => 'Move page',
+       'export' => 'Export',
+       'allmessages' => 'Namespace 8 related',
+       'thumbnails' => 'Thumbnails',
+       'import' => 'Special:Import',
+       'importlog' => 'Import log',
+       'javaccripttest' => 'JavaScriptTest',
+       'accesskeys' => 'Keyboard access keys for power users',
+       'tooltips' => 'Tooltip help for the actions',
+       'stylesheets' => 'Stylesheets',
+       'scripts' => 'Scripts',
+       'metadata_cc' => 'Metadata',
+       'attribution' => 'Attribution',
+       'spamprotection' => 'Spam protection',
+       'info' => 'Info page',
+       'skin' => 'Skin names',
+       'patrolling' => 'Patrolling',
+       'patrol-log' => 'Patrol log',
+       'imagedeletion' => 'Image deletion',
+       'browsediffs' => 'Browsing diffs',
+       'newfiles' => 'Special:NewFiles',
+       'video-info' => 'Video information, used by Language::formatTimePeriod() to ' .
+               'format lengths in the above messages',
+       'human-timestamps' => 'Human-readable timestamps',
+       'badimagelist' => 'Bad image list',
+       'variantname-zh' => "Short names for language variants used for language conversion links.
 Variants for Chinese language",
-       'variantname-gan'      => 'Variants for Gan language',
-       'variantname-sr'      => 'Variants for Serbian language',
-       'variantname-kk'      => 'Variants for Kazakh language',
-       'variantname-ku'      => 'Variants for Kurdish language',
-       'variantname-tg'      => 'Variants for Tajiki language',
-       'variantname-iu'      => 'Variants for Inuktitut language',
-       'variantname-shi'     => 'Variants for Tachelhit language',
-       'media-info'          => 'Media information',
-       'metadata'            => 'Metadata',
-       'exif'                           => 'Exif tags',
-       'exif-values'                    => 'Make & model, can be wikified in order to link to the camera and model name',
-       'exif-compression'               => 'Exif attributes',
-       'exif-copyrighted'               => '',
-       'exif-unknowndate'               => '',
+       'variantname-gan' => 'Variants for Gan language',
+       'variantname-sr' => 'Variants for Serbian language',
+       'variantname-kk' => 'Variants for Kazakh language',
+       'variantname-ku' => 'Variants for Kurdish language',
+       'variantname-tg' => 'Variants for Tajiki language',
+       'variantname-iu' => 'Variants for Inuktitut language',
+       'variantname-shi' => 'Variants for Tachelhit language',
+       'media-info' => 'Media information',
+       'metadata' => 'Metadata',
+       'exif' => 'Exif tags',
+       'exif-values' => 'Make & model, can be wikified in order to link to the camera and model name',
+       'exif-compression' => 'Exif attributes',
+       'exif-copyrighted' => '',
+       'exif-unknowndate' => '',
        'exif-photometricinterpretation' => '',
-       'exif-orientation'               => '',
-       'exif-planarconfiguration'       => '',
-       'exif-xyresolution'              => '',
-       'exif-colorspace'                => '',
-       'exif-componentsconfiguration'   => '',
-       'exif-exposureprogram'           => '',
-       'exif-subjectdistance-value'     => '',
-       'exif-meteringmode'              => '',
-       'exif-lightsource'               => '',
-       'exif-flash'                     => 'Flash modes',
-       'exif-focalplaneresolutionunit'  => '',
-       'exif-sensingmethod'             => '',
-       'exif-filesource'                => '',
-       'exif-scenetype'                 => '',
-       'exif-customrendered'            => '',
-       'exif-exposuremode'              => '',
-       'exif-whitebalance'              => '',
-       'exif-scenecapturetype'          => '',
-       'exif-gaincontrol'               => '',
-       'exif-contrast'                  => '',
-       'exif-saturation'                => '',
-       'exif-sharpness'                 => '',
-       'exif-subjectdistancerange'      => '',
-       'exif-gpslatitude'               => 'Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef',
-       'exif-gpslongitude'              => 'Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef',
-       'exif-altituderef'               => 'Pseudotags used for GPSAltitudeRef',
-       'exif-gpsstatus'                 => '',
-       'exif-gpsmeasuremode'            => '',
-       'exif-gpsspeed'                  => 'Pseudotags used for GPSSpeedRef',
-       'exif-gpsdestdistanceref'        => 'Pseudotags used for GPSDestDistanceRef',
-       'exif-gdop'                      => '',
-       'exif-objectcycle'               => '',
-       'exif-gpsdirection'              => 'Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef',
-       'exif-ycbcrpositioning'          => '',
-       'exif-dc'                        => '',
-       'exif-rating'                    => '',
-       'exif-isospeedratings'           => '',
-       'exif-maxaperturevalue'          => '',
-       'exif-iimcategory'               => '',
-       'exif-urgency'                   => '',
-       'edit-externally'       => 'External editor support',
-       'all'                   => "'all' in various places, this might be different for inflected languages",
-       'confirmemail'          => 'Email address confirmation',
-       'scarytransclusion'     => 'Scary transclusion',
-       'deleteconflict'        => 'Delete conflict',
-       'unit-pixel'            => '',
-       'purge'                 => 'action=purge',
-       'watch-unwatch'         => 'action=watch/unwatch',
-       'separators'            => 'Separators for various lists, etc.',
-       'imgmulti'              => 'Multipage image navigation',
-       'tablepager'            => 'Table pager',
-       'autosumm'              => 'Auto-summaries',
-       'autoblock_whitelist'   => 'Autoblock whitelist',
-       'sizeunits'             => 'Size units',
-       'bitrateunits'          => 'Bitrate units',
-       'livepreview'           => 'Live preview',
-       'lagwarning'            => 'Friendlier slave lag warnings',
-       'watchlisteditor'       => 'Watchlist editor',
-       'watchlisttools'        => 'Watchlist editing tools',
-       'iranian-dates'         => 'Iranian month names',
-       'hijri-dates'           => 'Hijri month names',
-       'hebrew-dates'          => 'Hebrew month names',
-       'signatures'            => 'Signatures',
-       'CoreParserFunctions'   => 'Core parser functions',
-       'version'               => 'Special:Version',
-       'redirect'              => 'Special:Redirect',
-       'fileduplicatesearch'   => 'Special:FileDuplicateSearch',
-       'special-specialpages'  => 'Special:SpecialPages',
-       'special-blank'         => 'Special:BlankPage',
-       'external_images'       => 'External image whitelist',
-       'special-tags'          => 'Special:Tags',
-       'comparepages'          => 'Special:ComparePages',
-       'db-error-messages'     => 'Database error messages',
-       'html-forms'            => 'HTML forms',
-       'sqlite'                => 'SQLite database support',
-       'logging'               => 'New logging system',
-       'logging-irc'           => 'For IRC, see bug 34508. Do not change',
-       'feedback'              => 'Feedback',
-       'searchsuggestions'     => 'Search suggestions',
-       'apierrors'             => 'API errors',
-       'duration'              => 'Durations',
-       'cachedspecial'         => 'SpecialCachedPage',
-       'rotation'              => 'Image rotation',
-       'limitreport'           => 'Limit report',
+       'exif-orientation' => '',
+       'exif-planarconfiguration' => '',
+       'exif-xyresolution' => '',
+       'exif-colorspace' => '',
+       'exif-componentsconfiguration' => '',
+       'exif-exposureprogram' => '',
+       'exif-subjectdistance-value' => '',
+       'exif-meteringmode' => '',
+       'exif-lightsource' => '',
+       'exif-flash' => 'Flash modes',
+       'exif-focalplaneresolutionunit' => '',
+       'exif-sensingmethod' => '',
+       'exif-filesource' => '',
+       'exif-scenetype' => '',
+       'exif-customrendered' => '',
+       'exif-exposuremode' => '',
+       'exif-whitebalance' => '',
+       'exif-scenecapturetype' => '',
+       'exif-gaincontrol' => '',
+       'exif-contrast' => '',
+       'exif-saturation' => '',
+       'exif-sharpness' => '',
+       'exif-subjectdistancerange' => '',
+       'exif-gpslatitude' => 'Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef',
+       'exif-gpslongitude' => 'Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef',
+       'exif-altituderef' => 'Pseudotags used for GPSAltitudeRef',
+       'exif-gpsstatus' => '',
+       'exif-gpsmeasuremode' => '',
+       'exif-gpsspeed' => 'Pseudotags used for GPSSpeedRef',
+       'exif-gpsdestdistanceref' => 'Pseudotags used for GPSDestDistanceRef',
+       'exif-gdop' => '',
+       'exif-objectcycle' => '',
+       'exif-gpsdirection' => 'Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef',
+       'exif-ycbcrpositioning' => '',
+       'exif-dc' => '',
+       'exif-rating' => '',
+       'exif-isospeedratings' => '',
+       'exif-maxaperturevalue' => '',
+       'exif-iimcategory' => '',
+       'exif-urgency' => '',
+       'edit-externally' => 'External editor support',
+       'all' => "'all' in various places, this might be different for inflected languages",
+       'confirmemail' => 'Email address confirmation',
+       'scarytransclusion' => 'Scary transclusion',
+       'deleteconflict' => 'Delete conflict',
+       'unit-pixel' => '',
+       'purge' => 'action=purge',
+       'watch-unwatch' => 'action=watch/unwatch',
+       'separators' => 'Separators for various lists, etc.',
+       'imgmulti' => 'Multipage image navigation',
+       'tablepager' => 'Table pager',
+       'autosumm' => 'Auto-summaries',
+       'autoblock_whitelist' => 'Autoblock whitelist',
+       'sizeunits' => 'Size units',
+       'bitrateunits' => 'Bitrate units',
+       'livepreview' => 'Live preview',
+       'lagwarning' => 'Friendlier slave lag warnings',
+       'watchlisteditor' => 'Watchlist editor',
+       'watchlisttools' => 'Watchlist editing tools',
+       'iranian-dates' => 'Iranian month names',
+       'hijri-dates' => 'Hijri month names',
+       'hebrew-dates' => 'Hebrew month names',
+       'signatures' => 'Signatures',
+       'CoreParserFunctions' => 'Core parser functions',
+       'version' => 'Special:Version',
+       'redirect' => 'Special:Redirect',
+       'fileduplicatesearch' => 'Special:FileDuplicateSearch',
+       'special-specialpages' => 'Special:SpecialPages',
+       'special-blank' => 'Special:BlankPage',
+       'external_images' => 'External image whitelist',
+       'special-tags' => 'Special:Tags',
+       'comparepages' => 'Special:ComparePages',
+       'db-error-messages' => 'Database error messages',
+       'html-forms' => 'HTML forms',
+       'sqlite' => 'SQLite database support',
+       'logging' => 'New logging system',
+       'logging-irc' => 'For IRC, see bug 34508. Do not change',
+       'feedback' => 'Feedback',
+       'searchsuggestions' => 'Search suggestions',
+       'apierrors' => 'API errors',
+       'duration' => 'Durations',
+       'cachedspecial' => 'SpecialCachedPage',
+       'rotation' => 'Image rotation',
+       'limitreport' => 'Limit report',
 );
index 66948ae..6b506b8 100644 (file)
@@ -38,13 +38,22 @@ require_once 'writeMessagesArray.inc';
  * @param $dupeMsgSource string The source file intended to remove from the array.
  * @param $messagesFolder String: path to a folder to store the MediaWiki messages.
  */
-function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown, $removeDupes, $dupeMsgSource, $messagesFolder ) {
+function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown,
+       $removeDupes, $dupeMsgSource, $messagesFolder
+) {
        $messages = $languages->getMessages( $code );
        $messages = $messages['all'];
        if ( $removeDupes ) {
                $messages = removeDupes( $messages, $dupeMsgSource );
        }
-       MessageWriter::writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown, $messagesFolder );
+       MessageWriter::writeMessagesToFile(
+               $messages,
+               $code,
+               $write,
+               $listUnknown,
+               $removeUnknown,
+               $messagesFolder
+       );
 }
 
 /**
@@ -71,15 +80,18 @@ function removeDupes( $oldMsgArray, $dupeMsgSource ) {
                        unset( $newMsgArray[$key] );
                }
        }
+
        return $newMsgArray;
 }
 
 # Show help
 if ( isset( $options['help'] ) ) {
        echo <<<TEXT
-Run this script to rewrite the messages array in the files languages/messages/MessagesXX.php.
+Run this script to rewrite the messages array in the files
+languages/messages/MessagesXX.php.
 Parameters:
-       * lang: Language code (default: the installation default language). You can also specify "all" to check all the languages.
+       * lang: Language code (default: the installation default language).
+         You can also specify "all" to check all the languages.
        * help: Show this help.
 Options:
        * dry-run: Do not write the array to the file.
@@ -114,13 +126,31 @@ $wgRemoveDuplicateMessages = isset( $options['remove-duplicates'] );
 $messagesFolder = isset( $options['messages-folder'] ) ? $options['messages-folder'] : false;
 
 # Get language objects
-$languages = new languages();
+$languages = new Languages();
 
 # Write all the language
 if ( $wgCode == 'all' ) {
        foreach ( $languages->getLanguages() as $languageCode ) {
-               rebuildLanguage( $languages, $languageCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource, $messagesFolder );
+               rebuildLanguage(
+                       $languages,
+                       $languageCode,
+                       $wgWriteToFile,
+                       $wgListUnknownMessages,
+                       $wgRemoveUnknownMessages,
+                       $wgRemoveDuplicateMessages,
+                       $wgDupeMessageSource,
+                       $messagesFolder
+               );
        }
 } else {
-       rebuildLanguage( $languages, $wgCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource, $messagesFolder );
+       rebuildLanguage(
+               $languages,
+               $wgCode,
+               $wgWriteToFile,
+               $wgListUnknownMessages,
+               $wgRemoveUnknownMessages,
+               $wgRemoveDuplicateMessages,
+               $wgDupeMessageSource,
+               $messagesFolder
+       );
 }
index 61b84a0..6a538e6 100644 (file)
@@ -32,7 +32,6 @@ require_once __DIR__ . '/../commandLine.inc';
 require_once 'languages.inc';
 require_once __DIR__ . '/StatOutputs.php';
 
-
 if ( isset( $options['help'] ) ) {
        showUsage();
 }
@@ -57,25 +56,23 @@ TEXT;
        exit( 1 );
 }
 
-
-
 # Select an output engine
 switch ( $options['output'] ) {
        case 'wiki':
-               $output = new wikiStatsOutput();
+               $output = new WikiStatsOutput();
                break;
        case 'text':
-               $output = new textStatsOutput();
+               $output = new TextStatsOutput();
                break;
        case 'csv':
-               $output = new csvStatsOutput();
+               $output = new CsvStatsOutput();
                break;
        default:
                showUsage();
 }
 
 # Languages
-$wgLanguages = new languages();
+$wgLanguages = new Languages();
 
 # Header
 $output->heading();
@@ -97,7 +94,8 @@ $wgRequiredMessagesNumber = count( $wgGeneralMessages['required'] );
 foreach ( $wgLanguages->getLanguages() as $code ) {
        # Don't check English, RTL English or dummy language codes
        if ( $code == 'en' || $code == 'enRTL' || ( is_array( $wgDummyLanguageCodes ) &&
-               isset( $wgDummyLanguageCodes[$code] ) ) ) {
+                       isset( $wgDummyLanguageCodes[$code] ) )
+       ) {
                continue;
        }
 
@@ -107,16 +105,33 @@ foreach ( $wgLanguages->getLanguages() as $code ) {
        $messages = $wgLanguages->getMessages( $code );
        $messagesNumber = count( $messages['translated'] );
        $requiredMessagesNumber = count( $messages['required'] );
-       $requiredMessagesPercent = $output->formatPercent( $requiredMessagesNumber, $wgRequiredMessagesNumber );
+       $requiredMessagesPercent = $output->formatPercent(
+               $requiredMessagesNumber,
+               $wgRequiredMessagesNumber
+       );
        $obsoleteMessagesNumber = count( $messages['obsolete'] );
-       $obsoleteMessagesPercent = $output->formatPercent( $obsoleteMessagesNumber, $messagesNumber, true );
+       $obsoleteMessagesPercent = $output->formatPercent(
+               $obsoleteMessagesNumber,
+               $messagesNumber,
+               true
+       );
        $messagesWithMismatchVariables = $wgLanguages->getMessagesWithMismatchVariables( $code );
        $emptyMessages = $wgLanguages->getEmptyMessages( $code );
        $messagesWithWhitespace = $wgLanguages->getMessagesWithWhitespace( $code );
        $nonXHTMLMessages = $wgLanguages->getNonXHTMLMessages( $code );
        $messagesWithWrongChars = $wgLanguages->getMessagesWithWrongChars( $code );
-       $problematicMessagesNumber = count( array_unique( array_merge( $messagesWithMismatchVariables, $emptyMessages, $messagesWithWhitespace, $nonXHTMLMessages, $messagesWithWrongChars ) ) );
-       $problematicMessagesPercent = $output->formatPercent( $problematicMessagesNumber, $messagesNumber, true );
+       $problematicMessagesNumber = count( array_unique( array_merge(
+               $messagesWithMismatchVariables,
+               $emptyMessages,
+               $messagesWithWhitespace,
+               $nonXHTMLMessages,
+               $messagesWithWrongChars
+       ) ) );
+       $problematicMessagesPercent = $output->formatPercent(
+               $problematicMessagesNumber,
+               $messagesNumber,
+               true
+       );
 
        # Output them
        $output->blockstart();
index 63d9b84..f1b4079 100644 (file)
@@ -60,5 +60,6 @@ function getVars( $filename ) {
        require $filename;
        $vars = get_defined_vars();
        unset( $vars['filename'] );
+
        return $vars;
 }
index fc0da3f..7c880b2 100644 (file)
  * @ingroup MaintenanceLanguage
  */
 class MessageWriter {
-       static $optionalComment = 'only translate this message to other languages if you have to change it';
-       static $ignoredComment = "do not translate or duplicate this message to other languages";
+       protected static $optionalComment =
+               'only translate this message to other languages if you have to change it';
+       protected static $ignoredComment = "do not translate or duplicate this message to other languages";
 
-       static $messageStructure;
-       static $blockComments;
-       static $ignoredMessages;
-       static $optionalMessages;
+       protected static $messageStructure;
+       protected static $blockComments;
+       protected static $ignoredMessages;
+       protected static $optionalMessages;
 
        /**
         * Write a messages array as a PHP text and write it to the messages file.
@@ -41,9 +42,12 @@ class MessageWriter {
         * @param $write Boolean: write to the messages file?
         * @param $listUnknown Boolean: list the unknown messages?
         * @param $removeUnknown Boolean: whether to remove unkown messages
-        * @param $messagesFolder String: path to a folder to store the MediaWiki messages. Defaults to the current install.
+        * @param $messagesFolder String: path to a folder to store the MediaWiki messages.
+        *        Defaults to the current install.
         */
-       public static function writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown, $messagesFolder = false ) {
+       public static function writeMessagesToFile( $messages, $code, $write, $listUnknown,
+               $removeUnknown, $messagesFolder = false
+       ) {
                # Rewrite the messages array
                $messages = self::writeMessagesArray( $messages, $code == 'en', false, $removeUnknown );
                $messagesText = $messages[0];
@@ -76,14 +80,20 @@ $messages = array(
                                        file_put_contents( $filename, $new );
                                        echo "Generated and wrote messages for language $code.\n";
                                } else {
-                                       echo "Generated messages for language $code. Please run the script again (without the parameter \"dry-run\") to write the array to the file.\n";
+                                       echo "Generated messages for language $code.\n" .
+                                               "Please run the script again (without the parameter \"dry-run\") " .
+                                               "to write the array to the file.\n";
                                }
                        }
-                       if ( $listUnknown && isset( $sortedMessages['unknown'] ) && !empty( $sortedMessages['unknown'] ) ) {
+                       if ( $listUnknown && isset( $sortedMessages['unknown'] ) &&
+                               !empty( $sortedMessages['unknown'] )
+                       ) {
                                if ( $removeUnknown ) {
-                                       echo "\nThe following " . count( $sortedMessages['unknown'] ) . " unknown messages have been removed:\n";
+                                       echo "\nThe following " . count( $sortedMessages['unknown'] ) .
+                                               " unknown messages have been removed:\n";
                                } else {
-                                       echo "\nThere are " . count( $sortedMessages['unknown'] ) . " unknown messages, please check them:\n";
+                                       echo "\nThere are " . count( $sortedMessages['unknown'] ) .
+                                               " unknown messages, please check them:\n";
                                }
                                foreach ( $sortedMessages['unknown'] as $key => $value ) {
                                        echo "* " . $key . "\n";
@@ -106,7 +116,9 @@ $messages = array(
         *
         * @return Array of the PHP text and the sorted messages array.
         */
-       public static function writeMessagesArray( $messages, $ignoredComments = false, $prefix = false, $removeUnknown = false ) {
+       public static function writeMessagesArray( $messages, $ignoredComments = false,
+               $prefix = false, $removeUnknown = false
+       ) {
                # Load messages
                $dir = $prefix ? $prefix : __DIR__;
 
@@ -162,6 +174,7 @@ $messages = array(
                }
                $messagesText .= ");
 ";
+
                return array( $messagesText, $sortedMessages );
        }
 
@@ -247,12 +260,22 @@ $blockComment
                        if ( strpos( $value, $single ) === false ) {
                                # Nothing ugly, just use '
                                $blockText .= $single . $value . $single;
-                       } elseif ( strpos( $value, $double ) === false && !preg_match( '/\$[a-zA-Z_\x7f-\xff]/', $value ) ) {
+                       } elseif ( strpos( $value, $double ) === false &&
+                               !preg_match( '/\$[a-zA-Z_\x7f-\xff]/', $value )
+                       ) {
                                # No "-quotes, no variables that need quoting, use "
                                $blockText .= $double . $value . $double;
                        } else {
                                # Something needs quoting, pick the quote which causes less quoting
-                               $quote = substr_count( $value, $double ) + substr_count( $value, '$' ) >= substr_count( $value, $single ) ? $single : $double;
+
+                               if ( substr_count( $value, $double ) + substr_count( $value, '$' ) >=
+                                       substr_count( $value, $single )
+                               ) {
+                                       $quote = $single;
+                               } else {
+                                       $quote = $double;
+                               }
+
                                if ( $quote === $double ) {
                                        $extra = '$';
                                } else {
index 34e6428..f991c1b 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  * @author Tim Starling
  *
- * USAGE: php moveBatch.php [-u <user>] [-r <reason>] [-i <interval>] [listfile]
+ * USAGE: php moveBatch.php [-u <user>] [-r <reason>] [-i <interval>] [-noredirects] [listfile]
  *
  * [listfile] - file with two titles per line, separated with pipe characters;
  * the first title is the source, the second is the destination.
@@ -29,6 +29,7 @@
  * <user> - username to perform moves as
  * <reason> - reason to be given for moves
  * <interval> - number of seconds to sleep after each move
+ * <noredirects> - suppress creation of redirects
  *
  * This will print out error codes from Title::moveTo() if something goes wrong,
  * e.g. immobile_namespace for namespaces which can't be moved
@@ -48,6 +49,7 @@ class MoveBatch extends Maintenance {
                $this->addOption( 'u', "User to perform move", false, true );
                $this->addOption( 'r', "Reason to move page", false, true );
                $this->addOption( 'i', "Interval to sleep between moves" );
+               $this->addOption( 'noredirects', "Suppress creation of redirects" );
                $this->addArg( 'listfile', 'List of pages to move, newline delimited', false );
        }
 
@@ -62,6 +64,7 @@ class MoveBatch extends Maintenance {
                $user = $this->getOption( 'u', 'Move page script' );
                $reason = $this->getOption( 'r', '' );
                $interval = $this->getOption( 'i', 0 );
+               $noredirects = $this->getOption( 'noredirects', false );
                if ( $this->hasArg() ) {
                        $file = fopen( $this->getArg(), 'r' );
                } else {
@@ -99,7 +102,7 @@ class MoveBatch extends Maintenance {
 
                        $this->output( $source->getPrefixedText() . ' --> ' . $dest->getPrefixedText() );
                        $dbw->begin( __METHOD__ );
-                       $err = $source->moveTo( $dest, false, $reason );
+                       $err = $source->moveTo( $dest, false, $reason, !$noredirects );
                        if ( $err !== true ) {
                                $msg = array_shift( $err[0] );
                                $this->output( "\nFAILED: " . wfMessage( $msg, $err[0] )->text() );
index 8f170ab..34837e1 100644 (file)
@@ -1,7 +1,6 @@
 #!/usr/bin/perl
 
 ## Convert data from a MySQL mediawiki database into a Postgres mediawiki database
-## svn: $Id$
 
 ## NOTE: It is probably easier to dump your wiki using maintenance/dumpBackup.php
 ## and then import it with maintenance/importDump.php
@@ -181,7 +180,7 @@ $MYSQLSOCKET and $conninfo .= "\n--   socket    $MYSQLSOCKET";
 print qq{
 -- Dump of MySQL Mediawiki tables for import into a Postgres Mediawiki schema
 -- Performed by the program: $0
--- Version: $VERSION (subversion }.q{$LastChangedRevision$}.qq{)
+-- Version: $VERSION
 -- Author: Greg Sabino Mullane <greg\@turnstep.com> Comments welcome
 --
 -- This file was created: $now
index 9f83ee7..c21301b 100644 (file)
@@ -69,7 +69,9 @@ class PurgeChangedFiles extends Maintenance {
                        implode( ',', array_keys( self::$typeMappings ) ) . ',all)', false, true );
                $this->addOption( 'htcp-dest', 'HTCP announcement destination (IP:port)', false, true );
                $this->addOption( 'dry-run', 'Do not send purge requests' );
+               $this->addOption( 'sleep-per-batch', 'Milliseconds to sleep between batches', false, true );
                $this->addOption( 'verbose', 'Show more output', false, false, 'v' );
+               $this->setBatchSize( 100 );
        }
 
        public function execute() {
@@ -154,6 +156,7 @@ class PurgeChangedFiles extends Maintenance {
                                __METHOD__
                        );
 
+                       $bSize = 0;
                        foreach ( $res as $row ) {
                                $file = $repo->newFile( Title::makeTitle( NS_FILE, $row->log_title ) );
 
@@ -197,6 +200,12 @@ class PurgeChangedFiles extends Maintenance {
                                }
 
                                $this->verbose( "Purged file {$row->log_title}; {$type} @{$row->log_timestamp}.\n" );
+
+                               if ( $this->hasOption( 'sleep-per-batch' ) && ++$bSize > $this->mBatchSize ) {
+                                       $bSize = 0;
+                                       // sleep-per-batch is milliseconds, usleep wants micro seconds.
+                                       usleep( 1000 * (int)$this->getOption( 'sleep-per-batch' ) );
+                               }
                        }
                }
        }
index 315176c..b9eb809 100644 (file)
@@ -70,7 +70,6 @@ class RebuildRecentchanges extends Maintenance {
                $dbw->insertSelect( 'recentchanges', array( 'page', 'revision' ),
                        array(
                                'rc_timestamp'  => 'rev_timestamp',
-                               'rc_cur_time'   => 'rev_timestamp',
                                'rc_user'       => 'rev_user',
                                'rc_user_text'  => 'rev_user_text',
                                'rc_namespace'  => 'page_namespace',
@@ -185,7 +184,6 @@ class RebuildRecentchanges extends Maintenance {
                $dbw->insertSelect( 'recentchanges', array( 'user', "$logging LEFT JOIN $page ON (log_namespace=page_namespace AND log_title=page_title)" ),
                        array(
                                'rc_timestamp'  => 'log_timestamp',
-                               'rc_cur_time'   => 'log_timestamp',
                                'rc_user'       => 'log_user',
                                'rc_user_text'  => 'user_name',
                                'rc_namespace'  => 'log_namespace',
index af01a30..53964aa 100644 (file)
@@ -1026,6 +1026,8 @@ CREATE TABLE /*_*/recentchanges (
   rc_timestamp varbinary(14) NOT NULL default '',
 
   -- This is no longer used
+  -- Field kept in database for downgrades
+  -- @todo: add drop patch with 1.24
   rc_cur_time varbinary(14) NOT NULL default '',
 
   -- As in revision
index 9eb5227..37430b9 100644 (file)
@@ -1164,8 +1164,8 @@ return array(
        ),
        'mediawiki.ui' => array(
                'skinStyles' => array(
-                       'default' => 'resources/mediawiki.ui/mediawiki.ui.default.css',
-                       'vector' => 'resources/mediawiki.ui/mediawiki.ui.vector.css',
+                       'default' => 'resources/mediawiki.ui/default.less',
+                       'vector' => 'resources/mediawiki.ui/vector.less',
                ),
                'position' => 'top',
        ),
index ba711aa..299fabd 100644 (file)
        };
 
        // Legacy (for compatibility with the code previously in skins/common.edit.js)
-       window.addButton = toolbar.addButton;
-       window.insertTags = toolbar.insertTags;
+       mw.log.deprecate( window, 'addButton', toolbar.addButton, 'Use mw.toolbar.addButton instead' );
+       mw.log.deprecate( window, 'insertTags', toolbar.insertTags, 'Use mw.toolbar.insertTags instead' );
 
-       // Explose API publicly
+       // Expose API publicly
        mw.toolbar = toolbar;
 
        $( function () {
diff --git a/resources/mediawiki.ui/components/default/buttons.less b/resources/mediawiki.ui/components/default/buttons.less
new file mode 100644 (file)
index 0000000..10d36ff
--- /dev/null
@@ -0,0 +1,69 @@
+@import "../../settings/typography";
+@import "../../mixins/effects";
+
+@buttonBorderRadius: 3px;
+
+// Button styling
+.mw-ui-button {
+       // Container layout
+       display: inline-block;
+       padding: 0.4em 1em 0.4em 1em;
+       margin: 0;
+
+       // IE6/IE7 hack
+       // http://stackoverflow.com/a/5838575/365238
+       *display: inline;
+       zoom: 1;
+
+       // Container styling
+       .buttonColors();
+       border-radius: @buttonBorderRadius;
+
+       // Content styling
+       vertical-align: middle;
+
+       text-align: center;
+       text-decoration: none;
+
+       font-weight: bold;
+
+       // Interaction styling
+       cursor: pointer;
+
+       &:disabled,
+       &.mw-ui-disabled {
+               cursor: default;
+       }
+
+       // Button sizes and displays
+       // -----------------------------------------
+       &.mw-ui-big {
+               font-size: @baseFontSize * 1.3;
+       }
+       &.mw-ui-block {
+               display: block;
+               width: 100%;
+       }
+}
+
+// This overrides an underline declaration on a:hover and a:focus in commonElements.css, which the
+// class alone isn't specific enough to do
+a.mw-ui-button {
+       text-decoration: none;
+}
+
+// Button groups
+.mw-ui-button-group > * {
+       border-radius: 0;
+       float: left;
+
+       &:first-child{
+               border-top-left-radius: @buttonBorderRadius;
+               border-bottom-left-radius: @buttonBorderRadius;
+       }
+
+       &:last-child{
+               border-top-right-radius: @buttonBorderRadius;
+               border-bottom-right-radius: @buttonBorderRadius;
+       }
+}
diff --git a/resources/mediawiki.ui/components/default/forms.less b/resources/mediawiki.ui/components/default/forms.less
new file mode 100644 (file)
index 0000000..d2554c6
--- /dev/null
@@ -0,0 +1,115 @@
+// Form elements and layouts
+
+@import "../../mixins/utilities";
+@import "../../mixins/forms";
+
+// --------------------------------------------------------------------------
+// Layouts
+// --------------------------------------------------------------------------
+
+// The FancyCaptcha image CAPTCHA used on WMF wikis drives the width of the
+// 'VForm' design, the form can't be narrower than this.
+@captchaContainerWidth: 290px;
+@defaultFormWidth: @captchaContainerWidth;
+
+// Style a compact vertical stacked form ("VForm") and the elements in divs
+// within it.
+.mw-ui-vform {
+       .box-sizing(border-box);
+
+       width: @defaultFormWidth;
+
+       // Immediate divs in a vform are block and spaced-out.
+       & > div {
+               display: block;
+               margin: 0 0 15px 0;
+               padding: 0;
+               width: 100%;
+
+               // MW currently doesn't use the type attribute everywhere on inputs.
+               input,
+               .mw-ui-button {
+                       display: block;
+                       .box-sizing(border-box);
+                       margin: 0;
+                       width: 100%;
+               }
+
+               // We exclude these because they'll generally use mw-ui-button.
+               // Otherwise, we'll unintentionally override that.
+               input:not([type=button]):not([type=submit]):not([type=file]), {
+                       .agora-field-styling(); // mixins/forms.less
+               }
+
+               label {
+                       display: block;
+                       .box-sizing(border-box);
+                       .agora-label-styling();
+                       width: auto;
+                       margin: 0 0 0.2em 0;
+                       padding: 0;
+               }
+
+               // Override input styling just for checkboxes and radio inputs.
+               input[type="checkbox"],
+               input[type="radio"] {
+                       display: inline;
+                       .box-sizing(content-box);
+                       width: auto;
+               }
+
+       }
+
+       // HTMLForm uses error, SpecialUserlogin (login and create account) uses
+       // errorbox.
+       // TODO move errorbox from mediawiki.special.vforms.css into here.
+       .error {
+               .box-sizing(border-box);
+               font-size: 0.9em;
+               margin: 0 0 1em 0;
+               padding: 0.5em;
+               color: #cc0000;
+               border: 1px solid #fac5c5;
+               background-color: #fae3e3;
+               text-shadow: 0 1px #fae3e3;
+               word-wrap: break-word;
+       }
+}
+
+// --------------------------------------------------------------------------
+// Elements
+// --------------------------------------------------------------------------
+
+// Apply this to individual elements to style them.
+// You generally don't need to use this class on divs within an Agora
+// form container such as mw-ui-vform
+// XXX DRY: This repeats earlier styling, use an @include agora-div-styling ?
+.mw-ui-vform-div {
+       display: block;
+       margin: 0 0 15px 0;
+       padding: 0;
+       width: 100%;
+}
+
+// Apply mw-ui-input to individual input fields to style them.
+// You generally don't need to use this class if <input> is within an Agora
+// form container such as mw-ui-vform
+.mw-ui-input {
+       .agora-field-styling(); // mixins/forms.less
+}
+
+// Apply mw-ui-label to individual elements to style them.
+// You generally don't need to use this class if <label> is within an Agora
+// form container such as mw-ui-vform
+.mw-ui-label {
+       .agora-label-styling(); // mixins/forms.less
+}
+
+// Nesting an input checkbox or radio button inside a label with this class
+// improves alignment, e.g.
+//     <label class="mw-ui-checkbox-label">
+//             <input type="checkbox">The label text
+//     </label>
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+       .agora-inline-label-styling();
+}
diff --git a/resources/mediawiki.ui/components/utilities.less b/resources/mediawiki.ui/components/utilities.less
new file mode 100644 (file)
index 0000000..9aea429
--- /dev/null
@@ -0,0 +1,19 @@
+// Generic helper classes that could be used in many elements/layouts
+
+// --------------------------------------------------------------------------
+// Positioning
+// --------------------------------------------------------------------------
+
+@import "../mixins/utilities";
+
+.mw-ui-flush-left {
+       .agora-flush-left();
+}
+
+.mw-ui-flush-right {
+       .agora-flush-right();
+}
+
+.mw-ui-center-block {
+       .agora-center-block();
+}
diff --git a/resources/mediawiki.ui/components/vector/buttons.less b/resources/mediawiki.ui/components/vector/buttons.less
new file mode 100644 (file)
index 0000000..a49721d
--- /dev/null
@@ -0,0 +1,20 @@
+@import "../default/buttons"; // Layer Vector on top of the default settings.
+@import "../../mixins/type";
+
+.mw-ui-button {
+       // Button colors determined by function.
+       // -----------------------------------------
+       &.mw-ui-primary {
+               .buttonColors(@agoraBlue);
+       }
+
+       &.mw-ui-constructive {
+               .buttonColors(@agoraGreen);
+       }
+
+       &.mw-ui-destructive {
+               .buttonColors(@agoraRed);
+       }
+
+       .vector-type();
+}
diff --git a/resources/mediawiki.ui/components/vector/containers.less b/resources/mediawiki.ui/components/vector/containers.less
new file mode 100644 (file)
index 0000000..1e9ec05
--- /dev/null
@@ -0,0 +1,6 @@
+// No default settings for containers yet.
+@import "../../mixins/type";
+
+.mw-ui-container {
+       .vector-type();
+}
diff --git a/resources/mediawiki.ui/components/vector/forms.less b/resources/mediawiki.ui/components/vector/forms.less
new file mode 100644 (file)
index 0000000..ebb175b
--- /dev/null
@@ -0,0 +1,8 @@
+@import "../default/forms"; // Layer Vector on top of the default settings.
+@import "../../mixins/type";
+
+.mw-ui-vform,
+.mw-ui-vform > div input,
+.mw-ui-input {
+       .vector-type();
+}
diff --git a/resources/mediawiki.ui/default.less b/resources/mediawiki.ui/default.less
new file mode 100644 (file)
index 0000000..036db5f
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using a skin other than
+ * Vector.
+ */
+
+@import "components/utilities";
+@import "components/default/buttons";
+@import "components/default/forms";
diff --git a/resources/mediawiki.ui/mediawiki.ui.default.css b/resources/mediawiki.ui/mediawiki.ui.default.css
deleted file mode 100644 (file)
index b072616..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-@charset "UTF-8";
-/**
- * Provide Agora appearance for mw-ui-* classes when using a skin other than
- * Vector.
- * Compass builds these Agora styles from source Sass files in
- * extensions/Agora/modules/scss
- */
-/* _effects.scss */
-/* Mixins for visual effects in CSS3 */
-/* line 7, sourcefiles/scss/components/_utilities.scss */
-.mw-ui-flush-left {
-  float: left;
-  margin-left: 0;
-  padding-left: 0;
-}
-
-/* line 11, sourcefiles/scss/components/_utilities.scss */
-.mw-ui-flush-right {
-  float: right;
-  margin-right: 0;
-  padding-right: 0;
-}
-
-/* line 15, sourcefiles/scss/components/_utilities.scss */
-.mw-ui-center-block {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-/* line 4, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button {
-  display: -moz-inline-stack;
-  display: inline-block;
-  vertical-align: middle;
-  *vertical-align: auto;
-  zoom: 1;
-  *display: inline;
-  padding: 0.4em 1em 0.4em 1em;
-  margin: 0;
-  background-color: #c9c9c9;
-  *background-color: #c9c9c9;
-  *zoom: 1;
-  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFDCDCDC', endColorstr='#FFC9C9C9');
-  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dcdcdc), color-stop(100%, #c9c9c9));
-  background-image: -webkit-linear-gradient(top, #dcdcdc, #c9c9c9);
-  background-image: -moz-linear-gradient(top, #dcdcdc, #c9c9c9);
-  background-image: -o-linear-gradient(top, #dcdcdc, #c9c9c9);
-  background-image: linear-gradient(top, #dcdcdc, #c9c9c9);
-  color: black;
-  text-shadow: 0 1px 1px rgba(201, 201, 201, 0.3);
-  border: 1px solid #c4c4c4;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  -ms-border-radius: 3px;
-  -o-border-radius: 3px;
-  border-radius: 3px;
-  vertical-align: middle;
-  text-align: center;
-  text-decoration: none;
-  font-weight: bold;
-  cursor: pointer;
-}
-/* line 38, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button:hover, .mw-ui-button.mw-ui-hover {
-  background-color: gainsboro;
-  *background-color: gainsboro;
-  *zoom: 1;
-  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFE9E9E9', endColorstr='#FFDCDCDC');
-  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e9e9e9), color-stop(100%, #dcdcdc));
-  background-image: -webkit-linear-gradient(top, #e9e9e9, #dcdcdc);
-  background-image: -moz-linear-gradient(top, #e9e9e9, #dcdcdc);
-  background-image: -o-linear-gradient(top, #e9e9e9, #dcdcdc);
-  background-image: linear-gradient(top, #e9e9e9, #dcdcdc);
-  text-decoration: none;
-}
-/* line 44, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button:active, .mw-ui-button.mw-ui-active {
-  background-image: none;
-  background-color: #c1c1c1;
-  text-shadow: none;
-}
-/* line 54, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
-  background-image: none;
-  background-color: #c9c9c9;
-  opacity: 0.5;
-  text-shadow: none;
-}
-/* line 30, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
-  cursor: default;
-}
-/* line 36, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button.mw-ui-big {
-  font-size: 1.3em;
-}
-/* line 41, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button.mw-ui-block {
-  display: block;
-  width: 100%;
-}
-
-/* line 49, sourcefiles/scss/components/default/_buttons.scss */
-a.mw-ui-button {
-  text-decoration: none;
-}
-
-/* line 56, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button-group > * {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  -ms-border-radius: 0;
-  -o-border-radius: 0;
-  border-radius: 0;
-  float: left;
-}
-/* line 60, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button-group > *:first-child {
-  -moz-border-radius-topleft: 3px;
-  -webkit-border-top-left-radius: 3px;
-  border-top-left-radius: 3px;
-  -moz-border-radius-bottomleft: 3px;
-  -webkit-border-bottom-left-radius: 3px;
-  border-bottom-left-radius: 3px;
-}
-/* line 65, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button-group > *:last-child {
-  -moz-border-radius-topright: 3px;
-  -webkit-border-top-right-radius: 3px;
-  border-top-right-radius: 3px;
-  -moz-border-radius-bottomright: 3px;
-  -webkit-border-bottom-right-radius: 3px;
-  border-bottom-right-radius: 3px;
-}
-
-/* line 14, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  width: 290px;
-}
-/* line 20, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div {
-  display: block;
-  margin: 0 0 15px 0;
-  padding: 0;
-  width: 100%;
-}
-/* line 28, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div input,
-.mw-ui-vform > div .mw-ui-button {
-  display: block;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  margin: 0;
-  width: 100%;
-}
-/* line 37, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]) {
-  border-style: solid;
-  border-width: 1px;
-  border-color: #c9c9c9;
-  color: #252525;
-  padding: 0.35em 0 0.35em 0.5em;
-}
-/* line 11, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus {
-  box-shadow: #4091ed 0px 0px 5px;
-  border-color: #4091ed;
-}
-/* line 13, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus:not([type=checkbox]):not([type=radio]) {
-  outline: 0;
-}
-/* line 41, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div label {
-  display: block;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  font-size: 0.9em;
-  color: #4a4a4a;
-  width: auto;
-  margin: 0 0 0.2em 0;
-  padding: 0;
-}
-/* line 38, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-vform > div label * {
-  font-weight: normal;
-}
-/* line 52, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div input[type="checkbox"],
-.mw-ui-vform > div input[type="radio"] {
-  display: inline;
-  -webkit-box-sizing: content-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  width: auto;
-}
-/* line 63, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform .error {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  font-size: 0.9em;
-  margin: 0 0 1em 0;
-  padding: 0.5em;
-  color: #cc0000;
-  border: 1px solid #fac5c5;
-  background-color: #fae3e3;
-  text-shadow: 0 1px #fae3e3;
-  word-wrap: break-word;
-}
-
-/* line 86, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform-div {
-  display: block;
-  margin: 0 0 15px 0;
-  padding: 0;
-  width: 100%;
-}
-
-/* line 96, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-input {
-  border-style: solid;
-  border-width: 1px;
-  border-color: #c9c9c9;
-  color: #252525;
-  padding: 0.35em 0 0.35em 0.5em;
-}
-/* line 11, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-input:focus {
-  box-shadow: #4091ed 0px 0px 5px;
-  border-color: #4091ed;
-}
-/* line 13, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-input:focus:not([type=checkbox]):not([type=radio]) {
-  outline: 0;
-}
-
-/* line 103, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-label {
-  font-size: 0.9em;
-  color: #4a4a4a;
-}
-/* line 38, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-label * {
-  font-weight: normal;
-}
-
-/* line 112, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-checkbox-label, .mw-ui-radio-label {
-  margin-bottom: 0.5em;
-  cursor: pointer;
-  vertical-align: bottom;
-  line-height: normal;
-  font-weight: normal;
-}
-/* line 54, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
-  width: auto;
-  height: auto;
-  margin: 0 0.1em 0em 0;
-  padding: 0;
-  border-style: solid;
-  border-width: 1px;
-  border-color: #c9c9c9;
-  cursor: pointer;
-}
diff --git a/resources/mediawiki.ui/mediawiki.ui.vector.css b/resources/mediawiki.ui/mediawiki.ui.vector.css
deleted file mode 100644 (file)
index fd9e091..0000000
+++ /dev/null
@@ -1,414 +0,0 @@
-@charset "UTF-8";
-/**
- * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
- * Compass builds these Agora styles from source Sass files in
- * extensions/Agora/modules/scss
- */
-/* _effects.scss */
-/* Mixins for visual effects in CSS3 */
-/* line 7, sourcefiles/scss/components/_utilities.scss */
-.mw-ui-flush-left {
-  float: left;
-  margin-left: 0;
-  padding-left: 0;
-}
-
-/* line 11, sourcefiles/scss/components/_utilities.scss */
-.mw-ui-flush-right {
-  float: right;
-  margin-right: 0;
-  padding-right: 0;
-}
-
-/* line 15, sourcefiles/scss/components/_utilities.scss */
-.mw-ui-center-block {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-/* line 4, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button {
-  display: -moz-inline-stack;
-  display: inline-block;
-  vertical-align: middle;
-  *vertical-align: auto;
-  zoom: 1;
-  *display: inline;
-  padding: 0.4em 1em 0.4em 1em;
-  margin: 0;
-  background-color: #c9c9c9;
-  *background-color: #c9c9c9;
-  *zoom: 1;
-  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFDCDCDC', endColorstr='#FFC9C9C9');
-  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dcdcdc), color-stop(100%, #c9c9c9));
-  background-image: -webkit-linear-gradient(top, #dcdcdc, #c9c9c9);
-  background-image: -moz-linear-gradient(top, #dcdcdc, #c9c9c9);
-  background-image: -o-linear-gradient(top, #dcdcdc, #c9c9c9);
-  background-image: linear-gradient(top, #dcdcdc, #c9c9c9);
-  color: black;
-  text-shadow: 0 1px 1px rgba(201, 201, 201, 0.3);
-  border: 1px solid #c4c4c4;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  -ms-border-radius: 3px;
-  -o-border-radius: 3px;
-  border-radius: 3px;
-  vertical-align: middle;
-  text-align: center;
-  text-decoration: none;
-  font-weight: bold;
-  cursor: pointer;
-}
-/* line 38, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button:hover, .mw-ui-button.mw-ui-hover {
-  background-color: gainsboro;
-  *background-color: gainsboro;
-  *zoom: 1;
-  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFE9E9E9', endColorstr='#FFDCDCDC');
-  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e9e9e9), color-stop(100%, #dcdcdc));
-  background-image: -webkit-linear-gradient(top, #e9e9e9, #dcdcdc);
-  background-image: -moz-linear-gradient(top, #e9e9e9, #dcdcdc);
-  background-image: -o-linear-gradient(top, #e9e9e9, #dcdcdc);
-  background-image: linear-gradient(top, #e9e9e9, #dcdcdc);
-  text-decoration: none;
-}
-/* line 44, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button:active, .mw-ui-button.mw-ui-active {
-  background-image: none;
-  background-color: #c1c1c1;
-  text-shadow: none;
-}
-/* line 54, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
-  background-image: none;
-  background-color: #c9c9c9;
-  opacity: 0.5;
-  text-shadow: none;
-}
-/* line 30, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
-  cursor: default;
-}
-/* line 36, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button.mw-ui-big {
-  font-size: 1.3em;
-}
-/* line 41, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button.mw-ui-block {
-  display: block;
-  width: 100%;
-}
-
-/* line 49, sourcefiles/scss/components/default/_buttons.scss */
-a.mw-ui-button {
-  text-decoration: none;
-}
-
-/* line 56, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button-group > * {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  -ms-border-radius: 0;
-  -o-border-radius: 0;
-  border-radius: 0;
-  float: left;
-}
-/* line 60, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button-group > *:first-child {
-  -moz-border-radius-topleft: 3px;
-  -webkit-border-top-left-radius: 3px;
-  border-top-left-radius: 3px;
-  -moz-border-radius-bottomleft: 3px;
-  -webkit-border-bottom-left-radius: 3px;
-  border-bottom-left-radius: 3px;
-}
-/* line 65, sourcefiles/scss/components/default/_buttons.scss */
-.mw-ui-button-group > *:last-child {
-  -moz-border-radius-topright: 3px;
-  -webkit-border-top-right-radius: 3px;
-  border-top-right-radius: 3px;
-  -moz-border-radius-bottomright: 3px;
-  -webkit-border-bottom-right-radius: 3px;
-  border-bottom-right-radius: 3px;
-}
-
-/* line 3, sourcefiles/scss/components/vector/_buttons.scss */
-.mw-ui-button {
-  font-size: 1em;
-  line-height: 1.4em;
-}
-/* line 6, sourcefiles/scss/components/vector/_buttons.scss */
-.mw-ui-button.mw-ui-primary {
-  background-color: #3366bb;
-  *background-color: #3366bb;
-  *zoom: 1;
-  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF4779CD', endColorstr='#FF3366BB');
-  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4779cd), color-stop(100%, #3366bb));
-  background-image: -webkit-linear-gradient(top, #4779cd, #3366bb);
-  background-image: -moz-linear-gradient(top, #4779cd, #3366bb);
-  background-image: -o-linear-gradient(top, #4779cd, #3366bb);
-  background-image: linear-gradient(top, #4779cd, #3366bb);
-  color: white;
-  text-shadow: 0 1px 1px rgba(51, 102, 187, 0.75);
-  border: 1px solid #3162b3;
-}
-/* line 38, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button.mw-ui-primary:hover, .mw-ui-button.mw-ui-primary.mw-ui-hover {
-  background-color: #4779cd;
-  *background-color: #4779cd;
-  *zoom: 1;
-  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF5B88D2', endColorstr='#FF4779CD');
-  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5b88d2), color-stop(100%, #4779cd));
-  background-image: -webkit-linear-gradient(top, #5b88d2, #4779cd);
-  background-image: -moz-linear-gradient(top, #5b88d2, #4779cd);
-  background-image: -o-linear-gradient(top, #5b88d2, #4779cd);
-  background-image: linear-gradient(top, #5b88d2, #4779cd);
-  text-decoration: none;
-}
-/* line 44, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button.mw-ui-primary:active, .mw-ui-button.mw-ui-primary.mw-ui-active {
-  background-image: none;
-  background-color: #305faf;
-  text-shadow: none;
-}
-/* line 54, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button.mw-ui-primary:disabled, .mw-ui-button.mw-ui-primary.mw-ui-disabled {
-  background-image: none;
-  background-color: #3366bb;
-  opacity: 0.5;
-  text-shadow: none;
-}
-/* line 10, sourcefiles/scss/components/vector/_buttons.scss */
-.mw-ui-button.mw-ui-constructive {
-  background-color: #27aa65;
-  *background-color: #27aa65;
-  *zoom: 1;
-  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF2EC977', endColorstr='#FF27AA65');
-  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2ec977), color-stop(100%, #27aa65));
-  background-image: -webkit-linear-gradient(top, #2ec977, #27aa65);
-  background-image: -moz-linear-gradient(top, #2ec977, #27aa65);
-  background-image: -o-linear-gradient(top, #2ec977, #27aa65);
-  background-image: linear-gradient(top, #2ec977, #27aa65);
-  color: white;
-  text-shadow: 0 1px 1px rgba(39, 170, 101, 0.75);
-  border: 1px solid #25a260;
-}
-/* line 38, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button.mw-ui-constructive:hover, .mw-ui-button.mw-ui-constructive.mw-ui-hover {
-  background-color: #2ec977;
-  *background-color: #2ec977;
-  *zoom: 1;
-  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF3ED384', endColorstr='#FF2EC977');
-  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #3ed384), color-stop(100%, #2ec977));
-  background-image: -webkit-linear-gradient(top, #3ed384, #2ec977);
-  background-image: -moz-linear-gradient(top, #3ed384, #2ec977);
-  background-image: -o-linear-gradient(top, #3ed384, #2ec977);
-  background-image: linear-gradient(top, #3ed384, #2ec977);
-  text-decoration: none;
-}
-/* line 44, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button.mw-ui-constructive:active, .mw-ui-button.mw-ui-constructive.mw-ui-active {
-  background-image: none;
-  background-color: #249e5e;
-  text-shadow: none;
-}
-/* line 54, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button.mw-ui-constructive:disabled, .mw-ui-button.mw-ui-constructive.mw-ui-disabled {
-  background-image: none;
-  background-color: #27aa65;
-  opacity: 0.5;
-  text-shadow: none;
-}
-/* line 14, sourcefiles/scss/components/vector/_buttons.scss */
-.mw-ui-button.mw-ui-destructive {
-  background-color: #cc0000;
-  *background-color: #cc0000;
-  *zoom: 1;
-  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFF20000', endColorstr='#FFCC0000');
-  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f20000), color-stop(100%, #cc0000));
-  background-image: -webkit-linear-gradient(top, #f20000, #cc0000);
-  background-image: -moz-linear-gradient(top, #f20000, #cc0000);
-  background-image: -o-linear-gradient(top, #f20000, #cc0000);
-  background-image: linear-gradient(top, #f20000, #cc0000);
-  color: white;
-  text-shadow: 0 1px 1px rgba(204, 0, 0, 0.75);
-  border: 1px solid #c20000;
-}
-/* line 38, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button.mw-ui-destructive:hover, .mw-ui-button.mw-ui-destructive.mw-ui-hover {
-  background-color: #f20000;
-  *background-color: #f20000;
-  *zoom: 1;
-  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFFF0D0D', endColorstr='#FFF20000');
-  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ff0d0d), color-stop(100%, #f20000));
-  background-image: -webkit-linear-gradient(top, #ff0d0d, #f20000);
-  background-image: -moz-linear-gradient(top, #ff0d0d, #f20000);
-  background-image: -o-linear-gradient(top, #ff0d0d, #f20000);
-  background-image: linear-gradient(top, #ff0d0d, #f20000);
-  text-decoration: none;
-}
-/* line 44, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button.mw-ui-destructive:active, .mw-ui-button.mw-ui-destructive.mw-ui-active {
-  background-image: none;
-  background-color: #bd0000;
-  text-shadow: none;
-}
-/* line 54, sourcefiles/scss/mixins/_effects.scss */
-.mw-ui-button.mw-ui-destructive:disabled, .mw-ui-button.mw-ui-destructive.mw-ui-disabled {
-  background-image: none;
-  background-color: #cc0000;
-  opacity: 0.5;
-  text-shadow: none;
-}
-
-/* line 14, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  width: 290px;
-}
-/* line 20, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div {
-  display: block;
-  margin: 0 0 15px 0;
-  padding: 0;
-  width: 100%;
-}
-/* line 28, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div input,
-.mw-ui-vform > div .mw-ui-button {
-  display: block;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  margin: 0;
-  width: 100%;
-}
-/* line 37, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]) {
-  border-style: solid;
-  border-width: 1px;
-  border-color: #c9c9c9;
-  color: #252525;
-  padding: 0.35em 0 0.35em 0.5em;
-}
-/* line 11, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus {
-  box-shadow: #4091ed 0px 0px 5px;
-  border-color: #4091ed;
-}
-/* line 13, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus:not([type=checkbox]):not([type=radio]) {
-  outline: 0;
-}
-/* line 41, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div label {
-  display: block;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  font-size: 0.9em;
-  color: #4a4a4a;
-  width: auto;
-  margin: 0 0 0.2em 0;
-  padding: 0;
-}
-/* line 38, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-vform > div label * {
-  font-weight: normal;
-}
-/* line 52, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div input[type="checkbox"],
-.mw-ui-vform > div input[type="radio"] {
-  display: inline;
-  -webkit-box-sizing: content-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  width: auto;
-}
-/* line 63, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform .error {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  font-size: 0.9em;
-  margin: 0 0 1em 0;
-  padding: 0.5em;
-  color: #cc0000;
-  border: 1px solid #fac5c5;
-  background-color: #fae3e3;
-  text-shadow: 0 1px #fae3e3;
-  word-wrap: break-word;
-}
-
-/* line 86, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform-div {
-  display: block;
-  margin: 0 0 15px 0;
-  padding: 0;
-  width: 100%;
-}
-
-/* line 96, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-input {
-  border-style: solid;
-  border-width: 1px;
-  border-color: #c9c9c9;
-  color: #252525;
-  padding: 0.35em 0 0.35em 0.5em;
-}
-/* line 11, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-input:focus {
-  box-shadow: #4091ed 0px 0px 5px;
-  border-color: #4091ed;
-}
-/* line 13, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-input:focus:not([type=checkbox]):not([type=radio]) {
-  outline: 0;
-}
-
-/* line 103, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-label {
-  font-size: 0.9em;
-  color: #4a4a4a;
-}
-/* line 38, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-label * {
-  font-weight: normal;
-}
-
-/* line 112, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-checkbox-label, .mw-ui-radio-label {
-  margin-bottom: 0.5em;
-  cursor: pointer;
-  vertical-align: bottom;
-  line-height: normal;
-  font-weight: normal;
-}
-/* line 54, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
-  width: auto;
-  height: auto;
-  margin: 0 0.1em 0em 0;
-  padding: 0;
-  border-style: solid;
-  border-width: 1px;
-  border-color: #c9c9c9;
-  cursor: pointer;
-}
-
-/* line 5, sourcefiles/scss/components/vector/_forms.scss */
-.mw-ui-vform,
-.mw-ui-vform > div input,
-.mw-ui-input {
-  font-size: 1em;
-  line-height: 1.4em;
-}
-
-/* line 3, sourcefiles/scss/components/vector/_containers.scss */
-.mw-ui-container {
-  font-size: 1em;
-  line-height: 1.4em;
-}
diff --git a/resources/mediawiki.ui/mixins/effects.less b/resources/mediawiki.ui/mixins/effects.less
new file mode 100644 (file)
index 0000000..d168e5f
--- /dev/null
@@ -0,0 +1,52 @@
+/* Mixins for visual effects in CSS3 */
+
+@import "../settings/colors";
+
+// ----------------------------------------------------------------------------
+// Gradients
+// ----------------------------------------------------------------------------
+.vertical-gradient(@startColor: lighten(@agoraGray, 95%), @endColor: @agoraGray, @startPos: 0, @endPos: 100%) {
+       background-color: @endColor;
+       background-image: -moz-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Firefox 3.6+
+       background-image: -webkit-gradient( linear, left top, left bottom, color-stop( @startPos, @startColor ), color-stop( @endPos, @endColor ) ); // Safari 4+, Chrome 2+
+       background-image: -webkit-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Safari 5.1+, Chrome 10+
+       background-image: linear-gradient( @startColor @startPos, @endColor @endPos ); // Standard
+}
+
+// ----------------------------------------------------------------------------
+// Button styling
+// ----------------------------------------------------------------------------
+
+.buttonColors(@baseColor: @agoraGray) {
+       // Background color
+       .vertical-gradient(lighten(@baseColor, 7.5%), @baseColor);
+
+       border: 1px solid darken(@baseColor, 2%);
+
+       &:hover,
+       &.mw-ui-hover {
+               .vertical-gradient(lighten(@baseColor, 12.5%), lighten(@baseColor, 7.5%));
+               text-decoration: none;
+       }
+
+       &:active,
+       &.mw-ui-active {
+               background-image: none;
+               background-color: darken(@baseColor, 3%);
+       }
+
+       &:disabled,
+       &.mw-ui-disabled {
+               background-image: none;
+               background-color: @baseColor;
+               opacity: 0.5;
+       }
+}
+
+.buttonColors(@baseColor: @agoraGray) when (lightness(@baseColor) >= 50%) {
+       color: #000;
+}
+
+.buttonColors(@baseColor: @agoraGray) when (lightness(@baseColor) < 50%) {
+       color: #fff;
+}
diff --git a/resources/mediawiki.ui/mixins/forms.less b/resources/mediawiki.ui/mixins/forms.less
new file mode 100644 (file)
index 0000000..76329b1
--- /dev/null
@@ -0,0 +1,51 @@
+@import "../settings/colors";
+
+// Font is not included.
+// For Vector, that should be layered on top with vector-type
+.agora-field-styling() {
+
+       border: 1px solid @agoraGray;
+
+       &:focus {
+               // Styling focus of native checkboxes etc on Mac is almost impossible.
+               &:not([type=checkbox]):not([type=radio]) {
+                       outline: 0; // Removes OS field focus
+               }
+
+               box-shadow: @agoraBlueShadow 0px 0px 5px;
+
+               border-color: @agoraBlueShadow;
+       }
+
+       color: @agoraTextColor;
+       padding: 0.35em 0 0.35em 0.5em;
+}
+
+.agora-label-styling() {
+       //font-weight: bold;
+       font-size: 0.9em;
+       color: darken(@agoraGray, 50%);
+
+       * {
+               font-weight: normal;
+       }
+}
+
+.agora-inline-label-styling() {
+       margin-bottom: 0.5em;
+       cursor: pointer;
+       vertical-align: bottom;
+       line-height: normal;
+
+       font-weight: normal;
+
+       & > input[type="checkbox"],
+       & > input[type="radio"] {
+               width: auto;
+               height: auto;
+               margin: 0 0.1em 0em 0;
+               padding: 0;
+               border: 1px solid @agoraGray;
+               cursor: pointer;
+       }
+}
diff --git a/resources/mediawiki.ui/mixins/type.less b/resources/mediawiki.ui/mixins/type.less
new file mode 100644 (file)
index 0000000..4a01168
--- /dev/null
@@ -0,0 +1,6 @@
+@import "../settings/typography";
+
+.vector-type() {
+       font-size: @baseFontSize;
+       line-height: @baseLineHeight;
+}
diff --git a/resources/mediawiki.ui/mixins/utilities.less b/resources/mediawiki.ui/mixins/utilities.less
new file mode 100644 (file)
index 0000000..a201a4e
--- /dev/null
@@ -0,0 +1,23 @@
+.box-sizing(@value) {
+       -moz-box-sizing: @value;
+       -webkit-box-sizing: @value;
+       box-sizing: @value;
+}
+
+.agora-flush-left() {
+       float: left;
+       margin-left: 0;
+       padding-left: 0;
+}
+
+.agora-flush-right() {
+       float: right;
+       margin-right: 0;
+       padding-right: 0;
+}
+
+.agora-center-block() {
+       display: block;
+       margin-left: auto;
+       margin-right: auto;
+}
diff --git a/resources/mediawiki.ui/settings/colors.less b/resources/mediawiki.ui/settings/colors.less
new file mode 100644 (file)
index 0000000..208d6f6
--- /dev/null
@@ -0,0 +1,17 @@
+// Grays
+// -----------------------------------------
+@agoraGray: #c9c9c9;
+@agoraTextColor: #252525;
+
+// Blues
+// -----------------------------------------
+@agoraBlue: #3366bb;
+@agoraBlueShadow: #4091ed;
+
+// Greens
+// -----------------------------------------
+@agoraGreen: #27aa65;
+
+// Reds
+// -----------------------------------------
+@agoraRed: #cc0000;
diff --git a/resources/mediawiki.ui/settings/typography.less b/resources/mediawiki.ui/settings/typography.less
new file mode 100644 (file)
index 0000000..76c398c
--- /dev/null
@@ -0,0 +1,5 @@
+@baseFontSize: 1em;
+@baseLineHeight: 1.4 * @baseFontSize;
+@baseFontColor: @agoraTextColor;
+
+@smallFontSize: 0.75em;
diff --git a/resources/mediawiki.ui/sourcefiles/Makefile b/resources/mediawiki.ui/sourcefiles/Makefile
deleted file mode 100644 (file)
index dea9013..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-DATE=$(shell date +%I:%M%p)
-CHECK=\033[32m✔\033[39m
-HR=\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
-
-build:
-       @echo "\n${HR}"
-       @echo "Building Agora..."
-       @echo "${HR}\n"
-       @compass compile
-       @echo "Compiling Compass project...            ${CHECK} Done"
-       @rm -rf .sass-cache
-       @echo "Removing .sass-cache...                 ${CHECK} Done"
-       @echo "\n${HR}"
-       @echo "Agora successfully built at ${DATE}."
-       @echo "${HR}\n"
-
-all: build
-
-watch:
-       @echo "\n${HR}"
-       @echo "Watching SCSS files for Agora..."
-       @echo "${HR}\n"
-       @compass watch
-       @echo "Started watching modules/scss at ${DATE}..."
diff --git a/resources/mediawiki.ui/sourcefiles/config.rb b/resources/mediawiki.ui/sourcefiles/config.rb
deleted file mode 100644 (file)
index 28c6524..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-# Require any additional compass plugins here.
-
-# Set this to the root of your project when deployed:
-# (unused so far): http_path = "/"
-
-# Output to parent of build directory
-css_dir = ".."
-sass_dir = "scss"
-# (unused so far): images_dir = "modules/img"
-# (unused so far): javascripts_dir = "modules/js"
-
-# You can select your preferred output style here (can be overridden via the command line):
-# output_style = :expanded or :nested or :compact or :compressed
-output_style = :expanded
-
-# To enable relative paths to assets via compass helper functions. Uncomment:
-relative_assets = true
-
-# To disable debugging comments that display the original location of your selectors. Uncomment:
-line_comments = true
-
-
-# If you prefer the indented syntax, you might want to regenerate this
-# project again passing --syntax sass, or you can uncomment this:
-# preferred_syntax = :sass
-# and then run:
-# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss
deleted file mode 100644 (file)
index e7090eb..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-@import "utilities";
-@import "default/buttons";
-@import "default/forms";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss
deleted file mode 100644 (file)
index 4f1dba2..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Generic helper classes that could be used in many elements/layouts
-
-// --------------------------------------------------------------------------
-// Positioning
-// --------------------------------------------------------------------------
-
-.mw-ui-flush-left {
-    @include agora-flush-left;
-}
-
-.mw-ui-flush-right {
-    @include agora-flush-right;
-}
-
-.mw-ui-center-block {
-    @include agora-center-block;
-}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss
deleted file mode 100644 (file)
index d7cb34a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-@import "utilities";
-@import "vector/buttons";
-@import "vector/forms";
-@import "vector/containers";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss b/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss
deleted file mode 100644 (file)
index d67810f..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-$buttonBorderRadius: 3px;
-
-// Button styling
-.mw-ui-button {
-    // Container layout
-    @include inline-block;
-    padding: 0.4em 1em 0.4em 1em;
-    margin: 0;
-
-    // Container styling
-    @include buttonColors($agoraGray);
-    @include border-radius($buttonBorderRadius);
-
-    // Content styling
-    vertical-align: middle;
-
-    text: {
-        align: center;
-        decoration: none;
-    }
-
-    font: {
-        weight: bold;
-    }
-
-    // Interaction styling
-    cursor: pointer;
-
-    &:disabled,
-    &.mw-ui-disabled {
-        cursor: default;
-    }
-
-    // Button sizes and displays
-    // -----------------------------------------
-    &.mw-ui-big {
-        font: {
-            size: $baseFontSize * 1.3;
-        }
-    }
-    &.mw-ui-block {
-        display: block;
-        width: 100%;
-    }
-}
-
-// This overrides an underline declaration on a:hover and a:focus in commonElements.css, which the
-// class alone isn't specific enough to do
-a.mw-ui-button {
-    text: {
-        decoration: none;
-    }
-}
-
-// Button groups
-.mw-ui-button-group > * {
-  @include border-radius(0);
-  float: left;
-
-  &:first-child{
-    @include border-top-left-radius($buttonBorderRadius);
-    @include border-bottom-left-radius($buttonBorderRadius);
-  }
-
-  &:last-child{
-    @include border-top-right-radius($buttonBorderRadius);
-    @include border-bottom-right-radius($buttonBorderRadius);
-  }
-}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss
deleted file mode 100644 (file)
index a9cec39..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-// Form elements and layouts
-
-// --------------------------------------------------------------------------
-// Layouts
-// --------------------------------------------------------------------------
-
-// The FancyCaptcha image CAPTCHA used on WMF wikis drives the width of the
-// 'VForm' design, the form can't be narrower than this.
-$captchaContainerWidth: 290px;
-$defaultFormWidth: $captchaContainerWidth;
-
-// Style a compact vertical stacked form ("VForm") and the elements in divs
-// within it.
-.mw-ui-vform {
-    @include box-sizing(border-box);
-
-    width: $defaultFormWidth;
-
-    // Immediate divs in a vform are block and spaced-out.
-    & > div {
-        display: block;
-        margin: 0 0 15px 0;
-        padding: 0;
-        width: 100%;
-
-        // MW currently doesn't use the type attribute everywhere on inputs.
-        input,
-        .mw-ui-button {
-            display: block;
-            @include box-sizing(border-box);
-            margin: 0;
-            width: 100%;
-        }
-
-        // We exclude these because they'll generally use mw-ui-button.
-        // Otherwise, we'll unintentionally override that.
-        input:not([type=button]):not([type=submit]):not([type=file]), {
-            @include agora-field-styling; // mixins/_forms.scss
-        }
-
-        label {
-            display: block;
-            @include box-sizing(border-box);
-            @include agora-label-styling;
-            width: auto;
-            margin: 0 0 0.2em 0;
-            padding: 0;
-        }
-
-        // Override input styling just for checkboxes and radio inputs.
-        input[type="checkbox"],
-        input[type="radio"] {
-            display: inline;
-            @include box-sizing(content-box);
-            width: auto;
-        }
-
-    }
-
-    // HTMLForm uses error, SpecialUserlogin (login and create account) uses
-    // errorbox.
-    // TODO move errorbox from mediawiki.special.vforms.css into here.
-    .error {
-        -webkit-box-sizing: border-box;
-        -moz-box-sizing: border-box;
-        box-sizing: border-box;
-        font-size: 0.9em;
-        margin: 0 0 1em 0;
-        padding: 0.5em;
-        color: #cc0000;
-        border: 1px solid #fac5c5;
-        background-color: #fae3e3;
-        text-shadow: 0 1px #fae3e3;
-        word-wrap: break-word;
-    }
-}
-
-// --------------------------------------------------------------------------
-// Elements
-// --------------------------------------------------------------------------
-
-// Apply this to individual elements to style them.
-// You generally don't need to use this class on divs within an Agora
-// form container such as mw-ui-vform
-// XXX DRY: This repeats earlier styling, use an @include agora-div-styling ?
-.mw-ui-vform-div {
-       display: block;
-       margin: 0 0 15px 0;
-       padding: 0;
-       width: 100%;
-}
-
-// Apply mw-ui-input to individual input fields to style them.
-// You generally don't need to use this class if <input> is within an Agora
-// form container such as mw-ui-vform
-.mw-ui-input {
-    @include agora-field-styling; // mixins/_forms.scss
-}
-
-// Apply mw-ui-label to individual elements to style them.
-// You generally don't need to use this class if <label> is within an Agora
-// form container such as mw-ui-vform
-.mw-ui-label {
-    @include agora-label-styling; // mixins/_forms.scss
-}
-
-// Nesting an input checkbox or radio button inside a label with this class
-// improves alignment, e.g.
-//   <label class="mw-ui-checkbox-label">
-//       <input type="checkbox">The label text
-//   </label>
-.mw-ui-checkbox-label, .mw-ui-radio-label {
-    @include agora-inline-label-styling;
-}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss
deleted file mode 100644 (file)
index 8d5f0b6..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-@import "../default/buttons"; // Layer Vector on top of the default settings.
-
-.mw-ui-button {
-    // Button colors determined by function.
-    // -----------------------------------------
-    &.mw-ui-primary {
-        @include buttonColors($agoraBlue);
-    }
-
-    &.mw-ui-constructive {
-        @include buttonColors($agoraGreen);
-    }
-
-    &.mw-ui-destructive {
-        @include buttonColors($agoraRed);
-    }
-
-    @include vector-type;
-}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss
deleted file mode 100644 (file)
index ed01603..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-// No default settings for containers yet.
-
-.mw-ui-container {
-    @include vector-type;
-}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss
deleted file mode 100644 (file)
index 73ea24e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-@import "../default/forms"; // Layer Vector on top of the default settings.
-
-.mw-ui-vform,
-.mw-ui-vform > div input,
-.mw-ui-input {
-    @include vector-type;
-}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss
deleted file mode 100644 (file)
index e6db523..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * Provide Agora appearance for mw-ui-* classes when using a skin other than
- * Vector.
- * Compass builds these Agora styles from source Sass files in
- * extensions/Agora/modules/scss
- */
-
-@charset "UTF-8";
-
-@import "compass";
-
-@import "settings/all";
-
-@import "mixins/all";
-
-@import "components/default";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss
deleted file mode 100644 (file)
index ac113ee..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
- * Compass builds these Agora styles from source Sass files in
- * extensions/Agora/modules/scss
- */
-
-@charset "UTF-8";
-
-@import "compass";
-
-@import "settings/all";
-
-@import "mixins/all";
-
-@import "components/vector";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss
deleted file mode 100644 (file)
index adc48cd..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-@import "utilities";
-@import "type";
-@import "effects";
-@import "forms";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss
deleted file mode 100644 (file)
index 2efff82..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/* _effects.scss */
-
-/* Mixins for visual effects in CSS3 */
-
-// ----------------------------------------------------------------------------
-// Gradients
-// ----------------------------------------------------------------------------
-@mixin vertical-gradient ($startColor: lighten($agoraGray, 95%), $endColor: $agoraGray) {
-       // Fallback
-    background-color: $endColor;
-    *background-color: $endColor; // IE7
-
-    // IE6-8
-    @include filter-gradient($startColor, $endColor, vertical);
-
-    // IE9+, Opera, Gecko, WebKit
-    @include background-image(linear-gradient(top, $startColor, $endColor));
-}
-
-// ----------------------------------------------------------------------------
-// Button styling
-// ----------------------------------------------------------------------------
-@mixin buttonColors ($baseColor: $agoraGray) {
-       // Background color
-       @include vertical-gradient(lighten($baseColor, 7.5%), $baseColor);
-
-       @if $baseColor == $agoraGray {
-               color: black;
-               @include text-shadow(0 1px 1px rgba($baseColor, 0.3));
-       } @else {
-               color: white;
-               @include text-shadow(0 1px 1px rgba($baseColor, 0.75));
-       }
-
-       border: 1px solid darken($baseColor, 2%);
-
-       &:hover,
-       &.mw-ui-hover {
-               @include vertical-gradient(lighten($baseColor, 12.5%), lighten($baseColor, 7.5%));
-               text-decoration: none;
-       }
-
-       &:active,
-       &.mw-ui-active {
-               background: {
-                       image: none;
-                       color: darken($baseColor, 3%);
-               }
-
-               text-shadow: none;
-       }
-
-       &:disabled,
-       &.mw-ui-disabled {
-               background: {
-                       image: none;
-                       color: $baseColor;
-               }
-               opacity: 0.5;
-               text-shadow: none;
-       }
-}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss
deleted file mode 100644 (file)
index 0f3f6ad..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-// Font is not included.
-// For Vector, that should be layered on top with vector-type
-@mixin agora-field-styling() {
-
-       border: {
-               style: solid;
-               width: 1px;
-               color: $agoraGray;
-       };
-
-       &:focus {
-               // Styling focus of native checkboxes etc on Mac is almost impossible.
-               &:not([type=checkbox]):not([type=radio]) {
-                       @include reset-focus;  // Removes OS field focus
-               };
-
-               // @include box-shadow generates unneeded prefixes
-               // https://github.com/chriseppstein/compass/issues/1054 , so specify
-               // directly.
-               box-shadow: $agoraBlueShadow 0px 0px 5px;
-
-               border: {
-                       color: $agoraBlueShadow;
-               };
-       }
-
-       color: $agoraTextColor;
-       padding: 0.35em 0 0.35em 0.5em;
-}
-
-@mixin agora-label-styling() {
-       font: {
-               //weight: bold;
-               size: 0.9em;
-       };
-       color: darken($agoraGray, 50%);
-
-       & * {
-               font-weight: normal;
-       }
-}
-
-@mixin agora-inline-label-styling() {
-       margin-bottom: 0.5em;
-       cursor: pointer;
-       vertical-align: bottom;
-       line-height: normal;
-
-       font: {
-               weight: normal;
-       };
-
-       & > input[type="checkbox"],
-       & > input[type="radio"] {
-               width: auto;
-               height: auto;
-               margin: 0 0.1em 0em 0;
-               padding: 0;
-               border: {
-                       style: solid;
-                       width: 1px;
-                       color: $agoraGray;
-               }
-               cursor: pointer;
-       }
-}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss
deleted file mode 100644 (file)
index 8a93a08..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-@mixin vector-type {
-    font: {
-        size: $baseFontSize;
-    }
-    line-height: $baseLineHeight;
-}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss
deleted file mode 100644 (file)
index 71a93b6..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-@mixin agora-flush-left() {
-    float: left;
-    margin-left: 0;
-    padding-left: 0;
-}
-
-@mixin agora-flush-right() {
-    float: right;
-    margin-right: 0;
-    padding-right: 0;
-}
-
-@mixin agora-center-block() {
-    display: block;
-    margin: {
-        left: auto;
-        right: auto;
-    };
-}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss
deleted file mode 100644 (file)
index 21ac292..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-@import "colors";
-@import "typography";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss
deleted file mode 100644 (file)
index 0c18bdb..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Grays
-// -----------------------------------------
-$agoraGray: #c9c9c9;
-$agoraTextColor: #252525;
-
-// Blues
-// -----------------------------------------
-$agoraBlue: #3366bb;
-$agoraBlueShadow: #4091ed;
-
-// Greens
-// -----------------------------------------
-$agoraGreen: #27aa65;
-
-// Reds
-// -----------------------------------------
-$agoraRed: #cc0000;
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss
deleted file mode 100644 (file)
index 013d12b..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-$baseFontSize: 1em;
-$baseLineHeight: 1.4 * $baseFontSize;
-$baseFontColor: $agoraTextColor;
-
-$smallFontSize: 0.75em;
\ No newline at end of file
diff --git a/resources/mediawiki.ui/vector.less b/resources/mediawiki.ui/vector.less
new file mode 100644 (file)
index 0000000..a347562
--- /dev/null
@@ -0,0 +1,8 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
+ */
+
+@import "components/utilities";
+@import "components/vector/buttons";
+@import "components/vector/forms";
+@import "components/vector/containers";
index 1f89792..328ba83 100644 (file)
@@ -1944,14 +1944,19 @@ var mw = ( function ( $, undefined ) {
                                                var timer;
 
                                                function flush() {
-                                                       var data;
+                                                       var data, key = mw.loader.store.getStoreKey();
                                                        if ( mw.loader.store.enabled !== true ) {
                                                                return false;
                                                        }
                                                        mw.loader.store.prune();
                                                        try {
+                                                               // Replacing the content of the module store might fail if the new
+                                                               // contents would exceed the browser's localStorage size limit. To
+                                                               // avoid clogging the browser with stale data, always remove the old
+                                                               // value before attempting to set the new one.
+                                                               localStorage.removeItem( key );
                                                                data = JSON.stringify( mw.loader.store );
-                                                               localStorage.setItem( mw.loader.store.getStoreKey(), data );
+                                                               localStorage.setItem( key, data );
                                                        } catch (e) {}
                                                }
 
index cfc717f..a057cce 100644 (file)
                                        // nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
                                        // or nextnode is a CSS selector for jQuery
                                        nextnode = $ul.find( nextnode );
-                               } else if ( !nextnode.jquery || nextnode[0].parentNode !== $ul[0] ) {
+                               } else if ( !nextnode.jquery || ( nextnode.length && nextnode[0].parentNode !== $ul[0] ) ) {
                                        // Fallback
                                        $ul.append( $item );
                                        return $item[0];
index f8be097..4651b48 100644 (file)
@@ -183,7 +183,7 @@ div.vectorTabs li.icon a {
        background-repeat: no-repeat;
 }
 /* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs span a  {
+div.vectorTabs span a {
        display: inline-block;
        padding-top: 1.25em;
 }
index d4d9f43..cc935da 100644 (file)
@@ -11709,6 +11709,70 @@ MSIE CSS safety test: comment in expression
 
 !! end
 
+!! test
+CSS safety test: vertical tab
+!! input
+<p style="font-size: 100px; background-image:url\b(https://www.google.com/images/srpr/logo6w.png)">A</p>
+!! result
+<p style="/* invalid control char */">A</p>
+
+!! end
+
+!! test
+MSIE CSS safety test: Fullwidth
+!! input
+<p style="font-size: 100px; color: expression((title='XSSed'),'red')">A</p>
+<div style="top:EXPRESSION(alert())">B</div>
+!! result
+<p style="/* insecure input */">A</p>
+<div style="/* insecure input */">B</div>
+
+!! end
+
+!! test
+MSIE CSS safety test: IPA extensions
+!! input
+<div style="background-image:uʀʟ(javascript:alert())">A</div>
+<p style="font-size: 100px; color: expʀessɪoɴ((title='XSSed'),'red')">B</p>
+!! result
+<div style="/* insecure input */">A</div>
+<p style="/* insecure input */">B</p>
+
+!! end
+
+!! test
+MSIE CSS safety test: sup/sub script
+!! input
+<div style="background-image:url⁽javascript:alert())">A</div>
+<div style="background-image:url₍javascript:alert())">B</div>
+<p style="font-size: 100px; color: expressioⁿ((title='XSSed'),'red')">C</p>
+!! result
+<div style="/* insecure input */">A</div>
+<div style="/* insecure input */">B</div>
+<p style="/* insecure input */">C</p>
+
+!! end
+
+!! test
+MSIE CSS safety test: Repetition markers
+!! input
+<p style="font-size: 100px; color: expres〱ion((title='XSSed'),'red')">A</p>
+<p style="font-size: 100px; color: expresゝion((title='XSSed'),'red')">B</p>
+<p style="font-size: 100px; color: expresーion((title='XSSed'),'red')">C</p>
+<p style="font-size: 100px; color: expresヽion((title='XSSed'),'red')">D</p>
+<p style="font-size: 100px; color: expresﹽion((title='XSSed'),'red')">E</p>
+<p style="font-size: 100px; color: expresﹼion((title='XSSed'),'red')">F</p>
+<p style="font-size: 100px; color: expresーion((title='XSSed'),'red')">G</p>
+!! result
+<p style="/* insecure input */">A</p>
+<p style="/* insecure input */">B</p>
+<p style="/* insecure input */">C</p>
+<p style="/* insecure input */">D</p>
+<p style="/* insecure input */">E</p>
+<p style="/* insecure input */">F</p>
+<p style="/* insecure input */">G</p>
+
+!! end
 
 !! test
 Table attribute legitimate extension
index c749598..7f9a023 100644 (file)
@@ -24,7 +24,7 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
                $templates1 = $title->getTemplateLinksFrom();
 
                $wgLang = Language::factory( 'de' );
-               $page->mPreparedEdit = false; // In order to force the rerendering of the same wikitext
+               $page = WikiPage::factory( $title ); // In order to force the rerendering of the same wikitext
 
                // We need an edit, a purge is not enough to regenerate the tables
                $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', EDIT_UPDATE, false, $user );
index 75a7278..7c62dca 100644 (file)
@@ -79,6 +79,8 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                global $wgContLang;
                $wgContLang->resetNamespaces();
 
+               MagicWord::clearCache();
+
                if ( is_string( $title ) ) {
                        $title = Title::newFromText( $title );
                }
index 2be8044..9216f0a 100644 (file)
         * Previously, test elements where invisible to the selector since only
         * one element can have a given id.
         */
-       QUnit.test( 'addPortletLink', 11, function ( assert ) {
-               var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo, addedAfter;
+       QUnit.test( 'addPortletLink', 13, function ( assert ) {
+               var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo,
+                       addedAfter, tbRLDMnonexistentid, tbRLDMemptyjquery;
 
                pTestTb = '\
                <div class="portlet" id="p-test-tb">\
 
                addedAfter = mw.util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
                assert.strictEqual( $( addedAfter ).next()[0], tbRL, 'Link is in the correct position (by passing a jQuery object as nextnode)' );
+
+               // test case - nonexistent id as next node
+               tbRLDMnonexistentid = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+                       'Default modules', 't-rldm-nonexistent', 'List of all default modules ', 'd', '#t-rl-nonexistent' );
+
+               assert.equal( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[0], 'Nonexistent id as nextnode adds the portlet at end' );
+
+               // test case - empty jquery object as next node
+               tbRLDMemptyjquery = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+                       'Default modules', 't-rldm-empty-jquery', 'List of all default modules ', 'd', $( '#t-rl-nonexistent' ) );
+
+               assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[0], 'Empty jquery as nextnode adds the portlet at end' );
        } );
 
        QUnit.test( 'jsMessage', 1, function ( assert ) {
index 913adc1..35ab9f2 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -107,6 +107,15 @@ function wfStreamThumb( array $params ) {
 
        $fileName = isset( $params['f'] ) ? $params['f'] : '';
 
+       // Backwards compatibility parameters
+       if ( isset( $params['w'] ) ) {
+               $params['width'] = $params['w'];
+               unset( $params['w'] );
+       }
+       if ( isset( $params['p'] ) ) {
+               $params['page'] = $params['p'];
+       }
+
        // Is this a thumb of an archived file?
        $isOld = ( isset( $params['archived'] ) && $params['archived'] );
        unset( $params['archived'] ); // handlers don't care
@@ -235,14 +244,6 @@ function wfStreamThumb( array $params ) {
                }
        }
 
-       // Backwards compatibility parameters
-       if ( isset( $params['w'] ) ) {
-               $params['width'] = $params['w'];
-               unset( $params['w'] );
-       }
-       if ( isset( $params['p'] ) ) {
-               $params['page'] = $params['p'];
-       }
        unset( $params['r'] ); // ignore 'r' because we unconditionally pass File::RENDER
        unset( $params['f'] ); // We're done with 'f' parameter.