Merge "Fix TimestampTest broken by 7e3386d4"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 26 Apr 2013 15:05:20 +0000 (15:05 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 26 Apr 2013 15:05:20 +0000 (15:05 +0000)
279 files changed:
.gitignore
RELEASE-NOTES-1.21
RELEASE-NOTES-1.22
includes/AjaxDispatcher.php
includes/Article.php
includes/AutoLoader.php
includes/Autopromote.php
includes/Block.php
includes/ChangesList.php
includes/Collation.php
includes/CryptRand.php [deleted file]
includes/DefaultSettings.php
includes/EditPage.php
includes/Exception.php
includes/FormOptions.php
includes/GlobalFunctions.php
includes/HTMLForm.php
includes/HashRing.php
includes/HttpFunctions.php
includes/Import.php
includes/MWCryptRand.php [new file with mode: 0644]
includes/MagicWord.php
includes/MimeMagic.php
includes/PoolCounter.php
includes/RecentChange.php
includes/SkinLegacy.php
includes/SkinTemplate.php
includes/StatCounter.php
includes/Title.php
includes/User.php
includes/Wiki.php
includes/WikiPage.php
includes/api/ApiBase.php
includes/api/ApiEditPage.php
includes/api/ApiFeedContributions.php
includes/api/ApiFormatXml.php
includes/api/ApiMain.php
includes/api/ApiPageSet.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiUpload.php
includes/db/Database.php
includes/db/DatabaseMssql.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/diff/DairikiDiff.php
includes/filerepo/file/LocalFile.php
includes/installer/Installer.i18n.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlInstaller.php
includes/job/JobQueueDB.php
includes/job/JobQueueFederated.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/media/BitmapMetadataHandler.php
includes/media/Exif.php
includes/media/FormatMetadata.php
includes/media/IPTC.php
includes/media/SVGMetadataExtractor.php
includes/media/XMP.php
includes/objectcache/RedisBagOStuff.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/Parser.php
includes/parser/Preprocessor_DOM.php
includes/search/SearchEngine.php
includes/search/SearchMySQL.php
includes/specials/SpecialContributions.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/templates/UsercreateVForm.php [new file with mode: 0644]
includes/templates/UserloginVForm.php
languages/Language.php
languages/classes/LanguageKk.php
languages/messages/MessagesAs.php
languages/messages/MessagesBa.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBn.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesFa.php
languages/messages/MessagesFr.php
languages/messages/MessagesHe.php
languages/messages/MessagesHsb.php
languages/messages/MessagesIa.php
languages/messages/MessagesInh.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKo.php
languages/messages/MessagesKsh.php
languages/messages/MessagesLij.php
languages/messages/MessagesLus.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMs.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNl.php
languages/messages/MessagesOr.php
languages/messages/MessagesPa.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesSah.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesTr.php
languages/messages/MessagesUk.php
languages/messages/MessagesVi.php
languages/messages/MessagesZh_hant.php
maintenance/backup.inc
maintenance/backupPrefetch.inc
maintenance/backupTextPass.inc
maintenance/fuzz-tester.php
maintenance/getConfiguration.php
maintenance/language/checkLanguage.inc
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/mwdocgen.php
maintenance/oracle/tables.sql
maintenance/storage/checkStorage.php
resources/Resources.php
resources/mediawiki.special/images/icon-contributors.png [new file with mode: 0644]
resources/mediawiki.special/images/icon-edits.png [new file with mode: 0644]
resources/mediawiki.special/images/icon-pages.png [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.createAccount.vform.css [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.createAccount.vform.js [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.vforms.css
resources/mediawiki.ui/mediawiki.ui.default.css
resources/mediawiki.ui/mediawiki.ui.vector.css
resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss
resources/mediawiki/mediawiki.util.js
skins/Vector.php
tests/RunSeleniumTests.php
tests/TestsAutoLoader.php
tests/parser/ParserTestResult.php [new file with mode: 0644]
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/MediaWikiLangTestCase.php
tests/phpunit/MediaWikiPHPUnitCommand.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/bootstrap.php
tests/phpunit/includes/ArticleTablesTest.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/CdbTest.php
tests/phpunit/includes/CollationTest.php
tests/phpunit/includes/DiffHistoryBlobTest.php
tests/phpunit/includes/FormOptionsInitializationTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/HooksTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/HttpTest.php
tests/phpunit/includes/LanguageConverterTest.php
tests/phpunit/includes/LinksUpdateTest.php
tests/phpunit/includes/MWFunctionTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/PathRouterTest.php
tests/phpunit/includes/PreferencesTest.php
tests/phpunit/includes/Providers.php
tests/phpunit/includes/RecentChangeTest.php
tests/phpunit/includes/RequestContextTest.php
tests/phpunit/includes/ResourceLoaderTest.php
tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/SiteConfigurationTest.php
tests/phpunit/includes/StringUtilsTest.php
tests/phpunit/includes/TemplateCategoriesTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/TimestampTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
tests/phpunit/includes/api/ApiAccountCreationTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiPurgeTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiTestCaseUpload.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/api/RandomImageGenerator.php
tests/phpunit/includes/api/format/ApiFormatPhpTest.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/api/query/ApiQueryTest.php
tests/phpunit/includes/api/query/ApiQueryTestBase.php
tests/phpunit/includes/cache/ProcessCacheLRUTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTestHelper.php
tests/phpunit/includes/db/ORMRowTest.php
tests/phpunit/includes/db/ORMTableTest.php
tests/phpunit/includes/db/TestORMRowTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filerepo/FileRepoTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/libs/GenericArrayObjectTest.php
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/media/ExifTest.php
tests/phpunit/includes/media/IPTCTest.php
tests/phpunit/includes/media/PNGMetadataExtractorTest.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/media/XMPTest.php
tests/phpunit/includes/media/XMPValidateTest.php
tests/phpunit/includes/objectcache/BagOStuffTest.php
tests/phpunit/includes/parser/MediaWikiParserTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/ParserPreloadTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/search/SearchUpdateTest.php
tests/phpunit/includes/site/MediaWikiSiteTest.php
tests/phpunit/includes/site/SiteListTest.php
tests/phpunit/includes/site/SiteSQLStoreTest.php
tests/phpunit/includes/site/SiteTest.php
tests/phpunit/includes/site/TestSites.php
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/includes/upload/UploadTest.php
tests/phpunit/languages/LanguageClassesTestCase.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/LanguageTrTest.php
tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/backupPrefetchTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/backup_LogTest.php
tests/phpunit/maintenance/backup_PageTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/maintenance/getSlaveServerTest.php
tests/phpunit/phpunit.php
tests/phpunit/resources/ResourcesTest.php
tests/phpunit/skins/SideBarTest.php
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/selenium/suites/AddContentToNewPageTestCase.php
tests/testHelpers.inc

index ca87d93..dbe20fc 100644 (file)
@@ -7,6 +7,8 @@
 # Editors
 *.kate-swp
 *~
+\#*#
+.#*
 .*.swp
 .project
 cscope.files
index 6c68d82..1930636 100644 (file)
@@ -115,6 +115,7 @@ production.
   uz, vi.
 * Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
 * Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
+* Added 'SpecialSearchResultsPrepend' and 'SpecialSearchResultsAppend' hooks.
 * (bug 33186) Add image rotation api "imagerotate"
 * (bug 34040) Add "User rights management" link on user page toolbox.
 * (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
index cf31e51..eda1e7c 100644 (file)
@@ -12,7 +12,8 @@ production.
 * $wgRedirectScript was removed. It was unused.
 * Removed $wgLocalMessageCacheSerialized, it is now always true.
 * When $wgUseVFormUserLogin is true, the redesign of Special:UserLogin is
-  activated.
+  activated; when $wgUseVFormCreateAccount is true, the redesign of
+  Special:UserLogin/signup is activated.
 * $wgVectorUseIconWatch is now enabled by default.
 
 === New features in 1.22 ===
@@ -24,9 +25,12 @@ production.
   preference). This feature was moved from the Vector extension, and is now part
   of core for all skins. Take care when upgrading that you don't use an older
   version of the Vector extension as this feature may conflict.
-* New version of Special:UserLogin form. It is opt-in for now, controlled by
-  the $wgUseVFormUserLogin setting or a 'useNew' URL parameter trigger.
-* Added 'SpecialSearchResultsPrepend' and 'SpecialSearchResultsAppend' hooks.
+* New 'mediawiki.ui' CSS module providing mw-ui-* styles for buttons and a
+  compact vertical form layout.
+* New versions of login (Special:UserLogin) and create account
+  (Special:UserLogin/signup) forms. They are opt-in for now, controlled by
+  the $wgUseVFormUserLogin and $wgUseVFormCreateAccount settings or a 'useNew'
+  URL parameter trigger.
 * (bug 23343) Implemented ability to apply IP blocks to the contents of X-Forwarded-For headers
   by adding a new configuration variable $wgApplyIpBlocksToXff (disabled by default).
 * The new hook 'APIGetPossibleErrors' to modify the list of possible errors was
@@ -35,6 +39,12 @@ production.
   Pager-related WebRequest parameters by default, as this is overwhelmingly
   likely to be what was intended by users of the method. If any caller wishes
   to use these parameters, the new param 'useRequestParams' may be set to true.
+* mw.util.addPortletLink: Tooltip is no longer required to be plain (without
+  an accesskey in it already). As such it now rountrips. Creating a link with a
+  message as tooltip, grabbing the title attribute and using it to create
+  another portlet will work as expected.
+* (bug 6747) {{ROOTPAGENAME}} introduced, contains the name of the topmost
+  page without namespace.
 
 === Bug fixes in 1.22 ===
 * Disable Special:PasswordReset when $wgEnableEmail. Previously one could still
@@ -48,6 +58,9 @@ production.
 * (bug 47218) Special:BlockList now handles correctly user names with spaces
   when passed as subpage.
 * Pager's properly validate which fields are allowed to be sorted on.
+* mw.util.tooltipAccessKeyRegexp: The regex now matches "option-" as well.
+  Support for Mac "option" was added in 1.16, but the regex was never updated.
+* (bug 46768) Usernames of blocking users now display correctly, even if numeric.
 
 === API changes in 1.22 ===
 * (bug 46626) xmldoublequote parameter was removed. Because of a bug, the
@@ -59,6 +72,7 @@ production.
   longer be), and will no longer choke on booleans.
 * action=opensearch no longer silently ignores the format parameter.
 * action=opensearch now supports format=jsonfm.
+* list=usercontribs&ucprop=ids will now include the parent revision id.
 
 === Languages updated in 1.22===
 
@@ -85,6 +99,8 @@ changes to languages because of Bugzilla reports.
 * Calling Linker methods using a skin will now output deprecation warnings.
 * (bug 46680) "Return to" links are no longer tagged with rel="next".
 * The Special:ActiveUsers special page was removed.
+* BREAKING CHANGE: mw.util.tooltipAccessKeyRegexp: The match group for the
+  accesskey character is now $6 instead of $5.
 
 == Compatibility ==
 
index b00cf30..e22fe20 100644 (file)
@@ -63,7 +63,7 @@ class AjaxDispatcher {
                        $this->mode = "post";
                }
 
-               switch( $this->mode ) {
+               switch ( $this->mode ) {
                        case 'get':
                                $this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
                                if ( ! empty( $_GET["rsargs"] ) ) {
index 1354a48..87b94ae 100644 (file)
@@ -160,7 +160,7 @@ class Article implements Page {
                $page = null;
                wfRunHooks( 'ArticleFromTitle', array( &$title, &$page ) );
                if ( !$page ) {
-                       switch( $title->getNamespace() ) {
+                       switch ( $title->getNamespace() ) {
                                case NS_FILE:
                                        $page = new ImagePage( $title );
                                        break;
@@ -609,7 +609,7 @@ class Article implements Page {
                $this->mParserOutput = false;
 
                while ( !$outputDone && ++$pass ) {
-                       switch( $pass ) {
+                       switch ( $pass ) {
                                case 1:
                                        wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
                                        break;
@@ -1100,7 +1100,7 @@ class Article implements Page {
                        $user = User::newFromName( $rootPart, false /* allow IP users*/ );
                        $ip = User::isIP( $rootPart );
 
-                       if ( !($user && $user->isLoggedIn()) && !$ip ) { # User does not exist
+                       if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
                                $outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
                                        array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
                        } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
index 8c20c8a..4813d45 100644 (file)
@@ -65,7 +65,6 @@ $wgAutoloadLocalClasses = array(
        'ConfEditorToken' => 'includes/ConfEditor.php',
        'Cookie' => 'includes/Cookie.php',
        'CookieJar' => 'includes/Cookie.php',
-       'MWCryptRand' => 'includes/CryptRand.php',
        'CurlHttpRequest' => 'includes/HttpFunctions.php',
        'DeferrableUpdate' => 'includes/DeferredUpdates.php',
        'DeferredUpdates' => 'includes/DeferredUpdates.php',
@@ -90,11 +89,6 @@ $wgAutoloadLocalClasses = array(
        'EnhancedChangesList' => 'includes/ChangesList.php',
        'ErrorPageError' => 'includes/Exception.php',
        'ExplodeIterator' => 'includes/StringUtils.php',
-       'ExternalStore' => 'includes/externalstore/ExternalStore.php',
-       'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
-       'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
-       'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
-       'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
        'FakeTitle' => 'includes/FakeTitle.php',
        'Fallback' => 'includes/Fallback.php',
        'FatalError' => 'includes/Exception.php',
@@ -117,6 +111,7 @@ $wgAutoloadLocalClasses = array(
        'Hooks' => 'includes/Hooks.php',
        'Html' => 'includes/Html.php',
        'HTMLApiField' => 'includes/HTMLForm.php',
+       'HTMLButtonField' => 'includes/HTMLForm.php',
        'HTMLCheckField' => 'includes/HTMLForm.php',
        'HTMLCheckMatrix' => 'includes/HTMLForm.php',
        'HTMLEditTools' => 'includes/HTMLForm.php',
@@ -172,6 +167,7 @@ $wgAutoloadLocalClasses = array(
        'Message' => 'includes/Message.php',
        'MessageBlobStore' => 'includes/MessageBlobStore.php',
        'MimeMagic' => 'includes/MimeMagic.php',
+       'MWCryptRand' => 'includes/MWCryptRand.php',
        'MWException' => 'includes/Exception.php',
        'MWExceptionHandler' => 'includes/Exception.php',
        'MWFunction' => 'includes/MWFunction.php',
@@ -542,6 +538,13 @@ $wgAutoloadLocalClasses = array(
        'WikiDiff3' => 'includes/diff/WikiDiff3.php',
        'WordLevelDiff' => 'includes/diff/DairikiDiff.php',
 
+       # includes/externalstore
+       'ExternalStore' => 'includes/externalstore/ExternalStore.php',
+       'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
+       'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
+       'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
+       'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
+
        # includes/filebackend
        'FileBackendGroup' => 'includes/filebackend/FileBackendGroup.php',
        'FileBackend' => 'includes/filebackend/FileBackend.php',
@@ -1005,6 +1008,7 @@ $wgAutoloadLocalClasses = array(
        'UserloginTemplate' => 'includes/templates/Userlogin.php',
        'UserloginTemplateVForm' => 'includes/templates/UserloginVForm.php',
        'UsercreateTemplate' => 'includes/templates/Usercreate.php',
+       'UsercreateTemplateVForm' => 'includes/templates/UsercreateVForm.php',
 
        # includes/upload
        'UploadBase' => 'includes/upload/UploadBase.php',
index 604b924..ec9dcf5 100644 (file)
@@ -165,7 +165,7 @@ class Autopromote {
                        return false;
                }
 
-               switch( $cond[0] ) {
+               switch ( $cond[0] ) {
                        case APCOND_EMAILCONFIRMED:
                                if ( Sanitizer::validateEmail( $user->getEmail() ) ) {
                                        if ( $wgEmailAuthentication ) {
index 638b9a6..47ddc7d 100644 (file)
@@ -249,7 +249,7 @@ class Block {
                # passed by some callers (bug 29116)
                if ( $vagueTarget != '' ) {
                        list( $target, $type ) = self::parseTarget( $vagueTarget );
-                       switch( $type ) {
+                       switch ( $type ) {
                                case self::TYPE_USER:
                                        # Slightly weird, but who are we to argue?
                                        $conds['ipb_address'][] = (string)$target;
@@ -511,7 +511,7 @@ class Block {
         * @return Array
         */
        protected function getDatabaseArray( $db = null ) {
-               if( !$db ) {
+               if ( !$db ) {
                        $db = wfGetDB( DB_SLAVE );
                }
                $expiry = $db->encodeExpiry( $this->mExpiry );
@@ -795,7 +795,7 @@ class Block {
         * @return String IP in Hex form
         */
        public function getRangeStart() {
-               switch( $this->type ) {
+               switch ( $this->type ) {
                        case self::TYPE_USER:
                                return '';
                        case self::TYPE_IP:
@@ -814,7 +814,7 @@ class Block {
         * @return String IP in Hex form
         */
        public function getRangeEnd() {
-               switch( $this->type ) {
+               switch ( $this->type ) {
                        case self::TYPE_USER:
                                return '';
                        case self::TYPE_IP:
@@ -911,7 +911,7 @@ class Block {
         * @return Bool
         */
        public function prevents( $action, $x = null ) {
-               switch( $action ) {
+               switch ( $action ) {
                        case 'edit':
                                # For now... <evil laugh>
                                return true;
@@ -1173,7 +1173,7 @@ class Block {
         * @param Array $block Array of blocks
         * @return Block|null the "best" block from the list
         */
-       public static function chooseBlock( array $blocks, array $ipChain  ) {
+       public static function chooseBlock( array $blocks, array $ipChain ) {
                if ( !count( $blocks ) ) {
                        return null;
                } elseif ( count( $blocks ) == 1 ) {
@@ -1393,4 +1393,43 @@ class Block {
        public function setBlocker( $user ) {
                $this->blocker = $user;
        }
+
+       /**
+        * Get the key and parameters for the corresponding error message.
+        *
+        * @since 1.22
+        * @param IContextSource $context
+        * @return array
+        */
+       public function getPermissionsError( IContextSource $context ) {
+               $blocker = $this->getBlocker();
+               if ( $blocker instanceof User ) { // local user
+                       $blockerUserpage = $blocker->getUserPage();
+                       $link = "[[{$blockerUserpage->getPrefixedText()}|{$blockerUserpage->getText()}]]";
+               } else { // foreign user
+                       $link = $blocker;
+               }
+
+               $reason = $this->mReason;
+               if ( $reason == '' ) {
+                       $reason = $context->msg( 'blockednoreason' )->text();
+               }
+
+               /* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
+                * This could be a username, an IP range, or a single IP. */
+               $intended = $this->getTarget();
+
+               $lang = $context->getLanguage();
+               return array(
+                       $this->mAuto ? 'autoblockedtext' : 'blockedtext',
+                       $link,
+                       $reason,
+                       $context->getRequest()->getIP(),
+                       $this->getByName(),
+                       $this->getId(),
+                       $lang->formatExpiry( $this->mExpiry ),
+                       (string)$intended,
+                       $lang->timeanddate( wfTimestamp( TS_MW, $this->mTimestamp ), true ),
+               );
+       }
 }
index 3170a7d..b589057 100644 (file)
@@ -121,8 +121,10 @@ class ChangesList extends ContextSource {
         */
        private function preCacheMessages() {
                if ( !isset( $this->message ) ) {
-                       foreach ( explode( ' ', 'cur diff hist last blocklink history ' .
-                       'semicolon-separator pipe-separator' ) as $msg ) {
+                       foreach ( array(
+                               'cur', 'diff', 'hist', 'last', 'blocklink', 'history',
+                               'semicolon-separator', 'pipe-separator' ) as $msg
+                       ) {
                                $this->message[$msg] = $this->msg( $msg )->escaped();
                        }
                }
index 215659e..ed8a031 100644 (file)
@@ -40,7 +40,7 @@ abstract class Collation {
         * @return Collation
         */
        static function factory( $collationName ) {
-               switch( $collationName ) {
+               switch ( $collationName ) {
                        case 'uppercase':
                                return new UppercaseCollation;
                        case 'identity':
@@ -349,15 +349,15 @@ class IcuCollation extends Collation {
                $cacheEntry = $cache->get( $cacheKey );
 
                if ( $cacheEntry && isset( $cacheEntry['version'] )
-                       && $cacheEntry['version'] == self::FIRST_LETTER_VERSION ) 
-               {
+                       && $cacheEntry['version'] == self::FIRST_LETTER_VERSION
+               {
                        $this->firstLetterData = $cacheEntry;
                        return $this->firstLetterData;
                }
 
                // Generate data from serialized data file
 
-               if ( isset ( self::$tailoringFirstLetters[$this->locale] ) ) {
+               if ( isset( self::$tailoringFirstLetters[$this->locale] ) ) {
                        $letters = wfGetPrecompiledData( "first-letters-root.ser" );
                        // Append additional characters
                        $letters = array_merge( $letters, self::$tailoringFirstLetters[$this->locale] );
diff --git a/includes/CryptRand.php b/includes/CryptRand.php
deleted file mode 100644 (file)
index bac018e..0000000
+++ /dev/null
@@ -1,497 +0,0 @@
-<?php
-/**
- * A cryptographic random generator class used for generating secret keys
- *
- * This is based in part on Drupal code as well as what we used in our own code
- * prior to introduction of this class.
- *
- * 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
- *
- * @author Daniel Friesen
- * @file
- */
-
-class MWCryptRand {
-
-       /**
-        * Minimum number of iterations we want to make in our drift calculations.
-        */
-       const MIN_ITERATIONS = 1000;
-
-       /**
-        * Number of milliseconds we want to spend generating each separate byte
-        * of the final generated bytes.
-        * This is used in combination with the hash length to determine the duration
-        * we should spend doing drift calculations.
-        */
-       const MSEC_PER_BYTE = 0.5;
-
-       /**
-        * Singleton instance for public use
-        */
-       protected static $singleton = null;
-
-       /**
-        * The hash algorithm being used
-        */
-       protected $algo = null;
-
-       /**
-        * The number of bytes outputted by the hash algorithm
-        */
-       protected $hashLength = null;
-
-       /**
-        * A boolean indicating whether the previous random generation was done using
-        * cryptographically strong random number generator or not.
-        */
-       protected $strong = null;
-
-       /**
-        * Initialize an initial random state based off of whatever we can find
-        */
-       protected function initialRandomState() {
-               // $_SERVER contains a variety of unstable user and system specific information
-               // It'll vary a little with each page, and vary even more with separate users
-               // It'll also vary slightly across different machines
-               $state = serialize( $_SERVER );
-
-               // To try vary the system information of the state a bit more
-               // by including the system's hostname into the state
-               $state .= wfHostname();
-
-               // Try to gather a little entropy from the different php rand sources
-               $state .= rand() . uniqid( mt_rand(), true );
-
-               // Include some information about the filesystem's current state in the random state
-               $files = array();
-
-               // We know this file is here so grab some info about ourselves
-               $files[] = __FILE__;
-
-               // We must also have a parent folder, and with the usual file structure, a grandparent
-               $files[] = __DIR__;
-               $files[] = dirname( __DIR__ );
-
-               // The config file is likely the most often edited file we know should be around
-               // so include its stat info into the state.
-               // The constant with its location will almost always be defined, as WebStart.php defines
-               // MW_CONFIG_FILE to $IP/LocalSettings.php unless being configured with MW_CONFIG_CALLBACK (eg. the installer)
-               if ( defined( 'MW_CONFIG_FILE' ) ) {
-                       $files[] = MW_CONFIG_FILE;
-               }
-
-               foreach ( $files as $file ) {
-                       wfSuppressWarnings();
-                       $stat = stat( $file );
-                       wfRestoreWarnings();
-                       if ( $stat ) {
-                               // stat() duplicates data into numeric and string keys so kill off all the numeric ones
-                               foreach ( $stat as $k => $v ) {
-                                       if ( is_numeric( $k ) ) {
-                                               unset( $k );
-                                       }
-                               }
-                               // The absolute filename itself will differ from install to install so don't leave it out
-                               if ( ( $path = realpath( $file ) ) !== false ) {
-                                       $state .= $path;
-                               } else {
-                                       $state .= $file;
-                               }
-                               $state .= implode( '', $stat );
-                       } else {
-                               // The fact that the file isn't there is worth at least a
-                               // minuscule amount of entropy.
-                               $state .= '0';
-                       }
-               }
-
-               // Try and make this a little more unstable by including the varying process
-               // id of the php process we are running inside of if we are able to access it
-               if ( function_exists( 'getmypid' ) ) {
-                       $state .= getmypid();
-               }
-
-               // If available try to increase the instability of the data by throwing in
-               // the precise amount of memory that we happen to be using at the moment.
-               if ( function_exists( 'memory_get_usage' ) ) {
-                       $state .= memory_get_usage( true );
-               }
-
-               // It's mostly worthless but throw the wiki's id into the data for a little more variance
-               $state .= wfWikiID();
-
-               // If we have a secret key or proxy key set then throw it into the state as well
-               global $wgSecretKey, $wgProxyKey;
-               if ( $wgSecretKey ) {
-                       $state .= $wgSecretKey;
-               } elseif ( $wgProxyKey ) {
-                       $state .= $wgProxyKey;
-               }
-
-               return $state;
-       }
-
-       /**
-        * Randomly hash data while mixing in clock drift data for randomness
-        *
-        * @param string $data The data to randomly hash.
-        * @return String The hashed bytes
-        * @author Tim Starling
-        */
-       protected function driftHash( $data ) {
-               // Minimum number of iterations (to avoid slow operations causing the loop to gather little entropy)
-               $minIterations = self::MIN_ITERATIONS;
-               // Duration of time to spend doing calculations (in seconds)
-               $duration = ( self::MSEC_PER_BYTE / 1000 ) * $this->hashLength();
-               // Create a buffer to use to trigger memory operations
-               $bufLength = 10000000;
-               $buffer = str_repeat( ' ', $bufLength );
-               $bufPos = 0;
-
-               // Iterate for $duration seconds or at least $minIterations number of iterations
-               $iterations = 0;
-               $startTime = microtime( true );
-               $currentTime = $startTime;
-               while ( $iterations < $minIterations || $currentTime - $startTime < $duration ) {
-                       // Trigger some memory writing to trigger some bus activity
-                       // This may create variance in the time between iterations
-                       $bufPos = ( $bufPos + 13 ) % $bufLength;
-                       $buffer[$bufPos] = ' ';
-                       // Add the drift between this iteration and the last in as entropy
-                       $nextTime = microtime( true );
-                       $delta = (int)( ( $nextTime - $currentTime ) * 1000000 );
-                       $data .= $delta;
-                       // Every 100 iterations hash the data and entropy
-                       if ( $iterations % 100 === 0 ) {
-                               $data = sha1( $data );
-                       }
-                       $currentTime = $nextTime;
-                       $iterations++;
-               }
-               $timeTaken = $currentTime - $startTime;
-               $data = $this->hash( $data );
-
-               wfDebug( __METHOD__ . ": Clock drift calculation " .
-                       "(time-taken=" . ( $timeTaken * 1000 ) . "ms, " .
-                       "iterations=$iterations, " .
-                       "time-per-iteration=" . ( $timeTaken / $iterations * 1e6 ) . "us)\n" );
-               return $data;
-       }
-
-       /**
-        * Return a rolling random state initially build using data from unstable sources
-        * @return string A new weak random state
-        */
-       protected function randomState() {
-               static $state = null;
-               if ( is_null( $state ) ) {
-                       // Initialize the state with whatever unstable data we can find
-                       // It's important that this data is hashed right afterwards to prevent
-                       // it from being leaked into the output stream
-                       $state = $this->hash( $this->initialRandomState() );
-               }
-               // Generate a new random state based on the initial random state or previous
-               // random state by combining it with clock drift
-               $state = $this->driftHash( $state );
-               return $state;
-       }
-
-       /**
-        * Decide on the best acceptable hash algorithm we have available for hash()
-        * @throws MWException
-        * @return String A hash algorithm
-        */
-       protected function hashAlgo() {
-               if ( !is_null( $this->algo ) ) {
-                       return $this->algo;
-               }
-
-               $algos = hash_algos();
-               $preference = array( 'whirlpool', 'sha256', 'sha1', 'md5' );
-
-               foreach ( $preference as $algorithm ) {
-                       if ( in_array( $algorithm, $algos ) ) {
-                               $this->algo = $algorithm;
-                               wfDebug( __METHOD__ . ": Using the {$this->algo} hash algorithm.\n" );
-                               return $this->algo;
-                       }
-               }
-
-               // We only reach here if no acceptable hash is found in the list, this should
-               // be a technical impossibility since most of php's hash list is fixed and
-               // some of the ones we list are available as their own native functions
-               // But since we already require at least 5.2 and hash() was default in
-               // 5.1.2 we don't bother falling back to methods like sha1 and md5.
-               throw new MWException( "Could not find an acceptable hashing function in hash_algos()" );
-       }
-
-       /**
-        * Return the byte-length output of the hash algorithm we are
-        * using in self::hash and self::hmac.
-        *
-        * @return int Number of bytes the hash outputs
-        */
-       protected function hashLength() {
-               if ( is_null( $this->hashLength ) ) {
-                       $this->hashLength = strlen( $this->hash( '' ) );
-               }
-               return $this->hashLength;
-       }
-
-       /**
-        * Generate an acceptably unstable one-way-hash of some text
-        * making use of the best hash algorithm that we have available.
-        *
-        * @param $data string
-        * @return String A raw hash of the data
-        */
-       protected function hash( $data ) {
-               return hash( $this->hashAlgo(), $data, true );
-       }
-
-       /**
-        * Generate an acceptably unstable one-way-hmac of some text
-        * making use of the best hash algorithm that we have available.
-        *
-        * @param $data string
-        * @param $key string
-        * @return String A raw hash of the data
-        */
-       protected function hmac( $data, $key ) {
-               return hash_hmac( $this->hashAlgo(), $data, $key, true );
-       }
-
-       /**
-        * @see self::wasStrong()
-        */
-       public function realWasStrong() {
-               if ( is_null( $this->strong ) ) {
-                       throw new MWException( __METHOD__ . ' called before generation of random data' );
-               }
-               return $this->strong;
-       }
-
-       /**
-        * @see self::generate()
-        */
-       public function realGenerate( $bytes, $forceStrong = false ) {
-               wfProfileIn( __METHOD__ );
-
-               wfDebug( __METHOD__ . ": Generating cryptographic random bytes for " . wfGetAllCallers( 5 ) . "\n" );
-
-               $bytes = floor( $bytes );
-               static $buffer = '';
-               if ( is_null( $this->strong ) ) {
-                       // Set strength to false initially until we know what source data is coming from
-                       $this->strong = true;
-               }
-
-               if ( strlen( $buffer ) < $bytes ) {
-                       // If available make use of mcrypt_create_iv URANDOM source to generate randomness
-                       // On unix-like systems this reads from /dev/urandom but does it without any buffering
-                       // and bypasses openbasedir restrictions, so it's preferable to reading directly
-                       // On Windows starting in PHP 5.3.0 Windows' native CryptGenRandom is used to generate
-                       // entropy so this is also preferable to just trying to read urandom because it may work
-                       // on Windows systems as well.
-                       if ( function_exists( 'mcrypt_create_iv' ) ) {
-                               wfProfileIn( __METHOD__ . '-mcrypt' );
-                               $rem = $bytes - strlen( $buffer );
-                               $iv = mcrypt_create_iv( $rem, MCRYPT_DEV_URANDOM );
-                               if ( $iv === false ) {
-                                       wfDebug( __METHOD__ . ": mcrypt_create_iv returned false.\n" );
-                               } else {
-                                       $buffer .= $iv;
-                                       wfDebug( __METHOD__ . ": mcrypt_create_iv generated " . strlen( $iv ) . " bytes of randomness.\n" );
-                               }
-                               wfProfileOut( __METHOD__ . '-mcrypt' );
-                       }
-               }
-
-               if ( strlen( $buffer ) < $bytes ) {
-                       // If available make use of openssl's random_pseudo_bytes method to attempt to generate randomness.
-                       // However don't do this on Windows with PHP < 5.3.4 due to a bug:
-                       // http://stackoverflow.com/questions/1940168/openssl-random-pseudo-bytes-is-slow-php
-                       // http://git.php.net/?p=php-src.git;a=commitdiff;h=cd62a70863c261b07f6dadedad9464f7e213cad5
-                       if ( function_exists( 'openssl_random_pseudo_bytes' )
-                               && ( !wfIsWindows() || version_compare( PHP_VERSION, '5.3.4', '>=' ) )
-                       ) {
-                               wfProfileIn( __METHOD__ . '-openssl' );
-                               $rem = $bytes - strlen( $buffer );
-                               $openssl_bytes = openssl_random_pseudo_bytes( $rem, $openssl_strong );
-                               if ( $openssl_bytes === false ) {
-                                       wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes returned false.\n" );
-                               } else {
-                                       $buffer .= $openssl_bytes;
-                                       wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes generated " . strlen( $openssl_bytes ) . " bytes of " . ( $openssl_strong ? "strong" : "weak" ) . " randomness.\n" );
-                               }
-                               if ( strlen( $buffer ) >= $bytes ) {
-                                       // openssl tells us if the random source was strong, if some of our data was generated
-                                       // using it use it's say on whether the randomness is strong
-                                       $this->strong = !!$openssl_strong;
-                               }
-                               wfProfileOut( __METHOD__ . '-openssl' );
-                       }
-               }
-
-               // Only read from urandom if we can control the buffer size or were passed forceStrong
-               if ( strlen( $buffer ) < $bytes && ( function_exists( 'stream_set_read_buffer' ) || $forceStrong ) ) {
-                       wfProfileIn( __METHOD__ . '-fopen-urandom' );
-                       $rem = $bytes - strlen( $buffer );
-                       if ( !function_exists( 'stream_set_read_buffer' ) && $forceStrong ) {
-                               wfDebug( __METHOD__ . ": Was forced to read from /dev/urandom without control over the buffer size.\n" );
-                       }
-                       // /dev/urandom is generally considered the best possible commonly
-                       // available random source, and is available on most *nix systems.
-                       wfSuppressWarnings();
-                       $urandom = fopen( "/dev/urandom", "rb" );
-                       wfRestoreWarnings();
-
-                       // Attempt to read all our random data from urandom
-                       // php's fread always does buffered reads based on the stream's chunk_size
-                       // so in reality it will usually read more than the amount of data we're
-                       // asked for and not storing that risks depleting the system's random pool.
-                       // If stream_set_read_buffer is available set the chunk_size to the amount
-                       // of data we need. Otherwise read 8k, php's default chunk_size.
-                       if ( $urandom ) {
-                               // php's default chunk_size is 8k
-                               $chunk_size = 1024 * 8;
-                               if ( function_exists( 'stream_set_read_buffer' ) ) {
-                                       // If possible set the chunk_size to the amount of data we need
-                                       stream_set_read_buffer( $urandom, $rem );
-                                       $chunk_size = $rem;
-                               }
-                               $random_bytes = fread( $urandom, max( $chunk_size, $rem ) );
-                               $buffer .= $random_bytes;
-                               fclose( $urandom );
-                               wfDebug( __METHOD__ . ": /dev/urandom generated " . strlen( $random_bytes ) . " bytes of randomness.\n" );
-                               if ( strlen( $buffer ) >= $bytes ) {
-                                       // urandom is always strong, set to true if all our data was generated using it
-                                       $this->strong = true;
-                               }
-                       } else {
-                               wfDebug( __METHOD__ . ": /dev/urandom could not be opened.\n" );
-                       }
-                       wfProfileOut( __METHOD__ . '-fopen-urandom' );
-               }
-
-               // If we cannot use or generate enough data from a secure source
-               // use this loop to generate a good set of pseudo random data.
-               // This works by initializing a random state using a pile of unstable data
-               // and continually shoving it through a hash along with a variable salt.
-               // We hash the random state with more salt to avoid the state from leaking
-               // out and being used to predict the /randomness/ that follows.
-               if ( strlen( $buffer ) < $bytes ) {
-                       wfDebug( __METHOD__ . ": Falling back to using a pseudo random state to generate randomness.\n" );
-               }
-               while ( strlen( $buffer ) < $bytes ) {
-                       wfProfileIn( __METHOD__ . '-fallback' );
-                       $buffer .= $this->hmac( $this->randomState(), mt_rand() );
-                       // This code is never really cryptographically strong, if we use it
-                       // at all, then set strong to false.
-                       $this->strong = false;
-                       wfProfileOut( __METHOD__ . '-fallback' );
-               }
-
-               // Once the buffer has been filled up with enough random data to fulfill
-               // the request shift off enough data to handle the request and leave the
-               // unused portion left inside the buffer for the next request for random data
-               $generated = substr( $buffer, 0, $bytes );
-               $buffer = substr( $buffer, $bytes );
-
-               wfDebug( __METHOD__ . ": " . strlen( $buffer ) . " bytes of randomness leftover in the buffer.\n" );
-
-               wfProfileOut( __METHOD__ );
-               return $generated;
-       }
-
-       /**
-        * @see self::generateHex()
-        */
-       public function realGenerateHex( $chars, $forceStrong = false ) {
-               // hex strings are 2x the length of raw binary so we divide the length in half
-               // odd numbers will result in a .5 that leads the generate() being 1 character
-               // short, so we use ceil() to ensure that we always have enough bytes
-               $bytes = ceil( $chars / 2 );
-               // Generate the data and then convert it to a hex string
-               $hex = bin2hex( $this->generate( $bytes, $forceStrong ) );
-               // A bit of paranoia here, the caller asked for a specific length of string
-               // here, and it's possible (eg when given an odd number) that we may actually
-               // have at least 1 char more than they asked for. Just in case they made this
-               // call intending to insert it into a database that does truncation we don't
-               // want to give them too much and end up with their database and their live
-               // code having two different values because part of what we gave them is truncated
-               // hence, we strip out any run of characters longer than what we were asked for.
-               return substr( $hex, 0, $chars );
-       }
-
-       /** Publicly exposed static methods **/
-
-       /**
-        * Return a singleton instance of MWCryptRand
-        * @return MWCryptRand
-        */
-       protected static function singleton() {
-               if ( is_null( self::$singleton ) ) {
-                       self::$singleton = new self;
-               }
-               return self::$singleton;
-       }
-
-       /**
-        * Return a boolean indicating whether or not the source used for cryptographic
-        * random bytes generation in the previously run generate* call
-        * was cryptographically strong.
-        *
-        * @return bool Returns true if the source was strong, false if not.
-        */
-       public static function wasStrong() {
-               return self::singleton()->realWasStrong();
-       }
-
-       /**
-        * Generate a run of (ideally) cryptographically random data and return
-        * it in raw binary form.
-        * You can use MWCryptRand::wasStrong() if you wish to know if the source used
-        * was cryptographically strong.
-        *
-        * @param int $bytes the number of bytes of random data to generate
-        * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
-        *                          strong sources of entropy even if reading from them may steal
-        *                          more entropy from the system than optimal.
-        * @return String Raw binary random data
-        */
-       public static function generate( $bytes, $forceStrong = false ) {
-               return self::singleton()->realGenerate( $bytes, $forceStrong );
-       }
-
-       /**
-        * Generate a run of (ideally) cryptographically random data and return
-        * it in hexadecimal string format.
-        * You can use MWCryptRand::wasStrong() if you wish to know if the source used
-        * was cryptographically strong.
-        *
-        * @param int $chars the number of hex chars of random data to generate
-        * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
-        *                          strong sources of entropy even if reading from them may steal
-        *                          more entropy from the system than optimal.
-        * @return String Hexadecimal random data
-        */
-       public static function generateHex( $chars, $forceStrong = false ) {
-               return self::singleton()->realGenerateHex( $chars, $forceStrong );
-       }
-
-}
index da2f321..c198081 100644 (file)
@@ -2829,12 +2829,22 @@ $wgVectorUseSimpleSearch = true;
 $wgVectorUseIconWatch = true;
 
 /**
- * Use VForm design for Special:Userlogin.  This can be overridden by
- * a useNew bool in the query string.  For instance, if it is globally
- * false, you can try it with useNew=1.
+ * Use compact vertical form ("VForm") design for Special:Userlogin.  This can
+ * be overridden by a useNew bool in the query string.  For instance, if it is
+ * globally false, you can try it with useNew=1.
+ *
+ * @since 1.22
  */
 $wgUseVFormUserLogin = false;
 
+/**
+ * Use compact vertical form ("VForm") design for account creation
+ * (Special:Userlogin?type=signup).
+ *
+ * @since 1.22
+ */
+$wgUseVFormCreateAccount = false;
+
 /**
  * Display user edit counts in various prominent places.
  */
index ae35f3e..c97431a 100644 (file)
@@ -1220,7 +1220,7 @@ class EditPage {
 
                        case self::AS_SUCCESS_NEW_ARTICLE:
                                $query = $resultDetails['redirect'] ? 'redirect=no' : '';
-                               $anchor = isset ( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
+                               $anchor = isset( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
                                $wgOut->redirect( $this->mTitle->getFullURL( $query ) . $anchor );
                                return false;
 
index b42ae99..c513ef7 100644 (file)
@@ -467,39 +467,9 @@ class ThrottledError extends ErrorPageError {
  */
 class UserBlockedError extends ErrorPageError {
        public function __construct( Block $block ) {
-               global $wgLang, $wgRequest;
-
-               $blocker = $block->getBlocker();
-               if ( $blocker instanceof User ) { // local user
-                       $blockerUserpage = $block->getBlocker()->getUserPage();
-                       $link = "[[{$blockerUserpage->getPrefixedText()}|{$blockerUserpage->getText()}]]";
-               } else { // foreign user
-                       $link = $blocker;
-               }
-
-               $reason = $block->mReason;
-               if ( $reason == '' ) {
-                       $reason = wfMessage( 'blockednoreason' )->text();
-               }
-
-               /* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
-                * This could be a username, an IP range, or a single IP. */
-               $intended = $block->getTarget();
-
-               parent::__construct(
-                       'blockedtitle',
-                       $block->mAuto ? 'autoblockedtext' : 'blockedtext',
-                       array(
-                               $link,
-                               $reason,
-                               $wgRequest->getIP(),
-                               $block->getByName(),
-                               $block->getId(),
-                               $wgLang->formatExpiry( $block->mExpiry ),
-                               $intended,
-                               $wgLang->timeanddate( wfTimestamp( TS_MW, $block->mTimestamp ), true )
-                       )
-               );
+               // @todo FIXME: Implement a more proper way to get context here.
+               $params = $block->getPermissionsError( RequestContext::getMain() );
+               parent::__construct( 'blockedtitle', array_shift( $params ), $params );
        }
 }
 
index 0a5cb68..530b094 100644 (file)
@@ -290,7 +290,7 @@ class FormOptions implements ArrayAccess {
                        $default = $this->options[$name]['default'];
                        $type = $this->options[$name]['type'];
 
-                       switch( $type ) {
+                       switch ( $type ) {
                                case self::BOOL:
                                        $value = $r->getBool( $name, $default );
                                        break;
index 458ab54..320a57d 100644 (file)
@@ -2736,22 +2736,12 @@ function wfEscapeShellArg() {
 }
 
 /**
- * Execute a shell command, with time and memory limits mirrored from the PHP
- * configuration if supported.
- * @param string $cmd Command line, properly escaped for shell.
- * @param &$retval null|Mixed optional, will receive the program's exit code.
- *                 (non-zero is usually failure)
- * @param array $environ optional environment variables which should be
- *                 added to the executed command environment.
- * @param array $limits optional array with limits(filesize, memory, time, walltime)
- *                 this overwrites the global wgShellMax* limits.
- * @return string collected stdout as a string (trailing newlines stripped)
+ * Check if wfShellExec() is effectively disabled via php.ini config
+ * @return bool|string False or one of (safemode,disabled)
+ * @since 1.22
  */
-function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
-       global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime,
-               $wgMaxShellWallClockTime, $wgShellCgroup;
-
-       static $disabled;
+function wfShellExecDisabled() {
+       static $disabled = null;
        if ( is_null( $disabled ) ) {
                $disabled = false;
                if ( wfIniGetBool( 'safe_mode' ) ) {
@@ -2767,6 +2757,26 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
                        }
                }
        }
+       return $disabled;
+}
+
+/**
+ * Execute a shell command, with time and memory limits mirrored from the PHP
+ * configuration if supported.
+ * @param string $cmd Command line, properly escaped for shell.
+ * @param &$retval null|Mixed optional, will receive the program's exit code.
+ *                 (non-zero is usually failure)
+ * @param array $environ optional environment variables which should be
+ *                 added to the executed command environment.
+ * @param array $limits optional array with limits(filesize, memory, time, walltime)
+ *                 this overwrites the global wgShellMax* limits.
+ * @return string collected stdout as a string (trailing newlines stripped)
+ */
+function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
+       global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime,
+               $wgMaxShellWallClockTime, $wgShellCgroup;
+
+       $disabled = wfShellExecDisabled();
        if ( $disabled ) {
                $retval = 1;
                return $disabled == 'safemode' ?
@@ -3750,7 +3760,7 @@ function wfShorthandToInteger( $string = '' ) {
        }
        $last = $string[strlen( $string ) - 1];
        $val = intval( $string );
-       switch( $last ) {
+       switch ( $last ) {
                case 'g':
                case 'G':
                        $val *= 1024;
index b7bdcfd..2d0cefc 100644 (file)
@@ -2542,7 +2542,19 @@ class HTMLHiddenField extends HTMLFormField {
  * Add a submit button inline in the form (as opposed to
  * HTMLForm::addButton(), which will add it at the end).
  */
-class HTMLSubmitField extends HTMLFormField {
+class HTMLSubmitField extends HTMLButtonField {
+       protected $buttonType = 'submit';
+}
+
+/**
+ * Adds a generic button inline to the form. Does not do anything, you must add
+ * click handling code in JavaScript. Use a HTMLSubmitField if you merely
+ * wish to add a submit button to a form.
+ *
+ * @since 1.22
+ */
+class HTMLButtonField extends HTMLFormField {
+       protected $buttonType = 'button';
 
        public function __construct( $info ) {
                $info['nodata'] = true;
@@ -2552,7 +2564,6 @@ class HTMLSubmitField extends HTMLFormField {
        public function getInputHTML( $value ) {
                $attr = array(
                        'class' => 'mw-htmlform-submit ' . $this->mClass,
-                       'name' => $this->mName,
                        'id' => $this->mID,
                );
 
@@ -2560,7 +2571,12 @@ class HTMLSubmitField extends HTMLFormField {
                        $attr['disabled'] = 'disabled';
                }
 
-               return Xml::submitButton( $value, $attr );
+               return Html::input(
+                       $this->mName,
+                       $value,
+                       $this->buttonType,
+                       $attr
+               );
        }
 
        protected function needsLabel() {
index 10a3c9c..227a287 100644 (file)
@@ -30,7 +30,7 @@ class HashRing {
        /** @var Array (location => (start, end)) */
        protected $ring = array();
 
-       const RING_SIZE = 16777216; // 2^24
+       const RING_SIZE = 268435456; // 2^28
 
        /**
         * @param array $map (location => weight)
@@ -86,7 +86,7 @@ class HashRing {
        public function getLocations( $item, $limit ) {
                $locations = array();
                $primaryLocation = null;
-               $spot = hexdec( substr( sha1( $item ), 0, 6 ) ); // first 24 bits
+               $spot = hexdec( substr( sha1( $item ), 0, 7 ) ); // first 28 bits
                foreach ( $this->ring as $location => $range ) {
                        if ( count( $locations ) >= $limit ) {
                                break;
index 28daf91..2da368c 100644 (file)
@@ -280,7 +280,7 @@ class MWHttpRequest {
                                ' Http::$httpEngine is set to "curl"' );
                }
 
-               switch( Http::$httpEngine ) {
+               switch ( Http::$httpEngine ) {
                        case 'curl':
                                return new CurlHttpRequest( $url, $options );
                        case 'php':
index 8220287..bf5a3fb 100644 (file)
@@ -381,7 +381,7 @@ class WikiImporter {
                }
                $buffer = "";
                while ( $this->reader->read() ) {
-                       switch( $this->reader->nodeType ) {
+                       switch ( $this->reader->nodeType ) {
                        case XmlReader::TEXT:
                        case XmlReader::SIGNIFICANT_WHITESPACE:
                                $buffer .= $this->reader->value;
@@ -424,7 +424,7 @@ class WikiImporter {
                        $lookup = array();
 
                        foreach ( $xmlReaderConstants as $name ) {
-                               $lookup[constant("XmlReader::$name")] = $name;
+                               $lookup[constant( "XmlReader::$name" )] = $name;
                        }
                }
 
@@ -1002,7 +1002,7 @@ class XMLReader2 extends XMLReader {
                }
                $buffer = "";
                while ( $this->read() ) {
-                       switch( $this->nodeType ) {
+                       switch ( $this->nodeType ) {
                        case XmlReader::TEXT:
                        case XmlReader::SIGNIFICANT_WHITESPACE:
                                $buffer .= $this->value;
@@ -1657,7 +1657,7 @@ class ImportStreamSource {
                        return Status::newFatal( 'importnofile' );
                }
                if ( !empty( $upload['error'] ) ) {
-                       switch( $upload['error'] ) {
+                       switch ( $upload['error'] ) {
                                case 1: # The uploaded file exceeds the upload_max_filesize directive in php.ini.
                                        return Status::newFatal( 'importuploaderrorsize' );
                                case 2: # The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.
diff --git a/includes/MWCryptRand.php b/includes/MWCryptRand.php
new file mode 100644 (file)
index 0000000..bac018e
--- /dev/null
@@ -0,0 +1,497 @@
+<?php
+/**
+ * A cryptographic random generator class used for generating secret keys
+ *
+ * This is based in part on Drupal code as well as what we used in our own code
+ * prior to introduction of this class.
+ *
+ * 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
+ *
+ * @author Daniel Friesen
+ * @file
+ */
+
+class MWCryptRand {
+
+       /**
+        * Minimum number of iterations we want to make in our drift calculations.
+        */
+       const MIN_ITERATIONS = 1000;
+
+       /**
+        * Number of milliseconds we want to spend generating each separate byte
+        * of the final generated bytes.
+        * This is used in combination with the hash length to determine the duration
+        * we should spend doing drift calculations.
+        */
+       const MSEC_PER_BYTE = 0.5;
+
+       /**
+        * Singleton instance for public use
+        */
+       protected static $singleton = null;
+
+       /**
+        * The hash algorithm being used
+        */
+       protected $algo = null;
+
+       /**
+        * The number of bytes outputted by the hash algorithm
+        */
+       protected $hashLength = null;
+
+       /**
+        * A boolean indicating whether the previous random generation was done using
+        * cryptographically strong random number generator or not.
+        */
+       protected $strong = null;
+
+       /**
+        * Initialize an initial random state based off of whatever we can find
+        */
+       protected function initialRandomState() {
+               // $_SERVER contains a variety of unstable user and system specific information
+               // It'll vary a little with each page, and vary even more with separate users
+               // It'll also vary slightly across different machines
+               $state = serialize( $_SERVER );
+
+               // To try vary the system information of the state a bit more
+               // by including the system's hostname into the state
+               $state .= wfHostname();
+
+               // Try to gather a little entropy from the different php rand sources
+               $state .= rand() . uniqid( mt_rand(), true );
+
+               // Include some information about the filesystem's current state in the random state
+               $files = array();
+
+               // We know this file is here so grab some info about ourselves
+               $files[] = __FILE__;
+
+               // We must also have a parent folder, and with the usual file structure, a grandparent
+               $files[] = __DIR__;
+               $files[] = dirname( __DIR__ );
+
+               // The config file is likely the most often edited file we know should be around
+               // so include its stat info into the state.
+               // The constant with its location will almost always be defined, as WebStart.php defines
+               // MW_CONFIG_FILE to $IP/LocalSettings.php unless being configured with MW_CONFIG_CALLBACK (eg. the installer)
+               if ( defined( 'MW_CONFIG_FILE' ) ) {
+                       $files[] = MW_CONFIG_FILE;
+               }
+
+               foreach ( $files as $file ) {
+                       wfSuppressWarnings();
+                       $stat = stat( $file );
+                       wfRestoreWarnings();
+                       if ( $stat ) {
+                               // stat() duplicates data into numeric and string keys so kill off all the numeric ones
+                               foreach ( $stat as $k => $v ) {
+                                       if ( is_numeric( $k ) ) {
+                                               unset( $k );
+                                       }
+                               }
+                               // The absolute filename itself will differ from install to install so don't leave it out
+                               if ( ( $path = realpath( $file ) ) !== false ) {
+                                       $state .= $path;
+                               } else {
+                                       $state .= $file;
+                               }
+                               $state .= implode( '', $stat );
+                       } else {
+                               // The fact that the file isn't there is worth at least a
+                               // minuscule amount of entropy.
+                               $state .= '0';
+                       }
+               }
+
+               // Try and make this a little more unstable by including the varying process
+               // id of the php process we are running inside of if we are able to access it
+               if ( function_exists( 'getmypid' ) ) {
+                       $state .= getmypid();
+               }
+
+               // If available try to increase the instability of the data by throwing in
+               // the precise amount of memory that we happen to be using at the moment.
+               if ( function_exists( 'memory_get_usage' ) ) {
+                       $state .= memory_get_usage( true );
+               }
+
+               // It's mostly worthless but throw the wiki's id into the data for a little more variance
+               $state .= wfWikiID();
+
+               // If we have a secret key or proxy key set then throw it into the state as well
+               global $wgSecretKey, $wgProxyKey;
+               if ( $wgSecretKey ) {
+                       $state .= $wgSecretKey;
+               } elseif ( $wgProxyKey ) {
+                       $state .= $wgProxyKey;
+               }
+
+               return $state;
+       }
+
+       /**
+        * Randomly hash data while mixing in clock drift data for randomness
+        *
+        * @param string $data The data to randomly hash.
+        * @return String The hashed bytes
+        * @author Tim Starling
+        */
+       protected function driftHash( $data ) {
+               // Minimum number of iterations (to avoid slow operations causing the loop to gather little entropy)
+               $minIterations = self::MIN_ITERATIONS;
+               // Duration of time to spend doing calculations (in seconds)
+               $duration = ( self::MSEC_PER_BYTE / 1000 ) * $this->hashLength();
+               // Create a buffer to use to trigger memory operations
+               $bufLength = 10000000;
+               $buffer = str_repeat( ' ', $bufLength );
+               $bufPos = 0;
+
+               // Iterate for $duration seconds or at least $minIterations number of iterations
+               $iterations = 0;
+               $startTime = microtime( true );
+               $currentTime = $startTime;
+               while ( $iterations < $minIterations || $currentTime - $startTime < $duration ) {
+                       // Trigger some memory writing to trigger some bus activity
+                       // This may create variance in the time between iterations
+                       $bufPos = ( $bufPos + 13 ) % $bufLength;
+                       $buffer[$bufPos] = ' ';
+                       // Add the drift between this iteration and the last in as entropy
+                       $nextTime = microtime( true );
+                       $delta = (int)( ( $nextTime - $currentTime ) * 1000000 );
+                       $data .= $delta;
+                       // Every 100 iterations hash the data and entropy
+                       if ( $iterations % 100 === 0 ) {
+                               $data = sha1( $data );
+                       }
+                       $currentTime = $nextTime;
+                       $iterations++;
+               }
+               $timeTaken = $currentTime - $startTime;
+               $data = $this->hash( $data );
+
+               wfDebug( __METHOD__ . ": Clock drift calculation " .
+                       "(time-taken=" . ( $timeTaken * 1000 ) . "ms, " .
+                       "iterations=$iterations, " .
+                       "time-per-iteration=" . ( $timeTaken / $iterations * 1e6 ) . "us)\n" );
+               return $data;
+       }
+
+       /**
+        * Return a rolling random state initially build using data from unstable sources
+        * @return string A new weak random state
+        */
+       protected function randomState() {
+               static $state = null;
+               if ( is_null( $state ) ) {
+                       // Initialize the state with whatever unstable data we can find
+                       // It's important that this data is hashed right afterwards to prevent
+                       // it from being leaked into the output stream
+                       $state = $this->hash( $this->initialRandomState() );
+               }
+               // Generate a new random state based on the initial random state or previous
+               // random state by combining it with clock drift
+               $state = $this->driftHash( $state );
+               return $state;
+       }
+
+       /**
+        * Decide on the best acceptable hash algorithm we have available for hash()
+        * @throws MWException
+        * @return String A hash algorithm
+        */
+       protected function hashAlgo() {
+               if ( !is_null( $this->algo ) ) {
+                       return $this->algo;
+               }
+
+               $algos = hash_algos();
+               $preference = array( 'whirlpool', 'sha256', 'sha1', 'md5' );
+
+               foreach ( $preference as $algorithm ) {
+                       if ( in_array( $algorithm, $algos ) ) {
+                               $this->algo = $algorithm;
+                               wfDebug( __METHOD__ . ": Using the {$this->algo} hash algorithm.\n" );
+                               return $this->algo;
+                       }
+               }
+
+               // We only reach here if no acceptable hash is found in the list, this should
+               // be a technical impossibility since most of php's hash list is fixed and
+               // some of the ones we list are available as their own native functions
+               // But since we already require at least 5.2 and hash() was default in
+               // 5.1.2 we don't bother falling back to methods like sha1 and md5.
+               throw new MWException( "Could not find an acceptable hashing function in hash_algos()" );
+       }
+
+       /**
+        * Return the byte-length output of the hash algorithm we are
+        * using in self::hash and self::hmac.
+        *
+        * @return int Number of bytes the hash outputs
+        */
+       protected function hashLength() {
+               if ( is_null( $this->hashLength ) ) {
+                       $this->hashLength = strlen( $this->hash( '' ) );
+               }
+               return $this->hashLength;
+       }
+
+       /**
+        * Generate an acceptably unstable one-way-hash of some text
+        * making use of the best hash algorithm that we have available.
+        *
+        * @param $data string
+        * @return String A raw hash of the data
+        */
+       protected function hash( $data ) {
+               return hash( $this->hashAlgo(), $data, true );
+       }
+
+       /**
+        * Generate an acceptably unstable one-way-hmac of some text
+        * making use of the best hash algorithm that we have available.
+        *
+        * @param $data string
+        * @param $key string
+        * @return String A raw hash of the data
+        */
+       protected function hmac( $data, $key ) {
+               return hash_hmac( $this->hashAlgo(), $data, $key, true );
+       }
+
+       /**
+        * @see self::wasStrong()
+        */
+       public function realWasStrong() {
+               if ( is_null( $this->strong ) ) {
+                       throw new MWException( __METHOD__ . ' called before generation of random data' );
+               }
+               return $this->strong;
+       }
+
+       /**
+        * @see self::generate()
+        */
+       public function realGenerate( $bytes, $forceStrong = false ) {
+               wfProfileIn( __METHOD__ );
+
+               wfDebug( __METHOD__ . ": Generating cryptographic random bytes for " . wfGetAllCallers( 5 ) . "\n" );
+
+               $bytes = floor( $bytes );
+               static $buffer = '';
+               if ( is_null( $this->strong ) ) {
+                       // Set strength to false initially until we know what source data is coming from
+                       $this->strong = true;
+               }
+
+               if ( strlen( $buffer ) < $bytes ) {
+                       // If available make use of mcrypt_create_iv URANDOM source to generate randomness
+                       // On unix-like systems this reads from /dev/urandom but does it without any buffering
+                       // and bypasses openbasedir restrictions, so it's preferable to reading directly
+                       // On Windows starting in PHP 5.3.0 Windows' native CryptGenRandom is used to generate
+                       // entropy so this is also preferable to just trying to read urandom because it may work
+                       // on Windows systems as well.
+                       if ( function_exists( 'mcrypt_create_iv' ) ) {
+                               wfProfileIn( __METHOD__ . '-mcrypt' );
+                               $rem = $bytes - strlen( $buffer );
+                               $iv = mcrypt_create_iv( $rem, MCRYPT_DEV_URANDOM );
+                               if ( $iv === false ) {
+                                       wfDebug( __METHOD__ . ": mcrypt_create_iv returned false.\n" );
+                               } else {
+                                       $buffer .= $iv;
+                                       wfDebug( __METHOD__ . ": mcrypt_create_iv generated " . strlen( $iv ) . " bytes of randomness.\n" );
+                               }
+                               wfProfileOut( __METHOD__ . '-mcrypt' );
+                       }
+               }
+
+               if ( strlen( $buffer ) < $bytes ) {
+                       // If available make use of openssl's random_pseudo_bytes method to attempt to generate randomness.
+                       // However don't do this on Windows with PHP < 5.3.4 due to a bug:
+                       // http://stackoverflow.com/questions/1940168/openssl-random-pseudo-bytes-is-slow-php
+                       // http://git.php.net/?p=php-src.git;a=commitdiff;h=cd62a70863c261b07f6dadedad9464f7e213cad5
+                       if ( function_exists( 'openssl_random_pseudo_bytes' )
+                               && ( !wfIsWindows() || version_compare( PHP_VERSION, '5.3.4', '>=' ) )
+                       ) {
+                               wfProfileIn( __METHOD__ . '-openssl' );
+                               $rem = $bytes - strlen( $buffer );
+                               $openssl_bytes = openssl_random_pseudo_bytes( $rem, $openssl_strong );
+                               if ( $openssl_bytes === false ) {
+                                       wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes returned false.\n" );
+                               } else {
+                                       $buffer .= $openssl_bytes;
+                                       wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes generated " . strlen( $openssl_bytes ) . " bytes of " . ( $openssl_strong ? "strong" : "weak" ) . " randomness.\n" );
+                               }
+                               if ( strlen( $buffer ) >= $bytes ) {
+                                       // openssl tells us if the random source was strong, if some of our data was generated
+                                       // using it use it's say on whether the randomness is strong
+                                       $this->strong = !!$openssl_strong;
+                               }
+                               wfProfileOut( __METHOD__ . '-openssl' );
+                       }
+               }
+
+               // Only read from urandom if we can control the buffer size or were passed forceStrong
+               if ( strlen( $buffer ) < $bytes && ( function_exists( 'stream_set_read_buffer' ) || $forceStrong ) ) {
+                       wfProfileIn( __METHOD__ . '-fopen-urandom' );
+                       $rem = $bytes - strlen( $buffer );
+                       if ( !function_exists( 'stream_set_read_buffer' ) && $forceStrong ) {
+                               wfDebug( __METHOD__ . ": Was forced to read from /dev/urandom without control over the buffer size.\n" );
+                       }
+                       // /dev/urandom is generally considered the best possible commonly
+                       // available random source, and is available on most *nix systems.
+                       wfSuppressWarnings();
+                       $urandom = fopen( "/dev/urandom", "rb" );
+                       wfRestoreWarnings();
+
+                       // Attempt to read all our random data from urandom
+                       // php's fread always does buffered reads based on the stream's chunk_size
+                       // so in reality it will usually read more than the amount of data we're
+                       // asked for and not storing that risks depleting the system's random pool.
+                       // If stream_set_read_buffer is available set the chunk_size to the amount
+                       // of data we need. Otherwise read 8k, php's default chunk_size.
+                       if ( $urandom ) {
+                               // php's default chunk_size is 8k
+                               $chunk_size = 1024 * 8;
+                               if ( function_exists( 'stream_set_read_buffer' ) ) {
+                                       // If possible set the chunk_size to the amount of data we need
+                                       stream_set_read_buffer( $urandom, $rem );
+                                       $chunk_size = $rem;
+                               }
+                               $random_bytes = fread( $urandom, max( $chunk_size, $rem ) );
+                               $buffer .= $random_bytes;
+                               fclose( $urandom );
+                               wfDebug( __METHOD__ . ": /dev/urandom generated " . strlen( $random_bytes ) . " bytes of randomness.\n" );
+                               if ( strlen( $buffer ) >= $bytes ) {
+                                       // urandom is always strong, set to true if all our data was generated using it
+                                       $this->strong = true;
+                               }
+                       } else {
+                               wfDebug( __METHOD__ . ": /dev/urandom could not be opened.\n" );
+                       }
+                       wfProfileOut( __METHOD__ . '-fopen-urandom' );
+               }
+
+               // If we cannot use or generate enough data from a secure source
+               // use this loop to generate a good set of pseudo random data.
+               // This works by initializing a random state using a pile of unstable data
+               // and continually shoving it through a hash along with a variable salt.
+               // We hash the random state with more salt to avoid the state from leaking
+               // out and being used to predict the /randomness/ that follows.
+               if ( strlen( $buffer ) < $bytes ) {
+                       wfDebug( __METHOD__ . ": Falling back to using a pseudo random state to generate randomness.\n" );
+               }
+               while ( strlen( $buffer ) < $bytes ) {
+                       wfProfileIn( __METHOD__ . '-fallback' );
+                       $buffer .= $this->hmac( $this->randomState(), mt_rand() );
+                       // This code is never really cryptographically strong, if we use it
+                       // at all, then set strong to false.
+                       $this->strong = false;
+                       wfProfileOut( __METHOD__ . '-fallback' );
+               }
+
+               // Once the buffer has been filled up with enough random data to fulfill
+               // the request shift off enough data to handle the request and leave the
+               // unused portion left inside the buffer for the next request for random data
+               $generated = substr( $buffer, 0, $bytes );
+               $buffer = substr( $buffer, $bytes );
+
+               wfDebug( __METHOD__ . ": " . strlen( $buffer ) . " bytes of randomness leftover in the buffer.\n" );
+
+               wfProfileOut( __METHOD__ );
+               return $generated;
+       }
+
+       /**
+        * @see self::generateHex()
+        */
+       public function realGenerateHex( $chars, $forceStrong = false ) {
+               // hex strings are 2x the length of raw binary so we divide the length in half
+               // odd numbers will result in a .5 that leads the generate() being 1 character
+               // short, so we use ceil() to ensure that we always have enough bytes
+               $bytes = ceil( $chars / 2 );
+               // Generate the data and then convert it to a hex string
+               $hex = bin2hex( $this->generate( $bytes, $forceStrong ) );
+               // A bit of paranoia here, the caller asked for a specific length of string
+               // here, and it's possible (eg when given an odd number) that we may actually
+               // have at least 1 char more than they asked for. Just in case they made this
+               // call intending to insert it into a database that does truncation we don't
+               // want to give them too much and end up with their database and their live
+               // code having two different values because part of what we gave them is truncated
+               // hence, we strip out any run of characters longer than what we were asked for.
+               return substr( $hex, 0, $chars );
+       }
+
+       /** Publicly exposed static methods **/
+
+       /**
+        * Return a singleton instance of MWCryptRand
+        * @return MWCryptRand
+        */
+       protected static function singleton() {
+               if ( is_null( self::$singleton ) ) {
+                       self::$singleton = new self;
+               }
+               return self::$singleton;
+       }
+
+       /**
+        * Return a boolean indicating whether or not the source used for cryptographic
+        * random bytes generation in the previously run generate* call
+        * was cryptographically strong.
+        *
+        * @return bool Returns true if the source was strong, false if not.
+        */
+       public static function wasStrong() {
+               return self::singleton()->realWasStrong();
+       }
+
+       /**
+        * Generate a run of (ideally) cryptographically random data and return
+        * it in raw binary form.
+        * You can use MWCryptRand::wasStrong() if you wish to know if the source used
+        * was cryptographically strong.
+        *
+        * @param int $bytes the number of bytes of random data to generate
+        * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
+        *                          strong sources of entropy even if reading from them may steal
+        *                          more entropy from the system than optimal.
+        * @return String Raw binary random data
+        */
+       public static function generate( $bytes, $forceStrong = false ) {
+               return self::singleton()->realGenerate( $bytes, $forceStrong );
+       }
+
+       /**
+        * Generate a run of (ideally) cryptographically random data and return
+        * it in hexadecimal string format.
+        * You can use MWCryptRand::wasStrong() if you wish to know if the source used
+        * was cryptographically strong.
+        *
+        * @param int $chars the number of hex chars of random data to generate
+        * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
+        *                          strong sources of entropy even if reading from them may steal
+        *                          more entropy from the system than optimal.
+        * @return String Hexadecimal random data
+        */
+       public static function generateHex( $chars, $forceStrong = false ) {
+               return self::singleton()->realGenerateHex( $chars, $forceStrong );
+       }
+
+}
index 18b79c4..f9457c3 100644 (file)
@@ -138,6 +138,8 @@ class MagicWord {
                'numberofactiveusers',
                'numberofpages',
                'currentversion',
+               'rootpagename',
+               'rootpagenamee',
                'basepagename',
                'basepagenamee',
                'currenttimestamp',
index 24d803b..44fafca 100644 (file)
@@ -642,7 +642,7 @@ class MimeMagic {
                }
 
                /* Look for WebP */
-               if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 8), "WEBPVP8 ", 8 ) == 0 ) {
+               if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 8 ), "WEBPVP8 ", 8 ) == 0 ) {
                        wfDebug( __METHOD__ . ": recognized file as image/webp\n" );
                        return "image/webp";
                }
@@ -815,12 +815,12 @@ class MimeMagic {
                        }
                        wfDebug( __METHOD__ . ": detected an Open Packaging Conventions archive: $mime\n" );
                } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
-                               ($headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
+                               ( $headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
                                preg_match( $openxmlRegex, substr( $tail, $headerpos + 30 ) ) ) {
                        if ( substr( $header, 512, 4 ) == "\xEC\xA5\xC1\x00" ) {
                                $mime = "application/msword";
                        }
-                       switch( substr( $header, 512, 6 ) ) {
+                       switch ( substr( $header, 512, 6 ) ) {
                                case "\xEC\xA5\xC1\x00\x0E\x00":
                                case "\xEC\xA5\xC1\x00\x1C\x00":
                                case "\xEC\xA5\xC1\x00\x43\x00":
@@ -876,9 +876,8 @@ class MimeMagic {
 
                $m = null;
                if ( $wgMimeDetectorCommand ) {
-                       // @todo FIXME: Use wfShellExec
-                       $fn = wfEscapeShellArg( $file );
-                       $m = `$wgMimeDetectorCommand $fn`;
+                       $args = wfEscapeShellArg( $file );
+                       $m = wfShellExec( "$wgMimeDetectorCommand $args" );
                } elseif ( function_exists( "finfo_open" ) && function_exists( "finfo_file" ) ) {
 
                        # This required the fileinfo extension by PECL,
index 38c6f04..2dac938 100644 (file)
@@ -190,9 +190,19 @@ abstract class PoolCounterWork {
        }
 
        /**
-        * Get the result of the work (whatever it is), or false.
+        * Get the result of the work (whatever it is), or the result of the error() function.
+        * This returns the result of the first applicable method that returns a non-false value,
+        * where the methods are checked in the following order:
+        *   - a) doWork()       : Applies if the work is exclusive or no another process
+        *                         is doing it, and on the condition that either this process
+        *                         successfully entered the pool or the pool counter is down.
+        *   - b) doCachedWork() : Applies if the work is cacheable and this blocked on another
+        *                         process which finished the work.
+        *   - c) fallback()     : Applies for all remaining cases.
+        * If these all fall through (by returning false), then the result of error() is returned.
+        *
         * @param $skipcache bool
-        * @return bool|mixed
+        * @return mixed
         */
        public function execute( $skipcache = false ) {
                if ( $this->cacheable && !$skipcache ) {
index faad391..b5d4a1c 100644 (file)
@@ -825,6 +825,29 @@ class RecentChange {
                return ChangesList::showCharacterDifference( $old, $new );
        }
 
+       /**
+        * Purge expired changes from the recentchanges table
+        * @since 1.22
+        */
+       public static function purgeExpiredChanges() {
+               if ( wfReadOnly() ) {
+                       return;
+               }
+
+               $method = __METHOD__;
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+                       global $wgRCMaxAge;
+
+                       $cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
+                       $dbw->delete(
+                               'recentchanges',
+                               array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
+                               $method
+                       );
+               } );
+       }
+
        private static function checkIPAddress( $ip ) {
                global $wgRequest;
                if ( $ip ) {
index 9b9485e..ae65b9d 100644 (file)
@@ -694,7 +694,7 @@ class LegacyTemplate extends BaseTemplate {
 
                if ( $title->isTalkPage() ) {
                        $link = $title->getSubjectPage();
-                       switch( $link->getNamespace() ) {
+                       switch ( $link->getNamespace() ) {
                                case NS_MAIN:
                                        $text = wfMessage( 'articlepage' );
                                        break;
index 17c7808..e53d424 100644 (file)
@@ -1827,7 +1827,7 @@ abstract class BaseTemplate extends QuickTemplate {
        }
 
        function makeSearchButton( $mode, $attrs = array() ) {
-               switch( $mode ) {
+               switch ( $mode ) {
                        case 'go':
                        case 'fulltext':
                                $realAttrs = array(
index 23a4e2b..374d5ca 100644 (file)
@@ -26,6 +26,7 @@
  *
  * @file
  * @ingroup StatCounter
+ * @author Aaron Schulz
  */
 
 /**
@@ -85,6 +86,10 @@ class StatCounter {
                $this->deltas = array();
        }
 
+       /**
+        * @param array $deltas
+        * @return void
+        */
        protected function sendDeltasUDP( array $deltas ) {
                global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
 
@@ -128,6 +133,10 @@ class StatCounter {
                }
        }
 
+       /**
+        * @param array $deltas
+        * @return void
+        */
        protected function sendDeltasMemc( array $deltas ) {
                global $wgMemc;
 
index fda790f..739c52a 100644 (file)
@@ -757,7 +757,7 @@ class Title {
         */
        public function getTalkNsText() {
                global $wgContLang;
-               return( $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) ) );
+               return $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) );
        }
 
        /**
@@ -766,7 +766,7 @@ class Title {
         * @return Bool TRUE or FALSE
         */
        public function canTalk() {
-               return( MWNamespace::canTalk( $this->mNamespace ) );
+               return MWNamespace::canTalk( $this->mNamespace );
        }
 
        /**
@@ -1275,10 +1275,10 @@ class Title {
         */
        public function getSubpageText() {
                if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
-                       return( $this->mTextform );
+                       return $this->mTextform;
                }
                $parts = explode( '/', $this->mTextform );
-               return( $parts[count( $parts ) - 1] );
+               return $parts[count( $parts ) - 1];
        }
 
        /**
@@ -1318,7 +1318,7 @@ class Title {
        public function getSubpageUrlForm() {
                $text = $this->getSubpageText();
                $text = wfUrlencode( str_replace( ' ', '_', $text ) );
-               return( $text );
+               return $text;
        }
 
        /**
@@ -2046,7 +2046,7 @@ class Title {
                        return $errors;
                }
 
-               global $wgContLang, $wgLang, $wgEmailConfirmToEdit;
+               global $wgEmailConfirmToEdit;
 
                if ( $wgEmailConfirmToEdit && !$user->isEmailConfirmed() ) {
                        $errors[] = array( 'confirmedittext' );
@@ -2056,38 +2056,8 @@ class Title {
                        // Don't block the user from editing their own talk page unless they've been
                        // explicitly blocked from that too.
                } elseif ( $user->isBlocked() && $user->mBlock->prevents( $action ) !== false ) {
-                       $block = $user->getBlock();
-
-                       // This is from OutputPage::blockedPage
-                       // Copied at r23888 by werdna
-
-                       $id = $user->blockedBy();
-                       $reason = $user->blockedFor();
-                       if ( $reason == '' ) {
-                               $reason = wfMessage( 'blockednoreason' )->text();
-                       }
-                       $ip = $user->getRequest()->getIP();
-
-                       if ( is_numeric( $id ) ) {
-                               $name = User::whoIs( $id );
-                       } else {
-                               $name = $id;
-                       }
-
-                       $link = '[[' . $wgContLang->getNsText( NS_USER ) . ":{$name}|{$name}]]";
-                       $blockid = $block->getId();
-                       $blockExpiry = $block->getExpiry();
-                       $blockTimestamp = $wgLang->timeanddate( wfTimestamp( TS_MW, $block->mTimestamp ), true );
-                       if ( $blockExpiry == 'infinity' ) {
-                               $blockExpiry = wfMessage( 'infiniteblock' )->text();
-                       } else {
-                               $blockExpiry = $wgLang->timeanddate( wfTimestamp( TS_MW, $blockExpiry ), true );
-                       }
-
-                       $intended = strval( $block->getTarget() );
-
-                       $errors[] = array( ( $block->mAuto ? 'autoblockedtext' : 'blockedtext' ), $link, $reason, $ip, $name,
-                               $blockid, $blockExpiry, $intended, $blockTimestamp );
+                       // @todo FIXME: Pass the relevant context into this function.
+                       $errors[] = $user->getBlock()->getPermissionsError( RequestContext::getMain() );
                }
 
                return $errors;
@@ -4431,7 +4401,7 @@ class Title {
                        return true;  // any interwiki link might be viewable, for all we know
                }
 
-               switch( $this->mNamespace ) {
+               switch ( $this->mNamespace ) {
                        case NS_MEDIA:
                        case NS_FILE:
                                // file exists, possibly in a foreign repo
index e911cb0..dd6407d 100644 (file)
@@ -1974,7 +1974,8 @@ class User {
                        $dbw = wfGetDB( DB_MASTER );
                        $userid = $this->mId;
                        $touched = $this->mTouched;
-                       $dbw->onTransactionIdle( function() use ( $dbw, $userid, $touched ) {
+                       $method = __METHOD__;
+                       $dbw->onTransactionIdle( function() use ( $dbw, $userid, $touched, $method ) {
                                // Prevent contention slams by checking user_touched first
                                $encTouched = $dbw->addQuotes( $dbw->timestamp( $touched ) );
                                $needsPurge = $dbw->selectField( 'user', '1',
@@ -1983,7 +1984,7 @@ class User {
                                        $dbw->update( 'user',
                                                array( 'user_touched' => $dbw->timestamp( $touched ) ),
                                                array( 'user_id' => $userid, 'user_touched < ' . $encTouched ),
-                                               __METHOD__
+                                               $method
                                        );
                                }
                        } );
@@ -2667,6 +2668,9 @@ class User {
                }
                $this->loadGroups();
                $this->mGroups[] = $group;
+               // In case loadGroups was not called before, we now have the right twice.
+               // Get rid of the duplicate.
+               $this->mGroups = array_unique( $this->mGroups );
                $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
 
                $this->invalidateCache();
index 7d0d5af..2fd12d5 100644 (file)
@@ -599,7 +599,7 @@ class MediaWiki {
         * Do a job from the job queue
         */
        private function doJobs() {
-               global $wgJobRunRate;
+               global $wgJobRunRate, $wgPhpCli, $IP;
 
                if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
                        return;
@@ -615,25 +615,36 @@ class MediaWiki {
                        $n = intval( $wgJobRunRate );
                }
 
-               $group = JobQueueGroup::singleton();
-               do {
-                       $job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
-                       if ( $job ) {
-                               $output = $job->toString() . "\n";
-                               $t = - microtime( true );
-                               wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
-                               $success = $job->run();
-                               wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
-                               $group->ack( $job ); // done
-                               $t += microtime( true );
-                               $t = round( $t * 1000 );
-                               if ( $success === false ) {
-                                       $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
-                               } else {
-                                       $output .= "Success, Time: $t ms\n";
+               if ( !wfShellExecDisabled() && is_executable( $wgPhpCli ) ) {
+                       // Start a background process to run some of the jobs.
+                       // This will be asynchronous on *nix though not on Windows.
+                       wfProfileIn( __METHOD__ . '-exec' );
+                       $retVal = 1;
+                       $cmd = wfShellWikiCmd( "$IP/maintenance/runJobs.php", array( '--maxjobs', $n ) );
+                       wfShellExec( "$cmd &", $retVal );
+                       wfProfileOut( __METHOD__ . '-exec' );
+               } else {
+                       // Fallback to running the jobs here while the user waits
+                       $group = JobQueueGroup::singleton();
+                       do {
+                               $job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
+                               if ( $job ) {
+                                       $output = $job->toString() . "\n";
+                                       $t = - microtime( true );
+                                       wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
+                                       $success = $job->run();
+                                       wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
+                                       $group->ack( $job ); // done
+                                       $t += microtime( true );
+                                       $t = round( $t * 1000 );
+                                       if ( $success === false ) {
+                                               $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
+                                       } else {
+                                               $output .= "Success, Time: $t ms\n";
+                                       }
+                                       wfDebugLog( 'jobqueue', $output );
                                }
-                               wfDebugLog( 'jobqueue', $output );
-                       }
-               } while ( --$n && $job );
+                       } while ( --$n && $job );
+               }
        }
 }
index 39a71ad..c2aad76 100644 (file)
@@ -2080,15 +2080,7 @@ class WikiPage implements Page, IDBAccessObject {
                        if ( 0 == mt_rand( 0, 99 ) ) {
                                // Flush old entries from the `recentchanges` table; we do this on
                                // random requests so as to avoid an increase in writes for no good reason
-                               global $wgRCMaxAge;
-
-                               $dbw = wfGetDB( DB_MASTER );
-                               $cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
-                               $dbw->delete(
-                                       'recentchanges',
-                                       array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
-                                       __METHOD__
-                               );
+                               RecentChange::purgeExpiredChanges();
                        }
                }
 
index ee5aa97..c500370 100644 (file)
@@ -966,9 +966,9 @@ abstract class ApiBase extends ContextSource {
                                                }
                                                break;
                                        case 'integer': // Force everything using intval() and optionally validate limits
-                                               $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] )
+                                               $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;
 
                                                if ( is_array( $value ) ) {
index ab60008..e7e5e1d 100644 (file)
@@ -262,7 +262,7 @@ class ApiEditPage extends ApiBase {
                        $requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
                }
 
-               if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) )       {
+               if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) ) {
                        $requestArray['wpMinoredit'] = '';
                }
 
@@ -342,7 +342,7 @@ class ApiEditPage extends ApiBase {
                $wgRequest = $oldRequest;
                global $wgMaxArticleSize;
 
-               switch( $status->value ) {
+               switch ( $status->value ) {
                        case EditPage::AS_HOOK_ERROR:
                        case EditPage::AS_HOOK_ERROR_EXPECTED:
                                $this->dieUsageMsg( 'hookaborted' );
index a11563b..f2a7748 100644 (file)
@@ -93,7 +93,7 @@ class ApiFeedContributions extends ApiBase {
 
        protected function feedItem( $row ) {
                $title = Title::makeTitle( intval( $row->page_namespace ), $row->page_title );
-               if ( $title ) {
+               if( $title && $title->userCan( 'read' ) ) {
                        $date = $row->rev_timestamp;
                        $comments = $title->getTalkPage()->getFullURL();
                        $revision = Revision::newFromRow( $row );
@@ -106,9 +106,8 @@ class ApiFeedContributions extends ApiBase {
                                $this->feedItemAuthor( $revision ),
                                $comments
                        );
-               } else {
-                       return null;
                }
+               return null;
        }
 
        /**
index f9b85ef..4ec149c 100644 (file)
@@ -155,7 +155,7 @@ class ApiFormatXml extends ApiFormatBase {
                                        unset( $elemValue[$subElemId] );
                                } elseif ( is_array( $subElemValue ) ) {
                                        $subElements[$subElemId] = $subElemValue;
-                                       unset ( $elemValue[$subElemId] );
+                                       unset( $elemValue[$subElemId] );
                                }
                        }
 
index 99847cf..dd75d3f 100644 (file)
@@ -609,7 +609,7 @@ class ApiMain extends ApiBase {
 
                $result = $this->getResult();
                // Printer may not be initialized if the extractRequestParams() fails for the main module
-               if ( !isset ( $this->mPrinter ) ) {
+               if ( !isset( $this->mPrinter ) ) {
                        // The printer has not been created yet. Try to manually get formatter value.
                        $value = $this->getRequest()->getVal( 'format', self::API_DEFAULT_FORMAT );
                        if ( !$this->mModuleMgr->isDefined( $value, 'format' ) ) {
index 0645edb..3caf81f 100644 (file)
@@ -188,7 +188,7 @@ class ApiPageSet extends ApiBase {
 
                        if ( !$isDryRun ) {
                                // Populate page information with the original user input
-                               switch( $dataSource ) {
+                               switch ( $dataSource ) {
                                        case 'titles':
                                                $this->initFromTitles( $this->mParams['titles'] );
                                                break;
@@ -407,7 +407,7 @@ class ApiPageSet extends ApiBase {
         * @return array of raw_prefixed_title (string) => prefixed_title (string)
         * @since 1.21
         */
-       public function getNormalizedTitlesAsResult( $result = null  ) {
+       public function getNormalizedTitlesAsResult( $result = null ) {
                $values = array();
                foreach ( $this->getNormalizedTitles() as $rawTitleStr => $titleStr ) {
                        $values[] = array(
index fa2a7c4..881269f 100644 (file)
@@ -121,10 +121,10 @@ class ApiQueryBlocks extends ApiQueryBase {
                        $show = array_flip( $params['show'] );
 
                        /* 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'] ) )
+                       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'] ) )
                        ) {
                                $this->dieUsageMsg( 'show' );
                        }
index 4a53409..690d0e6 100644 (file)
@@ -50,7 +50,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                $fld_user = isset( $prop['user'] );
                $fld_userid = isset( $prop['userid'] );
                $fld_comment = isset( $prop['comment'] );
-               $fld_parsedcomment = isset ( $prop['parsedcomment'] );
+               $fld_parsedcomment = isset( $prop['parsedcomment'] );
                $fld_minor = isset( $prop['minor'] );
                $fld_len = isset( $prop['len'] );
                $fld_sha1 = isset( $prop['sha1'] );
index 33b70a4..eaa2b47 100644 (file)
@@ -49,12 +49,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $this->fld_ids = isset( $prop['ids'] );
                $this->fld_title = isset( $prop['title'] );
                $this->fld_type = isset( $prop['type'] );
-               $this->fld_action = isset ( $prop['action'] );
+               $this->fld_action = isset( $prop['action'] );
                $this->fld_user = isset( $prop['user'] );
                $this->fld_userid = isset( $prop['userid'] );
                $this->fld_timestamp = isset( $prop['timestamp'] );
                $this->fld_comment = isset( $prop['comment'] );
-               $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
+               $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
                $this->fld_details = isset( $prop['details'] );
                $this->fld_tags = isset( $prop['tags'] );
 
index 8aceab2..7cb445d 100644 (file)
@@ -499,7 +499,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        }
                        return $retval;
                }
-               switch( $type ) {
+               switch ( $type ) {
                        case 'edit':
                                return RC_EDIT;
                        case 'new':
index 317b7ba..1d86c97 100644 (file)
@@ -146,17 +146,17 @@ class ApiQueryRevisions extends ApiQueryBase {
                $prop = array_flip( $params['prop'] );
 
                // Optional fields
-               $this->fld_ids = isset ( $prop['ids'] );
+               $this->fld_ids = isset( $prop['ids'] );
                // $this->addFieldsIf('rev_text_id', $this->fld_ids); // should this be exposed?
-               $this->fld_flags = isset ( $prop['flags'] );
-               $this->fld_timestamp = isset ( $prop['timestamp'] );
-               $this->fld_comment = isset ( $prop['comment'] );
-               $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
-               $this->fld_size = isset ( $prop['size'] );
-               $this->fld_sha1 = isset ( $prop['sha1'] );
-               $this->fld_contentmodel = isset ( $prop['contentmodel'] );
+               $this->fld_flags = isset( $prop['flags'] );
+               $this->fld_timestamp = isset( $prop['timestamp'] );
+               $this->fld_comment = isset( $prop['comment'] );
+               $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
+               $this->fld_size = isset( $prop['size'] );
+               $this->fld_sha1 = isset( $prop['sha1'] );
+               $this->fld_contentmodel = isset( $prop['contentmodel'] );
                $this->fld_userid = isset( $prop['userid'] );
-               $this->fld_user = isset ( $prop['user'] );
+               $this->fld_user = isset( $prop['user'] );
                $this->token = $params['token'];
 
                if ( !empty( $params['contentformat'] ) ) {
index 6d20d66..1e013eb 100644 (file)
@@ -48,7 +48,7 @@ class ApiQueryContributions extends ApiQueryBase {
                $this->fld_ids = isset( $prop['ids'] );
                $this->fld_title = isset( $prop['title'] );
                $this->fld_comment = isset( $prop['comment'] );
-               $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
+               $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
                $this->fld_size = isset( $prop['size'] );
                $this->fld_sizediff = isset( $prop['sizediff'] );
                $this->fld_flags = isset( $prop['flags'] );
@@ -255,7 +255,7 @@ class ApiQueryContributions extends ApiQueryBase {
                $this->addFieldsIf( 'rev_comment', $this->fld_comment || $this->fld_parsedcomment );
                $this->addFieldsIf( 'rev_len', $this->fld_size || $this->fld_sizediff );
                $this->addFieldsIf( 'rev_minor_edit', $this->fld_flags );
-               $this->addFieldsIf( 'rev_parent_id', $this->fld_flags || $this->fld_sizediff );
+               $this->addFieldsIf( 'rev_parent_id', $this->fld_flags || $this->fld_sizediff || $this->fld_ids );
                $this->addFieldsIf( 'rc_patrolled', $this->fld_patrolled );
 
                if ( $this->fld_tags ) {
@@ -297,6 +297,10 @@ class ApiQueryContributions extends ApiQueryBase {
                        $vals['pageid'] = intval( $row->rev_page );
                        $vals['revid'] = intval( $row->rev_id );
                        // $vals['textid'] = intval( $row->rev_text_id ); // todo: Should this field be exposed?
+
+                       if ( !is_null( $row->rev_parent_id ) ) {
+                               $vals['parentid'] = intval( $row->rev_parent_id );
+                       }
                }
 
                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
@@ -474,7 +478,11 @@ class ApiQueryContributions extends ApiQueryBase {
                        ),
                        'ids' => array(
                                'pageid' => 'integer',
-                               'revid' => 'integer'
+                               'revid' => 'integer',
+                               'parentid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
                        ),
                        'title' => array(
                                'ns' => 'namespace',
index 491d20f..3ee15f6 100644 (file)
@@ -68,7 +68,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $this->fld_user = isset( $prop['user'] );
                        $this->fld_userid = isset( $prop['userid'] );
                        $this->fld_comment = isset( $prop['comment'] );
-                       $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
+                       $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
                        $this->fld_timestamp = isset( $prop['timestamp'] );
                        $this->fld_sizes = isset( $prop['sizes'] );
                        $this->fld_patrol = isset( $prop['patrol'] );
@@ -143,12 +143,11 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $show = array_flip( $params['show'] );
 
                        /* 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'] ) )
-                       )
-                       {
+                       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'] ) )
+                       ) {
                                $this->dieUsageMsg( 'show' );
                        }
 
index a8d7115..5563087 100644 (file)
@@ -456,7 +456,7 @@ class ApiUpload extends ApiBase {
                global $wgFileExtensions;
 
                // @todo Move them to ApiBase's message map
-               switch( $verification['status'] ) {
+               switch ( $verification['status'] ) {
                        // Recoverable errors
                        case UploadBase::MIN_LENGTH_PARTNAME:
                                $this->dieRecoverableError( 'filename-tooshort', 'filename' );
index 63c9cfe..70fc1f3 100644 (file)
@@ -2966,6 +2966,7 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Run an anonymous function as soon as there is no transaction pending.
         * If there is a transaction and it is rolled back, then the callback is cancelled.
+        * Queries in the function will run in AUTO-COMMIT mode unless there are begin() calls.
         * Callbacks must commit any transactions that they begin.
         *
         * This is useful for updates to different systems or when separate transactions are needed.
index 427fd3d..da719be 100644 (file)
@@ -1049,7 +1049,7 @@ class MssqlResult {
                                $arrNum[] = $value;
                        }
                }
-               switch( $mode ) {
+               switch ( $mode ) {
                        case SQLSRV_FETCH_ASSOC:
                                $ret = $this->mRows[$this->mCursor];
                                break;
index a3f6805..3333f4a 100644 (file)
@@ -677,7 +677,7 @@ class DatabaseOracle extends DatabaseBase {
                Using uppercase because that's the only way Oracle can handle
                quoted tablenames
                */
-               switch( $name ) {
+               switch ( $name ) {
                        case 'user':
                                $name = 'MWUSER';
                                break;
index 704b70e..e12175f 100644 (file)
@@ -915,7 +915,7 @@ __INDEXATTR__;
 
        function tableName( $name, $format = 'quoted' ) {
                # Replace reserved words with better ones
-               switch( $name ) {
+               switch ( $name ) {
                        case 'user':
                                return $this->realTableName( 'mwuser', $format );
                        case 'text':
index e78045a..4435fc6 100644 (file)
@@ -1111,7 +1111,7 @@ class ArrayDiffFormatter extends DiffFormatter {
                $newline = 1;
                $retval = array();
                foreach ( $diff->edits as $edit ) {
-                       switch( $edit->type ) {
+                       switch ( $edit->type ) {
                                case 'add':
                                        foreach ( $edit->closing as $l ) {
                                                $retval[] = array(
index 8bd8376..325c673 100644 (file)
@@ -1663,11 +1663,11 @@ class LocalFile extends File {
        }
 
        /**
-        * @return bool
+        * @return bool Whether to cache in RepoGroup (this avoids OOMs)
         */
        function isCacheable() {
-               $this->load();
-               return strlen( $this->metadata ) <= self::CACHE_FIELD_MAX_LEN; // avoid OOMs
+               $this->load(); // if loaded from cache, metadata will be null if it didn't fit
+               return $this->metadata !== null && strlen( $this->metadata ) <= self::CACHE_FIELD_MAX_LEN;
        }
 
        /**
index c2b74f9..43fb14e 100644 (file)
@@ -336,6 +336,12 @@ The account you specify here must already exist.',
 
 If your MySQL installation supports InnoDB, it is highly recommended that you choose that instead.
 If your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
+       'config-mysql-only-myisam-dep'    => "'''Warning:''' MyISAM is the only available storage engine for MySQL, which is not recommended for use with MediaWiki, because:
+* it barely supports concurrency due to table locking
+* it is more prone to corruption than other engines
+* the MediaWiki codebase does not always handle MyISAM as it should
+
+Your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
        'config-mysql-engine-help'        => "'''InnoDB''' is almost always the best option, since it has good concurrency support.
 
 '''MyISAM''' may be faster in single-user or read-only installations.
@@ -11597,7 +11603,7 @@ Dat heiß, mer moß en affschallde, söns jeiht nix.",
 MediaWiki bruch Funxjohne en däm Modul un deiht et esu nit.
 Wann De <i lang="en">Mandrake</i> aam loufehäs, donn dat Pakätt <code lang="en">php-xml</code> enstalleere.',
        'config-pcre' => 'Dem PHP sing Modul för <i lang="en">PCRE</i> schingk ze fähle.
-MediaWiki deiht et nit ohne de Funxjohne för de <i lang="en">Perl-compatible regular expressions</i>.',
+MediaWiki deiht et nit der ohne de Funxjohne för de rejolähre Ußdrök vun dä Zoot, wi <i lang="en">Perl</i> se kännt.',
        'config-pcre-no-utf8' => "'''Dä:''' Et PHP-Modul <i lang=\"en\">PCRE</i> schingk ohne de <i lang=\"en\">PCRE_UTF8</i>-Aandeile övversaz ze sin.
 MediaWiki bruch dä UTF-8-Krohm ävver, öm ohne Fähler loufe ze künne.",
        'config-memory-raised' => 'Der jrühzte zohjelasse Shpeisherbedarf vum PHP, et <code lang="en">memory_limit</code>, shtund op $1 un es op $2 erop jesaz woode.',
index 35a546c..44a7241 100644 (file)
@@ -970,6 +970,7 @@ abstract class Installer {
 
        /**
         * Environment check for setting the preferred PHP file extension.
+        * @return bool
         */
        protected function envCheckExtension() {
                // @todo FIXME: Detect this properly
@@ -983,7 +984,7 @@ abstract class Installer {
        }
 
        /**
-        * TODO: document
+        * Environment check for preferred locale in shell
         * @return bool
         */
        protected function envCheckShellLocale() {
@@ -1057,7 +1058,7 @@ abstract class Installer {
        }
 
        /**
-        * TODO: document
+        * Environment check for the permissions of the uploads directory
         * @return bool
         */
        protected function envCheckUploadsDirectory() {
index d3dfc83..cd7e53c 100644 (file)
@@ -222,7 +222,7 @@ class LocalSettingsGenerator {
                        }
                }
 
-               switch( $this->values['wgMainCacheType'] ) {
+               switch ( $this->values['wgMainCacheType'] ) {
                        case 'anything':
                        case 'db':
                        case 'memcached':
index d550909..84638d4 100644 (file)
@@ -350,7 +350,11 @@ class MysqlInstaller extends DatabaseInstaller {
                $s .= Xml::openElement( 'div', array(
                        'id' => 'dbMyisamWarning'
                ));
-               $s .= $this->parent->getWarningBox( wfMessage( 'config-mysql-myisam-dep' )->text() );
+               $myisamWarning = 'config-mysql-myisam-dep';
+               if ( count( $engines ) === 1 ) {
+                       $myisamWarning = 'config-mysql-only-myisam-dep';
+               }
+               $s .= $this->parent->getWarningBox( wfMessage( $myisamWarning )->text() );
                $s .= Xml::closeElement( 'div' );
 
                if ( $this->getVar( '_MysqlEngine' ) != 'MyISAM' ) {
index e8e0385..6f4f6d9 100644 (file)
@@ -292,7 +292,7 @@ class JobQueueDB extends JobQueue {
                        $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
                        if ( !$title ) {
                                $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-                               wfDebugLog( 'JobQueueDB', "Row has invalid title '{$row->job_title}'." );
+                               wfDebug( "Row has invalid title '{$row->job_title}'." );
                                continue; // try again
                        }
                        $job = Job::factory( $row->job_cmd, $title,
@@ -434,7 +434,7 @@ class JobQueueDB extends JobQueue {
                                        array( 'job_cmd' => $this->type, 'job_token' => $uuid ), __METHOD__
                                );
                                if ( !$row ) { // raced out by duplicate job removal
-                                       wfDebugLog( 'JobQueueDB', "Row deleted as duplicate by another process." );
+                                       wfDebug( "Row deleted as duplicate by another process." );
                                }
                        } else {
                                break; // nothing to do
@@ -689,7 +689,8 @@ class JobQueueDB extends JobQueue {
         */
        private function getCacheKey( $property ) {
                list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
+               $cluster = is_string( $this->cluster ) ? $this->cluster : 'main';
+               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $cluster, $this->type, $property );
        }
 
        /**
index 7a5d113..b517d55 100644 (file)
@@ -212,7 +212,7 @@ class JobQueueFederated extends JobQueue {
                $partitionRing = new HashRing( $partitionsTry );
                // Because jobs are spread across partitions, per-job de-duplication needs
                // to use a consistent hash to avoid allowing duplicate jobs per partition.
-               // When inserting a batch of de-duplicated jobs, QoS_Atomic is disregarded.
+               // When inserting a batch of de-duplicated jobs, QOS_ATOMIC is disregarded.
                $uJobsByPartition = array(); // (partition name => job list)
                foreach ( $jobs as $key => $job ) {
                        if ( $job->ignoreDuplicates() ) {
@@ -222,7 +222,7 @@ class JobQueueFederated extends JobQueue {
                        }
                }
                // Get the batches of jobs that are not de-duplicated
-               if ( $flags & self::QoS_Atomic ) {
+               if ( $flags & self::QOS_ATOMIC ) {
                        $nuJobBatches = array( $jobs ); // all or nothing
                } else {
                        // Split the jobs into batches and spread them out over servers if there
index 27526f5..8f60aee 100644 (file)
@@ -194,9 +194,9 @@ class LogFormatter {
                // Text of title the action is aimed at.
                $target = $entry->getTarget()->getPrefixedText();
                $text = null;
-               switch( $entry->getType() ) {
+               switch ( $entry->getType() ) {
                        case 'move':
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                        case 'move':
                                                $movesource = $parameters['4::target'];
                                                $text = wfMessage( '1movedto2' )
@@ -215,7 +215,7 @@ class LogFormatter {
                                break;
 
                        case 'delete':
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                        case 'delete':
                                                $text = wfMessage( 'deletedarticle' )
                                                        ->rawParams( $target )->inContentLanguage()->escaped();
@@ -246,7 +246,7 @@ class LogFormatter {
                                break;
 
                        case 'protect':
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                case 'protect':
                                        $text = wfMessage( 'protectedarticle' )
                                                ->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
@@ -263,7 +263,7 @@ class LogFormatter {
                                break;
 
                        case 'newusers':
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                        case 'newusers':
                                        case 'create':
                                                $text = wfMessage( 'newuserlog-create-entry' )
@@ -282,7 +282,7 @@ class LogFormatter {
                                break;
 
                        case 'upload':
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                        case 'upload':
                                                $text = wfMessage( 'uploadedimage' )
                                                        ->rawParams( $target )->inContentLanguage()->escaped();
@@ -305,7 +305,7 @@ class LogFormatter {
                                } else {
                                        $newgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
                                }
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                        case 'rights':
                                                $text = wfMessage( 'rightslogentry' )
                                                        ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
@@ -479,7 +479,7 @@ class LogFormatter {
        protected function formatParameterValue( $type, $value ) {
                $saveLinkFlood = $this->linkFlood;
 
-               switch( strtolower( trim( $type ) ) ) {
+               switch ( strtolower( trim( $type ) ) ) {
                        case 'raw':
                                $value = Message::rawParam( $value );
                                break;
index 3fe91fc..9d6ab25 100644 (file)
@@ -331,7 +331,7 @@ class LogPage {
                        return $title->getPrefixedText();
                }
 
-               switch( $type ) {
+               switch ( $type ) {
                        case 'move':
                                $titleLink = Linker::link(
                                        $title,
index 555a414..7c39c81 100644 (file)
@@ -292,7 +292,7 @@ class BitmapMetadataHandler {
                $head = fread( $fh, 2 );
                fclose( $fh );
 
-               switch( $head ) {
+               switch ( $head ) {
                        case 'II':
                                return 'LE'; // II for intel.
                        case 'MM':
index 6058f45..d7c45d3 100644 (file)
@@ -394,7 +394,7 @@ class Exif {
                //ComponentsConfiguration should really be an array instead of a string...
                //This turns a string of binary numbers into an array of numbers.
 
-               if ( isset ( $this->mFilteredExifData['ComponentsConfiguration'] ) ) {
+               if ( isset( $this->mFilteredExifData['ComponentsConfiguration'] ) ) {
                        $val = $this->mFilteredExifData['ComponentsConfiguration'];
                        $ccVals = array();
                        for ( $i = 0; $i < strlen( $val ); $i++ ) {
@@ -411,7 +411,7 @@ class Exif {
                //Also change exif tag name from GPSVersion (what php exif thinks it is)
                //to GPSVersionID (what the exif standard thinks it is).
 
-               if ( isset ( $this->mFilteredExifData['GPSVersion'] ) ) {
+               if ( isset( $this->mFilteredExifData['GPSVersion'] ) ) {
                        $val = $this->mFilteredExifData['GPSVersion'];
                        $newVal = '';
                        for ( $i = 0; $i < strlen( $val ); $i++ ) {
@@ -758,7 +758,7 @@ class Exif {
                        return true;
                }
                // Does not work if not typecast
-               switch( (string)$etype ) {
+               switch ( (string)$etype ) {
                        case (string)Exif::BYTE:
                                $this->debug( $val, __FUNCTION__, $debug );
                                return $this->isByte( $val );
index 3d153eb..276af4d 100644 (file)
@@ -127,9 +127,9 @@ class FormatMetadata {
 
                        foreach ( $vals as &$val ) {
 
-                               switch( $tag ) {
+                               switch ( $tag ) {
                                case 'Compression':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1: case 2: case 3: case 4:
                                        case 5: case 6: case 7: case 8:
                                        case 32773: case 32946: case 34712:
@@ -142,7 +142,7 @@ class FormatMetadata {
                                        break;
 
                                case 'PhotometricInterpretation':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 2: case 6:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -153,7 +153,7 @@ class FormatMetadata {
                                        break;
 
                                case 'Orientation':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -164,7 +164,7 @@ class FormatMetadata {
                                        break;
 
                                case 'PlanarConfiguration':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1: case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -189,7 +189,7 @@ class FormatMetadata {
 
                                case 'XResolution':
                                case 'YResolution':
-                                       switch( $resolutionunit ) {
+                                       switch ( $resolutionunit ) {
                                                case 2:
                                                        $val = self::msg( 'XYResolution', 'i', self::formatNum( $val ) );
                                                        break;
@@ -208,7 +208,7 @@ class FormatMetadata {
                                        break;
 
                                case 'ColorSpace':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1: case 65535:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -219,7 +219,7 @@ class FormatMetadata {
                                        break;
 
                                case 'ComponentsConfiguration':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3: case 4: case 5: case 6:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -267,7 +267,7 @@ class FormatMetadata {
                                        break;
 
                                case 'ExposureProgram':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -282,7 +282,7 @@ class FormatMetadata {
                                        break;
 
                                case 'MeteringMode':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 255:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -293,7 +293,7 @@ class FormatMetadata {
                                        break;
 
                                case 'LightSource':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3: case 4: case 9: case 10: case 11:
                                        case 12: case 13: case 14: case 15: case 17: case 18: case 19: case 20:
                                        case 21: case 22: case 23: case 24: case 255:
@@ -328,7 +328,7 @@ class FormatMetadata {
                                        break;
 
                                case 'FocalPlaneResolutionUnit':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -339,7 +339,7 @@ class FormatMetadata {
                                        break;
 
                                case 'SensingMethod':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1: case 2: case 3: case 4: case 5: case 7: case 8:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -350,7 +350,7 @@ class FormatMetadata {
                                        break;
 
                                case 'FileSource':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 3:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -361,7 +361,7 @@ class FormatMetadata {
                                        break;
 
                                case 'SceneType':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -372,7 +372,7 @@ class FormatMetadata {
                                        break;
 
                                case 'CustomRendered':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -383,7 +383,7 @@ class FormatMetadata {
                                        break;
 
                                case 'ExposureMode':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -394,7 +394,7 @@ class FormatMetadata {
                                        break;
 
                                case 'WhiteBalance':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -405,7 +405,7 @@ class FormatMetadata {
                                        break;
 
                                case 'SceneCaptureType':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -416,7 +416,7 @@ class FormatMetadata {
                                        break;
 
                                case 'GainControl':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3: case 4:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -427,7 +427,7 @@ class FormatMetadata {
                                        break;
 
                                case 'Contrast':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -438,7 +438,7 @@ class FormatMetadata {
                                        break;
 
                                case 'Saturation':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -449,7 +449,7 @@ class FormatMetadata {
                                        break;
 
                                case 'Sharpness':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -460,7 +460,7 @@ class FormatMetadata {
                                        break;
 
                                case 'SubjectDistanceRange':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -473,7 +473,7 @@ class FormatMetadata {
                                //The GPS...Ref values are kept for compatibility, probably won't be reached.
                                case 'GPSLatitudeRef':
                                case 'GPSDestLatitudeRef':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'N': case 'S':
                                                $val = self::msg( 'GPSLatitude', $val );
                                                break;
@@ -485,7 +485,7 @@ class FormatMetadata {
 
                                case 'GPSLongitudeRef':
                                case 'GPSDestLongitudeRef':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'E': case 'W':
                                                $val = self::msg( 'GPSLongitude', $val );
                                                break;
@@ -504,7 +504,7 @@ class FormatMetadata {
                                        break;
 
                                case 'GPSStatus':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'A': case 'V':
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -515,7 +515,7 @@ class FormatMetadata {
                                        break;
 
                                case 'GPSMeasureMode':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 2: case 3:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -528,7 +528,7 @@ class FormatMetadata {
                                case 'GPSTrackRef':
                                case 'GPSImgDirectionRef':
                                case 'GPSDestBearingRef':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'T': case 'M':
                                                $val = self::msg( 'GPSDirection', $val );
                                                break;
@@ -548,7 +548,7 @@ class FormatMetadata {
                                        break;
 
                                case 'GPSSpeedRef':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'K': case 'M': case 'N':
                                                $val = self::msg( 'GPSSpeed', $val );
                                                break;
@@ -559,7 +559,7 @@ class FormatMetadata {
                                        break;
 
                                case 'GPSDestDistanceRef':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'K': case 'M': case 'N':
                                                $val = self::msg( 'GPSDestDistance', $val );
                                                break;
@@ -646,7 +646,7 @@ class FormatMetadata {
                                        break;
 
                                case 'iimCategory':
-                                       switch( strtolower( $val ) ) {
+                                       switch ( strtolower( $val ) ) {
                                                // See pg 29 of IPTC photo
                                                // metadata standard.
                                                case 'ace': case 'clj':
@@ -791,7 +791,7 @@ class FormatMetadata {
                                        }
                                        break;
                                case 'Copyrighted':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'True': case 'False':
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -863,7 +863,7 @@ class FormatMetadata {
                 */
                else {
                        global $wgContLang;
-                       switch( $type ) {
+                       switch ( $type ) {
                        case 'lang':
                                // Display default, followed by ContLang,
                                // followed by the rest in no particular
@@ -948,7 +948,7 @@ class FormatMetadata {
         * this is treated as wikitext not html).
         */
        private static function langItem( $value, $lang, $default = false, $noHtml = false ) {
-               if ( $lang === false && $default === false) {
+               if ( $lang === false && $default === false ) {
                        throw new MWException( '$lang and $default cannot both '
                                . 'be false.' );
                }
@@ -1125,7 +1125,7 @@ class FormatMetadata {
                        return $val;
                }
                $cat = '';
-               switch( substr( $val, 0, 2 ) ) {
+               switch ( substr( $val, 0, 2 ) ) {
                        case '01':
                                $cat = 'ace';
                                break;
index 6e04b3d..544dd21 100644 (file)
@@ -63,7 +63,7 @@ class IPTC {
                                wfDebugLog( 'iptc', "IPTC tag $tag had only whitespace as its value." );
                                continue;
                        }
-                       switch( $tag ) {
+                       switch ( $tag ) {
                                case '2#120': /*IPTC caption. mapped with exif ImageDescription*/
                                        $data['ImageDescription'] = self::convIPTC( $val, $c );
                                        break;
index c9a20f2..948a0f8 100644 (file)
@@ -144,7 +144,7 @@ class SVGReader {
                while ( $keepReading ) {
                        $tag = $this->reader->localName;
                        $type = $this->reader->nodeType;
-                       $isSVG = ($this->reader->namespaceURI == self::NS_SVG);
+                       $isSVG = ( $this->reader->namespaceURI == self::NS_SVG );
 
                        $this->debug( "$tag" );
 
@@ -241,7 +241,7 @@ class SVGReader {
                                && $this->reader->nodeType == XmlReader::END_ELEMENT ) {
                                break;
                        } elseif ( $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::ELEMENT ) {
-                               switch( $this->reader->localName ) {
+                               switch ( $this->reader->localName ) {
                                        case 'script':
                                                // Normally we disallow files with
                                                // <script>, but its possible
index b2b95e4..7eb3d19 100644 (file)
@@ -641,7 +641,7 @@ class XMPReader {
                        throw new MWException( "Hit end element </$elm> but no curItem" );
                }
 
-               switch( $this->mode[0] ) {
+               switch ( $this->mode[0] ) {
                        case self::MODE_IGNORE:
                                $this->endElementModeIgnore( $elm );
                                break;
@@ -1060,7 +1060,7 @@ class XMPReader {
                                . "encountered <$elm> with no mode" );
                }
 
-               switch( $this->mode[0] ) {
+               switch ( $this->mode[0] ) {
                        case self::MODE_IGNORE:
                                $this->startElementModeIgnore( $elm );
                                break;
index f9feaf9..e1dc42e 100644 (file)
@@ -140,7 +140,13 @@ class RedisBagOStuff extends BagOStuff {
                                $conn->setex( $key, $expiry, $value );
                        }
 
-                       $result = $conn->exec();
+                       /*
+                        * multi()/exec() (transactional mode) allows multiple values to
+                        * be set/get at once and will return an array of results, in
+                        * the order they were set/get. In this case, we only set 1
+                        * value, which should (in case of success) result in true.
+                        */
+                       $result = ( $conn->exec() == array( true ) );
                } catch ( RedisException $e ) {
                        $result = false;
                        $this->handleException( $server, $conn, $e );
index 5b02e19..e6342e4 100644 (file)
@@ -88,6 +88,8 @@ class CoreParserFunctions {
                $parser->setFunctionHook( 'pagenamee',        array( __CLASS__, 'pagenamee'        ), SFH_NO_HASH );
                $parser->setFunctionHook( 'fullpagename',     array( __CLASS__, 'fullpagename'     ), SFH_NO_HASH );
                $parser->setFunctionHook( 'fullpagenamee',    array( __CLASS__, 'fullpagenamee'    ), SFH_NO_HASH );
+               $parser->setFunctionHook( 'rootpagename',     array( __CLASS__, 'rootpagename'     ), SFH_NO_HASH );
+               $parser->setFunctionHook( 'rootpagenamee',    array( __CLASS__, 'rootpagenamee'    ), SFH_NO_HASH );
                $parser->setFunctionHook( 'basepagename',     array( __CLASS__, 'basepagename'     ), SFH_NO_HASH );
                $parser->setFunctionHook( 'basepagenamee',    array( __CLASS__, 'basepagenamee'    ), SFH_NO_HASH );
                $parser->setFunctionHook( 'subpagename',      array( __CLASS__, 'subpagename'      ), SFH_NO_HASH );
@@ -185,7 +187,7 @@ class CoreParserFunctions {
                if ( is_null( $magicWords ) ) {
                        $magicWords = new MagicWordArray( array( 'url_path', 'url_query', 'url_wiki' ) );
                }
-               switch( $magicWords->matchStartToEnd( $arg ) ) {
+               switch ( $magicWords->matchStartToEnd( $arg ) ) {
 
                        // Encode as though it's a wiki page, '_' for ' '.
                        case 'url_wiki':
@@ -438,7 +440,7 @@ class CoreParserFunctions {
        static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
                return self::formatRaw( SiteStats::pagesInNs( intval( $namespace ) ), $raw );
        }
-       static function numberingroup( $parser, $name = '', $raw = null) {
+       static function numberingroup( $parser, $name = '', $raw = null ) {
                return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
        }
 
@@ -546,6 +548,20 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getSubpageUrlForm() );
        }
+       static function rootpagename( $parser, $title = null ) {
+               $t = Title::newFromText( $title );
+               if ( is_null( $t ) ) {
+                       return '';
+               }
+               return wfEscapeWikiText( $t->getRootText() );
+       }
+       static function rootpagenamee( $parser, $title = null ) {
+               $t = Title::newFromText( $title );
+               if ( is_null( $t ) ) {
+                       return '';
+               }
+               return wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $t->getRootText() ) ) );
+       }
        static function basepagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -818,9 +834,9 @@ class CoreParserFunctions {
                if ( $old === false || $old == $text || $arg ) {
                        return '';
                } else {
-                       return( '<span class="error">' .
+                       return '<span class="error">' .
                                wfMessage( 'duplicate-defaultsort', $old, $text )->inContentLanguage()->escaped() .
-                               '</span>' );
+                               '</span>';
                }
        }
 
index c5dd09b..0a69b04 100644 (file)
@@ -156,10 +156,10 @@ class DateFormatter {
                }
                for ( $i = 1; $i <= self::LAST; $i++ ) {
                        $this->mSource = $i;
-                       if ( isset ( $this->rules[$preference][$i] ) ) {
+                       if ( isset( $this->rules[$preference][$i] ) ) {
                                # Specific rules
                                $this->mTarget = $this->rules[$preference][$i];
-                       } elseif ( isset ( $this->rules[self::ALL][$i] ) ) {
+                       } elseif ( isset( $this->rules[self::ALL][$i] ) ) {
                                # General rules
                                $this->mTarget = $this->rules[self::ALL][$i];
                        } elseif ( $preference ) {
@@ -357,7 +357,7 @@ class DateFormatter {
         */
        function makeNormalYear( $iso ) {
                if ( $iso[0] == '-' ) {
-                       $text = (intval( substr( $iso, 1 ) ) + 1) . ' BC';
+                       $text = ( intval( substr( $iso, 1 ) ) + 1 ) . ' BC';
                } else {
                        $text = intval( $iso );
                }
index b51ef38..47a09c4 100644 (file)
@@ -2510,10 +2510,10 @@ class Parser {
                for ( $i = 0; $i < $len; $i++ ) {
                        $c = $str[$i];
 
-                       switch( $state ) {
+                       switch ( $state ) {
                        # (Using the number is a performance hack for common cases)
                        case 0: # self::COLON_STATE_TEXT:
-                               switch( $c ) {
+                               switch ( $c ) {
                                case "<":
                                        # Could be either a <start> tag or an </end> tag
                                        $state = self::COLON_STATE_TAGSTART;
@@ -2558,7 +2558,7 @@ class Parser {
                                break;
                        case 1: # self::COLON_STATE_TAG:
                                # In a <tag>
-                               switch( $c ) {
+                               switch ( $c ) {
                                case ">":
                                        $stack++;
                                        $state = self::COLON_STATE_TEXT;
@@ -2572,7 +2572,7 @@ class Parser {
                                }
                                break;
                        case 2: # self::COLON_STATE_TAGSTART:
-                               switch( $c ) {
+                               switch ( $c ) {
                                case "/":
                                        $state = self::COLON_STATE_CLOSETAG;
                                        break;
@@ -2762,6 +2762,12 @@ class Parser {
                        case 'subpagenamee':
                                $value = wfEscapeWikiText( $this->mTitle->getSubpageUrlForm() );
                                break;
+                       case 'rootpagename':
+                               $value = wfEscapeWikiText( $this->mTitle->getRootText() );
+                               break;
+                       case 'rootpagenamee':
+                               $value = wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getRootText() ) ) );
+                               break;
                        case 'basepagename':
                                $value = wfEscapeWikiText( $this->mTitle->getBaseText() );
                                break;
@@ -4664,7 +4670,7 @@ class Parser {
         * @return mixed An expanded string, or false if invalid.
         */
        function validateSig( $text ) {
-               return( Xml::isWellFormedXmlFragment( $text ) ? $text : false );
+               return Xml::isWellFormedXmlFragment( $text ) ? $text : false;
        }
 
        /**
@@ -5230,7 +5236,7 @@ class Parser {
                                                $validated = $handler->validateParam( $paramName, $value );
                                        } else {
                                                # Validate internal parameters
-                                               switch( $paramName ) {
+                                               switch ( $paramName ) {
                                                case 'manualthumb':
                                                case 'alt':
                                                case 'class':
index 4ea7dd4..809e7f7 100644 (file)
@@ -148,21 +148,19 @@ class Preprocessor_DOM implements Preprocessor {
                                        wfDebugLog( "Preprocessor", "Loaded preprocessor XML from memcached (key $cacheKey)" );
                                }
                        }
-               }
-               if ( $xml === false ) {
-                       if ( $cacheable ) {
+                       if ( $xml === false ) {
                                wfProfileIn( __METHOD__ . '-cache-miss' );
                                $xml = $this->preprocessToXml( $text, $flags );
                                $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . $xml;
                                $wgMemc->set( $cacheKey, $cacheValue, 86400 );
                                wfProfileOut( __METHOD__ . '-cache-miss' );
                                wfDebugLog( "Preprocessor", "Saved preprocessor XML to memcached (key $cacheKey)" );
-                       } else {
-                               $xml = $this->preprocessToXml( $text, $flags );
                        }
-
+               } else {
+                       $xml = $this->preprocessToXml( $text, $flags );
                }
 
+
                // Fail if the number of elements exceeds acceptable limits
                // Do not attempt to generate the DOM
                $this->parser->mGeneratedPPNodeCount += substr_count( $xml, '<' );
index de9e99c..13e8a00 100644 (file)
@@ -93,7 +93,7 @@ class SearchEngine {
         * @return Boolean
         */
        public function supports( $feature ) {
-               switch( $feature ) {
+               switch ( $feature ) {
                case 'list-redirects':
                        return true;
                case 'title-suffix-filter':
index f63931d..c219b92 100644 (file)
@@ -211,7 +211,7 @@ class SearchMySQL extends SearchEngine {
        }
 
        public function supports( $feature ) {
-               switch( $feature ) {
+               switch ( $feature ) {
                case 'list-redirects':
                case 'title-suffix-filter':
                        return true;
index a0351a4..52261c9 100644 (file)
@@ -388,7 +388,7 @@ class SpecialContributions extends SpecialPage {
                }
 
                if ( !isset( $this->opts['year'] ) ) {
-                       $this->opts['year'] = '';
+                       $this->opts['year'] = gmdate( 'Y' );
                }
 
                if ( !isset( $this->opts['month'] ) ) {
index b2b2946..4da5155 100644 (file)
@@ -57,7 +57,7 @@ class SpecialUnblock extends SpecialPage {
                $form->addPreText( $this->msg( 'unblockiptext' )->parseAsBlock() );
 
                if ( $form->show() ) {
-                       switch( $this->type ) {
+                       switch ( $this->type ) {
                                case Block::TYPE_USER:
                                case Block::TYPE_IP:
                                        $out->addWikiMsg( 'unblocked', wfEscapeWikiText( $this->target ) );
@@ -106,7 +106,7 @@ class SpecialUnblock extends SpecialPage {
                        } else {
                                $fields['Target']['default'] = $target;
                                $fields['Target']['type'] = 'hidden';
-                               switch( $type ) {
+                               switch ( $type ) {
                                        case Block::TYPE_USER:
                                        case Block::TYPE_IP:
                                                $fields['Name']['default'] = Linker::link(
index 6fb133a..ee737c6 100644 (file)
@@ -530,7 +530,7 @@ class SpecialUpload extends SpecialPage {
        protected function processVerificationError( $details ) {
                global $wgFileExtensions;
 
-               switch( $details['status'] ) {
+               switch ( $details['status'] ) {
 
                        /** Statuses that only require name changing **/
                        case UploadBase::MIN_LENGTH_PARTNAME:
index f7e4d0a..bb57e6c 100644 (file)
@@ -973,6 +973,29 @@ class LoginForm extends SpecialPage {
                );
        }
 
+       /**
+        * Add a "return to" link or redirect to it.
+        * Extensions can use this to reuse the "return to" logic after
+        * inject steps (such as redirection) into the login process.
+        *
+        * @param $type string, one of the following:
+        *    - error: display a return to link ignoring $wgRedirectOnLogin
+        *    - success: display a return to link using $wgRedirectOnLogin if needed
+        *    - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
+        * @param string $returnTo
+        * @param array|string $returnToQuery
+        * @param bool $stickHTTPs Keep redirect link on HTTPs
+        * @since 1.22
+        */
+       public function showReturnToPage(
+               $type, $returnTo = '', $returnToQuery = '', $stickHTTPs = false
+       ) {
+               $this->mReturnTo = $returnTo;
+               $this->mReturnToQuery = $returnToQuery;
+               $this->mStickHTTPS = $stickHTTPs;
+               $this->executeReturnTo( $type );
+       }
+
        /**
         * Add a "return to" link or redirect to it.
         *
@@ -1023,10 +1046,10 @@ class LoginForm extends SpecialPage {
         * @return Boolean
         */
        private function shouldShowVForm() {
-               global $wgUseVFormUserLogin;
+               global $wgUseVFormCreateAccount, $wgUseVFormUserLogin;
 
                if ( $this->mType == 'signup' ) {
-                       return false;
+                       return $this->mRequest->getBool( 'useNew', $wgUseVFormCreateAccount );
                } else {
                        return $this->mRequest->getBool( 'useNew', $wgUseVFormUserLogin );
                }
@@ -1070,11 +1093,24 @@ class LoginForm extends SpecialPage {
                }
 
                if ( $this->mType == 'signup' ) {
-                       $template = new UsercreateTemplate();
+                       $out->addModules( 'mediawiki.special.userlogin.signup' );
+                       if ( $this->mShowVForm ) {
+                               $template = new UsercreateTemplateVForm();
+                               $out->addModuleStyles( array(
+                                       'mediawiki.ui',
+                                       'mediawiki.special.createaccount.vform'
+                               ) );
+                               // XXX hack pending RL or JS parse() support for complex content messages
+                               // https://bugzilla.wikimedia.org/show_bug.cgi?id=25349
+                               $out->addJsConfigVars( 'wgCreateacctImgcaptchaHelp',
+                                       $this->msg( 'createacct-imgcaptcha-help' )->parse() );
+                               $out->addModules( 'mediawiki.special.createaccount.vform.js' );
+                       } else {
+                               $template = new UsercreateTemplate();
+                       }
                        $q = 'action=submitlogin&type=signup';
                        $linkq = 'type=login';
                        $linkmsg = 'gotaccount';
-                       $out->addModules( 'mediawiki.special.userlogin.signup' );
                } else {
                        if ( $this->mShowVForm ) {
                                $template = new UserloginTemplateVForm();
index b01058a..c257dd4 100644 (file)
@@ -515,9 +515,9 @@ class SpecialVersion extends SpecialPage {
                }
 
                # Make description text.
-               $description = isset ( $extension['description'] ) ? $extension['description'] : '';
+               $description = isset( $extension['description'] ) ? $extension['description'] : '';
 
-               if ( isset ( $extension['descriptionmsg'] ) ) {
+               if ( isset( $extension['descriptionmsg'] ) ) {
                        # Look for a localized description.
                        $descriptionMsg = $extension['descriptionmsg'];
 
@@ -540,7 +540,7 @@ class SpecialVersion extends SpecialPage {
                                <td colspan=\"2\"><em>$mainLink $versionText</em></td>";
                }
 
-               $author = isset ( $extension['author'] ) ? $extension['author'] : array();
+               $author = isset( $extension['author'] ) ? $extension['author'] : array();
                $extDescAuthor = "<td>$description</td>
                        <td>" . $this->listAuthors( $author, false ) . "</td>
                        </tr>\n";
index ff4313f..0296a63 100644 (file)
@@ -76,7 +76,7 @@ class SpecialWatchlist extends SpecialPage {
                $mode = SpecialEditWatchlist::getMode( $request, $par );
                if ( $mode !== false ) {
                        # TODO: localise?
-                       switch( $mode ) {
+                       switch ( $mode ) {
                                case SpecialEditWatchlist::EDIT_CLEAR:
                                        $mode = 'clear';
                                        break;
@@ -163,7 +163,7 @@ class SpecialWatchlist extends SpecialPage {
                        $big = 1000; /* The magical big */
                        if ( $nitems > $big ) {
                                # Set default cutoff shorter
-                               $values['days'] = $defaults['days'] = (12.0 / 24.0); # 12 hours...
+                               $values['days'] = $defaults['days'] = ( 12.0 / 24.0 ); # 12 hours...
                        } else {
                                $values['days'] = $defaults['days']; # default cutoff for shortlisters
                        }
diff --git a/includes/templates/UsercreateVForm.php b/includes/templates/UsercreateVForm.php
new file mode 100644 (file)
index 0000000..0366aef
--- /dev/null
@@ -0,0 +1,291 @@
+<?php
+/**
+ * Html form for account creation with new VForm appearance.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Templates
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+       die( -1 );
+}
+
+/**
+ * Html form for create account with new VForm appearance.
+ *
+ * @since 1.22
+ */
+class UsercreateTemplateVForm extends BaseTemplate {
+
+       /**
+        * Extensions (AntiSpoof and TitleBlacklist) call this in response to
+        * UserCreateForm hook to add checkboxes to the create account form.
+        */
+       function addInputItem( $name, $value, $type, $msg, $helptext = false ) {
+               $this->data['extraInput'][] = array(
+                       'name' => $name,
+                       'value' => $value,
+                       'type' => $type,
+                       'msg' => $msg,
+                       'helptext' => $helptext,
+               );
+       }
+
+       function execute() {
+               global $wgCookieExpiration;
+               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
+?>
+<div class="mw-ui-container">
+       <?php
+       if ( $this->haveData( 'languages' ) ) {
+       ?>
+               <div id="languagelinks">
+                       <p><?php $this->html( 'languages' ); ?></p>
+               </div>
+       <?php
+       }
+       ?>
+<div id="userloginForm">
+<h2 class="createaccount-join"><?php $this->msg( 'createacct-join' ); ?></h2>
+<form name="userlogin2" id="userlogin2" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
+       <section class="mw-form-header">
+               <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+       </section>
+       <?php
+       if ( $this->data['message'] ) {
+?>
+               <div class="<?php $this->text( 'messagetype' ); ?>box">
+               <?php if ( $this->data['messagetype'] == 'error' ) { ?>
+                       <strong><?php $this->msg( 'createacct-error' ); ?></strong><br />
+               <?php } ?>
+               <?php $this->html( 'message' ); ?>
+               </div>
+       <?php } ?>
+               <div>
+                       <label for='wpName2'>
+                               <?php $this->msg( 'userlogin-yourname' ); ?>
+
+                               <span class="mw-ui-flush-right"><?php echo $this->getMsg( 'createacct-helpusername-link' )->parse(); ?></span>
+                       </label>
+                       <?php echo Html::input( 'wpName', $this->data['name'], 'text', array(
+                               'class' => 'mw-input loginText',
+                               'id' => 'wpName2',
+                               'tabindex' => '1',
+                               'size' => '20',
+                               'required',
+                               'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text(),
+                               'autofocus'
+                       ) ); ?>
+               </div>
+               <div>
+               <?php if ( $this->data['createemail'] ) { ?>
+                       <label class="mw-ui-checkbox-label">
+                               <input name="wpCreateaccountMail" type="checkbox" value="1" id="wpCreateaccountMail" tabindex="2"
+                                       <?php if ( $this->data['createemailset'] ) {
+                                               echo 'checked="checked"';
+                                       } ?>
+                               >
+                               <?php $this->msg( 'createaccountmail' ); ?>
+                       </label>
+               <?php } ?>
+               </div>
+               <div class="mw-row-password">
+                       <label for='wpPassword2'><?php $this->msg( 'userlogin-yourpassword' ); ?></label>
+                       <?php echo Html::input( 'wpPassword', null, 'password', array(
+                               'class' => 'mw-input loginPassword',
+                               'id' => 'wpPassword2',
+                               'tabindex' => '3',
+                               'size' => '20',
+                               'required',
+                               'placeholder' => $this->getMsg( 'createacct-yourpassword-ph' )->text()
+                       ) + User::passwordChangeInputAttribs() ); ?>
+               </div>
+       <?php if ( $this->data['usedomain'] ) {
+               $doms = "";
+               foreach ( $this->data['domainnames'] as $dom ) {
+                       $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+               }
+       ?>
+               <div>
+                       <label><?php $this->msg( 'yourdomainname' ); ?></label>
+                       <div class="mw-input">
+                               <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>"
+                                       tabindex="4">
+                                       <?php echo $doms ?>
+                               </select>
+                       </div>
+               </div>
+       <?php } ?>
+               <div class="mw-row-password">
+                       <label for='wpRetype'><?php $this->msg( 'createacct-yourpasswordagain' ); ?></label>
+                       <?php
+                       echo Html::input( 'wpRetype', null, 'password', array(
+                               'class' => 'mw-input loginPassword',
+                               'id' => 'wpRetype',
+                               'tabindex' => '5',
+                               'size' => '20',
+                               'required',
+                               'placeholder' => $this->getMsg( 'createacct-yourpasswordagain-ph' )->text()
+                               ) + User::passwordChangeInputAttribs() );
+                       ?>
+               </div>
+               <div>
+               <?php if ( $this->data['useemail'] ) { ?>
+                       <label for='wpEmail'>
+                               <?php
+                                       $this->msg( $this->data['emailrequired'] ?
+                                               'createacct-emailrequired' :
+                                               'createacct-emailoptional'
+                                       );
+                               ?>
+                       </label>
+                       <?php
+                               echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
+                                       'class' => 'mw-input loginText',
+                                       'id' => 'wpEmail',
+                                       'tabindex' => '6',
+                                       'size' => '20',
+                                       'placeholder' => $this->getMsg( 'createacct-email-ph' )->text()
+                               ) + ( $this->data['emailrequired'] ? array() : array( 'required' => '' ) ) );
+                       ?>
+                       <?php
+                       // VForm eliminates the prefsectiontip div tip:
+                       // prefs-help-email-required is redundant with the placeholder text
+                       // Doesn't show the wordy prefs-help-email
+                       // Doesn't show the wordy prefs-help-email-others
+                       ?>
+               <?php } ?>
+               </div>
+               <?php if ( $this->data['userealname'] ) { ?>
+                       <div>
+                               <label for='wpRealName'><?php $this->msg( 'createacct-realname' ); ?></label>
+                               <input type='text' class='mw-input loginText' name="wpRealName" id="wpRealName"
+                                       tabindex="7"
+                                       value="<?php $this->text( 'realname' ); ?>" size='20' />
+                               <div class="prefsectiontip">
+                                       <?php $this->msgWiki( 'prefs-help-realname' ); ?>
+                               </div>
+                       </div>
+               <?php }
+               if ( $this->data['usereason'] ) { ?>
+                       <div>
+                               <label for='wpReason'><?php $this->msg( 'createacct-reason' ); ?></label>
+                               <input type='text' class='mw-input loginText' name="wpReason" id="wpReason"
+                                               tabindex="8"
+                                               value="<?php $this->text( 'reason' ); ?>" size='20' />
+                       </div>
+               <?php }
+               $tabIndex = 9;
+               if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
+                       foreach ( $this->data['extraInput'] as $inputItem ) { ?>
+                       <div>
+                               <?php
+                               // If it's a checkbox, output the whole thing (assume it has a msg).
+                               if ( $inputItem['type'] == 'checkbox' ) {
+                               ?>
+                                       <label class="mw-ui-checkbox-label">
+                                               <input
+                                                       name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                                       id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                                       type="checkbox" value="1"
+                                                       tabindex="<?php echo $tabIndex++; ?>"
+                                                       <?php if ( !empty( $inputItem['value'] ) )  {
+                                                               echo 'checked="checked"';
+                                                       } ?>
+                                               >
+                                               <?php $this->msg( $inputItem['msg'] ); ?>
+                                       </label>
+                               <?php
+                               } else {
+                                       // Not a checkbox.
+                                       if ( !empty( $inputItem['msg'] ) ) {
+                                               // Output the message label
+                                       ?>
+                                               <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>">
+                                                       <?php $this->msgWiki( $inputItem['msg'] ); ?>
+                                               </label>
+                                       <?php
+                                       }
+                                       ?>
+                                       <input
+                                               type="<?php echo htmlspecialchars( $inputItem['type'] ); ?>"
+                                               class="mw-input"
+                                               name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                               tabindex="<?php echo $tabIndex++; ?>"
+                                               value="<?php echo htmlspecialchars( $inputItem['value'] ); ?>"
+                                               id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                       />
+                               <?php
+                               }
+                               if ( $inputItem['helptext'] !== false ) {
+                               ?>
+                                       <div class="prefsectiontip">
+                                               <?php $this->msgWiki( $inputItem['helptext'] ); ?>
+                                       </div>
+                               <?php
+                               }
+                               ?>
+                               </div>
+                       <?php
+                       }
+               }
+               // JS attempts to move the image CAPTCHA below this part of the form,
+               // so skip one index.
+               $tabIndex++;
+               ?>
+               <div class="mw-submit">
+                       <input type='submit' class="mw-ui-button mw-ui-big mw-ui-block mw-ui-primary" name="wpCreateaccount" id="wpCreateaccount"
+                               tabindex="<?php echo $tabIndex++; ?>"
+                               value="<?php $this->msg( 'createaccount' ); ?>" />
+               </div>
+       <input type="hidden" id="useNew" name="useNew" value="1" />
+<?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
+<?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+</form>
+</div>
+<div class="mw-createacct-benefits-container">
+       <h2><?php $this->msg( 'createacct-benefit-heading' ); ?></h2>
+       <div class="mw-createacct-benefits-list">
+               <div>
+                       <div class="mw-benefits-icon <?php $this->msg( 'createacct-benefit-icon1' ); ?>"></div>
+                       <div class="mw-number-text">
+                               <h3><?php $this->msg( 'createacct-benefit-head1' ); ?></h3>
+                               <p><?php $this->msg( 'createacct-benefit-body1' ); ?></p>
+                       </div>
+               </div>
+               <div>
+                       <div class="mw-benefits-icon <?php $this->msg( 'createacct-benefit-icon2' ); ?>"></div>
+                       <div class="mw-number-text">
+                               <h3><?php $this->msg( 'createacct-benefit-head2' ); ?></h3>
+                               <p><?php $this->msg( 'createacct-benefit-body2' ); ?></p>
+                       </div>
+               </div>
+               <div>
+                       <div class="mw-benefits-icon <?php $this->msg( 'createacct-benefit-icon3' ); ?>"></div>
+                       <div class="mw-number-text">
+                               <h3><?php $this->msg( 'createacct-benefit-head3' ); ?></h3>
+                               <p><?php $this->msg( 'createacct-benefit-body3' ); ?></p>
+                       </div>
+               </div>
+       </div>
+</div>
+</div>
+<?php
+
+       }
+}
index a944c0a..0948a20 100644 (file)
@@ -31,8 +31,6 @@ class UserloginTemplateVForm extends BaseTemplate {
 ?>
 <div class="mw-ui-container">
        <?php
-       // Some extensions including CAPTCHAs add content to header on UserLoginForm hook.
-       $this->html( 'header' );
        if ( $this->haveData( 'languages' ) ) {
        ?>
                <div id="languagelinks">
@@ -43,6 +41,9 @@ class UserloginTemplateVForm extends BaseTemplate {
        ?>
 <div id="userloginForm">
 <form name="userlogin" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
+       <section class="mw-form-header">
+               <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+       </section>
        <?php
 
        if ( $this->data['message'] ) {
index 24d083d..ff87f89 100644 (file)
@@ -1822,7 +1822,7 @@ class Language {
                }
                $start = substr( $str, 0, strlen( $str ) - 2 );
                $end = substr( $str, strlen( $str ) - 2 );
-               switch( $end ) {
+               switch ( $end ) {
                        case 'כ':
                                $str = $start . 'ך';
                                break;
@@ -4139,15 +4139,14 @@ class Language {
         * @since 1.18
         */
        public function formatExpiry( $expiry, $format = true ) {
-               static $infinity, $infinityMsg;
+               static $infinity;
                if ( $infinity === null ) {
-                       $infinityMsg = wfMessage( 'infiniteblock' );
                        $infinity = wfGetDB( DB_SLAVE )->getInfinity();
                }
 
                if ( $expiry == '' || $expiry == $infinity ) {
                        return $format === true
-                               ? $infinityMsg
+                               ? $this->getMessageFromDB( 'infiniteblock' )
                                : $infinity;
                } else {
                        return $format === true
index c8c06f3..c0bdc3f 100644 (file)
@@ -303,7 +303,7 @@ class KkConverter extends LanguageConverter {
                global $wgLanguageCode;
                $text = parent::translate( $text, $toVariant );
 
-               switch( $toVariant ) {
+               switch ( $toVariant ) {
                        case 'kk-cyrl':
                        case 'kk-kz':
                                $letters = KK_L_UC . KK_L_LC . 'ʺʹ#0123456789';
@@ -347,7 +347,7 @@ class KkConverter extends LanguageConverter {
                        return $text;
                }
 
-               switch( $toVariant ) {
+               switch ( $toVariant ) {
                        case 'kk-arab':
                        case 'kk-cn':
                                $letters = KK_C_LC . KK_C_UC/*.KK_L_LC.KK_L_UC*/;
index 6c07f0b..4444cc4 100644 (file)
@@ -290,6 +290,16 @@ $messages = array(
 'nov' => 'নৱেম্বৰ:',
 'dec' => 'ডিচেম্বৰ:',
 
+'monday-at' => 'সোমবাৰে $1ত',
+'tuesday-at' => 'মঙ্গলবাৰে  $1’ত',
+'wednesday-at' => 'বুধবাৰে $1’ত',
+'thursday-at' => 'বৃহস্পতিবাৰে $1’ত',
+'friday-at' => 'শুক্ৰবাৰে $1’ত',
+'saturday-at' => 'শনিবাৰে $1’ত',
+'sunday-at' => 'দেওবাৰে $1’ত',
+'today-at' => '$1',
+'yesterday-at' => 'কালি $1’ত',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|শ্ৰেণী|শ্ৰেণীসমূহ}}',
 'category_header' => '"$1" শ্ৰেণীৰ পৃষ্ঠাসমূহ',
@@ -3925,4 +3935,8 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
 'duration-millennia' => '$1 {{PLURAL:$1|সহস্ৰাব্দ|সহস্ৰাব্দ}}',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|ঘন্টা}} আগেয়ে',
+'minutes-ago' => '$1 {{PLURAL:$1|মাহ}} আগেয়ে',
+'seconds-ago' => '$1 {{PLURAL:$1|ছেকেন্ড}} আগতে',
 );
index 8823dd5..ca1e8a3 100644 (file)
@@ -562,9 +562,13 @@ $2',
 'welcomecreation-msg' => 'Иҫәп яҙыуығыҙ яһалды.
 Шәхси [[Special:Preferences|{{SITENAME}} көйләүҙәрен]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.',
 'yourname' => 'Ҡатнашыусы исеме',
+'userlogin-yourname' => 'Ҡулланыусы исеме',
 'yourpassword' => 'Һеҙҙең пароль',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Яңы паролде яҙығыҙ',
 'yourpasswordagain' => 'Паролде ҡабаттан яҙыу',
 'remembermypassword' => 'Был компьютерҙа паролемде иҫләргә ($1 {{PLURAL:$1|көндән|көндән}} күп түгел)',
+'userlogin-remembermypassword' => 'Хәтерҙә ҡалдырырға',
 'securelogin-stick-https' => 'Танылғандан һуң HTTPS менән бәйләнеште ҡалдырырға',
 'yourdomainname' => 'Һеҙҙең домен',
 'password-change-forbidden' => 'Был викила паролегеҙҙе үҙгәртә алмайһығыҙ.',
index 7e78295..b69874e 100644 (file)
@@ -368,6 +368,16 @@ $messages = array(
 'nov' => 'ліс',
 'dec' => 'сьн',
 
+'monday-at' => 'Панядзелак, $1',
+'tuesday-at' => 'Аўторак, $1',
+'wednesday-at' => 'Серада, $1',
+'thursday-at' => 'Чацьвер, $1',
+'friday-at' => 'Пятніца, $1',
+'saturday-at' => 'Субота, $1',
+'sunday-at' => 'Нядзеля, $1',
+'today-at' => '$1',
+'yesterday-at' => 'Учора, $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Катэгорыя|Катэгорыі|Катэгорыі}}',
 'category_header' => 'Старонкі ў катэгорыі «$1»',
@@ -4011,4 +4021,8 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 # Image rotation
 'rotate-comment' => 'Выява павернутая на $1{{PLURAL:$1|°}} па гадзіньнікавай стрэлцы',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|гадзіну|гадзіны|гадзінаў}} таму',
+'minutes-ago' => '$1 {{PLURAL:$1|хвіліну|хвіліны|хвілінаў}} таму',
+'seconds-ago' => '$1 {{PLURAL:$1|сэкунду|сэкунды|сэкундаў}} таму',
 );
index 3243c2a..c274d36 100644 (file)
@@ -492,6 +492,7 @@ $2',
 'yourpasswordagain' => 'শব্দচাবিটি (password) আবার লিখুন',
 'remembermypassword' => 'একাধিক সেশনের জন্য শব্দচাবি মনে রাখা হোক (সর্বোচ্চ $1 {{PLURAL:$1|দিনের|দিনের}} জন্য)',
 'userlogin-remembermypassword' => 'আমাকে মনে রাখো',
+'userlogin-signwithsecure' => 'নিরাপদ সার্ভারের মাধ্যমে লগইন করুন',
 'securelogin-stick-https' => 'লগইনের পর এইচটিটিপিএস-এর সাথে সংযোগকৃত থাকুন',
 'yourdomainname' => 'আপনার ডোমেইন',
 'password-change-forbidden' => 'আপনি এই উইকিতে পাসওয়ার্ড পরিবর্তন করতে পারবেন না।',
@@ -505,6 +506,7 @@ $2',
 'userlogout' => 'প্রস্থান',
 'notloggedin' => 'আপনি সংযুক্ত নন',
 'userlogin-noaccount' => 'কোনও অ্যাকাউন্ট নেই?',
+'userlogin-joinproject' => '{{SITENAME}}-এ অংশগ্রহন করুন',
 'nologin' => "আপনার কি উইকিপিডিয়াতে অ্যাকাউন্ট নেই? তাহলে '''$1'''।",
 'nologinlink' => 'অ্যাকাউন্ট তৈরি করুন',
 'createaccount' => 'নতুন অ্যাকাউন্ট খুলুন',
@@ -512,6 +514,7 @@ $2',
 'gotaccountlink' => 'প্রবেশ',
 'userlogin-resetlink' => 'আপনার লগইনের বিস্তারিত তথ্যাদি ভুলে গেছেন?',
 'helplogin-url' => 'Help:প্রবেশ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|লগইন সংক্রান্ত সাহায্য]]',
 'createaccountmail' => 'একটি র‌্যান্ডম পাসওয়ার্ড নির্বাচন করুন এবং নিচের নির্ধারিত ইমেইল ঠিকানায় পাঠিয়ে দিন',
 'createaccountreason' => 'কারণ:',
 'badretype' => "আপনার প্রবেশ করানো শব্দচাবি'টি মিলছেনা।",
@@ -602,6 +605,7 @@ $2',
 'passwordreset-text' => 'আপনার শব্দচাবি বদলের জন্য নিচের ফর্মটি পূরণ করুন।',
 'passwordreset-legend' => 'শব্দচাবি রিসেট',
 'passwordreset-disabled' => 'এই উইকিতে শব্দচাবি রিসেটের সুবিধা নিষ্ক্রিয় রয়েছে।',
+'passwordreset-emaildisabled' => 'এই উইকিতে ইমেইল অপশনটি বন্ধ করা হয়েছে।',
 'passwordreset-pretext' => '{{PLURAL:$1||নিচে উল্লেখিত ডেটাগুলোর কোনো একটি প্রবেশ করান}}',
 'passwordreset-username' => 'ব্যবহারকারী নাম:',
 'passwordreset-domain' => 'ডোমেইন:',
@@ -632,7 +636,7 @@ $2
 অস্থায়ী শব্দচাবি: $2',
 'passwordreset-emailsent' => 'শব্দচাবি বদলের একটি ই-মেইল পাঠানো হয়েছে।',
 'passwordreset-emailsent-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।',
-'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 ব্যবহারকারীকে এটি পাঠানো যায়নি!',
+'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!',
 
 # Special:ChangeEmail
 'changeemail' => 'ই-মেইল ঠিকানা পরিবর্তন',
@@ -1125,6 +1129,7 @@ $1",
 'powersearch-togglenone' => 'কিছু নয়',
 'search-external' => 'বহিঃস্থ অনুসন্ধান',
 'searchdisabled' => '{{SITENAME}} অনুসন্ধান এখন নিষ্ক্রিয় আছে। আপনি গুগলের মাধ্যমে অনুসন্ধান চালাতে পারেন। লক্ষ্য করুন যে {{SITENAME}}-এর বিষয়বস্তুর উপর গুগলের ইন্ডেক্সগুলি হালনাগাদ না-ও করা থাকতে পারে।',
+'search-error' => 'অনুসন্ধানের সময় একটি ত্রুটি হয়েছে: $1',
 
 # Preferences page
 'preferences' => 'আমার পছন্দ',
index 452ada1..5bce37b 100644 (file)
@@ -12,6 +12,7 @@
  * @author Girdi
  * @author Mega programmer
  * @author Sasan700
+ * @author Умар
  */
 
 $fallback = 'ru';
@@ -217,7 +218,7 @@ $messages = array(
 'tog-extendwatchlist' => 'Шорбина тlехьажарна могlам, ша беригге а хийцамаш чубогlуш, тlяхьабина боцурш а',
 'tog-usenewrc' => 'Лелабе дика могlам керла чу хийцамашна (оьшу JavaScript)',
 'tog-numberheadings' => 'Ша шех хlитто терахь корташна',
-'tog-showtoolbar' => 'Ð\93айÑ\82а Ð»Ð°ÐºÑ\85аÑ\80а Ð³lиÑ\80Ñ\81ан Ð´Ð°ÐºÑ\8aа Ð½Ð¸Ñ\81йеÑ\88 Ð°Ñ\82Ñ\82он Ð¾Ñ\86 Ñ\80едаккÑ\85ар чохь (JavaScript)',
+'tog-showtoolbar' => 'Ð\93айÑ\82а Ð»Ð°ÐºÑ\85аÑ\80а Ð³lиÑ\80Ñ\81ан Ð´Ð°ÐºÑ\8aа Ð½Ð¸Ñ\81йеÑ\88 Ð°Ñ\82Ñ\82он Ð¾Ñ\86 Ñ\82адар чохь (JavaScript)',
 'tog-editondblclick' => 'Нисйе агlонаш шозза тlетаlийча (JavaScript)',
 'tog-editsection' => 'Гайта хьажориг «нисйе» аьлла хlора агlона',
 'tog-editsectiononrightclick' => 'Нисде дакъа шозза бакъехьар дахка тlетаlийча оцу кортан (JavaScript)',
@@ -238,8 +239,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Гайта декъашхойн терахь, агlо латийна болу шай тергаме могlам юкъа',
 'tog-oldsig' => 'Хьалххьажар долучу куьгтаlорна:',
 'tog-fancysig' => 'Шен вики-къастаман куьгтаlдар (ша шех хьажориг йоцуш)',
-'tog-externaleditor' => 'Лелайан арахьара рéдаккхар (гlулкхдириг леррина нисйина хила йеза, [//www.mediawiki.org/wiki/Manual:External_editors кхин дlа.])',
-'tog-externaldiff' => 'Лелабан арахьара диллагlарам башхо тарйо гlирс (гlулкхдириг леррина нисйина хила йеза, [//www.mediawiki.org/wiki/Manual:External_editors кхин дlа.])',
 'tog-showjumplinks' => 'Латайе гlодарна хьажоригаш «дехьа вала оцу»',
 'tog-uselivepreview' => 'Лелайа чехка хьалха хьажа (JavaScript, муха ю хьажарна)',
 'tog-forceeditsummary' => 'Дага даийта, нагахь нисйарх лаьцна чохь язъйина язахь',
@@ -281,60 +280,60 @@ $messages = array(
 'thu' => 'Еа',
 'fri' => 'Пle',
 'sat' => 'Шот',
-'january' => 'нажи бутт',
-'february' => 'мархи бутт',
-'march' => 'биÑ\8dкаÑ\80г Ð±Ñ\83Ñ\82т',
-'april' => 'тушоли бутт',
-'may_long' => 'сели бутт',
-'june' => 'мангал Ð±Ñ\83Ñ\82Ñ\82',
-'july' => 'мÑ\8fÑ\82Ñ\81ел Ð±Ñ\83Ñ\82Ñ\82',
-'august' => 'эгиш бутт',
-'september' => 'Ñ\82ав Ð±Ñ\83Ñ\82Ñ\82',
-'october' => 'аÑ\80даÑ\80 Ð±Ñ\83Ñ\82Ñ\82',
-'november' => 'эрх бутт',
-'december' => 'огой Ð±Ñ\83Ñ\82Ñ\82',
-'january-gen' => 'нажи бутт',
-'february-gen' => 'мархи бутт',
-'march-gen' => 'биÑ\8dкаÑ\80г Ð±Ñ\83Ñ\82т',
-'april-gen' => 'тушоли бутт',
-'may-gen' => 'сели бутт',
-'june-gen' => 'мангал Ð±Ñ\83Ñ\82Ñ\82',
-'july-gen' => 'мÑ\8fÑ\82Ñ\81ел Ð±Ñ\83Ñ\82Ñ\82',
-'august-gen' => 'эгиш бутт',
-'september-gen' => 'Ñ\82ав Ð±Ñ\83Ñ\82Ñ\82',
-'october-gen' => 'аÑ\80даÑ\80 Ð±Ñ\83Ñ\82Ñ\82',
-'november-gen' => 'эрх бутт',
-'december-gen' => 'огой Ð±Ñ\83Ñ\82Ñ\82',
-'jan' => 'нажи бутт',
-'feb' => 'мархи бутт',
-'mar' => 'биÑ\8dкаÑ\80г Ð±Ñ\83Ñ\82т',
-'apr' => 'тушоли бутт',
-'may' => 'сели бутт',
-'jun' => 'мангал Ð±Ñ\83Ñ\82Ñ\82',
-'jul' => 'мÑ\8fÑ\82Ñ\81ел Ð±Ñ\83Ñ\82Ñ\82',
-'aug' => 'эгиш бутт',
-'sep' => 'Ñ\82ав Ð±Ñ\83Ñ\82Ñ\82',
-'oct' => 'аÑ\80даÑ\80 Ð±Ñ\83Ñ\82Ñ\82',
-'nov' => 'эрх бутт',
-'dec' => 'огой Ð±Ñ\83Ñ\82Ñ\82',
+'january' => 'январь',
+'february' => 'февраль',
+'march' => 'маÑ\80т',
+'april' => 'апрель',
+'may_long' => 'май',
+'june' => 'иÑ\8eнÑ\8c',
+'july' => 'иÑ\8eлÑ\8c',
+'august' => 'август',
+'september' => 'Ñ\81енÑ\82Ñ\8fбÑ\80Ñ\8c',
+'october' => 'окÑ\82Ñ\8fбÑ\80Ñ\8c',
+'november' => 'ноябрь',
+'december' => 'декабÑ\80Ñ\8c',
+'january-gen' => 'январь',
+'february-gen' => 'февраль',
+'march-gen' => 'маÑ\80т',
+'april-gen' => 'апрель',
+'may-gen' => 'май',
+'june-gen' => 'иÑ\8eнÑ\8c',
+'july-gen' => 'иÑ\8eлÑ\8c',
+'august-gen' => 'август',
+'september-gen' => 'Ñ\81енÑ\82Ñ\8fбÑ\80Ñ\8c',
+'october-gen' => 'окÑ\82Ñ\8fбÑ\80Ñ\8c',
+'november-gen' => 'ноябрь',
+'december-gen' => 'декабÑ\80Ñ\8c',
+'jan' => 'январь',
+'feb' => 'февраль',
+'mar' => 'маÑ\80т',
+'apr' => 'апрель',
+'may' => 'май',
+'jun' => 'иÑ\8eнÑ\8c',
+'jul' => 'иÑ\8eлÑ\8c',
+'aug' => 'август',
+'sep' => 'Ñ\81енÑ\82Ñ\8fбÑ\80Ñ\8c',
+'oct' => 'окÑ\82Ñ\8fбÑ\80Ñ\8c',
+'nov' => 'ноябрь',
+'dec' => 'декабÑ\80Ñ\8c',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Кадегар|Кадегарш}}',
-'category_header' => 'Агlонаш оц кадегаршчохь «$1»',
-'subcategories' => 'Бухаркадегарш',
-'category-media-header' => 'Хlумнаш оцу кадегар чохь «$1»',
-'category-empty' => "''Хlара кадегар хlинца йаьсса ю.''",
-'hidden-categories' => '{{PLURAL:$1|Къайлаха кадегар|Къайлаха йолу кадегарш}}',
-'hidden-category-category' => 'Къайлаха йолу кадегарш',
-'category-subcat-count' => '{{PLURAL:$2|Хlокх кадегар чохь ю хlокхуьна бухар кадегар.|{{PLURAL:$1|Гойташ $1 бухар кадегар|Гойту $1 бухар кадегар|Гойту $1 бухар кадегар}} оцу $2.}}',
-'category-subcat-count-limited' => 'Хlокх кадегар чохь {{PLURAL:$1|$1 бухар кадегар|$1 бухар кадегарша|$1 бухар кадегарш}}.',
-'category-article-count' => '{{PLURAL:$2|Хlокх кадегар чохь яц цхьа агlо бе.|{{PLURAL:$1|Гойташ $1 агlо|Гойту $1 агlонаш|Гойту $1 агlонаш}} хlокх кадегарца кху $2.}}',
-'category-article-count-limited' => 'Хlокх кадегар чохь {{PLURAL:$1|$1 агlо|$1 агlонаш|$1 агlонаш}}.',
-'category-file-count' => '{{PLURAL:$2|Хlокх кадегар чохь цхьа хlум бе яц.|{{PLURAL:$1|Гойта $1 хlум|Гойту $1 хlума|Гойту $1 хlумнаш}} хlокх кадегарца кху $2.}}',
-'category-file-count-limited' => 'Хlокх кадегар чохь {{PLURAL:$1|$1 хlум|$1 хlума|$1 хlумнаш}}.',
+'pagecategories' => '{{PLURAL:$1|Категори|Категореш}}',
+'category_header' => 'Агlонаш оц категоречохь «$1»',
+'subcategories' => 'Бухаркатегореш',
+'category-media-header' => 'ХӀумнаш оцу категори чохь «$1»',
+'category-empty' => "''ХӀара категори хӀинца йаьсса ю.''",
+'hidden-categories' => '{{PLURAL:$1|Къайлаха категори|Къайлаха йолу категореш}}',
+'hidden-category-category' => 'Къайлаха йолу категореш',
+'category-subcat-count' => '{{PLURAL:$2|ХӀокх категори чохь ю хӀокхуьна бухар категори.|{{PLURAL:$1|Гойташ $1 бухар категори|Гойту $1 бухар категори|Гойту $1 бухар категори}} оцу $2.}}',
+'category-subcat-count-limited' => 'Хlокх категори чохь {{PLURAL:$1|$1 бухар категори|$1 бухар категореша|$1 бухар категореш}}.',
+'category-article-count' => '{{PLURAL:$2|ХӀокх категори чохь яц цхьа агӀо бе.|{{PLURAL:$1|Гойташ $1 агlо|Гойту $1 агӀонаш|Гойту $1 агӀонаш}} хӀокх категорешца кху $2.}}',
+'category-article-count-limited' => 'Хlокх категори чохь {{PLURAL:$1|$1 агlо|$1 агlонаш|$1 агlонаш}}.',
+'category-file-count' => '{{PLURAL:$2|ХӀокх категори чохь цхьа хӀум бе яц.|{{PLURAL:$1|Гойта $1 хӀум|Гойту $1 хlума|Гойту $1 хlумнаш}} хlокх категорешца кху $2.}}',
+'category-file-count-limited' => 'ХӀокх категори чохь {{PLURAL:$1|$1 файл|$1 хӀума|$1 файлаш}}.',
 'listingcontinuesabbrev' => '(кхин дlа)',
 'index-category' => 'Меттигтерахьйо агlонаш',
-'noindex-category' => 'Дlахьушйоцу агlонаш',
+'noindex-category' => 'ДӀахьушйоцу агӀонаш',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
@@ -342,10 +341,10 @@ $messages = array(
 'article' => 'Яззам',
 'newwindow' => '(керлачу корехь)',
 'cancel' => 'Цаоьшу',
-'moredotdotdot' => 'Кхин дlа…',
-'mypage' => 'Долахь йолу агlо',
-'mytalk' => 'Сан дийцаре агlо',
-'anontalk' => 'Дийцаре хlара IP-долуметтиг',
+'moredotdotdot' => 'Кхин дӀа…',
+'mypage' => 'Долахь йолу агӀо',
+'mytalk' => 'Сан дийцаре агӀо',
+'anontalk' => 'Дийцаре хӀара IP-долуметтиг',
 'navigation' => 'Шавигар',
 'and' => '&#32;а',
 
@@ -369,7 +368,7 @@ $messages = array(
 'vector-simplesearch-preference' => 'Шуьйра лахаран хьехар лата де (декъа «Хьушйерг» кечйарца)',
 'vector-view-create' => 'Кхоллар',
 'vector-view-edit' => 'Нисйé',
-'vector-view-history' => 'Ð¥Ñ\8cажа Ð¸Ñ\81Ñ\82оÑ\80е',
+'vector-view-history' => 'Ð¥Ñ\8cажа Ð¸Ñ\81Ñ\82оÑ\80и',
 'vector-view-view' => 'Éшар',
 'vector-view-viewsource' => 'Билглонашка хьажа',
 'actions' => 'Дийраш',
@@ -384,8 +383,8 @@ $messages = array(
 'searchbutton' => 'Лаха',
 'go' => 'Дехьа вала',
 'searcharticle' => 'Дехьа вала',
-'history' => 'Ð\98Ñ\81Ñ\82оÑ\80е',
-'history_short' => 'Ð\98Ñ\81Ñ\82оÑ\80е',
+'history' => 'Ð\98Ñ\81Ñ\82оÑ\80и',
+'history_short' => 'Ð\98Ñ\81Ñ\82оÑ\80и',
 'updatedmarker' => 'Керла яккхина со чуваьллачултlаьхьа',
 'printableversion' => 'Зорба туху варси',
 'permalink' => 'Даиман йолу хьажориг',
@@ -506,11 +505,11 @@ $1',
 'nstab-user' => 'Декъашхо',
 'nstab-special' => 'Белха агlо',
 'nstab-project' => 'Кхолламех',
-'nstab-image' => 'Ð¥lÑ\83м',
+'nstab-image' => 'Файл',
 'nstab-mediawiki' => 'Хаам',
-'nstab-template' => 'Куцкеп',
+'nstab-template' => 'Кеп',
 'nstab-help' => 'Нисвохаам',
-'nstab-category' => 'Кадегар',
+'nstab-category' => 'Категори',
 
 # Main script and global functions
 'nosuchaction' => 'Ишта дийриг дац',
@@ -594,7 +593,7 @@ $1',
 'nowiki_sample' => 'Чудиллийша кхузе барамхlоттонза йоза.',
 'nowiki_tip' => 'Тергал ца бо вики-бáрамхlоттор',
 'image_sample' => 'Example.jpg',
-'image_tip' => 'ЧоÑ\85Ñ\8c Ð¹Ð¾Ð»Ñ\83 Ñ\85\83м',
+'image_tip' => 'ЧоÑ\85Ñ\8c Ð¹Ð¾Ð»Ñ\83 Ñ\84айл',
 'media_sample' => 'Example.ogg',
 'media_tip' => 'Хьажориг оцу медиа-хlуман',
 'sig_tip' => 'Хьан куьгтаlор аъ хlоттина хан',
@@ -609,7 +608,7 @@ $1',
 'preview' => 'Хьалха муха ю хьажа',
 'showpreview' => 'Хьалха муха ю хьажар',
 'showdiff' => 'Хlоттина болу хийцам',
-'anoneditwarning' => "'''ТеÑ\80гам Ð±Ðµ''': Ð\90Ñ\85Ñ\8cа Ñ\85Ñ\8cо Ð²Ð¾Ð²Ð·Ð¸Ñ\82ина Ð²Ð°Ñ\86 Ð³lиÑ\80Ñ\81ан. Ð¥Ñ\8cан IP-долÑ\83 Ð¼ÐµÑ\82Ñ\82иг Ð´lаÑ\8fзйина Ñ\85иÑ\80а Ñ\8e Ñ\85lокÑ\85Ñ\83 Ð°Ð³lон Ð¸Ñ\81Ñ\82оÑ\80е чу.",
+'anoneditwarning' => "'''ТеÑ\80гам Ð±Ðµ''': Ð\90Ñ\85Ñ\8cа Ñ\85Ñ\8cо Ð²Ð¾Ð²Ð·Ð¸Ñ\82ина Ð²Ð°Ñ\86 Ð³lиÑ\80Ñ\81ан. Ð¥Ñ\8cан IP-долÑ\83 Ð¼ÐµÑ\82Ñ\82иг Ð´lаÑ\8fзйина Ñ\85иÑ\80а Ñ\8e Ñ\85lокÑ\85Ñ\83 Ð°Ð³lон Ð¸Ñ\81Ñ\82оÑ\80и чу.",
 'summary-preview' => 'Цуьнах лаьцна хирду:',
 'blockedtitle' => 'Декъашхо сацийна',
 'accmailtitle' => 'Ишар дlаяхьийтина.',
@@ -635,9 +634,9 @@ $1',
 'updated' => '(Карла йаькхина)',
 'note' => "'''Билгалдаккхар:'''",
 'previewnote' => "'''Хlара хьалх хьажар ду, йоза хlинца язданза ду!'''",
-'editing' => 'РедаккÑ\85ар: $1',
-'editingsection' => 'РедаккÑ\85ар $1 (даакъа)',
-'editingcomment' => 'РедаккÑ\85ар $1 (керла даакъа)',
+'editing' => 'Тадар: $1',
+'editingsection' => 'Тадар $1 (даакъа)',
+'editingcomment' => 'Тадар $1 (керла даакъа)',
 'editconflict' => 'Редаккхарна дойнаш: $1',
 'yourtext' => 'Хьан йоза',
 'yourdiff' => 'Башхаллаш',
@@ -653,8 +652,8 @@ $1',
 'protectedpagewarning' => "'''Дlахьедар. Хlара агlо гlаролла дина ю хийцам цабайта, иза хийца йа нисйа а бакъо йолуш адаманкуьйгалла лелош болу декъашхой бе бац.'''
 Лахахьа гойту хаамаш тlаьхьара бина болу хийцамна тептар чура:",
 'cascadeprotectedwarning' => "'''Дlахьедар:''' Хlокху агlонна редаккха бакъо йолуш хlара тоба йу «Адаманкуьйгалхой», хlунда аьлча иза латийна {{PLURAL:$1|кхечу агlонца|кхечу агlонашца}} хlоттделлачу гlароллийца:",
-'templatesused' => '{{PLURAL:$1|Куцкеп, лелийна|Куцкепаш, лелош ду}} хlокху агlон башхонца:',
-'templatesusedpreview' => '{{PLURAL:$1|Куцкеп, лелошдолу|Куцкепаш, лелошдолу}} оцу хьалх хьожучу агlонца:',
+'templatesused' => '{{PLURAL:$1|Кеп, лелийна|Кепаш, лелош ду}} хlокху агlон башхонца:',
+'templatesusedpreview' => '{{PLURAL:$1|Кеп, лелошдолу|Кепаш, лелошдолу}} оцу хьалх хьожучу агlонца:',
 'template-protected' => '(гlароллийца)',
 'template-semiprotected' => '(дуьззина доцуш гlаролла)',
 'hiddencategories' => 'Хlара агlо чуйогlуш ю оцу $1 {{PLURAL:$1|къайлаха кадегарчу|къайлаха кадегаршчу|къайлаха кадегаршчу}}:',
@@ -671,7 +670,7 @@ $1',
 
 # Parser/template warnings
 'parser-template-loop-warning' => 'Карийна куцкепаш юкъахь хилла шад: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Дозанал хьалаваьлла кlоргенца йух йуха дина куцкеп ($1)',
+'parser-template-recursion-depth-warning' => 'Дозанал хьалаваьлла кlоргенца йух йуха дина кеп ($1)',
 
 # "Undo" feature
 'undo-success' => 'Нисйинарг а тlе цалаца мега. Дехар до, хьажа цхьатерра йуй башхо, тешна хила, баккъалла иза хийцам буйте хьуна безарг, тlакха тlе таlайе «дlайазйе агlо», хийцам хlотта ба.',
@@ -690,8 +689,8 @@ $1',
 'page_last' => 'тlаьххьара',
 'histlegend' => "Кхетор: (хlинцлера.) — йолучу башхон къастам; (хьалх.) — хьалхлерачу башхон къастам; '''ж''' — жимо бозалца болу хийцам.",
 'history-fieldset-title' => 'Хьажа исцlарерачу',
-'histfirst' => 'къена',
-'histlast' => 'Ñ\85Ñ\8cалÑ\85о',
+'histfirst' => 'ширниш',
+'histlast' => 'Ñ\85Ñ\8cалÑ\85аÑ\80ниÑ\88',
 'historyempty' => '(йаьсса)',
 
 # Revision feed
@@ -715,7 +714,7 @@ $1',
 'revertmerge' => 'Йекъа',
 
 # Diffs
-'history-title' => '$1 â\80\94 Ñ\85ийÑ\86аман Ð¸Ñ\81Ñ\82оÑ\80е',
+'history-title' => '$1 â\80\94 Ñ\85ийÑ\86аман Ð¸Ñ\81Ñ\82оÑ\80и',
 'lineno' => 'Могlа $1:',
 'compareselectedversions' => 'Хаьржиначуьна башхо муха ю хьажа',
 'showhideselectedversions' => 'Гайта/къайлайаха хаьржина башхонаш',
@@ -784,7 +783,7 @@ $1',
 'prefs-resetpass' => 'Хийца ишар',
 'prefs-rendering' => 'Арахьара хатl',
 'saveprefs' => 'lалашдан',
-'prefs-editing' => 'РедаккÑ\85ар',
+'prefs-editing' => 'Тадар',
 'searchresultshead' => 'Лаха',
 'timezonelegend' => 'Сахьатан аса:',
 'prefs-searchoptions' => 'Лахарна гlирс нисба',
@@ -851,7 +850,7 @@ $1',
 'rcshowhidemine' => '$1 айхьа нисдинарш',
 'rclinks' => 'Гайта тlаьхьара $1 хийцамаш оцу $2 ден<br />$3',
 'diff' => 'тейп тайпнара',
-'hist' => 'иÑ\81Ñ\82оÑ\80е',
+'hist' => 'иÑ\81Ñ\82оÑ\80и',
 'hide' => 'Къайлаяккха',
 'show' => 'Гайта',
 'minoreditletter' => 'ж',
@@ -873,8 +872,8 @@ $1',
 'recentchangeslinked-to' => 'Кхечу агlор, гайта хийцамаш агlонашца, хlоттийначу агlонтlе хьажориг йолуш',
 
 # Upload
-'upload' => 'ЧÑ\83йаккÑ\85а Ñ\85\83м',
-'uploadbtn' => 'ЧÑ\83йаккÑ\85а Ñ\85\83м',
+'upload' => 'ЧÑ\83йаккÑ\85а Ñ\84айл',
+'uploadbtn' => 'ЧÑ\83йаккÑ\85а Ñ\84айл',
 'uploadlogpage' => 'Чуйахаран тéптар',
 'uploadlogpagetext' => 'Лахахьа гойтуш бу могlам тlаьххьара чуяхна хlумнаши. Ишта хьажа. [[Special:ImageList|хlумнаши могlам]] йа [[Special:NewImages|галеларе хlумнаши]].',
 'filename' => 'Хlуман цlе',
@@ -899,7 +898,7 @@ PICT # тайп тайпан
 
 # Special:ListFiles
 'listfiles_search_for' => 'Лаха хIуман цIарца:',
-'imgfile' => 'Ñ\85\83м',
+'imgfile' => 'Ñ\84айл',
 'listfiles' => 'Хlумнаши могlам',
 'listfiles_name' => 'Хlуман цlе',
 'listfiles_user' => 'Декъашхо',
@@ -907,9 +906,9 @@ PICT # тайп тайпан
 'listfiles_description' => 'Цуьнах лаьцна',
 
 # File description page
-'file-anchor-link' => ' Хlум',
-'filehist' => 'Ð¥lÑ\83ман Ð¸Ñ\81Ñ\82оÑ\80е',
-'filehist-help' => 'ТlеÑ\82аlаде Ñ\82еÑ\80аÑ\85Ñ\8c\85ан, Ð¼Ñ\83Ñ\85а Ñ\85илла Ñ\85Ñ\8cажаÑ\80на Ð¸ Ñ\85\83м.',
+'file-anchor-link' => 'Файл',
+'filehist' => 'Файлан Ð¸Ñ\81Ñ\82оÑ\80и',
+'filehist-help' => 'ТlеÑ\82аlаде Ñ\82еÑ\80аÑ\85Ñ\8c\85ан, Ð¼Ñ\83Ñ\85а Ñ\85илла Ñ\85Ñ\8cажаÑ\80на Ð¸ Ñ\84айл.',
 'filehist-deleteall' => 'дlадайá массо',
 'filehist-deleteone' => 'дlадайá',
 'filehist-current' => 'карара',
@@ -929,7 +928,7 @@ PICT # тайп тайпан
 'filerevert-submit' => 'Юхаяккха',
 
 # File deletion
-'filedelete-legend' => 'Ð\94lайайá Ð¸ Ñ\85\83м',
+'filedelete-legend' => 'Ð\94lайайá Ð¸ Ñ\84айл',
 'filedelete-submit' => 'Дlадайá',
 'filedelete-otherreason' => 'Кхин бахьан:',
 'filedelete-reason-otherlist' => 'Кхин бахьан',
@@ -982,14 +981,14 @@ PICT # тайп тайпан
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|цlинцl|цlинцlа|цlинацl}}',
-'ncategories' => '$1 {{PLURAL:$1|кадегар|кадегарш|кадегарш}}',
-'nmembers' => '$1 {{PLURAL:$1|Ñ\85\83м|Ñ\85\83ма|Ñ\85\83мнаш}}',
+'ncategories' => '$1 {{PLURAL:$1|категори|категореш|категореш}}',
+'nmembers' => '$1 {{PLURAL:$1|Ñ\84айл|Ñ\84айлана|Ñ\84айлаш}}',
 'specialpage-empty' => 'Дехаро хlумма ца елла.',
 'lonelypages' => 'Байлахь йисина агIонаш',
-'uncategorizedpages' => 'Кадегар йоцу агIонаш',
-'uncategorizedcategories' => 'Кадегар йоцу кадегарш',
-'uncategorizedimages' => 'Кадегар йоцу хIумнаш',
-'uncategorizedtemplates' => 'Кадегар йоцу куцкепаш',
+'uncategorizedpages' => 'Категори йоцу агIонаш',
+'uncategorizedcategories' => 'Категори йоцу категореш',
+'uncategorizedimages' => 'Категори йоцу хIумнаш',
+'uncategorizedtemplates' => 'Категори йоцу кепаш',
 'unusedcategories' => 'Йаьсса кадегарш',
 'wantedcategories' => 'Оьшуш йолу кадегарш',
 'wantedpages' => 'Оьшуш йолу агIонаш',
@@ -1010,12 +1009,12 @@ PICT # тайп тайпан
 'listusers' => 'Декъашхой могlам',
 'newpages' => 'Керла агlонаш',
 'newpages-username' => 'Декъашхо:',
-'ancientpages' => 'ЯззамаÑ\88 Ð¾Ñ\86Ñ\83 Ñ\82еÑ\80аÑ\85Ñ\8cÑ\86а Ñ\82Ñ\8fÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\80едаккÑ\85ар дина долу',
+'ancientpages' => 'ЯззамаÑ\88 Ð¾Ñ\86Ñ\83 Ñ\82еÑ\80аÑ\85Ñ\8cÑ\86а Ñ\82Ñ\8fÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\82адар дина долу',
 'move' => 'Цlе хийца',
 'movethispage' => 'Хlокху агlон цlе хийца',
 'unusedimagestext' => 'Дехар до, тидаме эца, кхин йолу дуьнана машан-меттигаш а лелош хила мега нисса йогlу хьажориг (URL) хlокху хlуман, хlокху могlаме йогlуш ялахь яцахь а иза хила мега жигара лелош.',
 'pager-newer-n' => '{{PLURAL:$1|алсамо керла|алсамо керланаш|алсамо керлачарех}} $1',
-'pager-older-n' => '{{PLURAL:$1|алсамо къена|алсамо къенанаш|алсамо къеначарех}} $1',
+'pager-older-n' => '{{PLURAL:$1|алсамо шира|алсамо ширниш|алсамо ширачарех}} $1',
 
 # Book sources
 'booksources' => 'Жайнан хьосташ',
@@ -1059,16 +1058,13 @@ PICT # тайп тайпан
 # Special:ListUsers
 'listusers-submit' => 'Гайта',
 
-# Special:ActiveUsers
-'activeusers' => 'Жигар декъашхой могlам',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Декъашхойн тобанаши бакъонаш',
 'listgrouprights-group' => 'Тоба',
 'listgrouprights-helppage' => 'Help:Тобан бакъонаш',
 'listgrouprights-members' => '(тобан могlам)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Декъашхочун хааман кехат',
 'defemailsubject' => 'Хаам {{grammar:genitive|{{SITENAME}}}} чура бу',
 'emailmessage' => 'Хаам:',
@@ -1101,7 +1097,7 @@ PICT # тайп тайпан
 'exbeforeblank' => 'чуьраниг дlацlанйале хьалха: «$1»',
 'exblank' => 'агlо йаьсса йара',
 'delete-legend' => 'Дlадайáр',
-'confirmdeletetext' => 'Ð¥Ñ\8cан Ð´ÐµÑ\85аÑ\80 Ð´Ñ\83 Ñ\85lаÑ\80а Ð°Ð³lо Ñ\88е Ð±Ñ\83Ñ\85Ñ\86и Ð´lабайа Ð°Ñ\8cлла (йа Ñ\81Ñ\83Ñ\80Ñ\82) Ð° Ð¼Ð°Ñ\81Ñ\81о Ñ\86Ñ\83Ñ\8cнан Ð¸Ñ\81Ñ\82оÑ\80е оцу бух чура. Дехар до, бакъде, билгала хьайна иза лаахь, кхеташ хира ву хьо тlаьхьа хир долу чун, иза деш ду ахьа бакъонца догlуш, вахьа дехкина долучу дакъанца [[{{MediaWiki:Policy-url}}]].',
+'confirmdeletetext' => 'Ð¥Ñ\8cан Ð´ÐµÑ\85аÑ\80 Ð´Ñ\83 Ñ\85lаÑ\80а Ð°Ð³lо Ñ\88е Ð±Ñ\83Ñ\85Ñ\86и Ð´lабайа Ð°Ñ\8cлла (йа Ñ\81Ñ\83Ñ\80Ñ\82) Ð° Ð¼Ð°Ñ\81Ñ\81о Ñ\86Ñ\83Ñ\8cнан Ð¸Ñ\81Ñ\82оÑ\80и оцу бух чура. Дехар до, бакъде, билгала хьайна иза лаахь, кхеташ хира ву хьо тlаьхьа хир долу чун, иза деш ду ахьа бакъонца догlуш, вахьа дехкина долучу дакъанца [[{{MediaWiki:Policy-url}}]].',
 'actioncomplete' => 'Дешдерг кхочушди',
 'deletedtext' => '«$1» дlаяккхина йара.
 Хьажа. $2 хьажарна оцу тlаьхьара дlадайаран могlаме.',
@@ -1222,7 +1218,7 @@ PICT # тайп тайпан
 Нагахь ахьа иза цадинехь, дехар до, хьажа йуйла [[Special:DoubleRedirects|шалгlа]] а [[Special:BrokenRedirects|хадийначу дlасахьажориш]].
 Ахьа жоп лур ду кхин дlа а хьажориг хьажийна хилийта, хила йезаче.
 
-ТеÑ\80гамбеÑ\88 Ñ\85ила, Ð¸Ð·Ð° Ð°Ð³lо '''Ñ\85иÑ\80а Ñ\8fÑ\86''' Ñ\86lе Ñ\85ийÑ\86ина, Ð½Ð°Ð³Ð°Ñ\85Ñ\8c Ð¸Ð·Ð° Ñ\86lе Ð¹Ð¾Ð»Ñ\83Ñ\88 ÐºÐµÑ\80ла Ð°Ð³lо Ð¹Ð°Ð»Ð°Ñ\85Ñ\8c, Ñ\86Ñ\85Ñ\8cа Ð¹Ð¾Ð»Ñ\83 Ñ\85енаÑ\85Ñ\8c, Ð½Ð°Ð³Ð°Ñ\85Ñ\8c Ð¸Ð·Ð° Ð¹Ð°Ð»Ð°Ñ\85Ñ\8c Ñ\86Ñ\85Ñ\8cан Ñ\82lе Ñ\85Ñ\8cажийна Ð¹Ð° Ð¹Ð°Ñ\8cÑ\81Ñ\81а Ð° Ð½Ð¸Ñ\81йаÑ\80Ñ\86а Ð¸Ñ\81Ñ\82оÑ\80е йоцуш.
+ТеÑ\80гамбеÑ\88 Ñ\85ила, Ð¸Ð·Ð° Ð°Ð³lо '''Ñ\85иÑ\80а Ñ\8fÑ\86''' Ñ\86lе Ñ\85ийÑ\86ина, Ð½Ð°Ð³Ð°Ñ\85Ñ\8c Ð¸Ð·Ð° Ñ\86lе Ð¹Ð¾Ð»Ñ\83Ñ\88 ÐºÐµÑ\80ла Ð°Ð³lо Ð¹Ð°Ð»Ð°Ñ\85Ñ\8c, Ñ\86Ñ\85Ñ\8cа Ð¹Ð¾Ð»Ñ\83 Ñ\85енаÑ\85Ñ\8c, Ð½Ð°Ð³Ð°Ñ\85Ñ\8c Ð¸Ð·Ð° Ð¹Ð°Ð»Ð°Ñ\85Ñ\8c Ñ\86Ñ\85Ñ\8cан Ñ\82lе Ñ\85Ñ\8cажийна Ð¹Ð° Ð¹Ð°Ñ\8cÑ\81Ñ\81а Ð° Ð½Ð¸Ñ\81йаÑ\80Ñ\86а Ð¸Ñ\81Ñ\82оÑ\80и йоцуш.
 Иза бохург ду, хьега хийцалур ю оцу агlон цlе оцу цlарца, хlинц цуьна хилла йолу, нагахь ахьа гlалатонца цlе хийцанехь, йолуш йолу агlо цахууш йа мега хьа.
 
 '''ДlАХЬЕДАР!'''
@@ -1259,7 +1255,7 @@ PICT # тайп тайпан
 'export' => 'Яззамаш кхечу меттиган арадахар',
 'exporttext' => 'Шуьга далур ду кхечу меттера чудахарш, йоза а хийцаме тептарш билгалла йолу агlонаш йа гулдина йолу агlонаш хlокх XML барамца, йуха тlяхьа чура [[Special:Import|хьаэцалурдолш]] кхечу вики-хьалхен, болх беш йолу хlокху MediaWiki гlирсаца.
 
\9aÑ\85еÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82еÑ\80а Ñ\8fззамаÑ\88 Ñ\87Ñ\83йаÑ\85а, Ñ\87Ñ\83Ñ\8fзйе Ñ\86lе Ñ\80едокÑ\85Ñ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82е, Ñ\86\85Ñ\8cа Ð¼Ð¾Ð³lан Ñ\86lе Ð¼Ð¾Ð³lаÑ\80Ñ\88каÑ\85Ñ\8c, Ð¹Ñ\83Ñ\85а Ñ\85аÑ\80жа Ð»Ð°Ñ\8cи Ñ\88Ñ\83на Ð\9aÑ\85еÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82еÑ\80 Ñ\87Ñ\83йаÑ\85а Ð¼Ð°Ñ\81Ñ\81о Ñ\8fззамаÑ\88на Ð¸Ñ\81Ñ\82оÑ\80е хийцамбарш йа тlяхьаралера яззамна башхо.
\9aÑ\85еÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82еÑ\80а Ñ\8fззамаÑ\88 Ñ\87Ñ\83йаÑ\85а, Ñ\87Ñ\83Ñ\8fзйе Ñ\86lе Ñ\80едокÑ\85Ñ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82е, Ñ\86\85Ñ\8cа Ð¼Ð¾Ð³lан Ñ\86lе Ð¼Ð¾Ð³lаÑ\80Ñ\88каÑ\85Ñ\8c, Ð¹Ñ\83Ñ\85а Ñ\85аÑ\80жа Ð»Ð°Ñ\8cи Ñ\88Ñ\83на Ð\9aÑ\85еÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82еÑ\80 Ñ\87Ñ\83йаÑ\85а Ð¼Ð°Ñ\81Ñ\81о Ñ\8fззамаÑ\88на Ð¸Ñ\81Ñ\82оÑ\80и хийцамбарш йа тlяхьаралера яззамна башхо.
 
 Шуьга кхи даландерг, лелаеш йолу меттиг къастаман машан хьажориг кхечу меттер чудаха тlяхьарлера башхон яззамаш. Массала оцу яззамна [[{{MediaWiki:Mainpage}}]] хlара хира йу хьажориг [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
 'export-templates' => 'Латадé куцкепаш',
@@ -1329,7 +1325,7 @@ PICT # тайп тайпан
 'tooltip-t-permalink' => 'Даимна йолу хьажориг хlокху башха агlонна',
 'tooltip-ca-nstab-main' => 'Яззамна чулацам',
 'tooltip-ca-nstab-user' => 'Хlора декъашхон долахь йолу агlо',
-'tooltip-ca-nstab-media' => 'Ð\9cедиа-Ñ\85\83м',
+'tooltip-ca-nstab-media' => 'Ð\9cедиа-Ñ\84айл',
 'tooltip-ca-nstab-special' => 'Хlара белха агlо йу, хlара рéдаккхалуш яц',
 'tooltip-ca-nstab-project' => 'Кхолламан дакъа',
 'tooltip-ca-nstab-image' => 'Хlуман агlо',
@@ -1364,9 +1360,6 @@ PICT # тайп тайпан
 # Spam protection
 'spamprotectiontitle' => 'Совбиларна литтар',
 
-# Skin names
-'skinname-standard' => 'Лела ма ярра',
-
 # Browsing diffs
 'previousdiff' => '← Хьалхдоьда нисдинарг',
 'nextdiff' => 'Тlяхьа догlа нисдинарг →',
@@ -1470,7 +1463,7 @@ PICT # тайп тайпан
 
 # Special:FilePath
 'filepath' => 'ХIуман тIе болу некъ',
-'filepath-page' => 'Ð¥lÑ\83м:',
+'filepath-page' => 'Файл:',
 'filepath-submit' => 'Дехьавала',
 
 # Special:FileDuplicateSearch
index 7833a2c..34ba28c 100644 (file)
@@ -3287,7 +3287,7 @@ $5
 'hijri-calendar-m3' => 'ڕەبیعەلئەووەڵ',
 'hijri-calendar-m4' => 'ڕەبیعەلئاخیر',
 'hijri-calendar-m5' => 'جومادەلئوولا',
-'hijri-calendar-m6' => 'جومادەسسانی',
+'hijri-calendar-m6' => 'جومادەلئاخیر',
 'hijri-calendar-m7' => 'ڕەجەب',
 'hijri-calendar-m8' => 'شەعبان',
 'hijri-calendar-m9' => 'ڕەمەزان',
index 0aa0345..37cbd2e 100644 (file)
@@ -469,6 +469,16 @@ $messages = array(
 'nov' => '11.',
 'dec' => '12.',
 
+'monday-at' => 'v pondělí v $1',
+'tuesday-at' => 'v úterý v $1',
+'wednesday-at' => 've středu v $1',
+'thursday-at' => 've čtvrtek v $1',
+'friday-at' => 'v pátek v $1',
+'saturday-at' => 'v sobotu v $1',
+'sunday-at' => 'v neděli v $1',
+'today-at' => '$1',
+'yesterday-at' => 'včera v $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorie|Kategorie}}',
 'category_header' => 'Stránky v kategorii „$1“',
@@ -2154,7 +2164,7 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
 'ncategories' => '$1 {{PLURAL:$1|kategorie|kategorie|kategorií}}',
 'ninterwikis' => '$1 {{PLURAL:$1|mezijazykový odkaz|mezijazykové odkazy|mezijazykových odkazů}}',
 'nlinks' => '$1 {{PLURAL:$1|odkaz|odkazy|odkazů}}',
-'nmembers' => '$1 {{PLURAL:$1|stránka|stránky|stránek}}',
+'nmembers' => '$1 {{PLURAL:$1|položka|položky|položek}}',
 'nrevisions' => '$1 {{PLURAL:$1|revize|revize|revizí}}',
 'nviews' => '$1 {{PLURAL:$1|návšteva|návštevy|návštev}}',
 'nimagelinks' => 'Použit na $1 {{PLURAL:$1|stránce|stránkách}}',
@@ -4144,4 +4154,8 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
 # Image rotation
 'rotate-comment' => 'Obrázek otočen o $1 {{PLURAL:$1|stupeň|stupně|stupňů}} po směru hodinových ručiček',
 
+# Unknown messages
+'hours-ago' => 'před $1 {{PLURAL:$1|hodinou|hodinami}}',
+'minutes-ago' => 'před $1 {{PLURAL:$1|minutou|minutami}}',
+'seconds-ago' => 'před $1 {{PLURAL:$1|sekundou|sekundami}}',
 );
index 63c41f2..8a2cfca 100644 (file)
@@ -2210,7 +2210,7 @@ Fremtidige ændringer af denne side og dens tilknyttede diskussionsside vil bliv
 'watchmethod-list' => 'Tjekker seneste ændringer for sider i din overvågningsliste',
 'watchlistcontains' => 'Din overvågningsliste indeholder $1 {{PLURAL:$1|side|sider}}.',
 'iteminvalidname' => "Problem med '$1', ugyldigt navn...",
-'wlnote' => "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste '''$1''' ændringer}} i {{PLURAL:$2|den sidste time|'''de sidste $2 timer}}''' fra den $3, kl. $4.",
+'wlnote' => "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste '''$1''' ændringer}} i {{PLURAL:$2|den sidste time|'''de sidste $2 timer}}''' op til den $3 kl. $4.",
 'wlshowlast' => 'Vis de seneste $1 timer $2 dage $3',
 'watchlist-options' => 'Indstillinger for overvågningslisten',
 
index fcf0de5..a9fd166 100644 (file)
@@ -518,6 +518,16 @@ $messages = array(
 'nov' => 'Nov.',
 'dec' => 'Dez.',
 
+'monday-at' => 'Montag um $1',
+'tuesday-at' => 'Dienstag um $1',
+'wednesday-at' => 'Mittwoch um $1',
+'thursday-at' => 'Donnerstag um $1',
+'friday-at' => 'Freitag um $1',
+'saturday-at' => 'Samstag um $1',
+'sunday-at' => 'Sonntag um $1',
+'today-at' => '$1',
+'yesterday-at' => 'Gestern um $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorien}}',
 'category_header' => 'Seiten in der Kategorie „$1“',
@@ -832,7 +842,7 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ände
 'yourpasswordagain' => 'Passwort wiederholen:',
 'remembermypassword' => 'Mit diesem Browser dauerhaft angemeldet bleiben (maximal $1 {{PLURAL:$1|Tag|Tage}})',
 'userlogin-remembermypassword' => 'Angemeldet bleiben',
-'userlogin-signwithsecure' => 'Mit dem sicheren Server anmelden',
+'userlogin-signwithsecure' => 'Über den sicheren Server anmelden',
 'securelogin-stick-https' => 'Nach dem Anmelden mit HTTPS verbunden bleiben',
 'yourdomainname' => 'Deine Domain:',
 'password-change-forbidden' => 'Du kannst auf diesem Wiki keine Passwörter ändern.',
@@ -1439,7 +1449,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchprofile-advanced' => 'Erweitert',
 'searchprofile-articles-tooltip' => 'Suchen in $1',
 'searchprofile-project-tooltip' => 'Suchen in $1',
-'searchprofile-images-tooltip' => 'Nach Bildern suchen',
+'searchprofile-images-tooltip' => 'Nach Dateien suchen',
 'searchprofile-everything-tooltip' => 'Gesamten Inhalt durchsuchen (inklusive Diskussionsseiten)',
 'searchprofile-advanced-tooltip' => 'Suche in weiteren Namensräumen',
 'search-result-size' => '$1 ({{PLURAL:$2|1 Wort|$2 Wörter}})',
@@ -1782,8 +1792,8 @@ Stand: $4, $5 Uhr.",
 'rc-change-size' => '$1 {{PLURAL:$1|Byte|Bytes}}',
 'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Bytes}} nach der Änderung',
 'newsectionsummary' => 'Neuer Abschnitt /* $1 */',
-'rc-enhanced-expand' => 'Details anzeigen (benötigt JavaScript)',
-'rc-enhanced-hide' => 'Details verstecken',
+'rc-enhanced-expand' => 'Einzelheiten anzeigen (benötigt JavaScript)',
+'rc-enhanced-hide' => 'Einzelheiten verstecken',
 'rc-old-title' => 'ursprünglich erstellt als „$1“',
 
 # Recent changes linked
@@ -3311,6 +3321,7 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
 'minutes' => '{{PLURAL:$1|$1 Minute|$1 Minuten}}',
 'hours' => '{{PLURAL:$1|1 Stunde|$1 Stunden}}',
 'days' => '{{PLURAL:$1|$1 Tag|$1 Tage}}',
+'weeks' => '{{PLURAL:$1|$1 Woche|$1 Wochen}}',
 'months' => '{{PLURAL:$1|1 Monat|$1 Monate}}',
 'years' => '{{PLURAL:$1|1 Jahr|$1 Jahre}}',
 'ago' => 'vor $1',
@@ -4169,4 +4180,8 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
 # Image rotation
 'rotate-comment' => 'Bild um $1 {{PLURAL:$1|Grad}} im Uhrzeigersinn gedreht',
 
+# Unknown messages
+'hours-ago' => 'vor {{PLURAL:$1|einer Stunde|$1 Stunden}}',
+'minutes-ago' => 'vor {{PLURAL:$1|einer Minute|$1 Minuten}}',
+'seconds-ago' => 'vor {{PLURAL:$1|einer Sekunde|$1 Sekunden}}',
 );
index 8baae84..cf8af7c 100644 (file)
@@ -309,12 +309,12 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Bınê gırey de xete bıance:',
+'tog-underline' => 'Bınê gırey de xete bance:',
 'tog-justify' => 'Paragrafan eyar ke',
 'tog-hideminor' => 'Vurnayışanê şenıkan pela vurnayışanê peyênan de bınımne',
 'tog-hidepatrolled' => 'Vurnayışanê qontrolkerdeyan pela vurnayışê peyêni de bınımne',
 'tog-newpageshidepatrolled' => 'Pelanê qontrolkerdeyan lista pelanê neweyan de bınımne',
-'tog-extendwatchlist' => 'Lista seyrkerdışi hera bıke ke vurnayışi pêro bıasê, tenya tewr peyêni nê',
+'tog-extendwatchlist' => 'Lista seyrkerdışi hera bıke ke vurnayışi pêro basê, tenya tewr peyêni nê',
 'tog-usenewrc' => 'Pele be vurnayışanê grube de vurnayışê peyêni u lista seyrkerdışi (JavaScript lazımo)',
 'tog-numberheadings' => 'Sernuşteyan be xo numre cı şane',
 'tog-showtoolbar' => 'Goceganê hacetanê vurnayışi bımocne (JavaScript lazımo)',
@@ -331,7 +331,7 @@ $messages = array(
 'tog-previewontop' => 'Verqayti pela nuştışi ser de bımocne',
 'tog-previewonfirst' => 'Vurnayışo verên de verqayti tım bımocne',
 'tog-nocache' => 'Pelanê cıgeyrayoği meya xo viri',
-'tog-enotifwatchlistpages' => ' pele ya zi dosyaya ke lista mına seyrkerdışi de vurnayê mı rê e-poste bırışe',
+'tog-enotifwatchlistpages' => 'Yew pele ya zi dosyaya ke lista mına seyrkerdışi de vurnayê mı rê e-poste bırışe',
 'tog-enotifusertalkpages' => 'Pela mına werênayışi ke vurnayê mı rê e-poste bırışe',
 'tog-enotifminoredits' => 'Vurnayışanê qıckekanê pelan u dosyeyan de zi mı rê e-poste bırışe',
 'tog-enotifrevealaddr' => 'Adresa e-posteyê mı posteyê xeberan de bımocne',
@@ -346,17 +346,17 @@ $messages = array(
 'tog-watchlisthideminor' => 'Vurnayışanê qıckekan lista mına seyrkerdışi de bınımne',
 'tog-watchlisthideliu' => 'Lista seyrkerdışi ra vurnayışanê karberanê cıkewteyan bınımne',
 'tog-watchlisthideanons' => 'Lista seyrkerdışi ra vurnayışanê karberanê anoniman bınımne',
-'tog-watchlisthidepatrolled' => 'Lista seyrkerdışi ra vurnayışanê qontrol kerdeyan bınımne',
+'tog-watchlisthidepatrolled' => 'Lista seyrkerdışi ra vurnayışanê qontrolkerdeyan bınımne',
 'tog-ccmeonemails' => 'E-posteyanê ke ez karberanê binan rê rışenan, mı rê kopya inan bırışe',
 'tog-diffonly' => 'Qıyasê versiyonan de tek ferqan bımocne, pela butıne nê',
-'tog-showhiddencats' => 'Kategoriyanê dızdine bımocne',
+'tog-showhiddencats' => 'Kategoriyanê dızdiye bımocne',
 'tog-noconvertlink' => 'Greyê sernami çerx kerdışi bıqefılne',
 'tog-norollbackdiff' => 'Peyserardışi ra dıme ferqi caverde',
-'tog-useeditwarning' => 'wexta ke ez pelo nêqeydbiyaye ra veciyaya mı hişyar bıker',
+'tog-useeditwarning' => 'Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de',
 
 'underline-always' => 'Tım',
 'underline-never' => 'Qet',
-'underline-default' => 'Cild ya zi cıgeyrayoğo hesıbyaye',
+'underline-default' => 'Cild ya zi cıgeyrayoğo hesebiyaye',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Cayê vurnayışi de terzê nuştışi:',
@@ -2091,12 +2091,12 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'brokenredirects-edit' => 'bıvurne',
 'brokenredirects-delete' => 'bestere',
 
-'withoutinterwiki' => 'Peleyê ke zıwanan de bina re gırey cı çınyo',
+'withoutinterwiki' => 'Pelê ke zıwananê binan rê gıreyê cı çıniyo',
 'withoutinterwiki-summary' => 'Enê pelî ke versiyonê ziwanî binî ra link nidano.',
 'withoutinterwiki-legend' => 'Verole',
 'withoutinterwiki-submit' => 'Bımocne',
 
-'fewestrevisions' => 'Peleyê ke cı sero tewr tayn timaryayış vıraziyayo',
+'fewestrevisions' => 'Pelê be senık çımraviyarnayışi',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt|bayti}}',
@@ -2114,17 +2114,17 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'uncategorizedpages' => 'Pelayanê ke kategorî nibiye',
 'uncategorizedcategories' => 'Kategoriyê ke bê kategorîyê',
 'uncategorizedimages' => 'Dosyayê ke bê kategoriyê',
-'uncategorizedtemplates' => 'Şablonê ke bê kategoriyê',
+'uncategorizedtemplates' => 'Şablonê ke bêkategoriyê',
 'unusedcategories' => 'Kategoriyê ke nê xebtênê',
 'unusedimages' => 'Dosyeyê ke nê xebtênê',
 'popularpages' => 'Pelî ke populer o.',
 'wantedcategories' => 'Kategoriye ke waştênê',
 'wantedpages' => 'Peleye ke waştênê',
 'wantedpages-badtitle' => 'sernuşte meqbul niyo: $1',
-'wantedfiles' => 'Dosyeye ke waştênê',
+'wantedfiles' => 'Dosyeyê cıgeyriyayey',
 'wantedfiletext-cat' => 'Dosyaya cêrên karvıstedeya lakin çınya. Mewcud dosyayan de xeriba miyan de liste bena. Xırabiya wınisin dana <del>ateber</del>. Zewbi zi, şırê pela da dosyeyê ke çınyaya [[:$1]].',
 'wantedfiletext-nocat' => 'Dosyeyê cêrêni estê lekin karnêvıstê. Dosyeyê xeribi liste benê. bo babeta dano <del>ateber</del>',
-'wantedtemplates' => 'Şablonê ke waştênê',
+'wantedtemplates' => 'Şablonê ke waziyenê',
 'mostlinked' => 'Pelî ke tewr zafî lînk bîy.',
 'mostlinkedcategories' => 'Kategorî ke tewr zafî lînk bîy.',
 'mostlinkedtemplates' => 'Şablonê ke tewr zafî pela re gıre bîye.',
@@ -2136,14 +2136,14 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'prefixindex-namespace' => 'Peleyê Veroleyıni ($1 cay nami)',
 'shortpages' => 'Pelê kılmeki',
 'longpages' => 'Peleyê dergeki',
-'deadendpages' => 'pelê ke pelê binan re gırey nêeşto',
+'deadendpages' => 'Pelê nêgıredayey',
 'deadendpagestext' => 'Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.',
-'protectedpages' => 'Pelayê ke biyê star',
+'protectedpages' => 'Pelê pawıtiyey',
 'protectedpages-indef' => 'têna pawıteyê bêmuddeti',
 'protectedpages-cascade' => 'Kilit biyaye ke teyna cascadiye',
 'protectedpagestext' => 'pelê cêrınî pawiyenê',
 'protectedpagesempty' => 'pê ney parametreyan pelê pawiteyi çinî',
-'protectedtitles' => 'Sernameyê ke starênê',
+'protectedtitles' => 'Sernameyê pawıtiyey',
 'protectedtitlestext' => 'sernameyê cêrıni pawıte yî',
 'protectedtitlesempty' => 'pê ney parametreyan sernuşteyê pawite çinê',
 'listusers' => 'Listeyê Karberan',
@@ -2504,9 +2504,9 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 'restriction-upload' => 'Bar ke',
 
 # Restriction levels
-'restriction-level-sysop' => 'pawıtışê tamamîye',
-'restriction-level-autoconfirmed' => 'nêm-pawıtış',
-'restriction-level-all' => 'seviye ya ke raşt ame',
+'restriction-level-sysop' => 'tam pawiyayo',
+'restriction-level-autoconfirmed' => 'nêm pawiyayo',
+'restriction-level-all' => 'heme yew sewiya',
 
 # Undelete
 'undelete' => 'Peleyê ke besterneyayê enê bımocnê',
@@ -4053,14 +4053,14 @@ Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqed
 * Xısusi pelaya normal
 * <span class="mw-specialpagerestricted">Xısusi peleyê keı rê ray nê deyaya.</span>
 * <strong class="mw-specialpagerestricted">Peleya xısusiya ke grota verhefıza.</strong>',
-'specialpages-group-maintenance' => 'Raporê pak tepiştîşî',
+'specialpages-group-maintenance' => 'Raporê tepıştışi',
 'specialpages-group-other' => 'Pelê xasiyê bini',
 'specialpages-group-login' => 'Cı kewe / hesab vıraze',
 'specialpages-group-changes' => 'Vurnayişê peni u logan',
 'specialpages-group-media' => 'Raporê medya u bar kerdîşî',
 'specialpages-group-users' => 'Karber u heqqî',
 'specialpages-group-highuse' => 'Peleyê ke vêşi karênê',
-'specialpages-group-pages' => 'listeyanê pelan',
+'specialpages-group-pages' => 'Listeyê pelan',
 'specialpages-group-pagetools' => 'Haletê pelan',
 'specialpages-group-wiki' => 'Melumat u haceti',
 'specialpages-group-redirects' => 'Pela xasîyê ke heteneyayê',
index 80dd417..8191f59 100644 (file)
@@ -253,6 +253,8 @@ $magicWords = array(
        'fullpagenamee'           => array( 1,    'FULLPAGENAMEE' ),
        'subpagename'             => array( 1,    'SUBPAGENAME' ),
        'subpagenamee'            => array( 1,    'SUBPAGENAMEE' ),
+       'rootpagename'            => array( 1,    'ROOTPAGENAME' ),
+       'rootpagenamee'           => array( 1,    'ROOTPAGENAMEE' ),
        'basepagename'            => array( 1,    'BASEPAGENAME' ),
        'basepagenamee'           => array( 1,    'BASEPAGENAMEE' ),
        'talkpagename'            => array( 1,    'TALKPAGENAME' ),
@@ -1079,10 +1081,15 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'yourname'                     => 'Username:',
 'userlogin-yourname'           => 'Username',
 'userlogin-yourname-ph'        => 'Enter your username',
+'createacct-helpusername-url'     => '{{ns:Project}}:Username_policy',
+'createacct-helpusername-link'    => '[[{{MediaWiki:createacct-helpusername-url}}|(help me choose)]]',
 'yourpassword'                 => 'Password:',
 'userlogin-yourpassword'       => 'Password',
 'userlogin-yourpassword-ph'    => 'Enter your password',
+'createacct-yourpassword-ph'      => 'Enter a password',
 'yourpasswordagain'            => 'Retype password:',
+'createacct-yourpasswordagain'    => 'Confirm password',
+'createacct-yourpasswordagain-ph' => 'Enter password again',
 'remembermypassword'           => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'userlogin-remembermypassword' => 'Remember me',
 'userlogin-signwithsecure'     => 'Sign in with secure server',
@@ -1109,12 +1116,33 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'userlogin-resetlink'          => 'Forgotten your login details?',
 'helplogin-url'                => 'Help:Logging in',
 'userlogin-helplink'           => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]',
+'createacct-join'                 => 'Enter your information below.',
+'createacct-emailrequired'        => 'Email address',
+'createacct-emailoptional'        => 'Email address (optional)',
+'createacct-email-ph'             => 'Enter your email address',
 'createaccountmail'            => 'Use a temporary random password and send it to the email address specified below',
+'createacct-realname'             => 'Real name (optional)',
 'createaccountreason'          => 'Reason:',
+'createacct-reason'               => 'Reason',
+'createacct-captcha'              => 'Security check',
+'createacct-captcha-help-url'     => '{{ns:Project}}:Request an account',
+'createacct-imgcaptcha-help'      => 'Can\'t see the image? [[{{MediaWiki:createacct-captcha-help-url}}|Request an account]]',
+'createacct-imgcaptcha-ph'        => 'Enter the text you see above',
+'createacct-benefit-heading'      => '{{SITENAME}} is made by people like you.',
+'createacct-benefit-icon1'        => 'icon-edits',
+'createacct-benefit-head1'        => '{{NUMBEROFEDITS}}',
+'createacct-benefit-body1'        => 'edits',
+'createacct-benefit-icon2'        => 'icon-pages',
+'createacct-benefit-head2'        => '{{NUMBEROFARTICLES}}',
+'createacct-benefit-body2'        => 'pages',
+'createacct-benefit-icon3'        => 'icon-contributors',
+'createacct-benefit-head3'        => '{{NUMBEROFACTIVEUSERS}}',
+'createacct-benefit-body3'        => 'contributors this month',
 'badretype'                    => 'The passwords you entered do not match.',
 'userexists'                   => 'Username entered already in use.
 Please choose a different name.',
 'loginerror'                   => 'Login error',
+'createacct-error'             => 'Account creation error',
 'createaccounterror'           => 'Could not create account: $1',
 'nocookiesnew'                 => 'The user account was created, but you are not logged in.
 {{SITENAME}} uses cookies to log in users.
@@ -3890,20 +3918,19 @@ By executing it, your system may be compromised.",
 'ago'            => '$1 ago',
 'just-now'       => 'just now',
 
-'hours-ago'      => '$1 {{PLURAL:$1|hour|hours}} ago',
-'minutes-ago'    => '$1 {{PLURAL:$1|minute|minutes}} ago',
-'seconds-ago'    => '$1 {{PLURAL:$1|seconds|seconds}} ago',
-
-'monday-at'      => 'Monday at $1',
-'tuesday-at'     => 'Tuesday at $1',
-'wednesday-at'   => 'Wednesday at $1',
-'thursday-at'    => 'Thursday at $1',
-'friday-at'      => 'Friday at $1',
-'saturday-at'    => 'Saturday at $1',
-'sunday-at'      => 'Sunday at $1',
-
-'today-at'       => '$1',
-'yesterday-at'   => 'Yesterday at $1',
+# Human-readable timestamps
+'hours-ago'    => '$1 {{PLURAL:$1|hour|hours}} ago',
+'minutes-ago'  => '$1 {{PLURAL:$1|minute|minutes}} ago',
+'seconds-ago'  => '$1 {{PLURAL:$1|seconds|seconds}} ago',
+'monday-at'    => 'Monday at $1',
+'tuesday-at'   => 'Tuesday at $1',
+'wednesday-at' => 'Wednesday at $1',
+'thursday-at'  => 'Thursday at $1',
+'friday-at'    => 'Friday at $1',
+'saturday-at'  => 'Saturday at $1',
+'sunday-at'    => 'Sunday at $1',
+'today-at'     => '$1',
+'yesterday-at' => 'Yesterday at $1',
 
 # Bad image list
 'bad_image_list' => 'The format is as follows:
index 0d41e46..f570b42 100644 (file)
@@ -422,6 +422,8 @@ $messages = array(
 'nov' => 'Nov',
 'dec' => 'Dec',
 
+'today-at' => '$1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorio|Kategorioj}}',
 'category_header' => 'Artikoloj en kategorio "$1"',
@@ -730,9 +732,14 @@ Notu ke iuj paĝoj daŭre ŝajnos kvazaŭ vi ankoraŭ estus ensalutinta, ĝis vi
 'welcomecreation-msg' => 'Via konto estas kreita.
 Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'yourname' => 'Salutnomo:',
+'userlogin-yourname' => 'Uzantonomo',
+'userlogin-yourname-ph' => 'Enigu vian uzantonomon',
 'yourpassword' => 'Pasvorto:',
+'userlogin-yourpassword' => 'Pasvorto',
+'userlogin-yourpassword-ph' => 'Enigu vian pasvorton',
 'yourpasswordagain' => 'Retajpu pasvorton',
 'remembermypassword' => 'Memori mian ensalutadon ĉe ĉi tiu komputilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
+'userlogin-remembermypassword' => 'Memoru min',
 'securelogin-stick-https' => 'Resti konektita al HTTPS post ensalutado',
 'yourdomainname' => 'Via domajno',
 'password-change-forbidden' => 'Ve ne povas ŝanĝi pasvortojn en ĉi tiu vikio.',
@@ -745,12 +752,14 @@ Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'logout' => 'Elsaluti',
 'userlogout' => 'Elsaluti',
 'notloggedin' => 'Ne ensalutinta',
+'userlogin-noaccount' => 'Ĉu vi ne havas konton?',
 'nologin' => "Ĉu vi ne havas konton? '''$1'''.",
 'nologinlink' => 'Krei konton',
 'createaccount' => 'Krei novan konton',
 'gotaccount' => "Ĉu vi jam havas konton? '''$1'''.",
 'gotaccountlink' => 'Ensaluti',
 'userlogin-resetlink' => 'Ĉu vi forgesis ensalutajn detalojn?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Helpo pri ensalutado]]',
 'createaccountmail' => 'Uzi provizoran hazardsignan pasvorton kaj sendi ĝin al la retpoŝto suben',
 'createaccountreason' => 'Kialo:',
 'badretype' => 'La pasvortojn kiujn vi tajpis ne egalas.',
@@ -822,6 +831,7 @@ Bonvolu ĝisatendi antaŭ retrovi.',
 # Email sending
 'php-mail-error-unknown' => 'Nekonata eraro en la funkcio mail() de PHP',
 'user-mail-no-addy' => 'Provis sendi retpoŝton sen retpoŝtadreso.',
+'user-mail-no-body' => 'Provo sendi malplenan aŭ sensence mallongan retpošton.',
 
 # Change password dialog
 'resetpass' => 'Ŝanĝi pasvorton',
@@ -843,9 +853,10 @@ Vi eble jam ŝanĝis vian pasvorton aŭ petis novan provizoran pasvorton.',
 
 # Special:PasswordReset
 'passwordreset' => 'Restarigo de pasvorto',
-'passwordreset-text' => 'Plenumigu ĉi tiun formularon por ricevi retpoŝtan memoraĵon de viaj kontaj detaloj.',
+'passwordreset-text' => 'Plenigu ĉi tiun formularon por renovigi vian pasvorton.',
 'passwordreset-legend' => 'Refari pasvorton',
 'passwordreset-disabled' => 'Pasvortaj restarigoj estis malŝaltitaj en ĉi tiu vikio.',
+'passwordreset-emaildisabled' => 'Retpoŝtaj funkcioj estas malfunkciigitaj en tiu ĉi vikio.',
 'passwordreset-pretext' => '{{PLURAL:$1||Enigi unu el la jenaj datenoj}}',
 'passwordreset-username' => 'Salutnomo:',
 'passwordreset-domain' => 'Domajno:',
@@ -875,9 +886,9 @@ aŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas ŝanĝi
 ĝin, vi povas ignori ĉi tiun mesaĝon kaj uzi vian malnovan pasvorton.',
 'passwordreset-emailelement' => 'Salutnomo: $1
 Provizora pasvorto: $2',
-'passwordreset-emailsent' => 'Rememoriga retpoŝto estis sendita.',
-'passwordreset-emailsent-capture' => 'Memoriga retpoŝto estis sendita, kiu estas montrata sube.',
-'passwordreset-emailerror-capture' => 'Memoriga retpoŝto estis generita, montrata sube, sed sendado al uzanto malsukcesis: $1',
+'passwordreset-emailsent' => 'Renovigita pasvorto estis retpoŝte sendita.',
+'passwordreset-emailsent-capture' => 'Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata sube.',
+'passwordreset-emailerror-capture' => 'Retpoŝto kun renovigita pasvorto estis generita, montrata sube, sed sendado al uzanto malsukcesis: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ŝanĝi retpoŝtadreson',
@@ -1359,7 +1370,7 @@ Detaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'search-interwiki-default' => '$1 rezultoj:',
 'search-interwiki-more' => '(plu)',
 'search-relatedarticle' => 'Relataj',
-'mwsuggest-disable' => 'Malŝalti AJAX-sugestojn',
+'mwsuggest-disable' => 'Malŝalti serĉajn sugestojn',
 'searcheverything-enable' => 'Traserĉi ĉiujn nomspacojn',
 'searchrelated' => 'rilataj',
 'searchall' => 'ĉiuj',
@@ -1380,6 +1391,7 @@ Provu prefiksi vian mendon kun ''all:'' por serĉi ĉiun enhavon (inkluzivante d
 'search-external' => 'Ekstera serĉo',
 'searchdisabled' => '<p>Oni provizore malŝaltis serĉadon per la plenteksta
 indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> aŭ per <i>jahu!</i>:</p>',
+'search-error' => 'Okazis eraro dum serĉado: $1',
 
 # Preferences page
 'preferences' => 'Preferoj',
@@ -2447,6 +2459,7 @@ Vidu [[Special:ProtectedPages|liston de protektitaj paĝoj]] por listo de aktual
 'prot_1movedto2' => '[[$1]] movita al [[$2]]',
 'protect-badnamespace-title' => 'Ne-protektebla nomspaco',
 'protect-badnamespace-text' => 'Paĝoj en ĉi tiu datumbazo ne povas esti protektita.',
+'protect-norestrictiontypes-title' => 'Neprotektebla paĝo',
 'protect-legend' => 'Konfirmi protektadon',
 'protectcomment' => 'Kialo:',
 'protectexpiry' => 'Eksvalidiĝas:',
@@ -2462,9 +2475,9 @@ Jen la aktualaj valoroj por la paĝo '''$1''':",
 'protect-cascadeon' => 'Ĉi paĝo estas nun protektita kontraŭ redaktado ĉar ĝi estas inkluzivita en {{PLURAL:$1|jena paĝo, kiu mem estas protektita|jenaj paĝoj, kiuj mem estas protektitaj}} per kaskada protekto.
 Vi povas ŝanĝi ties protektnivelon, sed tio ne ŝanĝos la kaskadan protekton.',
 'protect-default' => 'Permesigi ĉiujn uzantojn',
-'protect-fallback' => 'Rajto "$1" nepras.',
+'protect-fallback' => 'Permesi nur uzantojn kun la rajto  "$1"',
 'protect-level-autoconfirmed' => 'Bloki novajn kaj neregistritajn uzantojn',
-'protect-level-sysop' => 'Nur administrantoj',
+'protect-level-sysop' => 'Permesi nur administrantojn',
 'protect-summary-cascade' => 'kaskada',
 'protect-expiring' => 'finiĝas je $1 (UTC)',
 'protect-expiring-local' => 'eksdatiĝas $1',
@@ -3106,6 +3119,7 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'pageinfo-robot-noindex' => 'Ne indeksebla',
 'pageinfo-views' => 'Nombro de rigardoj',
 'pageinfo-watchers' => 'Nombro de paĝatentantoj',
+'pageinfo-few-watchers' => 'Malpli ol $1 {{PLURAL:$1|atentanto|atentantoj}}',
 'pageinfo-redirects-name' => 'Alidirektoj al ĉi tiu paĝo',
 'pageinfo-subpages-name' => 'Subpaĝoj de ĉi tiu paĝo',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|alidirektilo|alidirektiloj}}; $3 {{PLURAL:$3|ne-alidirektilo|ne-alidirektiloj}})',
@@ -3213,6 +3227,7 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutoj}}',
 'hours' => '{{PLURAL:$1|$1 horo|$1 horoj}}',
 'days' => '{{PLURAL:$1|$1 tago|$1 tagoj}}',
+'weeks' => '{{PLURAL:$1|$1 semajno|$1 semajnoj}}',
 'months' => '{{PLURAL:$1|$1 monato|$1 monatoj}}',
 'years' => '{{PLURAL:$1|$1 jaro|$1 jaroj}}',
 'ago' => 'antaŭ $1',
@@ -3989,6 +4004,8 @@ Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
 'htmlform-submit' => 'Ek!',
 'htmlform-reset' => 'Malfari ŝanĝojn',
 'htmlform-selectorother-other' => 'Alia',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Jes',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 kun tut-teksta subteno',
@@ -3999,13 +4016,13 @@ Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
 'logentry-delete-restore' => '$1 restarigis paĝon $3',
 'logentry-delete-event' => '$1 ŝanĝis videblecon de {{PLURAL:$5|protokola evento|$5 protokolaj eventoj}} je $3: $4',
 'logentry-delete-revision' => '$1 ŝanĝis videblecon de {{PLURAL:$5|revizio|$5 reviziojn}} je paĝo $3: $4',
-'logentry-delete-event-legacy' => '$1 ŝanĝis vidiblecon de protokolaj eventoj en $3',
-'logentry-delete-revision-legacy' => '$1 ŝanĝis vidiblecon de revizioj en $3',
+'logentry-delete-event-legacy' => '$1 ŝanĝis videblecon de protokolaj eventoj en $3',
+'logentry-delete-revision-legacy' => '$1 ŝanĝis videblecon de revizioj en $3',
 'logentry-suppress-delete' => '$1 kaŝis paĝon $3',
 'logentry-suppress-event' => '$1 kaŝite ŝanĝis videblecon de {{PLURAL:$5|protokola evento|$5 protokolaj eventoj}} je $3: $4',
 'logentry-suppress-revision' => '$1 kaŝite ŝanĝis videblecon de {{PLURAL:$5|revizio|$5 reviziojn}} je paĝo $3: $4',
-'logentry-suppress-event-legacy' => '$1 kaŝite ŝanĝis vidiblecon de protokolaj eventoj en $3',
-'logentry-suppress-revision-legacy' => '$1 kaŝite ŝanĝis vidiblecon de revizioj en paĝo $3',
+'logentry-suppress-event-legacy' => '$1 kaŝite ŝanĝis videblecon de protokolaj eventoj en $3',
+'logentry-suppress-revision-legacy' => '$1 kaŝite ŝanĝis videblecon de revizioj en paĝo $3',
 'revdelete-content-hid' => 'enhavo kaŝita',
 'revdelete-summary-hid' => 'resumo de redakto kaŝita',
 'revdelete-uname-hid' => 'salutnomo kaŝita',
@@ -4015,15 +4032,16 @@ Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
 'revdelete-restricted' => 'aplikis limojn al administrantoj',
 'revdelete-unrestricted' => 'forigis limojn por administrantoj',
 'logentry-move-move' => '$1 movis paĝon $3 al $4',
-'logentry-move-move-noredirect' => '$1 movis paĝon $3 al $4 sen lasante alidirektilon',
+'logentry-move-move-noredirect' => '$1 movis paĝon $3 al $4 ne lasante alidirektilon',
 'logentry-move-move_redir' => '$1 movis paĝon $3 al $4 anstataŭigante alidirektilon',
-'logentry-move-move_redir-noredirect' => '$1 movis paĝon $3 al $4 anstataŭigante alidirektilon sen lasante alidirektilon',
-'logentry-patrol-patrol' => '$1 markis revizion $4 de paĝo $3 kiel patrolita',
-'logentry-patrol-patrol-auto' => '$1 aŭtomate markis revizion $4 de paĝo $3 kiel patrolita',
-'logentry-newusers-newusers' => '$1 kreis konton',
-'logentry-newusers-create' => '$1 kreis konton',
-'logentry-newusers-create2' => '$1 kreis uzanton $3',
-'logentry-newusers-autocreate' => 'Konto $1 estis kreita aŭtomate',
+'logentry-move-move_redir-noredirect' => '$1 movis paĝon $3 al $4 anstataŭigante alidirektilon ne lasante alidirektilon',
+'logentry-patrol-patrol' => '$1 markis revizion $4 de paĝo $3 patrolita',
+'logentry-patrol-patrol-auto' => '$1 aŭtomate markis revizion $4 de paĝo $3 patrolita',
+'logentry-newusers-newusers' => 'Konto de uzanto $1 estis kreita',
+'logentry-newusers-create' => 'Konto de uzanto $1 estis kreita',
+'logentry-newusers-create2' => 'Konto de uzanto $3 estis kreita de $1',
+'logentry-newusers-byemail' => 'Konto de uzanto $3 estis kreita de $1 kaj pasvorto estis sendita per retpoŝto',
+'logentry-newusers-autocreate' => 'Uzantokonto $1 estis kreita aŭtomate',
 'logentry-rights-rights' => '$1 ŝanĝis grupan membrecon por $3 de $4 al $5',
 'logentry-rights-rights-legacy' => '$1 ŝanĝis grupan membrecon por $3',
 'logentry-rights-autopromote' => '$1 estis aŭtomate {{GENDER:$2|altrangigita}} de $4 al $5',
@@ -4102,4 +4120,8 @@ Aŭ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la pa
 'duration-centuries' => '$1 {{PLURAL:$1|jarcento|jarcentoj}}',
 'duration-millennia' => '$1 {{PLURAL:$1|jarmilo|jarmiloj}}',
 
+# Unknown messages
+'hours-ago' => 'antaŭ $1 {{PLURAL:$1|horo|horoj}}',
+'minutes-ago' => 'antaŭ $1 {{PLURAL:$1|minuto|minutoj}}',
+'seconds-ago' => 'antaŭ $1 {{PLURAL:$1|sekundo|sekundoj}}',
 );
index d144573..5b01aa1 100644 (file)
@@ -474,6 +474,16 @@ $messages = array(
 'nov' => 'nov',
 'dec' => 'dic',
 
+'monday-at' => 'El lunes a las $1',
+'tuesday-at' => 'El martes a las $1',
+'wednesday-at' => 'El miércoles a las $1',
+'thursday-at' => 'El jueves a las $1',
+'friday-at' => 'El viernes a las $1',
+'saturday-at' => 'El sábado a las $1',
+'sunday-at' => 'El domingo a las $1',
+'today-at' => '$1',
+'yesterday-at' => 'Ayer a las $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoría|Categorías}}',
 'category_header' => 'Artículos en la categoría «$1»',
@@ -4121,4 +4131,8 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 # Image rotation
 'rotate-comment' => 'Imagen girada por $1 {{PLURAL:$1|grado|grados}} en el sentido de las agujas del reloj',
 
+# Unknown messages
+'hours-ago' => 'hace $1 {{PLURAL:$1|hora|horas}}',
+'minutes-ago' => 'hace {{PLURAL:$1|un minuto|$1 minutos}}',
+'seconds-ago' => 'hace $1 {{PLURAL:$1|segundo|segundos}}',
 );
index a3ecc82..591f6ed 100644 (file)
@@ -538,6 +538,16 @@ $messages = array(
 'nov' => 'نوامبر',
 'dec' => 'دسامبر',
 
+'monday-at' => 'دوشنبهٔ $1',
+'tuesday-at' => 'سه‌شنبهٔ $1',
+'wednesday-at' => 'چهارشنبهٔ $1',
+'thursday-at' => 'پنج‌شنبهٔ $1',
+'friday-at' => 'جمعهٔ $1',
+'saturday-at' => 'شنبهٔ $1',
+'sunday-at' => 'یک‌شنبهٔ $1',
+'today-at' => '$1',
+'yesterday-at' => 'دیروز $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|رده|رده‌ها}}',
 'category_header' => 'صفحه‌های ردهٔ «$1»',
@@ -4272,4 +4282,8 @@ $5
 # Image rotation
 'rotate-comment' => 'تصویر به دست $1 {{PLURAL:$1|درجهٔ|درجهٔ}} ساعت‌گرد چرخانده شد',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|ساعت|ساعت}} قبل',
+'minutes-ago' => '$1 {{PLURAL:$1|دقیقه|دقیقه}} قبل',
+'seconds-ago' => '$1 {{PLURAL:$1|ثانیه|ثانیه}} قبل',
 );
index 10a6f50..f7c996a 100644 (file)
@@ -495,6 +495,16 @@ $messages = array(
 'nov' => 'nov',
 'dec' => 'déc',
 
+'monday-at' => 'Lundi à $1',
+'tuesday-at' => 'Mardi à $1',
+'wednesday-at' => 'Mercredi à $1',
+'thursday-at' => 'Jeudi à $1',
+'friday-at' => 'Vendredi à $1',
+'saturday-at' => 'Samedi à $1',
+'sunday-at' => 'Dimanche à $1',
+'today-at' => '$1',
+'yesterday-at' => 'Hier à $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Catégorie|Catégories}}',
 'category_header' => 'Pages dans la catégorie « $1 »',
@@ -546,7 +556,7 @@ $messages = array(
 'vector-simplesearch-preference' => "Activer la barre de recherche simplifiée (seulement pour l'habillage Vector)",
 'vector-view-create' => 'Créer',
 'vector-view-edit' => 'Modifier',
-'vector-view-history' => "Afficher l'historique",
+'vector-view-history' => 'Afficher l’historique',
 'vector-view-view' => 'Lire',
 'vector-view-viewsource' => 'Voir la source',
 'actions' => 'Actions',
@@ -3306,6 +3316,7 @@ Si vous l'exécutez, votre système peut être compromis.",
 'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
 'hours' => '{{PLURAL:$1|$1 heure|$1 heures}}',
 'days' => '{{PLURAL:$1|$1 jour|$1 jours}}',
+'weeks' => '{{PLURAL:$1|$1 semaine|$1 semaines}}',
 'months' => '{{PLURAL:$1|$1 mois}}',
 'years' => '{{PLURAL:$1|$1 an|$1 ans}}',
 'ago' => 'Il y a $1',
@@ -4227,4 +4238,8 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 # Image rotation
 'rotate-comment' => 'Image pivotée de $1 {{PLURAL:$1|degré|degrés}} dans le sens des aiguilles d’une montre',
 
+# Unknown messages
+'hours-ago' => 'il y a $1 {{PLURAL:$1|heure|heures}}',
+'minutes-ago' => 'il y a $1 {{PLURAL:$1|minute|minutes}}',
+'seconds-ago' => 'il y a $1 {{PLURAL:$1|seconde|secondes}}',
 );
index 9d60c9f..9457d96 100644 (file)
@@ -371,21 +371,21 @@ $messages = array(
 'tog-watchmoves' => 'מעקב אחרי דפים וקבצים שהעברתי',
 'tog-watchdeletion' => 'מעקב אחרי דפים וקבצים שמחקתי',
 'tog-minordefault' => 'הגדרת כל פעולת עריכה כמשנית אם לא צוין אחרת',
-'tog-previewontop' => 'הצגת תצוגה מקדימה לפני תיבת העריכה (או: אחריה)',
+'tog-previewontop' => 'הצגת תצוגה מקדימה לפני תיבת העריכה',
 'tog-previewonfirst' => 'הצגת תצוגה מקדימה בעריכה ראשונה',
 'tog-nocache' => 'מניעת אחסון הדפים בזיכרון המטמון בדפדפן',
 'tog-enotifwatchlistpages' => 'לשלוח אליי דואר אלקטרוני כאשר משתנה דף או קובץ ברשימת המעקב שלי',
 'tog-enotifusertalkpages' => 'לשלוח אליי דואר אלקטרוני כאשר נעשה שינוי בדף שיחת המשתמש שלי',
 'tog-enotifminoredits' => 'לשלוח אליי דואר אלקטרוני גם על עריכות משניות של דפים וקבצים',
 'tog-enotifrevealaddr' => 'חשיפת כתובת הדוא"ל שלך בהודעות דוא"ל',
-'tog-shownumberswatching' => 'הצגת מספר המשתמשים העוקבים אחרי הדף',
-'tog-oldsig' => '×\94×\97ת×\99×\9e×\94 ×\94ק×\99×\99×\9eת:',
+'tog-shownumberswatching' => 'הצגת מספר המשתמשים העוקבים',
+'tog-oldsig' => '×\94×\97ת×\99×\9e×\94 ×\94× ×\95×\9b×\97×\99ת:',
 'tog-fancysig' => 'פירוש החתימה כקוד ויקי (ללא קישור אוטומטי)',
-'tog-showjumplinks' => 'הצגת קישורי נגישות מסוג "קפוץ אל"',
+'tog-showjumplinks' => 'הצגת קישורי נגישות מסוג "{{int:jumpto}}"',
 'tog-uselivepreview' => 'שימוש בתצוגה מקדימה מהירה (דרוש JavaScript) (ניסיוני)',
 'tog-forceeditsummary' => 'הצגת אזהרה בעת הכנסת תקציר עריכה ריק',
-'tog-watchlisthideown' => 'הסתרת עריכות שלי ברשימת המעקב',
-'tog-watchlisthidebots' => 'הסתרת בוטים ברשימת המעקב',
+'tog-watchlisthideown' => '×\94סתרת ×\94ער×\99×\9b×\95ת ×©×\9c×\99 ×\91רש×\99×\9eת ×\94×\9eעק×\91',
+'tog-watchlisthidebots' => '×\94סתרת ×¢×¨×\99×\9b×\95ת ×©×\9c ×\91×\95×\98×\99×\9d ×\91רש×\99×\9eת ×\94×\9eעק×\91',
 'tog-watchlisthideminor' => 'הסתרת עריכות משניות ברשימת המעקב',
 'tog-watchlisthideliu' => 'הסתרת עריכות של משתמשים רשומים ברשימת המעקב',
 'tog-watchlisthideanons' => 'הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב',
@@ -460,6 +460,16 @@ $messages = array(
 'nov' => "נוב'",
 'dec' => "דצמ'",
 
+'monday-at' => 'ביום שני בשעה $1',
+'tuesday-at' => 'ביום שלישי בשעה $1',
+'wednesday-at' => 'ביום רביעי בשעה $1',
+'thursday-at' => 'ביום חמישי בשעה $1',
+'friday-at' => 'ביום שישי בשעה $1',
+'saturday-at' => 'בשבת בשעה $1',
+'sunday-at' => 'ביום ראשון בשעה $1',
+'today-at' => '$1',
+'yesterday-at' => 'אתמול בשעה $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|קטגוריה|קטגוריות}}',
 'category_header' => 'דפים בקטגוריה "$1"',
@@ -3302,6 +3312,7 @@ $1',
 'minutes' => '{{PLURAL:$1|דקה|$1 דקות}}',
 'hours' => '{{PLURAL:$1|שעה|שעתיים|$1 שעות}}',
 'days' => '{{PLURAL:$1|יום|יומיים|$1 ימים}}',
+'weeks' => '{{PLURAL:$1|שבוע|שבועיים|$1 שבועות}}',
 'months' => '{{PLURAL:$1|חודש|חודשיים|$1 חודשים}}',
 'years' => '{{PLURAL:$1|שנה|שנתיים|$1 שנים}}',
 'ago' => 'לפני $1',
@@ -4204,4 +4215,8 @@ $5
 # Image rotation
 'rotate-comment' => 'התמונה סובבה {{PLURAL:$1|במעלה אחת|ב֫־$1 מעלות}} בכיוון השעון',
 
+# Unknown messages
+'hours-ago' => 'לפני {{PLURAL:$1|שעה|שעתיים|$1 שעות}}',
+'minutes-ago' => 'לפני {{PLURAL:$1|דקה|$1 דקות}}',
+'seconds-ago' => 'לפני {{PLURAL:$1|שנייה|$1 שניות}}',
 );
index 20ef535..2332a69 100644 (file)
@@ -1494,9 +1494,9 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'rc-old-title' => 'prěnjotnje wutworjeny jako "$1"',
 
 # Recent changes linked
-'recentchangeslinked' => 'Změny w zwjazanych stronach',
+'recentchangeslinked' => 'Změny na zwjazanych stronach',
 'recentchangeslinked-feed' => 'Změny zwjazanych stron',
-'recentchangeslinked-toolbox' => 'Změny w zwjazanych stronach',
+'recentchangeslinked-toolbox' => 'Změny na zwjazanych stronach',
 'recentchangeslinked-title' => 'Změny na stronach, kotrež su z „$1“ wotkazane',
 'recentchangeslinked-noresult' => 'Njejsu změny zwajzanych stron we wubranej dobje.',
 'recentchangeslinked-summary' => "Tuta strona nalistuje poslednje změny na wotkazanych stronach (resp. pola kategorijow na čłonach kategorije).
index f58f2fa..72c4c1a 100644 (file)
@@ -251,6 +251,16 @@ $messages = array(
 'nov' => 'nov',
 'dec' => 'dec',
 
+'monday-at' => 'Lunedi a $1',
+'tuesday-at' => 'Martedi a $1',
+'wednesday-at' => 'Mercuridi a $1',
+'thursday-at' => 'Jovedi a $1',
+'friday-at' => 'Venerdi a $1',
+'saturday-at' => 'Sabbato a $1',
+'sunday-at' => 'Dominica a $1',
+'today-at' => '$1',
+'yesterday-at' => 'Heri a $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
 'category_header' => 'Articulos in le categoria "$1"',
@@ -3962,4 +3972,8 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
 # Image rotation
 'rotate-comment' => 'Imagine rotate de $1 {{PLURAL:$1|grado|grados}} in senso horologic',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|hora|horas}} retro',
+'minutes-ago' => '$1 {{PLURAL:$1|minuta|minutas}} retro',
+'seconds-ago' => '$1 {{PLURAL:$1|secunda|secundas}} retro',
 );
index fad44dd..fb4d15a 100644 (file)
@@ -12,6 +12,7 @@
  * @author Reedy
  * @author Sapral Mikail
  * @author Tagir
+ * @author Умар
  */
 
 $fallback = 'ru';
@@ -47,8 +48,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ший теркама дагарленгах оагӀув чулаьца бола дакъалаьцархой таьрах хьахьокха',
 'tog-oldsig' => 'Дола кулгайоазув:',
 'tog-fancysig' => 'Ший кулга яздара массахоамбаккхам (ший лоӀаме Ӏинка йоацаш)',
-'tog-externaleditor' => 'Арена гӀалатнийсдарца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
-'tog-externaldiff' => 'Арена бӀасакхосса болхоагӀувца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
 'tog-showjumplinks' => '"Дехьадала" яха новкъостала Ӏинк хьахьокха',
 'tog-uselivepreview' => 'Сиха бӀарахьажар (JavaScript) (Экспериментально)',
 'tog-forceeditsummary' => 'Хоам бе, хувцамий лоацам белгал даь деце',
@@ -556,9 +555,6 @@ $messages = array(
 'powersearch-toggleall' => 'Деррига',
 'powersearch-togglenone' => 'Цхьаккха',
 
-# Quickbar
-'qbsettings-none' => 'Цхьаккха',
-
 # Preferences page
 'preferences' => 'Оттамаш',
 'mypreferences' => 'Оттамаш',
@@ -796,7 +792,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(тоабий дагарче)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Дакъалаьцархочоа д-хоамни:',
 
 # Watchlist
index 518d16b..724430e 100644 (file)
@@ -395,6 +395,15 @@ $messages = array(
 'nov' => 'nov',
 'dec' => 'dic',
 
+'monday-at' => 'Lunedì alle $1',
+'tuesday-at' => 'Martedì alle $1',
+'wednesday-at' => 'Mercoledì alle $1',
+'thursday-at' => 'Giovedì alle $1',
+'friday-at' => 'Venerdì alle $1',
+'saturday-at' => 'Sabato alle $1',
+'sunday-at' => 'Domenica alle $1',
+'yesterday-at' => 'Ieri alle $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorie}}',
 'category_header' => 'Pagine nella categoria "$1"',
@@ -576,7 +585,6 @@ $1',
 'site-atom-feed' => 'Feed Atom di $1',
 'page-rss-feed' => 'Feed RSS per "$1"',
 'page-atom-feed' => 'Feed Atom per "$1"',
-'feed-rss' => 'RSS',
 'red-link-title' => '$1 (la pagina non esiste)',
 'sort-descending' => 'Ordinamento decrescente',
 'sort-ascending' => 'Ordinamento crescente',
@@ -3148,6 +3156,7 @@ $1',
 'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
 'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
 'days' => '{{PLURAL:$1|$1 giorno|$1 giorni}}',
+'weeks' => '{{PLURAL:$1|$1 settimana|$1 settimane}}',
 'months' => '{{PLURAL:$1|$1 mese|$1 mesi}}',
 'years' => '{{PLURAL:$1|$1 anno|$1 anni}}',
 'ago' => '$1 fa',
@@ -4003,4 +4012,8 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 # Image rotation
 'rotate-comment' => 'Immagine ruotata di $1 {{PLURAL:$1|grado|gradi}} in senso orario',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|ora|ore}} fa',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minuti}} fa',
+'seconds-ago' => '$1 {{PLURAL:$1|secondo|secondi}} fa',
 );
index 00264bc..41c32ab 100644 (file)
@@ -472,6 +472,16 @@ $messages = array(
 'nov' => '11月',
 'dec' => '12月',
 
+'monday-at' => '月曜日 $1',
+'tuesday-at' => '火曜日 $1',
+'wednesday-at' => '水曜日 $1',
+'thursday-at' => '木曜日 $1',
+'friday-at' => '金曜日 $1',
+'saturday-at' => '土曜日 $1',
+'sunday-at' => '日曜日 $1',
+'today-at' => '$1',
+'yesterday-at' => '昨日 $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|カテゴリ}}',
 'category_header' => 'カテゴリ「$1」にあるページ',
@@ -4368,4 +4378,8 @@ MediaWikiは、有用であることを期待して配布されていますが
 # Image rotation
 'rotate-comment' => '画像を時計回りに $1 {{PLURAL:$1|度}}回転',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|時間}}前',
+'minutes-ago' => '$1 {{PLURAL:$1|分}}前',
+'seconds-ago' => '$1 {{PLURAL:$1|秒}}前',
 );
index 16c6518..cc32f1c 100644 (file)
@@ -150,6 +150,16 @@ $messages = array(
 'nov' => 'Wam',
 'dec' => 'Duj',
 
+'monday-at' => 'Arim af $1',
+'tuesday-at' => 'Aram af $1',
+'wednesday-at' => 'Ahad af $1',
+'thursday-at' => 'Amhad af $1',
+'friday-at' => 'Sem af $1',
+'saturday-at' => 'Sed af $1',
+'sunday-at' => 'Acer af $1',
+'today-at' => '$1',
+'yesterday-at' => 'Iḍelli af $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Taggayt|Taggayin}}',
 'category_header' => 'Imagraden deg taggayt "$1"',
@@ -3003,4 +3013,8 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'duration-centuries' => '$1 {{PLURAL:$1|timiḍi|timiḍa}}',
 'duration-millennia' => '$1 {{PLURAL:$1|agimseggwas|agimseggwasen}}',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|asrag|isragen}} aya',
+'minutes-ago' => '$1 {{PLURAL:$1|tamrect|timercin}} aya',
+'seconds-ago' => '$1 {{PLURAL:$1|tasint|tisinin}} aya',
 );
index a084acd..a79f258 100644 (file)
@@ -1562,7 +1562,7 @@ Eke dosya de peydêna vuriyais biyo ki, beno ke taê melumati gorê vurnaisê ne
 'specialpages-group-media' => 'Raporê medya u bar-kerdey',
 'specialpages-group-users' => 'Karber u heqi',
 'specialpages-group-highuse' => 'Pelê jêdêr gurenaey',
-'specialpages-group-pages' => 'Lista pelun',
+'specialpages-group-pages' => 'Listê pelun',
 'specialpages-group-pagetools' => 'Hacetê pele',
 'specialpages-group-wiki' => "Daê ''Wiki''y u haceti",
 'specialpages-group-redirects' => 'Newe-vırastena pelunê xususiyun',
index 3227fe3..6793e76 100644 (file)
@@ -453,6 +453,16 @@ $messages = array(
 'nov' => '11',
 'dec' => '12',
 
+'monday-at' => '월요일 $1',
+'tuesday-at' => '화요일 $1',
+'wednesday-at' => '수요일 $1',
+'thursday-at' => '목요일 $1',
+'friday-at' => '금요일 $1',
+'saturday-at' => '토요일 $1',
+'sunday-at' => '일요일 $1',
+'today-at' => '$1',
+'yesterday-at' => '어제 $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|분류}}',
 'category_header' => '"$1" 분류에 속하는 문서',
@@ -4197,4 +4207,8 @@ $5
 # Image rotation
 'rotate-comment' => '그림을 시계 방향으로 $1{{PLURAL:$1|도}}로 회전함',
 
+# Unknown messages
+'hours-ago' => '$1{{PLURAL:$1|시간}} 전',
+'minutes-ago' => '$1{{PLURAL:$1|분}} 전',
+'seconds-ago' => '$1{{PLURAL:$1|초}} 전',
 );
index dd9d1ae..fa797ac 100644 (file)
@@ -647,6 +647,8 @@ Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].'
 'userlogin-yourpassword-ph' => 'Donn Ding Paßwood enjävve',
 'yourpasswordagain' => 'Noch ens dat Passwood',
 'remembermypassword' => 'Op Duur aanmelde (hält {{PLURAL:$1|för eine Daach|bes op $1 Dääsch|bloß för hück}})',
+'userlogin-remembermypassword' => 'Op Duur enlogge',
+'userlogin-signwithsecure' => 'Verschlößeld enlogge',
 'securelogin-stick-https' => 'Noh em Enlogge övver HTTPS verbonge blieve.',
 'yourdomainname' => 'Ding Domain',
 'password-change-forbidden' => 'Do kanns en heh däm Wiki kein Paßwööter ändere.',
@@ -660,6 +662,7 @@ Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].'
 'userlogout' => 'Ußlogge',
 'notloggedin' => 'Nit enjelogg',
 'userlogin-noaccount' => 'Do häß noch keine Zohjang?',
+'userlogin-joinproject' => 'Aanmälde zom Metmaache!',
 'nologin' => "Wann De Dich noch nit aanjemeldt häs, dann dun Dich '''$1'''.",
 'nologinlink' => 'neu aanmelde',
 'createaccount' => 'Aanmelde als ene neue Metmaacher',
@@ -802,6 +805,7 @@ Do häs Der enzwesche e neu Zweschepaßwood jehollt.',
 'passwordreset-text' => 'Donn dat Fommulaa heh ußfölle, öm e neu Paßwoot faßzelääje.',
 'passwordreset-legend' => 'Et Paßwoot zeröck säze',
 'passwordreset-disabled' => 'Et Paßwoot zeröck ze säze es heh em Wiki afjeschalldt.',
+'passwordreset-emaildisabled' => 'Heh dat Wiki määt nix met <i lang="en">e-mail</i>!',
 'passwordreset-pretext' => '{{PLURAL:$1||Jiff ein vun dä Saache heh dronger enn|}}',
 'passwordreset-username' => 'Metmaacher Name:',
 'passwordreset-domain' => 'Domähn:',
@@ -837,7 +841,7 @@ moß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.',
 Eijmohl-Paßwoot: $2',
 'passwordreset-emailsent' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck.',
 'passwordreset-emailsent-capture' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck woode. Heh dronger kanns De se lässe.',
-'passwordreset-emailerror-capture' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh sullt verscheck wääde, ävver dat Verschecke hät nit jeflup: $1',
+'passwordreset-emailerror-capture' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh sullt verscheck wääde, ävver dat Verschecke aan {{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} $2 hät nit jeflup: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Donn Ding Address för de <i lang="en">e-mail</i> ändere',
@@ -4015,7 +4019,7 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
 'version-parser-function-hooks' => 'Parserfunktione',
 'version-hook-name' => 'De Schnettstelle ier Name',
 'version-hook-subscribedby' => 'Opjeroofe vun',
-'version-version' => '(Version $1)',
+'version-version' => '(Väsjohn $1)',
 'version-license' => 'Lėzänz',
 'version-poweredby-credits' => "Dat Wiki heh löp met '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'sönß wää',
@@ -4075,7 +4079,7 @@ Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
 
 # External image whitelist
 'external_image_whitelist' => '# Donn aan dä Reih heh nix ändere<pre>
-# Onge künne Brochstöck fun regular expressions aanjejovve wäde,
+# Onge künne Brochstöke fun rejolähre Ußdrök aanjejovve wäde,
 # alsu dä Deil zwesche / und /
 # Noh em Verjliische met däm URL vun ene Datei fun ußerhallef:
 # Treffer: De Datei weed jezeich odder enjebonge.
index 7375533..bd5d04b 100644 (file)
@@ -448,7 +448,12 @@ Pe favô ti peu segnalâ quello che l'é sucesso a in [[Special:ListUsers/sysop|
 'viewsource' => 'Veddi a fonte',
 'protectedpagetext' => "'Sta paggina a l'è stæta protezûa pe impedîghe a modiffica.",
 'viewsourcetext' => "O l'è poscibbile vedde e copiâ o còddice sorgente de 'sta paggina:",
+'customjsprotected' => "No ti gh'æ i permessi pe cangiâ sta pagina de JavaScript percose a contegne e impostaçioin personæ de 'n atro utente",
 'ns-specialprotected' => 'No se pœu modificâ e paggine speciali',
+'titleprotected' => "A creaçion de 'na paggina con sto tittolo a l'è stæta bloccâ da [[User:$1|$1]].
+A raxon a l'è: ''$2''.",
+'exception-nologin' => "No t'ê introu",
+'exception-nologin-text' => "Pe sta paggina ò sta açion ti gh'æ da effettuâ l'accesso inte sta wiki.",
 
 # Virus scanner
 'virus-scanfailed' => 'scansion fallia (codice $1)',
@@ -460,6 +465,7 @@ Pe favô ti peu segnalâ quello che l'é sucesso a in [[Special:ListUsers/sysop|
 'yourpasswordagain' => 'Riscrivi a pòula segrétta:',
 'remembermypassword' => 'Aregòrda a mæ login in sto navegatô (pe in mascimo de $1 {{PLURAL:$1|giórno|giórni}})',
 'yourdomainname' => 'Indirisso do scito:',
+'password-change-forbidden' => 'No ti peu cangiâ poula segretta in questa wiki.',
 'login' => 'Intra',
 'nav-login-createaccount' => 'Intra / Registrate',
 'loginprompt' => "Pe fâ l'accesso inte {{SITENAME}} ti g'hæ da  abilitâ i cookie.",
@@ -499,22 +505,31 @@ A paròlla d'ordine pe l'ûtente \"\$2\" a l'è stæta impostâ a \"\$3\".
 Se conseggia de fâ l'accesso quanto primma e cangiâ a paròlla d'ordine immediatamente.
 Se no ti ê stæto ti a fâ 'sta domanda, oppûre se ti t'hæ ritrovòu a têu paròlla d'ordine e no ti vêu cangiâla ciû, ti pêu ignorâ 'sto messaggio e andâ avanti deuviando a vegia paròlla d'ordine.",
 'noemail' => 'No gh\'è nisciûn indirisso e-mail registròu pe l\'ûtente "$1".',
+'noemailcreate' => 'Ti devi dâ un addresso e-mail vallido.',
 'passwordsent' => "Ûnn-a nêuva paròlla d'ordine a l'è stæta inviâa a l'indirisso e-mail registròu pe l'ûtente \"\$1\".
 Pe piaxei, fa 'n accesso appenn-a ti a ghe reçeivi.",
 'blocked-mailpassword' => "O teu indirisso IP o l'è affirmoö, e pe sta razon o non se peu usâ a funscion de remandâ a pòula segretta.",
 'eauthentsent' => "'N messaggio e-mail de confermassion o l'è stæto inviòu a l'indirisso indicòu.
 Pe abilitâ l'invîo de messaggi e-mail pe quest'accesso, o se deive seguî l'istrûssioîn indicæ, coscì ti confermi che ti t'è o legittimo propietâjo de l'indirisso.",
+'mailerror' => "Errô inte l'invio do messaggio: $1",
 'acct_creation_throttle_hit' => "Ne dispiâxe, ma t'hæ zà creòu $1 accesci. No ti pêu creâne ciû!",
 'emailauthenticated' => "O teu indirisso de posta elettronica o l'è stæto autenticou o $1.",
 'emailconfirmlink' => 'Conferma o teu indirisso de posta elettronega',
 'accountcreated' => 'Graçie pe esëte registroö!!!',
 'accountcreatedtext' => "Utente $1, ti te guägno l'açeiso!",
+'createaccount-title' => "Creaçion de 'n conto pe {{SITENAME}}",
+'usernamehasherror' => 'O nomme utente o no poeu contegnî di caratteri hash',
+'login-abort-generic' => "O to accesso o no l'ha avuo successo - Abortio",
 'loginlanguagelabel' => 'Lengoa: $1',
 
 # Change password dialog
-'resetpass' => 'Reverti a pòula segretta',
-'resetpass_header' => 'Reverti a pòula segretta',
+'resetpass' => 'Cangia a pòula segretta',
+'resetpass_announce' => "T'ê introu co in codiçe temporanio de l'e-mail.Pe completâ l'accesso ti devi çerne 'na neuva poula segretta chì:",
+'resetpass_header' => 'Cangia a pòula segretta do conto',
+'oldpassword' => 'Vegia poula segretta',
+'newpassword' => 'Neuva poula segretta',
 'retypenew' => "Ripette a nêuva paròlla d'ordine:",
+'resetpass_submit' => 'Çerni a poula segretta e intra',
 'resetpass_forbidden' => "No l'é poscìbile cangiâ e paròlle segrétte",
 
 # Edit page toolbar
index 2d456ae..af02732 100644 (file)
@@ -19,11 +19,11 @@ $messages = array(
 'tog-hidepatrolled' => 'Siamţhat venhim tihdanglam thar zingah tilang suh',
 'tog-newpageshidepatrolled' => 'Phêk venhim phêk thar tlarah tilang suh',
 'tog-extendwatchlist' => 'A thar chauh ni lo, tihdanglamna zawng zawng tilang tùrin ralvèn kapparh rawh',
-'tog-usenewrc' => 'Tihdanglam thar belhchhan hmang rawh (JavaScript a ngai)',
+'tog-usenewrc' => 'Tihdanglam tharte leh ralvente a phêk azir zëlin tlar rawh (JavaScript a ngai)',
 'tog-numberheadings' => 'A thupuite amahin nambar inpêktir rawh',
-'tog-showtoolbar' => 'Siamţhatna hmanraw-liang tilang rawh (JavaScript a ngai)',
-'tog-editondblclick' => 'Hmehphìrin phêk siamţha rawh (JavaScript a ngai)',
-'tog-editsection' => 'Hlawm hrang siamţhatna [siamţhatna] zawmna hmangin awmtir rawh',
+'tog-showtoolbar' => 'Siamhatna hmanraw-liang tilang rawh (JavaScript a ngai)',
+'tog-editondblclick' => 'Hmehphìrin phêk siamha rawh (JavaScript a ngai)',
+'tog-editsection' => 'Hlawm hrang siamṭhatna [siamṭhatna] zawmna hmangin awmtir rawh',
 'tog-editsectiononrightclick' => 'Hlawm thupui ding-hmeh hmangin hlawm siamţhat theihna awmtir rawh (JavaScript a ngai)',
 'tog-showtoc' => 'A chhunga thu awm te tilang rawh (thupui 3 aia tam phêk tan)',
 'tog-rememberpassword' => 'He ka rangpuifannaah hian min hre reng rawh (a rei berah ni $1  {{PLURAL:$1}})',
@@ -77,7 +77,7 @@ $messages = array(
 'friday' => 'Zirtawpni',
 'saturday' => 'Inrinni',
 'sun' => 'Ptn',
-'mon' => 'Thţ',
+'mon' => 'Th',
 'tue' => 'Thl',
 'wed' => 'Nil',
 'thu' => 'Nng',
@@ -110,8 +110,8 @@ $messages = array(
 'jan' => 'Pkt',
 'feb' => 'Rtk',
 'mar' => 'Vau',
-'apr' => 'Ţau',
-'may' => 'Ţmr',
+'apr' => 'au',
+'may' => 'mr',
 'jun' => 'Nkr',
 'jul' => 'Vhz',
 'aug' => 'Tţn',
index 7374f76..1a89338 100644 (file)
@@ -258,7 +258,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) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Tantang {{SITENAME}}',
 'aboutpage' => 'Project:Tantang',
-'copyright' => 'Kandungan tasadio dalam $1',
+'copyright' => 'Isi tasadio dalam $1',
 'copyrightpage' => '{{ns:project}}:Hak cipta',
 'currentevents' => 'Kajadian kini ko',
 'currentevents-url' => 'Project:Kajadian kini ko',
@@ -272,15 +272,15 @@ $1',
 'policy-url' => 'Project:Kabijakan',
 'portal' => 'Portal komunitas',
 'portal-url' => 'Project:Portal komunitas',
-'privacy' => 'Kecipehan privasi',
-'privacypage' => 'Project:Kecipehan privasi',
+'privacy' => 'Kacipehan privasi',
+'privacypage' => 'Project:Kacipehan privasi',
 
 'badaccess' => 'Kasalahan hak akses',
 'badaccess-group0' => 'Sanak indak diizinkan untuak malakuan tindakan ko.',
 'badaccess-groups' => 'Tindakan nan Sanak nio babateh untuak pangguno dalam {{PLURAL:$2|kalompok}}: $1.',
 
 'versionrequired' => 'Dibutuahan MediaWiki versi $1',
-'versionrequiredtext' => 'MediaWiki versi $1 dibutuahan untuak manggunoan laman ko. Lihek [[Special:Version|versi laman]]',
+'versionrequiredtext' => 'MediaWiki versi $1 dibutuahan untuak manggunoan laman ko. Caliak [[Special:Version|versi laman]]',
 
 'ok' => 'OK',
 'pagetitle' => '$1 - {{SITENAME}} bahaso Minang',
@@ -303,7 +303,7 @@ $1',
 'editsectionhint' => 'Suntiang bagian: $1',
 'toc' => 'Dafta isi',
 'showtoc' => 'tampilkan',
-'hidetoc' => 'suruakkan',
+'hidetoc' => 'suruakan',
 'collapsible-collapse' => 'Ketekan',
 'collapsible-expand' => 'Kambangan',
 'thisisdeleted' => 'Caliak atau kambalian $1?',
@@ -1144,9 +1144,9 @@ Alamaik surel Sanak indakkan tau dek urang nan manghubungi sanak tu.',
 'userrights-groupsmember' => 'Anggota dari:',
 'userrights-groupsmember-auto' => 'Anggota implisit dari:',
 'userrights-groups-help' => 'Sanak dapek mangubah kalompok pangguno ko:
-* Kotak jo tando cek marupoan kalompok pangguno tasabuik
-* Kotak tanpa tando cek bararti pangguno ko bukan anggota kalompok tasabuik
-* Tando * manandoi Sanak indak dapek mambatalan kalompok tasabuik bilo Sanak alah manambahannyo, atau sabaliaknyo.',
+* Kotak jo tando centang marupoan kalompok pangguno tasabuik
+* Kotak indak ado tando centang bararti pangguno ko bukan anggota kalompok tasabuik
+* Tando * manandoan Sanak indak dapek mambatalan kalompok tasabuik bilo Sanak alah manambahannyo, ataupun sabaliaknyo.',
 'userrights-reason' => 'Alasan:',
 'userrights-no-interwiki' => 'Sanak indak bahak untuak mangubah hak pangguno di wiki lain.',
 'userrights-nodatabase' => 'Basis data $1 indak ado atau bukan disiko.',
@@ -1718,7 +1718,7 @@ Entri log pamblokiran tabaru ado di bawah ko untuak referensi:',
 
 # What links here
 'whatlinkshere' => 'Pautan baliak',
-'whatlinkshere-title' => 'Laman yang bakaik ka "$1"',
+'whatlinkshere-title' => 'Laman nan takaik ka "$1"',
 'whatlinkshere-page' => 'Laman:',
 'linkshere' => "Laman-laman ko bakaik ka '''[[:$1]]''':",
 'nolinkshere' => "Indak ado laman nan punyo tautan ka '''[[:$1]]'''.",
index 0573fbb..2f00177 100644 (file)
@@ -455,6 +455,16 @@ $messages = array(
 'nov' => 'ное',
 'dec' => 'дек',
 
+'monday-at' => 'понеделникот во $1',
+'tuesday-at' => 'вторникот во $1',
+'wednesday-at' => 'средата во $1',
+'thursday-at' => 'четвртокот во $1',
+'friday-at' => 'петокот во $1',
+'saturday-at' => 'саботата во $1',
+'sunday-at' => 'неделата во $1',
+'today-at' => '$1',
+'yesterday-at' => 'вчера во $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категорија|Категории}}',
 'category_header' => 'Статии во категоријата „$1“',
@@ -465,7 +475,7 @@ $messages = array(
 'hidden-category-category' => 'Скриени категории',
 'category-subcat-count' => '{{PLURAL:$2|Оваа категорија ја содржи само следнава поткатегорија.|Оваа категорија {{PLURAL:$1|ја содржи следнава поткатегорија|ги содржи следниве $1 поткатегории}} од вкупно $2.}}',
 'category-subcat-count-limited' => 'Оваа категорија {{PLURAL:$1|ја содржи следнава поткатегорија|ги содржи следниве $1 поткатегории}}.',
-'category-article-count' => '{{PLURAL:$2|Ð\9aаÑ\82егоÑ\80иÑ\98аÑ\82а Ñ\98а Ñ\81одÑ\80жи Ñ\81амо Ñ\81леднава Ñ\81Ñ\82Ñ\80аниÑ\86а.|Ð\9aаÑ\82егоÑ\80иÑ\98аÑ\82а {{PLURAL:$1|Ñ\98а Ñ\81одÑ\80жи Ñ\81леднава Ñ\81Ñ\82Ñ\80аниÑ\86а|ги Ñ\81одÑ\80жи следниве $1 страници}} од вкупно $2.}}',
+'category-article-count' => '{{PLURAL:$2|Ð\9eваа ÐºÐ°Ñ\82егоÑ\80иÑ\98а Ñ\98а Ñ\81одÑ\80жи Ñ\81амо Ñ\81леднава Ñ\81Ñ\82Ñ\80аниÑ\86а:|Ð\92о ÐºÐ°Ñ\82егоÑ\80иÑ\98аÑ\82а Ñ\81е {{PLURAL:$1|Ñ\81одÑ\80жи Ñ\81леднава Ñ\81Ñ\82Ñ\80аниÑ\86а|Ñ\81одÑ\80жаÑ\82 следниве $1 страници}} од вкупно $2.}}',
 'category-article-count-limited' => '{{PLURAL:$1|Следната страница е|Следните $1 страници се}} во оваа категорија.',
 'category-file-count' => '{{PLURAL:$2|Оваа категорија ја содржи само следната податотека.|{{PLURAL:$1|Следната податотека е|Следните $1 податотеки се}} во оваа категорија, од вкупно $2.}}',
 'category-file-count-limited' => '{{PLURAL:$1|Следнава податотека е|Следниве $1 податотеки се}} во оваа категорија.',
@@ -562,7 +572,7 @@ $messages = array(
 'viewhelppage' => 'Погледајте ја страницата за помош',
 'categorypage' => 'Погледајте ја страницата за категоријата',
 'viewtalkpage' => 'Видете го разговорот',
-'otherlanguages' => 'Ð\94руги јазици',
+'otherlanguages' => 'Ð\9dа Ð´руги јазици',
 'redirectedfrom' => '(Пренасочено од $1)',
 'redirectpagesub' => 'Страница за пренасочување',
 'lastmodifiedat' => 'Оваа страница последен пат е изменета на $1 во $2 ч.',
@@ -733,9 +743,9 @@ $1',
 'protectedpagetext' => 'Оваа страница е заклучена за уредувања и други дејства.',
 'viewsourcetext' => 'Можете да го погледнете и копирате кодот на оваа страница:',
 'viewyourtext' => "Можете да го погледнете и копирате кодот на '''вашите уредувања''' на оваа страница:",
-'protectedinterface' => 'Оваа страница содржи текст од посредникот на софтверот на ова вики и е превентивно заштитена поради можна злоупотреба.
+'protectedinterface' => 'Оваа страница содржи текст од посредникот на програмот на ова вики и е превентивно заштитена поради можна злоупотреба.
 За да додавате или менувате преводи на сите викија, појдете на [//translatewiki.net/wiki/Main_Page?uselang=mk translatewiki.net] - проектот за локализација на МедијаВики.',
-'editinginterface' => "'''Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:''' Ð£Ñ\80едÑ\83ваÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а ÐºÐ¾Ñ\98а Ðµ Ð´ÐµÐ» Ð¾Ð´ ÐºÐ¾Ñ\80иÑ\81ниÑ\87киоÑ\82 Ð¿Ð¾Ñ\81Ñ\80едник Ð½Ð° Ð\9cедиÑ\98аÐ\92ики Ñ\81оÑ\84Ñ\82веÑ\80оÑ\82.
+'editinginterface' => "'''Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:''' Ð£Ñ\80едÑ\83ваÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а ÐºÐ¾Ñ\98а Ðµ Ð´ÐµÐ» Ð¾Ð´ ÐºÐ¾Ñ\80иÑ\81ниÑ\87киоÑ\82 Ð¿Ð¾Ñ\81Ñ\80едник Ð½Ð° Ð¿Ñ\80огÑ\80амоÑ\82 Ð\9cедиÑ\98аÐ\92ики.
 Промените на оваа страница ќе предизвикаат промени во корисничкиот посредник кај другите корисници на ова вики.
 За да додадете или измените превод на сите викија, појдете на [//translatewiki.net/wiki/Main_Page?setlang=mk translatewiki.net] - проектот за локализација на МедијаВики.",
 'sqlhidden' => '(Барањето до SQL е скриено)',
@@ -1682,7 +1692,7 @@ $1",
 'newuserlogpagetext' => 'Ова е дневник на регистрирани корисници.',
 
 # User rights log
-'rightslog' => 'Ð\94невник Ð½Ð° Ð¼ÐµÐ½Ñ\83ваÑ\9aа Ð½Ð° ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки права',
+'rightslog' => 'Ð\94невник Ð½Ð° ÐºÐ¾Ñ\80иÑ\81ниÑ\87киÑ\82е права',
 'rightslogtext' => 'Ова е дневник на промени на кориснички права.',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1869,7 +1879,7 @@ $1",
 'uploaddisabledtext' => 'Подигањето на податотеки е оневозможено.',
 'php-uploaddisabledtext' => 'Подигањето на податотеки е оневозможено во PHP. 
 Проверете го нагодувањето file_uploads.',
-'uploadscripted' => 'Податотеката содржи HTML или скриптен код што може да биде погрешно протолкуван од прелистувач.',
+'uploadscripted' => 'Податотеката содржи HTML-код или сценарио што може погрешно да се протолкува во прелистувачот.',
 'uploadvirus' => 'Оваа податотека содржи вирус! Повеќе подробности: $1',
 'uploadjava' => 'Податотеката е од типот ZIP што содржи податотека со наставка .class за Java.
 Подигањето на податотеки за Java не е дозволено, бидејќи со нив можат да се заобиколуваат безбедносните ограничувања.',
@@ -2163,11 +2173,11 @@ $1',
 'statistics-users-active-desc' => 'Корисници кои имаат извршено некое дејство {{PLURAL:$1|претходниот ден|во претходните $1 дена}}',
 'statistics-mostpopular' => 'Најпосетувани страници',
 
-'disambiguations' => 'Страници што водат до страници за појаснување',
+'disambiguations' => 'Страници што водат до појаснителни страници',
 'disambiguationspage' => 'Template:Појаснување',
-'disambiguations-text' => "Следните страници имаат барем по една врска што води до '''страница за појаснување'''.
-Наместо тоа, може да имаат врска до посоодветната тема.<br />
-Една страница се смета за страница за појаснување ако го користи шаблонот што води од [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Следните страници имаат барем по една врска што води до '''појаснителна страница'''.
+Наместо тоа, може да имаат врска до посоодветна страница.<br />
+Една страница се смета за појаснителна ако го користи шаблонот што води од [[MediaWiki:Disambiguationspage]]",
 
 'pageswithprop' => 'Страници со својство',
 'pageswithprop-legend' => 'Страници со својство',
@@ -3341,6 +3351,7 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минута|$1 минути}}',
 'hours' => '{{PLURAL:$1|$1 час|$1 часа}}',
 'days' => '{{PLURAL:$1|$1 ден|$1 дена}}',
+'weeks' => '{{PLURAL:$1|$1 недела|$1 недели}}',
 'months' => '{{PLURAL:$1|$1 месец|$1 месеци}}',
 'years' => '{{PLURAL:$1|$1 година|$1 години}}',
 'ago' => 'пред $1',
@@ -4223,7 +4234,7 @@ $5
 
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|ја избриша}} страницата $3',
-'logentry-delete-restore' => '$1 {{GENDER:$2|ја врати}} страницата $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|Ñ\98а Ð¿Ð¾Ð²Ñ\80аÑ\82и}} Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а $3',
 'logentry-delete-event' => '$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4',
 'logentry-delete-revision' => '$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|ревизија|$5 ревизии}} на страницата $3: $4',
 'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ја измени}} видливоста на настаните во дневникот на $3',
@@ -4333,4 +4344,8 @@ $5
 # Image rotation
 'rotate-comment' => 'Сликата е завртена за $1 {{PLURAL:$1|степен|степени}} вдесно',
 
+# Unknown messages
+'hours-ago' => 'пред $1 {{PLURAL:$1|час|часа}}',
+'minutes-ago' => 'пред $1 {{PLURAL:$1|минута|минути}}',
+'seconds-ago' => 'пред $1 {{PLURAL:$1|секунда|секунди}}',
 );
index a4d8ae4..5892961 100644 (file)
@@ -443,6 +443,16 @@ $messages = array(
 'nov' => 'നവം.',
 'dec' => 'ഡിസം.',
 
+'monday-at' => 'തിങ്കളാഴ്ച്ച $1-നു്',
+'tuesday-at' => 'ചൊവ്വാഴ്ച്ച $1-നു്',
+'wednesday-at' => 'ബുധനാഴ്ച്ച $1-നു്',
+'thursday-at' => 'വ്യാഴാഴ്ച്ച $1-നു്',
+'friday-at' => 'വെള്ളിയാഴ്ച്ച $1-നു്',
+'saturday-at' => 'ശനിയാഴ്ച്ച $1-നു്',
+'sunday-at' => 'ഞായറാഴ്ച്ച $1-നു്',
+'today-at' => 'ഇന്ന് $1-നു്',
+'yesterday-at' => 'ഇന്നലെ $1-നു്',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|വർഗ്ഗം|വർഗ്ഗങ്ങൾ}}',
 'category_header' => '"$1" എന്ന വർഗ്ഗത്തിലെ താളുകൾ',
@@ -895,7 +905,7 @@ $2
 താത്കാലിക രഹസ്യവാക്ക്: $2',
 'passwordreset-emailsent' => 'ഒരു രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്.',
 'passwordreset-emailsent-capture' => 'രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്, അത് താഴെക്കൊടുക്കുന്നു.',
-'passwordreset-emailerror-capture' => 'താഴàµ\86à´\95àµ\8dà´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨, à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ à´\87à´®àµ\86യിൽ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95ാനായàµ\86à´\99àµ\8dà´\95à´¿à´²àµ\81à´\82, à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8d à´\85യയàµ\8dà´\95àµ\8dà´\95ാൻ à´\95à´´à´¿à´\9eàµ\8dà´\9eà´¿à´²àµ\8dà´²: $1',
+'passwordreset-emailerror-capture' => 'താഴàµ\86à´\95àµ\8dà´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨, à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ à´\87à´®àµ\86യിൽ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95ാനായàµ\86à´\99àµ\8dà´\95à´¿à´²àµ\81à´\82, à´\85à´¤àµ\8d {{GENDER:$2|à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8d}} à´\85യയàµ\8dà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതàµ\8d à´ªà´°à´¾à´\9cയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fàµ\81: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക',
@@ -1382,6 +1392,7 @@ $1",
 'powersearch-togglenone' => 'ഒന്നുംവേണ്ട',
 'search-external' => 'ബാഹ്യ അന്വേഷണം',
 'searchdisabled' => '{{SITENAME}} സം‌രംഭത്തിൽ തിരച്ചിൽ ദുർബലപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾക്ക് ഗൂഗിൾ ഉപയോഗിച്ച് തത്കാലം തിരച്ചിൽ നടത്താവുന്നതാണ്‌. പക്ഷെ ഗൂഗിളിൽ {{SITENAME}} സം‌രംഭത്തിന്റെ സൂചിക കാലഹരണപ്പെട്ടതായിരിക്കാൻ സാദ്ധ്യതയുണ്ട്.',
+'search-error' => 'തിരയുന്നതിനിടെ ഒരു പിഴവുണ്ടായി: $1',
 
 # Preferences page
 'preferences' => 'ക്രമീകരണങ്ങൾ',
@@ -2735,6 +2746,7 @@ $1',
 'proxyblocksuccess' => 'ചെയ്തു കഴിഞ്ഞു.',
 'sorbsreason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്.',
 'sorbs_create_account_reason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്. താങ്കൾക്ക് അംഗത്വമെടുക്കാൻ സാദ്ധ്യമല്ല.',
+'xffblockreason' => 'എക്സ്-ഫോർവേഡഡ്-ഫോർ ഹെഡറിലെ ഒരു ഐ.പി. വിലാസം, താങ്കളുടേതോ താങ്കൾ ഉപയോഗിക്കുന്ന പ്രോക്സി സെർവറിലേതോ ആകാം, തടയപ്പെട്ടിരിക്കുന്നതാണ്. തടയലിന്റെ കാരണം: $1',
 'cant-block-while-blocked' => 'താങ്കൾ തടയപ്പെട്ടിരിക്കുമ്പോൾ മറ്റുപയോക്താക്കളെ തടയാൻ താങ്കൾക്ക് സാധിക്കില്ല.',
 'cant-see-hidden-user' => 'താങ്കൾ തടയാൻ ശ്രമിക്കുന്ന ഉപയോക്താവ് മുമ്പേ തടയപ്പെടുകയും മറയ്ക്കപ്പെടുകയും ചെയ്യപ്പെട്ടതാണ്. താങ്കൾക്ക് ഉപയോക്താവിനെ മറയ്ക്കാനുള്ള അവകാശം ഇല്ലെങ്കിൽ, ഉപയോക്താവിനെതിരെ ഉള്ള തടയൽ കാണാനോ തിരുത്താനോ കഴിയുന്നതല്ല.',
 'ipbblocked' => 'മറ്റുള്ളവരെ തടയാനോ അവരുടെ തടയൽ നീക്കാനോ താങ്കൾക്ക് കഴിയില്ല. കാരണം താങ്കൾ തന്നെ തടയപ്പെട്ടിരിക്കുകയാണ്',
@@ -3225,6 +3237,7 @@ $1',
 'minutes' => '{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}}',
 'hours' => '{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}}',
 'days' => '{{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}',
+'weeks' => '{{PLURAL:$1|ഒരാഴ്ച്ച|$1 ആഴ്ച്ച}}',
 'months' => '{{PLURAL:$1|ഒരു മാസം|$1 മാസം}}',
 'years' => '{{PLURAL:$1|ഒരു വർഷം|$1 വർഷം}}',
 'ago' => '$1 മുമ്പ്',
@@ -4065,4 +4078,8 @@ $5
 # Image rotation
 'rotate-comment' => 'ചിത്രം പ്രദക്ഷിണദിശയിൽ {{PLURAL:$1|ഒരു ഡിഗ്രി|$1 ഡിഗ്രി}} തിരിച്ചു',
 
+# Unknown messages
+'hours-ago' => '{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}} മുൻപ്',
+'minutes-ago' => '{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}} മുൻപ്',
+'seconds-ago' => '{{PLURAL:$1|ഒരു സെക്കന്റ്|$1 സെക്കന്റ്}} മുൻപ്',
 );
index 3b86d67..287001f 100644 (file)
@@ -757,7 +757,7 @@ $2
 Kata laluan sementara: $2',
 'passwordreset-emailsent' => 'E-mel set semula kata laluan telah dihantar.',
 'passwordreset-emailsent-capture' => 'E-mel set semula kata laluan telah dihantar, seperti yang dipaparkan di bawah.',
-'passwordreset-emailerror-capture' => 'E-mel set semula kata laluan telah dihasilkan, seperti yang dipaparkan di bawah, tetapi tidak berjaya dihantar kepada pengguna: $1',
+'passwordreset-emailerror-capture' => 'E-mel set semula kata laluan telah dihasilkan, seperti yang dipaparkan di bawah, tetapi tidak berjaya dihantar kepada {{GENDER:$2|pengguna}} berkenaan: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Tukar alamat e-mel',
index ae6c6b5..90ca89a 100644 (file)
@@ -886,7 +886,7 @@ passord.',
 Midlertidig passord: $2',
 'passwordreset-emailsent' => 'En passordtilbakestillingslenke har blitt sendt per e-post.',
 'passwordreset-emailsent-capture' => 'Passordtilbakestillingseposten vist under har blitt sendt ut.',
-'passwordreset-emailerror-capture' => 'En passordtilbakestillingsepost ble laget, men det lyktes ikke å sende denne til brukeren: $1',
+'passwordreset-emailerror-capture' => 'En passordtilbakestillingsepost ble laget, men det lyktes ikke å sende denne til {{GENDER:$2|brukeren}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Endre e-postadresse',
index 4768673..6581533 100644 (file)
@@ -354,7 +354,7 @@ $messages = array(
 
 'underline-always' => 'Altied',
 'underline-never' => 'Nooit',
-'underline-default' => 'Standardinstelling',
+'underline-default' => 'Standard in joew vormgeving of webkieker',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Lettertype veur de tekste t bewarkingsveld:',
@@ -415,6 +415,8 @@ $messages = array(
 'nov' => 'nov',
 'dec' => 'des',
 
+'today-at' => '$1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorieën}}',
 'category_header' => 'Artikels in kategorie $1',
@@ -439,7 +441,8 @@ $messages = array(
 'newwindow' => '(niej vienster)',
 'cancel' => 'Aofbreken',
 'moredotdotdot' => 'Meer...',
-'mypage' => 'Mien gebrukerszied',
+'morenotlisted' => 'Meer niet in de lieste...',
+'mypage' => 'Gebrukerszied',
 'mytalk' => 'Mien overleg',
 'anontalk' => 'Overlegzied veur dit IP-adres',
 'navigation' => 'Navigasie',
@@ -462,7 +465,7 @@ $messages = array(
 'vector-action-protect' => 'Beveiligen',
 'vector-action-undelete' => 'Weerummeplaotsen',
 'vector-action-unprotect' => 'Beveiliging wiezigen',
-'vector-simplesearch-preference' => 'Verbeterde zeuksuggesties anzetten (allinnig mit Vector-vormgeving)',
+'vector-simplesearch-preference' => 'Vereenvoudigd zeuken anzetten (allinnig mit Vector-vormgeving)',
 'vector-view-create' => 'Anmaken',
 'vector-view-edit' => 'Bewarken',
 'vector-view-history' => 'Geschiedenisse bekieken',
@@ -472,6 +475,7 @@ $messages = array(
 'namespaces' => 'Naamruumtes',
 'variants' => 'Variaanten',
 
+'navigation-heading' => 'Navigasiemenu',
 'errorpagetitle' => 'Foutmelding',
 'returnto' => 'Weerumme naor $1.',
 'tagline' => 'Van {{SITENAME}}',
@@ -679,7 +683,7 @@ Zeukopdrachte: $2',
 'viewsource-title' => 'Bron bekieken van $1',
 'actionthrottled' => 'Haandeling tegenehöllen',
 'actionthrottledtext' => "As maotregel tegen t plaotsen van ongewunste verwiezingen, is t antal keren da'j disse haandeling in n korte tied uutvoeren kunnen beteund. Je hebben de limiet overschrejen. Probeer t over n antal minuten weer.",
-'protectedpagetext' => 'Disse zied is beveiligd um bewarkingen te veurkoemen.',
+'protectedpagetext' => 'Disse zied is beveiligd. Bewarken of aandere haandelingen bin niet meugelik.',
 'viewsourcetext' => 'Je kunnen de brontekste van disse zied bewarken en bekieken:',
 'viewyourtext' => "Je kunnen '''joew bewarkingen''' an de brontekste van disse zied bekieken en kopiëren:",
 'protectedinterface' => "Op disse zied steet tekste die gebruukt wörden veur systeemteksten van disse wiki. Allinnig beheerders kunnen disse zied bewarken.
@@ -712,10 +716,16 @@ De beheerder gaf hierveur de volgende reden: "$3".',
 
 Je kunnen {{SITENAME}} noen anoniem gebruken of je eigen <span class='plainlinks'>[$1 opniej anmelden]</span> onder disse of n aandere gebrukersnaam.
 t Kan ween dat der wat ziejen bin die weeregeven wörden asof je an-emeld bin totda'j t tussengeheugen van joew webkieker leegmaken.",
+'welcomeuser' => 'Welkom, $1!',
 'yourname' => 'Gebrukersnaam',
+'userlogin-yourname' => 'Gebrukersnaam',
+'userlogin-yourname-ph' => 'Geef joew gebrukersnaam op',
 'yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword-ph' => 'Geef joew wachtwoord op',
 'yourpasswordagain' => 'Opniej invoeren',
 'remembermypassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
+'userlogin-remembermypassword' => 'Vanzelf anmelden',
 'securelogin-stick-https' => "Verbunnen blieven via HTTPS naoda'j an-emeld bin",
 'yourdomainname' => 'Joew domein',
 'password-change-forbidden' => 'Je kunnen joew wachtwoord niet wiezigen op disse wiki.',
@@ -728,13 +738,15 @@ t Kan ween dat der wat ziejen bin die weeregeven wörden asof je an-emeld bin to
 'logout' => 'Aofmelden',
 'userlogout' => 'Aofmelden',
 'notloggedin' => 'Niet an-emeld',
+'userlogin-noaccount' => "He'j nog gien gebrukersnaam?",
+'userlogin-joinproject' => 'Over {{SITENAME}}',
 'nologin' => "He'j nog gien gebrukersnaam? '''$1'''.",
 'nologinlink' => 'Maak n gebrukersprofiel an',
 'createaccount' => 'Niej gebrukersprofiel anmaken',
 'gotaccount' => "Stao'j al in-eschreven? '''$1'''.",
 'gotaccountlink' => 'Anmelden',
 'userlogin-resetlink' => "Bi'j de anmeldgegevens kwiet?",
-'createaccountmail' => 'per netpost',
+'createaccountmail' => 'Gebruuk n tiejelik wachtwoord dat joe netzelde is en stuur t naor t netpostadres dat hieronder steet',
 'createaccountreason' => 'Reden:',
 'badretype' => "De wachtwoorden die'j in-etikt hebben bin niet liek alleens.",
 'userexists' => 'Disse gebrukersnaam is al gebruuk.
@@ -1072,6 +1084,12 @@ t Besteet al.',
 'editwarning-warning' => "A'j disse zied aofsluten dan kan t ween dat der wieziging die'j emaakt hebben kwiet raken.
 A'j an-emeld bin, dan ku'j disse waorschuwing uutzetten in t tabblad \"Bewarken\" in joew veurkeuren.",
 
+# Content models
+'content-model-wikitext' => 'wikitekste',
+'content-model-text' => 'tekste zonder opmaak',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Waorschuwing: disse zied gebruukt te veule kostbaore parserfunksies.
 
@@ -1321,7 +1339,7 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'search-interwiki-default' => '$1 resultaoten:',
 'search-interwiki-more' => '(meer)',
 'search-relatedarticle' => 'Verwaant',
-'mwsuggest-disable' => 'Anbevelingen via AJAX uutschakelen',
+'mwsuggest-disable' => 'Zeuksuggesties uutzetten',
 'searcheverything-enable' => 'In alle naamruumten zeuken',
 'searchrelated' => 'verwaant',
 'searchall' => 'alles',
@@ -1419,8 +1437,8 @@ Disse haandeling kan niet ongedaonemaakt wörden.',
 'prefs-emailconfirm-label' => 'Netpostbevestiging:',
 'prefs-textboxsize' => 'Aofmetingen bewarkingsscharm',
 'youremail' => 'Netpostadres (niet verplicht) *',
-'username' => 'Gebrukersnaam:',
-'uid' => 'Gebrukersnummer:',
+'username' => '{{GENDER:$1|Gebrukersnaam}}:',
+'uid' => '{{GENDER:$1|Gebrukersnummer}}:',
 'prefs-memberingroups' => 'Lid van {{PLURAL:$1|groep|groepen}}:',
 'prefs-registration' => 'Registrasiedaotum:',
 'yourrealname' => 'Echte naam (niet verplicht)',
@@ -2035,6 +2053,8 @@ Vergeet niet de verwiezingen nao te kieken veurda\'j de mal vortdoon.',
 Feitelik mutten ze rechtstreeks verwiezen naor t juuste onderwarp.<br />
 Ziejen wörden ezien as n deurverwieszied, as de mal gebruukt wörden die vermeld steet op [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop-submit' => 'Zeuk',
+
 'doubleredirects' => 'Dubbele deurverwiezingen',
 'doubleredirectstext' => 'Op disse lieste staon alle ziejen die deurverwiezen naor aandere deurverwiezingen.
 Op elke regel steet de eerste en de tweede deurverwiezing, daorachter steet de doelzied van de tweede deurverwiezing.
@@ -2509,7 +2529,7 @@ $1',
 'blanknamespace' => '(Heufdnaamruumte)',
 
 # Contributions
-'contributions' => 'Biedragen van disse gebruker',
+'contributions' => '{{GENDER:$1|Biedragen van disse gebruker}}',
 'contributions-title' => 'Biedragen van $1',
 'mycontris' => 'Mien biedragen',
 'contribsub2' => 'Veur $1 ($2)',
@@ -3035,6 +3055,11 @@ Meestentieds kömp dit deur n uutgaonde verwiezing die op de zwarte lieste steet
 'pageinfo-magic-words' => '{{PLURAL:$1|Magies woord|Magiese woorden}} ($1)',
 'pageinfo-hidden-categories' => 'Verbörgen {{PLURAL:$1|kategorie|kategorieën}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Gebruukten mal|Gebruukten mallen}} ($1)',
+'pageinfo-toolboxlink' => 'Informasie over disse zied',
+'pageinfo-redirectsto' => 'Verwis deur naor',
+'pageinfo-redirectsto-info' => 'informasie',
+'pageinfo-contentpage' => 'Eteld as zied mit inhoud',
+'pageinfo-contentpage-yes' => 'Ja',
 
 # Skin names
 'skinname-cologneblue' => 'Keuls blauw',
@@ -3114,6 +3139,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 ure|$1 uren}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
 'ago' => '$1 eleen',
+'just-now' => 'onderlest',
 
 # Bad image list
 'bad_image_list' => 'De opmaak is as volgt:
@@ -3825,6 +3851,8 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'htmlform-submit' => 'Opslaon',
 'htmlform-reset' => 'Wiezigingen ongedaonmaken',
 'htmlform-selectorother-other' => 'Aanders',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
 
 # SQLite database support
 'sqlite-has-fts' => 'Versie $1 mit ondersteuning veur "full-text" zeuken',
index d0c1f30..20fda89 100644 (file)
@@ -463,6 +463,16 @@ $messages = array(
 'nov' => 'nov',
 'dec' => 'dec',
 
+'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',
+'today-at' => '$1',
+'yesterday-at' => 'Gisteren om $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorie|Categorieën}}',
 'category_header' => 'Pagina’s in categorie "$1"',
@@ -4222,4 +4232,8 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt
 # Image rotation
 'rotate-comment' => 'Afbeelding gedraaid, $1 {{PLURAL:$1|graad|graden}} met de klok mee',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|uur}} geleden',
+'minutes-ago' => '$1 {{PLURAL:$1|minuut|minuten}} geleden',
+'seconds-ago' => '$1 {{PLURAL:$1|seconde|seconden}} geleden',
 );
index ccc71a0..0e93dbf 100644 (file)
@@ -4019,4 +4019,8 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|ଘଣ୍ଟା}} ଆଗରୁ',
+'minutes-ago' => '$1 {{PLURAL:$1|ମିନିଟ|ମିନିଟ}} ଆଗରୁ',
+'seconds-ago' => '$1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}} ଆଗରୁ',
 );
index 2395626..6cbbb03 100644 (file)
@@ -198,8 +198,8 @@ $messages = array(
 'tog-usenewrc' => 'ਹਾਲ ’ਚ ਹੋਏ ਬਦਲਾਵ ਅਤੇ ਧਿਆਨਸੂਚੀ ਵਿੱਚ ਪੰਨੇ ਮੁਤਾਬਕ ਬਦਲਾਵ ਦੇ ਗਰੁੱਪ ਬਣਾਓ (ਜਾਵਾਸਕ੍ਰਿਪਟ ਦੀ ਜਰੂਰਤ ਹੈ)',
 'tog-numberheadings' => 'ਆਟੋ-ਨੰਬਰ ਹੈਡਿੰਗ',
 'tog-showtoolbar' => 'ਸੋਧ ਟੂਲਬਾਰ ਵੇਖੋ (JavaScript ਚਾਹੀਦੀ ਹੈ)',
-'tog-editondblclick' => 'ਦà©\82ਹਰà©\87 à¨\95ਲਿੱà¨\95 â\80\99ਤà©\87 à¨ªà©°à¨¨à©\87 à¨¨à©\82à©° à¨¸à©°à¨ªà¨¾à¨¦à¨¤ à¨\95ਰà©\8b (à¨\9cਾਵਾਸà¨\95à©\8dਰਿਪà¨\9f à¨¦à©\80 à¨\9cਰà©\82ਰਤ ਹੈ)',
-'tog-editsection' => '[ਸੰਪਾਦਨ] à¨\95à©\9cà©\80à¨\86à¨\82 à¨¦à©\81à¨\86ਰਾ à¨\85ਨà©\81ਭਾà¨\97 à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨¸à¨®à¨°à©±à¨¥à¨¾à¨µà¨¾à¨¨ à¨\95ਰà©\8b',
+'tog-editondblclick' => 'ਦà©\8b à¨µà¨¾à¨° à¨\95ਲਿੱà¨\95 à¨\95ਰਨ à¨¨à¨¾à¨² à¨¸à¨«à¨¼à©\87 à¨¸à©\8bਧà©\8b (à¨\9cਾਵਾਸà¨\95à©\8dਰਿਪà¨\9f à¨\9aਾਹà©\80ਦà©\80 ਹੈ)',
+'tog-editsection' => '[ਸà©\8bਧ] à¨²à¨¿à©°à¨\95 à¨°à¨¾à¨¹à©\80à¨\82 à¨­à¨¾à¨\97 à¨¸à©\8bਧ à¨\95ਰਨਾ à¨\9aਾਲà©\82',
 'tog-editsectiononrightclick' => 'ਭਾਗ ਸਿਰਲੇਖਾਂ ਤੇ ਸੱਜੀ ਕਲਿੱਕ ਦੁਆਰਾ ਸੋਧ ਯੋਗ ਕਰੋ (ਜਾਵਾ ਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
 'tog-showtoc' => 'ਤਤਕਰਾ ਵੇਖਾਓ (3 ਤੋਂ ਵੱਧ ਸਿਰਲੇਖਾਂ ਵਾਲੇ ਪੰਨਿਆਂ ਲਈ)',
 'tog-rememberpassword' => 'ਇਸ ਬਰਾਊਜ਼ਰ ਉੱਤੇ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ ($1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ)',
@@ -345,8 +345,8 @@ $messages = array(
 'vector-action-unprotect' => 'ਸੁਰੱਖਿਆ ਬਦਲੋ',
 'vector-simplesearch-preference' => 'ਸਧਾਰਨ ਖੋਜ ਸਲਾਹ ਪੱਟੀ ਯੋਗ ਕਰੋ (ਸਿਰਫ਼ ਵਿਕਟਰ ਸਕਿੰਨ ਵਿਚ)',
 'vector-view-create' => 'ਬਣਾਓ',
-'vector-view-edit' => 'ਸੰਪਾਦਨ',
-'vector-view-history' => 'à¨\87ਤਿਹਾਸ ਵੇਖੋ',
+'vector-view-edit' => 'ਸà©\8bਧ',
+'vector-view-history' => 'à¨\85ਤà©\80ਤ ਵੇਖੋ',
 'vector-view-view' => 'ਪੜ੍ਹੋ',
 'vector-view-viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
 'actions' => 'ਕਾਰਵਾਈਆਂ',
@@ -362,14 +362,14 @@ $messages = array(
 'searchbutton' => 'ਖੋਜ',
 'go' => 'ਜਾਓ',
 'searcharticle' => 'ਜਾਓ',
-'history' => 'ਪੰਨà©\87 à¨¦à¨¾ à¨\87ਤਿਹਾਸ',
-'history_short' => 'à¨\87ਤਿਹਾਸ',
+'history' => 'ਸਫ਼ਾ à¨\85ਤà©\80ਤ',
+'history_short' => 'à¨\85ਤà©\80ਤ',
 'updatedmarker' => 'ਮੇਰੀ ਆਖਰੀ ਫੇਰੀ ਤੋਂ ਬਾਅਦ ਦੇ ਅੱਪਡੇਟ',
 'printableversion' => 'ਛਪਣਯੋਗ ਵਰਜਨ',
 'permalink' => 'ਪੱਕਾ ਲਿੰਕ',
 'print' => 'ਛਾਪੋ',
 'view' => 'ਵੇਖੋ',
-'edit' => 'ਸੰਪਾਦਨ',
+'edit' => 'ਸà©\8bਧ',
 'create' => 'ਬਣਾਓ',
 'editthispage' => 'ਇਹ ਸਫ਼ਾ ਸੋਧੋ',
 'create-this-page' => 'ਇਹ ਸਫ਼ਾ ਬਣਾਓ',
@@ -403,7 +403,7 @@ $messages = array(
 'otherlanguages' => 'ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ',
 'redirectedfrom' => '($1 ਤੋਂ ਰੀਡਿਰੈਕਟ)',
 'redirectpagesub' => 'ਰੀਡਿਰੈਕਟ ਸਫ਼ਾ',
-'lastmodifiedat' => 'à¨\87ਸ à¨ªà©°à¨¨à¨¾ à¨¦à¨¾ à¨ªà¨¿à©±à¨\9bਲਾ à¨¬à¨¦à¨²à¨¾à¨\85  $1 à¨¨à©\82à©°  $2 à¨µà¨\9cà©\87 à¨¹à©\8bà¨\87à¨\86 à¨¸à©\80।',
+'lastmodifiedat' => 'à¨\87ਹ à¨¸à¨«à¨¼à©\87 à¨µà¨¿à©±à¨\9a à¨\86à¨\96ਰà©\80 à¨¸à©\8bਧ  $1 à¨¨à©\82à©°  $2 à¨µà¨\9cà©\87 à¨¹à©\8bà¨\88।',
 'viewcount' => 'ਇਹ ਸਫ਼ਾ {{PLURAL:$1|ਇੱਕ ਵਾਰ|$1 ਵਾਰ}} ਵੇਖਿਆ ਗਿਆ।',
 'protectedpage' => 'ਸੁਰੱਖਿਅਤ ਪੇਜ',
 'jumpto' => 'ਇਸ ’ਤੇ ਜਾਓ:',
@@ -432,7 +432,7 @@ $1',
 'mainpage' => 'ਮੁੱਖ ਸਫ਼ਾ',
 'mainpage-description' => 'ਮੁੱਖ ਸਫ਼ਾ',
 'policy-url' => 'Project:ਨੀਤੀ',
-'portal' => 'ਸਮਾà¨\9c à¨®à©\81ੱà¨\96 à¨ªà©°à¨¨à¨¾',
+'portal' => 'ਸਮਾà¨\9c à¨¸à©±à¨¥',
 'portal-url' => 'Project:ਸਮਾਜ ਸੱਥ',
 'privacy' => 'ਪਰਾਈਵੇਸੀ ਨੀਤੀ',
 'privacypage' => 'Project:ਪਰਾਈਵੇਸੀ ਨੀਤੀ',
@@ -1569,7 +1569,7 @@ to upload files.',
 'newpages-username' => 'ਯੂਜ਼ਰ-ਨਾਂ:',
 'ancientpages' => 'ਸਭ ਤੋਂ ਪੁਰਾਣੇ ਪੇਜ',
 'move' => 'ਸਥਾਨਾਂਤਰਨ',
-'movethispage' => 'à¨\87ਹ à¨ªà©\87à¨\9c ਭੇਜੋ',
+'movethispage' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ ਭੇਜੋ',
 'unusedcategoriestext' => 'ਇਹ ਕੈਟੇਗਰੀ ਸਫ਼ੇ ਮੌਜੂਦ ਹਨ ਹਾਲਾਂਕਿ ਕਿਸੇ ਵੀ ਸਫ਼ੇ ਜਾਂ ਕੈਟੇਗਰੀ ਨੇ ਇਹਨਾਂ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ।',
 'notargettitle' => 'ਟਾਰਗੇਟ ਨਹੀਂ',
 'pager-newer-n' => '{{PLURAL:$1|1 ਨਵਾਂ|$1 ਨਵੇਂ}}',
@@ -1673,7 +1673,7 @@ to upload files.',
 
 # Watchlist
 'watchlist' => 'ਨਿਗਰਾਨ-ਸੂਚੀ',
-'mywatchlist' => 'ਧਿà¨\86ਨਸੂਚੀ',
+'mywatchlist' => 'ਨਿà¨\97ਰਾਨ-ਸੂਚੀ',
 'watchlistfor2' => '$1 $2 ਲਈ',
 'nowatchlist' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਕੋਈ ਚੀਜ਼ ਨਹੀਂ ਹੈ।',
 'watchlistanontext' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲੀਆਂ ਚੀਜ਼ਾਂ ਵੇਖਣ ਜਾਂ ਸੋਧਣ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ $1।',
@@ -1696,7 +1696,7 @@ to upload files.',
 'wlnote' => "$3, $4 ਮੁਤਾਬਕ ਆਖ਼ਰੀ {{PLURAL:$2|ਘੰਟੇ|'''$2''' ਘੰਟਿਆਂ}} ਵਿਚ {{PLURAL:
 $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆਂ}}, ਹੇਠਾਂ ਵੇਖੋ।",
 'wlshowlast' => 'ਪਿੱਛਲੇ $1 ਘੰਟੇ $2 ਦਿਨ $3 ਵੇਖੋ',
-'watchlist-options' => 'ਧਿà¨\86ਨਸà©\82à¨\9aà©\80 à¨µà¨¿à¨\95ਲਪ',
+'watchlist-options' => 'ਨਿà¨\97ਰਾਨ-ਸà©\82à¨\9aà©\80 à¨\9aà©\8bਣਾà¨\82',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'ਨਿਗ੍ਹਾ (ਵਾਚ) ਰੱਖੀ ਜਾ ਰਹੀ ਹੈ...',
index 60a8a21..06d0fe1 100644 (file)
@@ -398,9 +398,6 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 'powersearch-field' => 'Suche noch',
 'powersearch-togglenone' => 'Kään',
 
-# Quickbar
-'qbsettings-none' => 'Kään',
-
 # Preferences page
 'preferences' => 'Optione',
 'mypreferences' => 'Oistellunge',
@@ -551,7 +548,7 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 # Special:ListGroupRights
 'listgrouprights-members' => '(Midgliederlischd)',
 
-# E-mail user
+# Email user
 'emailuser' => 'E-Mail on de Benutzer',
 'emailsend' => 'Abschigge',
 
@@ -798,7 +795,7 @@ Du kannschd e Grund in dr Zammfassung aagewwe",
 'file-info-size' => '$1 × $2 Pixels, Dateigreß: $3, MIME-Type: $4',
 'file-nohires' => 'Ke hechere Ufflesung verfiechbar.',
 'svg-long-desc' => 'SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3',
-'show-big-image' => 'Gsamte Ergebnis',
+'show-big-image' => 'Volli Uflesung',
 
 # Special:NewFiles
 'showhidebots' => '(Bots $1)',
index fdb3698..24929c3 100644 (file)
@@ -409,6 +409,16 @@ $messages = array(
 'nov' => 'lis',
 'dec' => 'gru',
 
+'monday-at' => 'poniedziałek, $1',
+'tuesday-at' => 'wtorek, $1',
+'wednesday-at' => 'środa, $1',
+'thursday-at' => 'czwartek, $1',
+'friday-at' => 'piątek, $1',
+'saturday-at' => 'sobota, $1',
+'sunday-at' => 'niedziela, $1',
+'today-at' => '$1',
+'yesterday-at' => 'wczoraj, $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoria|Kategorie}}',
 'category_header' => 'Strony w kategorii „$1”',
@@ -981,7 +991,7 @@ Jednak adres IP może być współdzielony przez wielu użytkowników.
 Jeśli jesteś anonimowym użytkownikiem i uważasz, że zamieszczone tu komentarze nie są skierowane do Ciebie, [[Special:UserLogin/signup|utwórz konto]] lub [[Special:UserLogin|zaloguj się]] – dzięki temu unikniesz w przyszłości podobnych nieporozumień.''",
 'noarticletext' => 'Brak strony o tym tytule.
 Możesz [[Special:Search/{{PAGENAME}}|poszukać „{{PAGENAME}}” na innych stronach]],
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przeszukać log] lub [{{fullurl:{{FULLPAGENAME}}|action=edit}} utworzyć tę stronę]</span>.',
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przeszukać rejestr] lub [{{fullurl:{{FULLPAGENAME}}|action=edit}} utworzyć tę stronę]</span>.',
 'noarticletext-nopermission' => 'Ta strona nie posiada jeszcze zawartości.
 Możesz [[Special:Search/{{PAGENAME}}|wyszukać ten tytuł]] w treści innych stron
 lub <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przeszukać powiązane dzienniki]</span>, ale nie masz uprawnień do utworzenia tej strony',
@@ -3246,6 +3256,7 @@ Jeśli go otworzysz, możesz zarazić swój system.",
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minuty|$1 minut}}',
 'hours' => '{{PLURAL:$1|$1 godzina|$1 godziny|$1 godzin}}',
 'days' => '{{PLURAL:$1|$1 dzień|$1 dni}}',
+'weeks' => '{{PLURAL:$1|$1 tydzień|$1 tygodnie|$1 tygodni}}',
 'months' => '{{PLURAL:$1|$1 miesiąc|$1 miesiące|$1 miesięcy}}',
 'years' => '{{PLURAL:$1|$1 rok|$1 lata|$1 lat}}',
 'ago' => '$1 temu',
@@ -4142,4 +4153,8 @@ W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zosta
 # Image rotation
 'rotate-comment' => 'Obraz został odwrócony o $1 {{PLURAL:$1|stopień|stopnie|stopni}} (w kierunku zgodnym z ruchem wskazówek zegara)',
 
+# Unknown messages
+'hours-ago' => '{{PLURAL:$1|przed godziną|$1 godziny temu|$1 godzin temu}}',
+'minutes-ago' => '{{PLURAL:$1|przed minutą|$1 minuty temu|$1 minut temu}}',
+'seconds-ago' => '{{PLURAL:$1|przed sekundą|$1 sekundy temu|$1 sekund temu}}',
 );
index 40adf4c..13696ef 100644 (file)
@@ -94,16 +94,16 @@ $messages = array(
 # Font style option in Special:Preferences
 'editfont-style' => "Stil dij caràter ëd l'àrea ëd modìfica:",
 'editfont-default' => 'Stàndard dël navigator',
-'editfont-monospace' => 'Font mono-spassià',
-'editfont-sansserif' => 'Font sans-serif',
-'editfont-serif' => 'Font serif',
+'editfont-monospace' => 'Caràter mono-spassià',
+'editfont-sansserif' => 'Caràter sensa piòte',
+'editfont-serif' => 'Caràter con piòte',
 
 # Dates
-'sunday' => 'Dumìnica',
-'monday' => 'Lùn-es',
-'tuesday' => 'Màrtes',
-'wednesday' => 'Merco',
-'thursday' => 'Giòbia',
+'sunday' => 'dumìnica',
+'monday' => 'lùn-es',
+'tuesday' => 'màrtes',
+'wednesday' => 'merco',
+'thursday' => 'giòbia',
 'friday' => 'Vënner',
 'saturday' => 'Saba',
 'sun' => 'Dum',
index 4c2a048..4ef67e5 100644 (file)
@@ -309,6 +309,16 @@ This option means "underline links as in your user skin or your browser", there
 'nov' => 'Abbreviation of November, the eleventh month of the Gregorian calendar',
 'dec' => 'Abbreviation of December, the twelfth month of the Gregorian calendar',
 
+'monday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Monday. $1 is the time.',
+'tuesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Tuesday. $1 is the time.',
+'wednesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Wednesday. $1 is the time.',
+'thursday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Thursday. $1 is the time.',
+'friday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Friday. $1 is the time.',
+'saturday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Saturday. $1 is the time.',
+'sunday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Sunday. $1 is the time.',
+'today-at' => 'Phrase for indicating that something occurred at a particular time today. $1 is the time.',
+'yesterday-at' => 'Phrase for indicating that something occurred at a particular time yesterday. $1 is the time.',
+
 # Categories related messages
 'pagecategories' => 'Used in the categories section of pages. Is followed by a colon and a list of categories.',
 'category_header' => 'In category description page',
@@ -1045,13 +1055,18 @@ In user preferences.
 'userlogin-yourname' => 'In new vertical user login & create account forms, label for username field.
 {{Identical|Username}}',
 'userlogin-yourname-ph' => 'Placeholder text in new userlogin/create account form field.',
+'createacct-helpusername-url' => 'The URL of a page providing username guidance for the wiki.',
+'createacct-helpusername-link' => 'Message in new create account form providing guidance for username.',
 'yourpassword' => 'In user preferences
 
 {{Identical|Password}}',
 'userlogin-yourpassword' => 'In new vertical user login & create account forms, label for password field.
 {{Identical|Password}}',
 'userlogin-yourpassword-ph' => 'Placeholder text in new userlogin form for password field.',
+'createacct-yourpassword-ph' => 'Placeholder text in new create account form for password field.',
 'yourpasswordagain' => 'In user preferences',
+'createacct-yourpasswordagain' => 'In new create account form, label for field to re-enter password',
+'createacct-yourpasswordagain-ph' => 'Placeholder text in new create account form for re-enter password field.',
 'remembermypassword' => 'A check box in [[Special:UserLogin]]
 
 {{Identical|Remember my login on this computer}}',
@@ -1119,12 +1134,33 @@ Wikitext linking to login help.
 
 See also:
 * {{msg-mw|Helplogin-url}}',
+'createacct-join' => 'Subheading of vertical-layout create account form encouraging user to join the wiki.',
+'createacct-emailrequired' => 'Label in vertical-layout create account form for email field when it is required.',
+'createacct-emailoptional' => 'Label in vertical-layout create account form for email field when it is optional.',
+'createacct-email-ph' => 'Placeholder in vertical-layout create account form for email field.',
 'createaccountmail' => 'Button text for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.',
+'createacct-realname' => 'In vertical-layout create account form, label for field to enter optional real name.',
 'createaccountreason' => '{{Identical|Reason}}',
+'createacct-reason' => 'In vertical-layout create account form, label for field to enter reason to create an account when already logged-in.',
+'createacct-captcha' => 'Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.',
+'createacct-captcha-help-url' => 'The URL of a page providing CAPTCHA assistance for the wiki.',
+'createacct-imgcaptcha-help' => 'Help text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.',
+'createacct-imgcaptcha-ph' => 'Placehodler text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.',
+'createacct-benefit-heading' => 'In vertical-layout create account form, the heading for the section describing the benefits of creating an account.',
+'createacct-benefit-icon1' => 'In vertical-layout create account form, the CSS style for the div next to the first benefit. If you replace this you will need probably need to adjust CSS.',
+'createacct-benefit-head1' => 'In vertical-layout create account form, the text in the heading for the first benefit. Do not edit the magic word; if you replace it you will probably need to adjust CSS.',
+'createacct-benefit-body1' => 'In vertical-layout create account form, the text for the first benefit.',
+'createacct-benefit-icon2' => 'In vertical-layout create account form, the CSS style for the div next to the second benefit. If you replace this you will need probably need to adjust CSS.',
+'createacct-benefit-head2' => 'In vertical-layout create account form, the text in the heading for the second benefit. Do not edit the magic word; if you replace it you will probably need to adjust CSS.',
+'createacct-benefit-body2' => 'In vertical-layout create account form, the text for the second benefit.',
+'createacct-benefit-icon3' => 'In vertical-layout create account form, the CSS style for the div next to the third benefit. If you replace this you will need probably need to adjust CSS.',
+'createacct-benefit-head3' => 'In vertical-layout create account form, the text in the heading for the third benefit. Do not edit the magic word; if you replace it you will probably need to adjust CSS.',
+'createacct-benefit-body3' => 'In vertical-layout create account form, the text for the third benefit.',
 'badretype' => 'Used as error message when the new password and its retype do not match.',
 'userexists' => 'Used as error message in creating a user account.',
 'loginerror' => 'Used as title of error message.
 {{Identical|Login error}}',
+'createacct-error' => 'Title of error message in new vertical create account form.',
 'createaccounterror' => 'Parameters:
 * $1 is an error message',
 'nocookiesnew' => "This message is displayed when a new account was successfully created, but the browser doesn't accept cookies.",
@@ -1170,7 +1206,7 @@ $1 is the minimum number of characters in the password.',
 
 Parameters:
 * $1 is a user name. This parameter can be used with GENDER.',
-'noemailcreate' => 'Used as error message in [[Special:UserLogin]].',
+'noemailcreate' => 'Used as error message when one user creates an account for another and there is no email.',
 'passwordsent' => '* $1 - username',
 'blocked-mailpassword' => 'Used as error message in password recovery.',
 'eauthentsent' => "This message appears after entering an e-mail address in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}, then clicking on '{{int:saveprefs}}'.",
@@ -2259,7 +2295,8 @@ See also:
 
 See also:
 * {{msg-mw|Searchprofile-images|message}}
-* {{msg-mw|Searchprofile-images-tooltip|tooltip}}',
+* {{msg-mw|Searchprofile-images-tooltip|tooltip}}
+{{Identical|Muitimedia}}',
 'searchprofile-everything' => 'Used as an option in [[Special:Search]].
 
 See also:
@@ -2426,7 +2463,8 @@ See also:
 'resetprefs' => 'Button for resetting changes in the preferences page.',
 'restoreprefs' => 'Used in [[Special:Preferences]]',
 'prefs-editing' => 'Title of a tab in [[Special:Preferences]].
-When changing this message, please also update {{msg-mw|vector-editwarning-warning}} which references to this message.',
+When changing this message, please also update {{msg-mw|vector-editwarning-warning}} which references to this message.
+{{Identical|Editing}}',
 'prefs-edit-boxsize' => 'Used on [[Special:Preferences]].',
 'rows' => 'Used on [[Special:Preferences]], "Editing" section in the "Size of editing window" fieldset',
 'columns' => 'Used on [[Special:Preferences]], "Editing" section in the "Size of editing window" fieldset',
@@ -3809,7 +3847,8 @@ $1 is the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|shar
 * $1 - file title
 See also:
 * {{msg-mw|Filedelete-intro}}',
-'filedelete-legend' => '{{Identical|Delete}}',
+'filedelete-legend' => 'Used as fieldset label in the "Delete file" form.
+{{Identical|Delete file}}',
 'filedelete-intro' => 'Used as introduction for FileDelete form.
 See also:
 * {{msg-mw|Filedelete|page title}}',
@@ -4921,7 +4960,8 @@ See also:
 'contribsub2' => 'Contributions for "user" (links)
 {{Identical|For $1}}',
 'nocontribs' => 'Optional parameter: $1 is the user name',
-'uctop' => 'This message is used in [[Special:Contributions]]. It is used to show that a particular edit was the last made to a page. Example: 09:57, 11 February 2008 (hist) (diff) Pagename‎ (edit summary) (top)',
+'uctop' => 'This message is used in [[Special:Contributions]]. It is used to show that a particular edit was the last made to a page. Example: 09:57, 11 February 2008 (hist) (diff) Pagename‎ (edit summary) (top)
+{{Identical|Top}}',
 'month' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a dropdown box to select a specific month to view the edits made in that month, and the earlier months. See also {{msg-mw|year}}.',
 'year' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for an input box to select a specific year to view the edits made in that year, and the earlier years.
 
@@ -7019,9 +7059,6 @@ See also {{msg-mw|Days-abbrev}}
 
 Part of variable $1 in {{msg-mw|Ago}}
 {{Identical|Day}}',
-'weeks' => 'Full word for "weeks". $1 is the number of weeks.
-
-Part of variable $1 in {{msg-mw|Ago}}',
 'months' => 'Full word for "months". $1 is the number of months.
 
 Part of variable $1 in {{msg-mw|Ago}}',
@@ -7037,20 +7074,6 @@ Part of variable $1 in {{msg-mw|Ago}}',
 *{{msg-mw|Years}}',
 'just-now' => 'Phrase for indicating something happened just now.',
 
-'hours-ago'      => 'Phrase for indicating that something occurred a certain number of hours ago',
-'minutes-ago'    => 'Phrase for indicating that something occurred a certain number of minutes ago',
-'seconds-ago'    => 'Phrase for indicating that something occurred a certain number of seconds ago',
-
-'monday-at'   => 'Phrase for indicating that something occurred at a particular time on the most recent Monday. $1 is the time.',
-'tuesday-at'   => 'Phrase for indicating that something occurred at a particular time on the most recent Tuesday. $1 is the time.',
-'wednesday-at'   => 'Phrase for indicating that something occurred at a particular time on the most recent Wednesday. $1 is the time.',
-'thursday-at'   => 'Phrase for indicating that something occurred at a particular time on the most recent Thursday. $1 is the time.',
-'friday-at'   => 'Phrase for indicating that something occurred at a particular time on the most recent Friday. $1 is the time.',
-'saturday-at'   => 'Phrase for indicating that something occurred at a particular time on the most recent Saturday. $1 is the time.',
-'sunday-at'   => 'Phrase for indicating that something occurred at a particular time on the most recent Sunday. $1 is the time.',
-'today-at'       => 'Phrase for indicating that something occurred at a particular time today. $1 is the time.',
-'yesterday-at'   => 'Phrase for indicating that something occurred at a particular time yesterday. $1 is the time.',
-
 # Bad image list
 'bad_image_list' => 'This message only appears to guide administrators to add links with the right format. This will not appear anywhere else in MediaWiki.',
 
@@ -7252,7 +7275,8 @@ See also:
 This contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.
 {{Related|Exif-componentsconfiguration}}',
 'exif-compressedbitsperpixel' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-pixelydimension' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-pixelydimension' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+{{Identical|Image width}}',
 'exif-pixelxdimension' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
 'exif-usercomment' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
@@ -8893,4 +8917,8 @@ $4 is the gender of the target user.',
 # Image rotation
 'rotate-comment' => 'Edit summary for the act of rotating an image.',
 
+# Unknown messages
+'hours-ago' => 'Phrase for indicating that something occurred a certain number of hours ago',
+'minutes-ago' => 'Phrase for indicating that something occurred a certain number of minutes ago',
+'seconds-ago' => 'Phrase for indicating that something occurred a certain number of seconds ago',
 );
index 60c2a89..8413906 100644 (file)
@@ -407,6 +407,16 @@ pe titlul secțiunii (JavaScript)',
 'nov' => 'nov',
 'dec' => 'dec',
 
+'monday-at' => 'Luni, la $1',
+'tuesday-at' => 'Marți, la $1',
+'wednesday-at' => 'Miercuri, la $1',
+'thursday-at' => 'Joi,la $1',
+'friday-at' => 'Vineri, la $1',
+'saturday-at' => 'Sâmbătă, la $1',
+'sunday-at' => 'Duminică, la $1',
+'today-at' => '$1',
+'yesterday-at' => 'Ieri, la $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorie|Categorii}}',
 'category_header' => 'Pagini din categoria „$1”',
@@ -4056,4 +4066,8 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 # Image rotation
 'rotate-comment' => 'Imagine rotită în sensul acelor de ceasornic cu $1 {{PLURAL:$1|grad|grade|de grade}}',
 
+# Unknown messages
+'hours-ago' => 'acum $1 {{PLURAL:$1|oră|ore|de ore}}',
+'minutes-ago' => 'acum $1 {{PLURAL:$1|minut|minute|de minute}}',
+'seconds-ago' => 'acum {{PLURAL:$1|o secundă|$1 secunde|$1 de secunde}}',
 );
index 6f726f2..516b376 100644 (file)
@@ -133,6 +133,16 @@ $messages = array(
 'nov' => 'Nov',
 'dec' => 'Dec',
 
+'monday-at' => 'Lunedìe a le $1',
+'tuesday-at' => 'Martedìe a le $1',
+'wednesday-at' => 'Mercrudìe a le $1',
+'thursday-at' => 'Sciuvedìe a le $1',
+'friday-at' => 'Venerdìe a le $1',
+'saturday-at' => 'Sabbète a le $1',
+'sunday-at' => 'Dumeneche a le $1',
+'today-at' => '$1',
+'yesterday-at' => 'Aijere a le $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorije|Categorije}}',
 'category_header' => 'Pàggene jndr\'à categorie "$1"',
@@ -3045,6 +3055,7 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
 'minutes' => '{{PLURAL:$1|$1 minute|$1 minute}}',
 'hours' => '{{PLURAL: $1|$1ore|$1 ore}}',
 'days' => '{{PLURAL: $1|$1 sciurne|$1 sciurne}}',
+'weeks' => '{{PLURAL:$1|$1 sumàne}}',
 'months' => '{{PLURAL:$1|$1 mese|$1 mise}}',
 'years' => '{{PLURAL:$1|$1 anne}}',
 'ago' => '$1 fà',
@@ -4077,4 +4088,8 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 # Image rotation
 'rotate-comment' => 'Immaggine rotate de $1 {{PLURAL:$1|grade}} in sienze orarie',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|ore}} fà',
+'minutes-ago' => '$1 {{PLURAL:$1|minute}} fà',
+'seconds-ago' => '$1 {{PLURAL:$1|seconde}} fà',
 );
index eb5f112..b73204b 100644 (file)
@@ -454,9 +454,15 @@ $2',
 'welcomecreation-msg' => 'Аатыҥ бэлиэтэннэ.
 {{SITENAME}} ситим-сиргэ үлэлииргэ табыгастаах буоллун диэн [[Special:Preferences|тус туруорууларгын]] уларытыаххын сөп.',
 'yourname' => 'Кыттааччы аатыҥ:',
+'userlogin-yourname' => 'Бэлиэ-аат',
+'userlogin-yourname-ph' => 'Бэлиэ-ааккын киллэр',
 'yourpassword' => 'Киирии тыла:',
+'userlogin-yourpassword' => 'Киирии тыл',
+'userlogin-yourpassword-ph' => 'Киирии тылгын суруй',
 'yourpasswordagain' => 'Киирии тылгын хатылаа:',
 'remembermypassword' => 'Миигин бу көмпүүтэргэ сигээ ($1 {{PLURAL:$1|күн|күнтэн ордуга суох}})',
+'userlogin-remembermypassword' => 'Долоҕойгор хатаа',
+'userlogin-signwithsecure' => 'Бигэ сиэрбэри туһанан киирии',
 'securelogin-stick-https' => 'Киирэн баран HTTPS нөҥүө холбонууну салгыырга',
 'yourdomainname' => 'Эн дөмүөнүҥ:',
 'password-change-forbidden' => 'Бу биикигэ киирии тылы уоарытар табыллыбат.',
@@ -469,12 +475,16 @@ $2',
 'logout' => 'Тахсыы',
 'userlogout' => 'Тахсыы',
 'notloggedin' => 'Ааккын эппэтиҥ',
+'userlogin-noaccount' => 'Бэлиэтэнэ иликкин дуо?',
+'userlogin-joinproject' => '{{SITENAME}} ситим-сиргэ киирии',
 'nologin' => "Бэлиэтэнэ иликкин дуо? '''$1'''.",
 'nologinlink' => 'Бэлиэтэнии',
 'createaccount' => 'Бэлиэтэнии',
 'gotaccount' => "Бэлиэтэммитиҥ дуо? '''$1'''.",
 'gotaccountlink' => 'Аатыҥ',
 'userlogin-resetlink' => 'Киирэр тылгын умнубуккун дуо?',
+'helplogin-url' => 'Help:Бэлиэ-ааты киллэрии',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Бэлиэтэниигэ көмө]]',
 'createaccountmail' => 'Быстах киирии тылы туһаныы уонна ону email-ынан ыытыы',
 'createaccountreason' => 'Төрүөтэ:',
 'badretype' => 'Киирии тылларыҥ сөп түбэспэтилэр.',
index bd9dee3..0c51e56 100644 (file)
@@ -390,6 +390,16 @@ $messages = array(
 'nov' => 'nov',
 'dec' => 'dec',
 
+'monday-at' => 'v pondelok o $1',
+'tuesday-at' => 'v utorok o $1',
+'wednesday-at' => 'v stredu o $1',
+'thursday-at' => 'vo štvrtok o $1',
+'friday-at' => 'v piatok o $1',
+'saturday-at' => 'v sobotu o $1',
+'sunday-at' => 'v nedeľu o $1',
+'today-at' => '$1',
+'yesterday-at' => 'včera o $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategória|Kategórie|Kategórie}}',
 'category_header' => 'Stránky v kategórii „$1“',
@@ -4048,4 +4058,8 @@ V opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš k
 # Image rotation
 'rotate-comment' => 'Obrázok otočený o $1 {{PLURAL:$1|stupeň|stupne|stupňov}} v smere hodinových ručičiek',
 
+# Unknown messages
+'hours-ago' => 'pred $1 {{PLURAL:$1|hodinou|hodinami}}',
+'minutes-ago' => 'pred $1 {{PLURAL:$1|minútou|minútami}}',
+'seconds-ago' => 'pred $1 {{PLURAL:$1|sekundou|sekundami}}',
 );
index d4b8e0e..100e57c 100644 (file)
@@ -294,6 +294,16 @@ $messages = array(
 'nov' => 'nov.',
 'dec' => 'dec.',
 
+'monday-at' => 'Ponedeljek ob $1',
+'tuesday-at' => 'Torek ob $1',
+'wednesday-at' => 'Sreda ob $1',
+'thursday-at' => 'Četrtek ob $1',
+'friday-at' => 'Petek ob $1',
+'saturday-at' => 'Sobota ob $1',
+'sunday-at' => 'Nedelja ob $1',
+'today-at' => '$1',
+'yesterday-at' => 'Včeraj ob $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategoriji|Kategorije}}',
 'category_header' => 'Strani v kategoriji »$1«',
@@ -773,7 +783,7 @@ svojega starega gesla.',
 Začasno geslo: $2',
 'passwordreset-emailsent' => 'Poslali smo e-pošto za postavitev gesla.',
 'passwordreset-emailsent-capture' => 'Poslali smo e-pošto za ponastavitev gesla, ki je prikazana spodaj.',
-'passwordreset-emailerror-capture' => 'Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje uporabniku ni uspelo: $1',
+'passwordreset-emailerror-capture' => 'Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje {{GENDER:$2|uporabniku|uporabnici}} ni uspelo: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Sprememba e-poštnega naslova',
@@ -3135,6 +3145,7 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
 'minutes' => '$1 {{PLURAL:$1|minuta|minuti|minute|minut}}',
 'hours' => '$1 {{PLURAL:$1|ura|uri|ure|ur}}',
 'days' => '$1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
+'weeks' => '$1 {{PLURAL:$1|teden|tedna|tedni|tednov}}',
 'months' => '$1 {{PLURAL:$1|mesec|meseca|mesece|mesecev}}',
 'years' => '$1 {{PLURAL:$1|leto|leti|leta|let}}',
 'ago' => 'pred $1',
@@ -3988,4 +3999,8 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
 # Image rotation
 'rotate-comment' => 'Slika zavrti s  $1  {{PLURAL:$1| degree|degrees}} v smeri urinega kazalca',
 
+# Unknown messages
+'hours-ago' => 'pred $1 {{PLURAL:$1|uro|urama|urami}}',
+'minutes-ago' => 'pred $1 {{PLURAL:$1|minuto|minutama|minutami}}',
+'seconds-ago' => 'pred $1 {{PLURAL:$1|sekundo|sekundama|sekundami}}',
 );
index f16836a..5d5a996 100644 (file)
@@ -456,6 +456,16 @@ $messages = array(
 'nov' => 'Kas',
 'dec' => 'Ara',
 
+'monday-at' => '$1 Pazartesi günü',
+'tuesday-at' => '$1 Salı günü',
+'wednesday-at' => '$1 Çarşamba günü',
+'thursday-at' => '$1 Perşembe günü',
+'friday-at' => '$1 Cuma günü',
+'saturday-at' => '$1 Cumartesi günü',
+'sunday-at' => '$1 Pazar günü',
+'today-at' => '$1',
+'yesterday-at' => '$1 dün itibariyle',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriler}}',
 'category_header' => '"$1" kategorisindeki sayfalar',
@@ -3963,4 +3973,8 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'duration-centuries' => '$1 {{PLURAL:$1|yüzyıl|yüzyıl}}',
 'duration-millennia' => '$1 {{PLURAL:$1|bin yıl|bin yıl}}',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|saat|saat}} önce',
+'minutes-ago' => '$1 {{PLURAL:$1|dakika|dakika}} önce',
+'seconds-ago' => '$1 {{PLURAL:$1|saniye|saniye}} önce',
 );
index 70ce910..f2fc88f 100644 (file)
@@ -36,6 +36,7 @@
  * @author RLuts
  * @author Riwnodennyk
  * @author Sodmy
+ * @author Ua2004
  * @author Urhixidur
  * @author VolodymyrF
  * @author Vox
@@ -2408,7 +2409,7 @@ $1',
 'addedwatchtext' => "Сторінку «[[:$1]]» додано до вашого [[Special:Watchlist|списку спостереження]].
 Подальші редагування цієї сторінки (та пов'язаної з нею сторінки обговорення) відображатимуться в цьому списку.",
 'removewatch' => 'Видалити зі списку спостереження',
-'removedwatchtext' => 'Сторінка «[[:$1]]» вилучена з вашого [[Special:Watchlist|списку спостереження]].',
+'removedwatchtext' => 'Сторінку «[[:$1]]» вилучено з вашого [[Special:Watchlist|списку спостереження]].',
 'watch' => 'Спостерігати',
 'watchthispage' => 'Спостерігати за цією сторінкою',
 'unwatch' => 'Скас. спостереження',
index bdc04b1..dd8ff84 100644 (file)
@@ -410,6 +410,16 @@ $messages = array(
 'nov' => 'tháng 11',
 'dec' => 'tháng 12',
 
+'monday-at' => 'Thứ Hai lúc $1',
+'tuesday-at' => 'Thứ Ba lúc $1',
+'wednesday-at' => 'Thứ Tư lúc $1',
+'thursday-at' => 'Thứ Năm lúc $1',
+'friday-at' => 'Thứ Sáu lúc $1',
+'saturday-at' => 'Thứ Bảy lúc $1',
+'sunday-at' => 'Chủ Nhật lúc $1',
+'today-at' => '$1',
+'yesterday-at' => 'Hôm qua lúc $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Thể loại|Thể loại}}',
 'category_header' => 'Các trang trong thể loại “$1”',
@@ -861,7 +871,7 @@ mật khẩu cũ.',
 Mật khẩu tạm: $2',
 'passwordreset-emailsent' => 'Đã gửi thư điện tử để tái tạo mật khẩu.',
 'passwordreset-emailsent-capture' => 'Thư điện tử để tái tạo mật khẩu đã được gửi, nội dung như sau.',
-'passwordreset-emailerror-capture' => 'Chúng tôi đã tạo thư tái tạo mật khẩu dưới đây, nhưng không thể gửi đến người dùng: $1',
+'passwordreset-emailerror-capture' => 'Chúng tôi đã tạo thư tái tạo mật khẩu dưới đây, nhưng không thể gửi đến {{GENDER:$2}}người dùng: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Đổi địa chỉ thư điện tử',
@@ -3215,6 +3225,7 @@ Nếu thực thi nó máy tính của bạn có thể bị tiếm quyền.",
 'minutes' => '$1 phút',
 'hours' => '$1 giờ',
 'days' => '$1 ngày',
+'weeks' => '{{PLURAL:$1|$1 tuần}}',
 'months' => '$1 tháng',
 'years' => '$1 năm',
 'ago' => 'cách đây $1',
@@ -4167,4 +4178,8 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 # Image rotation
 'rotate-comment' => 'Đã quay hình $1 độ theo chiều kim đồng hồ',
 
+# Unknown messages
+'hours-ago' => 'Cách đây $1 {{PLURAL:$1|giờ}}',
+'minutes-ago' => 'Cách đây $1 {{PLURAL:$1|phút}}',
+'seconds-ago' => 'Cách đây $1 {{PLURAL:$1|giây}}',
 );
index 0714d0a..58f5bc4 100644 (file)
@@ -362,6 +362,16 @@ $messages = array(
 'nov' => '11月',
 'dec' => '12月',
 
+'monday-at' => '於星期一$1',
+'tuesday-at' => '於星期二$1',
+'wednesday-at' => '於星期三$1',
+'thursday-at' => '於星期四$1',
+'friday-at' => '於星期五$1',
+'saturday-at' => '於星期六$1',
+'sunday-at' => '於星期日$1',
+'today-at' => '$1',
+'yesterday-at' => '昨天$1',
+
 # Categories related messages
 'pagecategories' => '$1個分類',
 'category_header' => '「$1」分類中的頁面',
@@ -3122,6 +3132,7 @@ $1',
 'minutes' => '$1分鍾',
 'hours' => '$1小時',
 'days' => '$1天',
+'weeks' => '{{PLURAL:$1|$1周|$1周}}',
 'months' => '{{PLURAL:$1|$1個月|$1個月}}',
 'years' => '{{PLURAL:$1|$1年|$1年}}',
 'ago' => '$1前',
@@ -3981,4 +3992,8 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 # Image rotation
 'rotate-comment' => '順時針旋轉圖像$1{{PLURAL:$1|度|度}}',
 
+# Unknown messages
+'hours-ago' => '$1小時前',
+'minutes-ago' => '$1分鐘前',
+'seconds-ago' => '$1秒前',
 );
index 9163d69..bcd59f1 100644 (file)
@@ -133,7 +133,7 @@ class BackupDumper {
                        $matches = array();
                        if ( preg_match( '/^--(.+?)(?:=(.+?)(?::(.+?))?)?$/', $arg, $matches ) ) {
                                @list( /* $full */ , $opt, $val, $param ) = $matches;
-                               switch( $opt ) {
+                               switch ( $opt ) {
                                case "plugin":
                                        $this->loadPlugin( $val, $param );
                                        break;
@@ -368,7 +368,7 @@ class BackupDumper {
 
        function fatalError( $msg ) {
                $this->progress( "$msg\n" );
-               die(1);
+               die( 1 );
        }
 }
 
index cc0a7e1..04352b9 100644 (file)
@@ -51,7 +51,7 @@ class BaseDump {
                $this->infiles = explode( ';', $infile );
                $this->reader = new XMLReader();
                $infile = array_shift( $this->infiles );
-               if (defined( 'LIBXML_PARSEHUGE' ) ) {
+               if ( defined( 'LIBXML_PARSEHUGE' ) ) {
                        $this->reader->open( $infile, null, LIBXML_PARSEHUGE );
                }
                else {
@@ -110,8 +110,8 @@ class BaseDump {
                        }
                } else {
                        $this->close();
-                       if (count($this->infiles)) {
-                               $infile = array_shift($this->infiles);
+                       if ( count( $this->infiles ) ) {
+                               $infile = array_shift( $this->infiles );
                                $this->reader->open( $infile );
                                $this->atEnd = false;
                        }
@@ -181,7 +181,7 @@ class BaseDump {
                }
                $buffer = "";
                while ( $this->reader->read() ) {
-                       switch( $this->reader->nodeType ) {
+                       switch ( $this->reader->nodeType ) {
                        case XMLReader::TEXT:
 //                     case XMLReader::WHITESPACE:
                        case XMLReader::SIGNIFICANT_WHITESPACE:
index c99f004..547abab 100644 (file)
@@ -183,7 +183,7 @@ class TextPassDumper extends BackupDumper {
                global $IP;
                $url = $this->processFileOpt( $val, $param );
 
-               switch( $opt ) {
+               switch ( $opt ) {
                case 'prefetch':
                        require_once "$IP/maintenance/backupPrefetch.inc";
                        $this->prefetch = new BaseDump( $url );
@@ -215,7 +215,7 @@ class TextPassDumper extends BackupDumper {
        function processFileOpt( $val, $param ) {
                $fileURIs = explode( ';', $param );
                foreach ( $fileURIs as $URI ) {
-                       switch( $val ) {
+                       switch ( $val ) {
                                case "file":
                                        $newURI = $URI;
                                        break;
index 4c03980..b3d8174 100644 (file)
@@ -657,6 +657,7 @@ class wikiFuzz {
                        "}}",
                        "{{INT:googlesearch|",
                        "}}",
+                        "{{ROOTPAGENAME}}",
                        "{{BASEPAGENAME}}",
                        "{{CONTENTLANGUAGE}}",
                        "{{PAGESINNAMESPACE:}}",
index 83b5b02..53ea597 100644 (file)
@@ -53,7 +53,7 @@ class GetConfiguration extends Maintenance {
                }
 
                $out = null;
-               switch( $this->getOption( 'format' ) ) {
+               switch ( $this->getOption( 'format' ) ) {
                        case 'PHP':
                                $out = serialize( $res );
                                break;
index 413d650..9e583e7 100644 (file)
@@ -46,7 +46,7 @@ class CheckLanguageCLI {
        public function __construct( array $options ) {
                if ( isset( $options['help'] ) ) {
                        echo $this->help();
-                       exit(1);
+                       exit( 1 );
                }
 
                if ( isset( $options['lang'] ) ) {
@@ -488,7 +488,7 @@ class CheckExtensionsCLI extends CheckLanguageCLI {
        public function __construct( array $options, $extension ) {
                if ( isset( $options['help'] ) ) {
                        echo $this->help();
-                       exit(1);
+                       exit( 1 );
                }
 
                if ( isset( $options['lang'] ) ) {
@@ -654,7 +654,7 @@ ENDS;
                                echo $extension->name() . ":\n";
 
                                if ( $this->level > 0 ) {
-                                       switch( $this->output ) {
+                                       switch ( $this->output ) {
                                                case 'plain':
                                                        $this->outputText();
                                                        break;
index f5bcb5d..991788c 100644 (file)
@@ -247,6 +247,13 @@ $wgIgnoredMessages = array(
        'ipb-default-expiry',
        'pageinfo-header',
        'pageinfo-footer',
+       'createacct-benefit-head1',
+       'createacct-benefit-icon1',
+       'createacct-benefit-head2',
+       'createacct-benefit-icon2',
+       'createacct-benefit-head3',
+       'createacct-benefit-icon3',
+       'today-at',
 );
 
 /** Optional messages, which may be translated only if changed in the target language. */
index cc5b9d3..96a6c13 100644 (file)
@@ -136,17 +136,6 @@ $wgMessageStructure = array(
                'nov',
                'dec',
        ),
-       'human-timestamps' => array(
-               'monday-at',
-               'tuesday-at',
-               'wednesday-at',
-               'thursday-at',
-               'friday-at',
-               'saturday-at',
-               'sunday-at',
-               'today-at',
-               'yesterday-at',
-       ),
        'categorypages' => array(
                'pagecategories',
                'pagecategorieslink',
@@ -442,10 +431,15 @@ $wgMessageStructure = array(
                'yourname',
                'userlogin-yourname',
                'userlogin-yourname-ph',
+               'createacct-helpusername-url',
+               'createacct-helpusername-link',
                'yourpassword',
                'userlogin-yourpassword',
                'userlogin-yourpassword-ph',
+               'createacct-yourpassword-ph',
                'yourpasswordagain',
+               'createacct-yourpasswordagain',
+               'createacct-yourpasswordagain-ph',
                'remembermypassword',
                'userlogin-remembermypassword',
                'userlogin-signwithsecure',
@@ -472,11 +466,32 @@ $wgMessageStructure = array(
                'userlogin-resetlink',
                'helplogin-url',
                'userlogin-helplink',
+               'createacct-join',
+               'createacct-emailrequired',
+               'createacct-emailoptional',
+               'createacct-email-ph',
                'createaccountmail',
+               'createacct-realname',
                'createaccountreason',
+               'createacct-reason',
+               'createacct-captcha',
+               'createacct-captcha-help-url',
+               'createacct-imgcaptcha-help',
+               'createacct-imgcaptcha-ph',
+               'createacct-benefit-heading',
+               'createacct-benefit-icon1',
+               'createacct-benefit-head1',
+               'createacct-benefit-body1',
+               'createacct-benefit-icon2',
+               'createacct-benefit-head2',
+               'createacct-benefit-body2',
+               'createacct-benefit-icon3',
+               'createacct-benefit-head3',
+               'createacct-benefit-body3',
                'badretype',
                'userexists',
                'loginerror',
+               'createacct-error',
                'createaccounterror',
                'nocookiesnew',
                'nocookieslogin',
@@ -2825,6 +2840,20 @@ $wgMessageStructure = array(
                'ago',
                'just-now',
        ),
+       'human-timestamps' => array(
+               'hours-ago',
+               'minutes-ago',
+               'seconds-ago',
+               'monday-at',
+               'tuesday-at',
+               'wednesday-at',
+               'thursday-at',
+               'friday-at',
+               'saturday-at',
+               'sunday-at',
+               'today-at',
+               'yesterday-at',
+       ),
        'badimagelist' => array(
                'bad_image_list',
        ),
@@ -3983,8 +4012,9 @@ XHTML id names.",
        'patrol-log'          => 'Patrol log',
        'imagedeletion'       => 'Image deletion',
        'browsediffs'         => 'Browsing diffs',
-       'newfiles'           => 'Special:NewFiles',
+       '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",
index 6148cc4..8aac4b3 100644 (file)
@@ -145,8 +145,8 @@ function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath,
 unset( $file );
 
 if ( is_array( $argv ) ) {
-       for ($i = 0; $i < count($argv); $i++ ) {
-               switch( $argv[$i] ) {
+       for ( $i = 0; $i < count( $argv ); $i++ ) {
+               switch ( $argv[$i] ) {
                case '--all':
                        $input = 0;
                        break;
@@ -210,7 +210,7 @@ Other options:
 
 
 END;
-                       exit(0);
+                       exit( 0 );
                        break;
                }
        }
index c5bf569..0f6f365 100644 (file)
@@ -522,12 +522,12 @@ CREATE TABLE &mw_prefix.job (
   job_namespace  NUMBER  DEFAULT 0 NOT NULL,
   job_title      VARCHAR2(255)      NOT NULL,
   job_timestamp         TIMESTAMP(6) WITH TIME ZONE NULL,
-  job_params     CLOB      NOT NULL
-  job_random NUMBER NOT NULL default 0,
+  job_params     CLOB      NOT NULL,
+  job_random NUMBER DEFAULT 0 NOT NULL,
   job_token VARCHAR2(32),
   job_token_timestamp TIMESTAMP(6) WITH TIME ZONE,
   job_sha1 VARCHAR2(32),
-  job_attempts NUMBER NOT NULL default 0
+  job_attempts NUMBER DEFAULT 0 NOT NULL
 );
 ALTER TABLE &mw_prefix.job ADD CONSTRAINT &mw_prefix.job_pk PRIMARY KEY (job_id);
 CREATE INDEX &mw_prefix.job_i01 ON &mw_prefix.job (job_cmd, job_namespace, job_title);
@@ -703,7 +703,7 @@ CREATE TABLE &mw_prefix.site_identifiers (
   si_type VARCHAR2(32) NOT NULL,
   si_key VARCHAR2(32) NOT NULL
 );
-CREATE UNIQUE INDEX &mw_prefix.site_identifiers_u01 ON &mw_prefix.sites (si_type, si_key);
+CREATE UNIQUE INDEX &mw_prefix.site_identifiers_u01 ON &mw_prefix.site_identifiers (si_type, si_key);
 CREATE INDEX &mw_prefix.site_identifiers_i01 ON &mw_prefix.site_identifiers (si_site);
 CREATE INDEX &mw_prefix.site_identifiers_i02 ON &mw_prefix.site_identifiers (si_key);
 
index b9bfe81..505313d 100644 (file)
@@ -443,13 +443,21 @@ class CheckStorage {
 
        function importRevision( &$revision, &$importer ) {
                $id = $revision->getID();
-               $text = $revision->getText();
+               $content = $revision->getContent( Revision::RAW );
+               $id = $id ? $id : '';
+
+               if ( $content === null ) {
+                       echo "Revision $id is broken, we have no content available\n";
+                       return;
+               }
+
+               $text = $content->serialize();
                if ( $text === '' ) {
                        // This is what happens if the revision was broken at the time the
                        // dump was made. Unfortunately, it also happens if the revision was
                        // legitimately blank, so there's no way to tell the difference. To
                        // be safe, we'll skip it and leave it broken
-                       $id = $id ? $id : '';
+
                        echo "Revision $id is blank in the dump, may have been broken before export\n";
                        return;
                }
index c96184e..538ee01 100644 (file)
@@ -944,6 +944,22 @@ return array(
                ),
                'position' => 'top',
        ),
+       'mediawiki.special.createaccount.vform' => array(
+               'styles' => array(
+                       'resources/mediawiki.special/mediawiki.special.vforms.css',
+                       'resources/mediawiki.special/mediawiki.special.createAccount.vform.css',
+               ),
+               'position' => 'top',
+       ),
+       'mediawiki.special.createaccount.vform.js' => array(
+               'scripts' => 'resources/mediawiki.special/mediawiki.special.createAccount.vform.js',
+               'messages' => array(
+                       'createacct-captcha',
+                       'createacct-imgcaptcha-ph'
+               ),
+               'dependencies' => 'mediawiki.jqueryMsg',
+               'position' => 'top',
+       ),
        'mediawiki.special.javaScriptTest' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
                'messages' => array_merge( Skin::getSkinNameMessages(), array(
diff --git a/resources/mediawiki.special/images/icon-contributors.png b/resources/mediawiki.special/images/icon-contributors.png
new file mode 100644 (file)
index 0000000..62b37f9
Binary files /dev/null and b/resources/mediawiki.special/images/icon-contributors.png differ
diff --git a/resources/mediawiki.special/images/icon-edits.png b/resources/mediawiki.special/images/icon-edits.png
new file mode 100644 (file)
index 0000000..263832b
Binary files /dev/null and b/resources/mediawiki.special/images/icon-edits.png differ
diff --git a/resources/mediawiki.special/images/icon-pages.png b/resources/mediawiki.special/images/icon-pages.png
new file mode 100644 (file)
index 0000000..0389c84
Binary files /dev/null and b/resources/mediawiki.special/images/icon-pages.png differ
diff --git a/resources/mediawiki.special/mediawiki.special.createAccount.vform.css b/resources/mediawiki.special/mediawiki.special.createAccount.vform.css
new file mode 100644 (file)
index 0000000..a1d78a2
--- /dev/null
@@ -0,0 +1,98 @@
+/* Disable the underline that Vector puts on h2 headings, and bold them. */
+.mw-ui-container h2 {
+       border: 0;
+       font-weight: bold;
+}
+
+/* shuffled CAPTCHA */
+#wpCaptchaWord {
+       margin-top: 6px;
+}
+
+.mw-createacct-captcha-container {
+       background-color: #f8f8f8;
+       border: 1px solid #c9c9c9;
+       padding: 10px;
+       text-align: center;
+}
+
+.mw-createacct-captcha-image-container {
+       background-color: #fff;
+       min-height: 95px;
+}
+
+.mw-createacct-captcha-assisted {
+       display: block;
+       margin-top: 0.5em;
+}
+
+.mw-createacct-captcha-and-reload {
+       border: 1px solid #c9c9c9;
+       display: table-cell;
+       width: 270px;
+       background-color: #FFF;
+}
+
+.mw-createacct-captcha-and-reload .confirmedit-captcha-reload {
+       display: block;
+       float: right;
+}
+
+/* Benefits column CSS to the right (if it fits) of the form. */
+.mw-ui-container #userloginForm {
+       float: left;
+}
+
+div.mw-createacct-benefits-container {
+       float: left
+}
+
+div.mw-createacct-benefits-container h2 {
+       margin-bottom: 30px;
+}
+
+div.mw-benefits-icon {
+       display: inline-block;
+       padding: 0;
+       float: left;
+       width: 80px;
+       height: 75px;
+       margin-right: 15px;
+       border: 0;
+}
+
+.mw-benefits-icon.icon-edits {
+       /* @embed */
+       background: url(images/icon-edits.png) no-repeat right;
+}
+
+.mw-benefits-icon.icon-pages {
+       /* @embed */
+       background: url(images/icon-pages.png) no-repeat right;
+}
+
+.mw-benefits-icon.icon-contributors {
+       /* @embed */
+       background: url(images/icon-contributors.png) no-repeat right;
+}
+
+/* Special font for numbers in benefits*/
+div.mw-number-text h3 {
+       top: 0;
+       margin: 0;
+       padding: 0;
+       color: #252525;
+       font-family: 'Georgia', serif;
+       font-weight: normal;
+       font-size: 2.2em;
+       line-height: 1.2;
+       text-align: center;
+}
+
+div.mw-number-text {
+       display: block;
+       font-size: 1.2em;
+       color: #444;
+       margin-top: 1em;
+       text-align: center;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.createAccount.vform.js b/resources/mediawiki.special/mediawiki.special.createAccount.vform.js
new file mode 100644 (file)
index 0000000..11084fe
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * JavaScript for Create account form (Special:UserLogin?type=signup).
+ */
+( function ( mw, $ ) {
+
+       $( document ).ready( function( $ ) {
+               var $content = $( '#mw-content-text' ),
+                       $submit = $content.find( '#wpCreateaccount' ),
+                       tabIndex,
+                       $captchaStuff,
+                       helpMsg = mw.config.get( 'wgCreateacctImgcaptchaHelp' ),
+                       captchaImage;
+
+               /*
+                * CAPTCHA
+                * The CAPTCHA is in a div style="captcha" at the top of the form.
+                * If it's a FancyCaptcha, then we remove it and insert it lower down,
+                * in a customized div with just what we need (e.g. no
+                * fancycaptcha-createaccount message).
+                */
+               if ( !$submit.length) {
+                       return;
+               }
+               tabIndex = $submit.prop( 'tabindex' ) - 1;
+               $captchaStuff = $content.find ( '.captcha' );
+
+               if ( $captchaStuff.length ) {
+
+                       // The FancyCaptcha image has this class in the ConfirmEdit extension
+                       // after 2013-04-18.
+                       captchaImage = $captchaStuff.find( 'img.fancycaptcha-image' );
+                       if ( captchaImage.length !== 1 ) {
+                               return;
+                       }
+
+                       $captchaStuff.remove();
+
+                       // Insert another div before the submit button.
+                       $submit.closest( 'div' )
+                               .before( [
+                       '<div>',
+                               '<label for="wpCaptchaWord">' + mw.message( 'createacct-captcha' ).escaped() + '</label>',
+                               '<div class="mw-createacct-captcha-container">',
+                                       '<div class="mw-createacct-captcha-and-reload">',
+                                               '<div class="mw-createacct-captcha-image-container">',
+                                                       '<img id="mw-createacct-captcha" alt="PLACEHOLDER">',
+                                               '</div>',
+                                       '</div>',
+                                       '<input id="wpCaptchaWord" name="wpCaptchaWord" type="text" placeholder="' +
+                                               mw.message( 'createacct-imgcaptcha-ph' ).escaped() +
+                                               '" tabindex="' + tabIndex + '" autocapitalize="off" autocorrect="off">',
+                                       '<small class="mw-createacct-captcha-assisted">' + helpMsg + '</small>',
+                               '</div>',
+                       '</div>'
+                                       ].join( '' )
+                               );
+
+                       // Replace the placeholder img with the img from the old CAPTCHA.
+                       captchaImage.replaceAll( $content.find( '#mw-createacct-captcha' ) );
+
+                       // Append CAPTCHA reload, if any.
+                       $( '.mw-createacct-captcha-and-reload' ).append( $captchaStuff.find( '.confirmedit-captcha-reload' ) );
+
+                       // Find the input field, add the text (if any) of the existing CAPTCHA
+                       // field (although usually it's blanked out on every redisplay),
+                       // and after it move over the hidden field that tells the CAPTCHA
+                       // what to do.
+                       $content.find( '#wpCaptchaWord' )
+                               .val( $captchaStuff.find( '#wpCaptchaWord' ).val() )
+                               .after( $captchaStuff.find( '#wpCaptchaId' ) );
+               }
+
+       });
+
+}( mediaWiki, jQuery ) );
index d9b950b..2d948ea 100644 (file)
        font-size: 0.8em;
 }
 
+/* Put some space under template's header, which may contain CAPTCHA HTML.*/
+section.mw-form-header {
+       margin-bottom: 10px;
+}
+
 /*
  * Besides errorbox there could be warningbox, successbox, msgbox, though
  * spage has never seen these in practice.
        text-shadow: 0 1px #fae3e3;
        word-wrap: break-word;
 }
+
+/*
+ * Override the right margin of the form to give space in case a benefits
+ * column appears to the side.
+ *
+ */
+.mw-ui-container #userloginForm {
+       margin-right: 100px;
+}
index 2568f5a..c32f54b 100644 (file)
   padding: 0;
   width: 100%;
 }
-/* line 28, sourcefiles/scss/components/default/_forms.scss */
+/* line 27, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input,
-.mw-ui-vform > div label,
 .mw-ui-vform > div .mw-ui-button {
   display: block;
   -webkit-box-sizing: border-box;
   margin: 0;
   width: 100%;
 }
-/* line 35, sourcefiles/scss/components/default/_forms.scss */
+/* line 34, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input {
   outline: 0;
   border-style: solid;
   box-shadow: #4091ed 0px 0px 5px;
   border-color: #4091ed;
 }
-/* line 39, sourcefiles/scss/components/default/_forms.scss */
+/* line 38, 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: #7d7d7d;
   width: auto;
index fd1ed47..5995439 100644 (file)
   padding: 0;
   width: 100%;
 }
-/* line 28, sourcefiles/scss/components/default/_forms.scss */
+/* line 27, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input,
-.mw-ui-vform > div label,
 .mw-ui-vform > div .mw-ui-button {
   display: block;
   -webkit-box-sizing: border-box;
   margin: 0;
   width: 100%;
 }
-/* line 35, sourcefiles/scss/components/default/_forms.scss */
+/* line 34, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input {
   outline: 0;
   border-style: solid;
   box-shadow: #4091ed 0px 0px 5px;
   border-color: #4091ed;
 }
-/* line 39, sourcefiles/scss/components/default/_forms.scss */
+/* line 38, 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: #7d7d7d;
   width: auto;
index 86a891a..8bbe3c2 100644 (file)
@@ -24,7 +24,6 @@ $defaultFormWidth: $captchaContainerWidth;
 
         // MW currently doesn't use the type attribute everywhere on inputs.
         input,
-        label,
         .mw-ui-button {
             display: block;
             @include box-sizing(border-box);
@@ -37,8 +36,9 @@ $defaultFormWidth: $captchaContainerWidth;
         }
 
         label {
+            display: block;
+            @include box-sizing(border-box);
             @include agora-label-styling;
-
             width: auto;
             margin: 0 0 0.2em 0;
             padding: 0;
index 1bd7430..60ef758 100644 (file)
                /**
                 * @property {RegExp}
                 * Regex to match accesskey tooltips.
+                *
+                * Should match:
+                *
+                * - "ctrl-option-"
+                * - "alt-shift-"
+                * - "ctrl-alt-"
+                * - "ctrl-"
+                *
+                * The accesskey is matched in group $6.
                 */
-               tooltipAccessKeyRegexp: /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
+               tooltipAccessKeyRegexp: /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
 
                /**
                 * Add the appropriate prefix to the accesskey shown in the tooltip.
                        }
 
                        $nodes.attr( 'title', function ( i, val ) {
-                               if ( val && util.tooltipAccessKeyRegexp.exec( val ) ) {
+                               if ( val && util.tooltipAccessKeyRegexp.test( val ) ) {
                                        return val.replace( util.tooltipAccessKeyRegexp,
-                                               '[' + util.tooltipAccessKeyPrefix + '$5]' );
+                                               '[' + util.tooltipAccessKeyPrefix + '$6]' );
                                }
                                return val;
                        } );
                        if ( id ) {
                                $item.attr( 'id', id );
                        }
-                       if ( accesskey ) {
-                               $link.attr( 'accesskey', accesskey );
-                               tooltip += ' [' + accesskey + ']';
+
+                       if ( tooltip ) {
+                               // Trim any existing accesskey hint and the trailing space
+                               tooltip = $.trim( tooltip.replace( util.tooltipAccessKeyRegexp, '' ) );
+                               if ( accesskey ) {
+                                       tooltip += ' [' + accesskey + ']';
+                               }
                                $link.attr( 'title', tooltip );
+                               if ( accesskey ) {
+                                       util.updateTooltipAccessKeys( $link );
+                               }
                        }
-                       if ( accesskey && tooltip ) {
-                               util.updateTooltipAccessKeys( $link );
+
+                       if ( accesskey ) {
+                               $link.attr( 'accesskey', accesskey );
                        }
 
                        // Where to put our node ?
                        // - nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
                        if ( nextnode && nextnode.parentNode === $ul[0] ) {
-                               $(nextnode).before( $item );
+                               $( nextnode ).before( $item );
 
                        // - nextnode is a CSS selector for jQuery
                        } else if ( typeof nextnode === 'string' && $ul.find( nextnode ).length !== 0 ) {
index f8d55c5..1e4643e 100644 (file)
@@ -187,7 +187,7 @@ class VectorTemplate extends BaseTemplate {
                                <?php } ?>
                                <?php if ( $this->data['newtalk'] ) { ?>
                                <!-- newtalk -->
-                               <div class="usermessage"><?php $this->html( 'newtalk' )  ?></div>
+                               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
                                <!-- /newtalk -->
                                <?php } ?>
                                <?php if ( $this->data['showjumplinks'] ) { ?>
@@ -304,7 +304,7 @@ class VectorTemplate extends BaseTemplate {
                        }
 
                        echo "\n<!-- {$name} -->\n";
-                       switch( $name ) {
+                       switch ( $name ) {
                                case 'SEARCH':
                                        break;
                                case 'TOOLBOX':
@@ -381,7 +381,7 @@ class VectorTemplate extends BaseTemplate {
                // Render elements
                foreach ( $elements as $name => $element ) {
                        echo "\n<!-- {$name} -->\n";
-                       switch( $element ) {
+                       switch ( $element ) {
                                case 'NAMESPACES':
 ?>
 <div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
index b7320cb..964b7d6 100644 (file)
@@ -108,7 +108,7 @@ class SeleniumTester extends Maintenance {
        }
 
        protected function stopServer() {
-               if ( !isset ( $this->serverManager ) ) {
+               if ( !isset( $this->serverManager ) ) {
                        echo ( "Warning: Request to stop Selenium Server, but it was " .
                                "not stared by RunSeleniumTests\n" .
                                "RunSeleniumTests cannot stop a Selenium Server it " .
index 83c2fcb..ca92fe3 100644 (file)
@@ -30,6 +30,7 @@ $wgAutoloadClasses += array(
        'DbTestPreviewer' => "$testDir/testHelpers.inc",
        'DbTestRecorder' => "$testDir/testHelpers.inc",
        'DelayedParserTest' => "$testDir/testHelpers.inc",
+       'ParserTestResult' => "$testDir/parser/ParserTestResult.php",
        'TestFileIterator' => "$testDir/testHelpers.inc",
        'TestRecorder' => "$testDir/testHelpers.inc",
 
diff --git a/tests/parser/ParserTestResult.php b/tests/parser/ParserTestResult.php
new file mode 100644 (file)
index 0000000..e846da5
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @copyright Copyright © 2013, Antoine Musso
+ * @copyright Copyright © 2013, Wikimedia Foundation Inc.
+ * @license GNU GPL v2
+ *
+ * @file
+ */
+
+/**
+ * Represent the result of a parser test.
+ *
+ * @since 1.22
+ */
+class ParserTestResult {
+       /**
+        * Description of the parser test.
+        *
+        * This is usually the text used to describe a parser test in the .txt
+        * files.  It is initialized on a construction and you most probably
+        * never want to change it.
+        */
+       public $description;
+       /** Text that was expected */
+       public $expected;
+       /** Actual text rendered */
+       public $actual;
+
+       /**
+        * @param $description string A short text describing the parser test
+        *        usually the text in the parser test .txt file.  The description
+        *        is later available using the property $description.
+        */
+       public function __construct( $description ) {
+               $this->description = $description;
+       }
+
+       /** Whether the test passed */
+       public function isSuccess() {
+               return ($this->expected === $this->actual);
+       }
+}
index 3d34f34..7c8daf2 100644 (file)
@@ -518,18 +518,23 @@ class ParserTest {
                }
 
                $this->teardownGlobals();
-               return $this->showTestResult( $desc, $result, $out );
+
+               $testResult = new ParserTestResult( $desc );
+               $testResult->expected = $result;
+               $testResult->actual = $out;
+
+               return $this->showTestResult( $testResult );
        }
 
        /**
-        *
+        * Refactored in 1.22 to use ParserTestResult
         */
-       function showTestResult( $desc, $result, $out ) {
-               if ( $result === $out ) {
-                       $this->showSuccess( $desc );
+       function showTestResult( ParserTestResult $testResult ) {
+               if ( $testResult->isSuccess() ) {
+                       $this->showSuccess( $testResult );
                        return true;
                } else {
-                       $this->showFailure( $desc, $result, $out );
+                       $this->showFailure( $testResult );
                        return false;
                }
        }
@@ -1095,10 +1100,12 @@ class ParserTest {
        /**
         * Print a happy success message.
         *
-        * @param $desc String: the test name
+        * Refactored in 1.22 to use ParserTestResult
+        *
+        * @param $testResult ParserTestResult
         * @return Boolean
         */
-       protected function showSuccess( $desc ) {
+       protected function showSuccess( ParserTestResult $testResult ) {
                if ( $this->showProgress ) {
                        print $this->term->color( '1;32' ) . 'PASSED' . $this->term->reset() . "\n";
                }
@@ -1110,28 +1117,29 @@ class ParserTest {
         * Print a failure message and provide some explanatory output
         * about what went wrong if so configured.
         *
-        * @param $desc String: the test name
-        * @param $result String: expected HTML output
-        * @param $html String: actual HTML output
+        * Refactored in 1.22 to use ParserTestResult
+        *
+        * @param $testResult ParserTestResult
         * @return Boolean
         */
-       protected function showFailure( $desc, $result, $html ) {
+       protected function showFailure( ParserTestResult $testResult ) {
                if ( $this->showFailure ) {
                        if ( !$this->showProgress ) {
                                # In quiet mode we didn't show the 'Testing' message before the
                                # test, in case it succeeded. Show it now:
-                               $this->showTesting( $desc );
+                               $this->showTesting( $testResult->description );
                        }
 
                        print $this->term->color( '31' ) . 'FAILED!' . $this->term->reset() . "\n";
 
                        if ( $this->showOutput ) {
-                               print "--- Expected ---\n$result\n--- Actual ---\n$html\n";
+                               print "--- Expected ---\n{$testResult->expected}\n";
+                               print "--- Actual ---\n{$testResult->actual}\n";
                        }
 
                        if ( $this->showDiffs ) {
-                               print $this->quickDiff( $result, $html );
-                               if ( !$this->wellFormed( $html ) ) {
+                               print $this->quickDiff( $testResult->expected, $testResult->actual );
+                               if ( !$this->wellFormed( $testResult->actual ) ) {
                                        print "XML error: $this->mXmlError\n";
                                }
                        }
index 540b6f4..0631196 100644 (file)
@@ -3969,6 +3969,33 @@ Link containing "<#" and ">#" as a hex sequences
 </p>
 !! end
 
+!! test
+Link containing an equals sign
+!! input
+[[Special:BookSources/isbn=4-00-026157-6]]
+!! result
+<p><a href="/wiki/Special:BookSources/isbn%3D4-00-026157-6" title="Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a>
+</p>
+!! end
+
+!! article
+Foo~bar
+!! text
+Just a test of an article title containing a tilde.
+!! endarticle
+
+# note that links containing signatures, like [[Foo~~~~]], are
+# massaged by the pre-save transform (PST) and so the tildes are never
+# seen by the parser.
+!! test
+Link containing a tilde
+!! input
+[[Foo~bar]]
+!! result
+<p><a href="/wiki/Foo%7Ebar" title="Foo~bar">Foo~bar</a>
+</p>
+!! end
+
 !! test
 Link containing double-single-quotes '' (bug 4598)
 !! input
@@ -4230,6 +4257,23 @@ language=kaa
 </p>
 !! end
 
+!! article
+Söfnuður
+!! text
+Test.
+!! endarticle
+
+!! test
+Internal link with is linkprefix
+!! options
+language=is
+!! input
+Aðrir mótmælenda[[söfnuður|söfnuðir]] og
+!! result
+<p>Aðrir <a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðir</a> og
+</p>
+!! end
+
 !! test
 Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
 !! input
@@ -10955,6 +10999,8 @@ Say the magic word
 * {{BASEPAGENAME}}
 * {{SUBPAGENAME}}
 * {{SUBPAGENAMEE}}
+* {{ROOTPAGENAME}}
+* {{ROOTPAGENAMEE}}
 * {{BASEPAGENAME}}
 * {{BASEPAGENAMEE}}
 * {{TALKPAGENAME}}
@@ -10975,6 +11021,8 @@ Say the magic word
 </li><li> Parser_test
 </li><li> Parser test
 </li><li> Parser_test
+</li><li> Parser test
+</li><li> Parser_test
 </li><li> Talk:Parser test
 </li><li> Talk:Parser_test
 </li><li> Parser test
index 0cf6e38..1131385 100644 (file)
@@ -15,6 +15,10 @@ abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
                                "\$wgContLang->getCode() (" . $wgContLang->getCode() . ")" );
                }
 
+               // HACK: Call getLanguage() so the real $wgContLang is cached as the user language
+               // rather than our fake one. This is to avoid breaking other, unrelated tests.
+               RequestContext::getMain()->getLanguage();
+
                $langCode = 'en'; # For mainpage to be 'Main Page'
                $langObj = Language::factory( $langCode );
 
index 12c2e00..b9117fd 100644 (file)
@@ -18,7 +18,6 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
                foreach ( self::$additionalOptions as $option => $default ) {
                        $this->longOptions[$option] = $option . 'Handler';
                }
-
        }
 
        public static function main( $exit = true ) {
@@ -97,5 +96,4 @@ Database options:
 
 EOT;
        }
-
 }
index ecc8ad1..440f866 100644 (file)
@@ -137,6 +137,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        protected function getNewTempFile() {
                $fname = tempnam( wfTempDir(), 'MW_PHPUnit_' . get_class( $this ) . '_' );
                $this->tmpfiles[] = $fname;
+
                return $fname;
        }
 
@@ -158,6 +159,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                // where temporary directory creation is bundled and can be improved
                unlink( $fname );
                $this->assertTrue( wfMkdirParents( $fname ) );
+
                return $fname;
        }
 
@@ -348,7 +350,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * Stub. If a test needs to add additional data to the database, it should
         * implement this method and do so
         */
-       function addDBData() {}
+       function addDBData() {
+       }
 
        private function addCoreDBData() {
                # disabled for performance
@@ -377,7 +380,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                'page_touched' => $this->db->timestamp(),
                                'page_latest' => 0,
                                'page_len' => 0 ), __METHOD__, array( 'IGNORE' ) );
-
                }
 
                User::resetIdByNameCache();
@@ -394,7 +396,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        $user->saveSettings();
                }
 
-
                //Make 1 page with 1 revision
                $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
                if ( !$page->getId() == 0 ) {
@@ -461,6 +462,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                if ( ( $db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
                        CloneDatabase::changePrefix( $prefix );
+
                        return;
                } else {
                        $dbClone->cloneTableStructure();
@@ -523,6 +525,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        private static function unprefixTable( $tableName ) {
                global $wgDBprefix;
+
                return substr( $tableName, strlen( $wgDBprefix ) );
        }
 
@@ -547,6 +550,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        unset( $tables['searchindex_segments'] );
                        $tables = array_flip( $tables );
                }
+
                return $tables;
        }
 
@@ -561,13 +565,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( isset( MediaWikiPHPUnitCommand::$additionalOptions[$offset] ) ) {
                        return MediaWikiPHPUnitCommand::$additionalOptions[$offset];
                }
-
        }
 
        public function setCliArg( $offset, $value ) {
 
                MediaWikiPHPUnitCommand::$additionalOptions[$offset] = $value;
-
        }
 
        /**
@@ -839,6 +841,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        ) {
 
                                $wikitextNS = $ns;
+
                                return $wikitextNS;
                        }
                }
@@ -906,6 +909,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( !$loaded ) {
                        $this->markTestSkipped( "PHP extension '$extName' is not loaded, skipping." );
                }
+
                return $loaded;
        }
 
@@ -934,5 +938,4 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                $this->assertInstanceOf( $expected, $pokemons, $message );
        }
-
 }
index 01caf8f..3978b8d 100644 (file)
@@ -11,7 +11,7 @@ if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
 You are running these tests directly from phpunit. You may not have all globals correctly set.
 Running phpunit.php instead is recommended.
 EOF;
-       require_once ( __DIR__ . "/phpunit.php" );
+       require_once( __DIR__ . "/phpunit.php" );
 }
 
 // Output a notice when running with older versions of PHPUnit
index 967ffa1..686ab93 100644 (file)
@@ -16,18 +16,17 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
                $wgContLang = Language::factory( 'es' );
 
                $wgLang = Language::factory( 'fr' );
-               $status = $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', 0, false, $user );
+               $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', 0, false, $user );
                $templates1 = $title->getTemplateLinksFrom();
 
                $wgLang = Language::factory( 'de' );
                $page->mPreparedEdit = false; // In order to force the rerendering of the same wikitext
 
                // We need an edit, a purge is not enough to regenerate the tables
-               $status = $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', EDIT_UPDATE, false, $user );
+               $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', EDIT_UPDATE, false, $user );
                $templates2 = $title->getTemplateLinksFrom();
 
                $this->assertEquals( $templates1, $templates2 );
                $this->assertEquals( $templates1[0]->getFullText(), 'Historial' );
        }
-
 }
index 02546fa..32fc2c5 100644 (file)
@@ -59,7 +59,7 @@ class BlockTest extends MediaWikiLangTestCase {
         * debug function : dump the ipblocks table
         */
        function dumpBlocks() {
-               $v = $this->db->query( 'SELECT * FROM unittest_ipblocks' );
+               $v = $this->db->select( 'ipblocks', '*' );
                print "Got " . $v->numRows() . " rows. Full dump follow:\n";
                foreach ( $v as $row ) {
                        print_r( $row );
@@ -72,7 +72,6 @@ class BlockTest extends MediaWikiLangTestCase {
                $this->assertTrue( $this->block->equals( Block::newFromTarget( 'UTBlockee' ) ), "newFromTarget() returns the same block as the one that was made" );
 
                $this->assertTrue( $this->block->equals( Block::newFromID( $this->blockId ) ), "newFromID() returns the same block as the one that was made" );
-
        }
 
        /**
@@ -82,7 +81,6 @@ class BlockTest extends MediaWikiLangTestCase {
                // delta to stop one-off errors when things happen to go over a second mark.
                $delta = abs( $this->madeAt - $this->block->mTimestamp );
                $this->assertLessThan( 2, $delta, "If no timestamp is specified, the block is recorded as time()" );
-
        }
 
        /**
@@ -133,7 +131,6 @@ class BlockTest extends MediaWikiLangTestCase {
                $u->addToDatabase();
                unset( $u );
 
-
                // Sanity check
                $this->assertNull(
                        Block::newFromTarget( $username ),
index add585d..e3d9da7 100644 (file)
@@ -66,7 +66,6 @@ class CdbTest extends MediaWikiTestCase {
                        $this->cdbAssert( "PHP error", $key, $v1, $value );
                        $this->cdbAssert( "DBA error", $key, $v2, $value );
                }
-
        }
 
        private function randomString() {
@@ -75,6 +74,7 @@ class CdbTest extends MediaWikiTestCase {
                for ( $j = 0; $j < $len; $j++ ) {
                        $s .= chr( mt_rand( 0, 255 ) );
                }
+
                return $s;
        }
 
index c746208..f1004fb 100644 (file)
@@ -47,6 +47,7 @@ class CollationTest extends MediaWikiLangTestCase {
                        array( 'en', 'A', 'Aꦲ' ),
                );
        }
+
        /**
         * Opposite of testIsPrefix
         *
@@ -84,6 +85,7 @@ class CollationTest extends MediaWikiLangTestCase {
                $col = Collation::factory( $collation );
                $this->assertEquals( $firstLetter, $col->getFirstLetter( $string ) );
        }
+
        function firstLetterProvider() {
                return array(
                        array( 'uppercase', 'Abc', 'A' ),
index dcd9ddd..53f33d9 100644 (file)
@@ -4,14 +4,17 @@ class DiffHistoryBlobTest extends MediaWikiTestCase {
        protected function setUp() {
                if ( !extension_loaded( 'xdiff' ) ) {
                        $this->markTestSkipped( 'The xdiff extension is not available' );
+
                        return;
                }
                if ( !function_exists( 'xdiff_string_rabdiff' ) ) {
                        $this->markTestSkipped( 'The version of xdiff extension is lower than 1.5.0' );
+
                        return;
                }
                if ( !extension_loaded( 'hash' ) && !extension_loaded( 'mhash' ) ) {
                        $this->markTestSkipped( 'Neither the hash nor mhash extension is available' );
+
                        return;
                }
                parent::setUp();
index 4053683..fb2304d 100644 (file)
@@ -81,5 +81,4 @@ class FormOptionsInitializationTest extends MediaWikiTestCase {
                        $this->object->getOptions()
                );
        }
-
 }
index 2e6417f..166a3ce 100644 (file)
@@ -257,7 +257,6 @@ class GlobalTest extends MediaWikiTestCase {
 
                $sampleUTF = "Östergötland_coat_of_arms.png";
 
-
                //mb_substr
                $substr_params = array(
                        array( 0, 0 ),
@@ -280,7 +279,6 @@ class GlobalTest extends MediaWikiTestCase {
                        );
                }
 
-
                //mb_strlen
                $this->assertEquals(
                        mb_strlen( $sampleUTF ),
@@ -288,7 +286,6 @@ class GlobalTest extends MediaWikiTestCase {
                        'Fallback mb_strlen'
                );
 
-
                //mb_str(r?)pos
                $strpos_params = array(
                        //array( 'ter' ),
@@ -315,7 +312,6 @@ class GlobalTest extends MediaWikiTestCase {
                                'Fallback mb_strrpos with params ' . implode( ', ', $old_param_set )
                        );
                }
-
        }
 
 
@@ -329,7 +325,6 @@ class GlobalTest extends MediaWikiTestCase {
                $old_wgDebugTimestamps = $wgDebugTimestamps;
                $wgDebugTimestamps = false;
 
-
                wfDebug( "This is a normal string" );
                $this->assertEquals( "This is a normal string", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
@@ -338,7 +333,6 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertEquals( "This is nöt an ASCII string", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
 
-
                wfDebug( "\00305This has böth UTF and control chars\003" );
                $this->assertEquals( " 05This has böth UTF and control chars ", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
@@ -351,7 +345,6 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertGreaterThan( 5000000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
                unlink( $wgDebugLogFile );
 
-
                $wgDebugLogFile = $old_log_file;
                $wgDebugTimestamps = $old_wgDebugTimestamps;
        }
@@ -398,7 +391,6 @@ class GlobalTest extends MediaWikiTestCase {
 
                $this->assertEquals( $var1, 2, 'var1 is swapped' );
                $this->assertEquals( $var2, 1, 'var2 is swapped' );
-
        }
 
        function testWfPercentTest() {
@@ -643,6 +635,7 @@ class GlobalTest extends MediaWikiTestCase {
                                array( "$p//nds-nl.wikipedia.org", array( 'nl.wikipedia.org' ), true, "Substrings of domains match while they shouldn't, $pDesc URL" ),
                        ) );
                }
+
                return $a;
        }
 
@@ -660,6 +653,7 @@ class GlobalTest extends MediaWikiTestCase {
 
        public static function provideWfShellMaintenanceCmdList() {
                global $wgPhpCli;
+
                return array(
                        array( 'eval.php', array( '--help', '--test' ), array(),
                                "'$wgPhpCli' 'eval.php' '--help' '--test'",
index c585726..8bd0849 100644 (file)
@@ -13,6 +13,7 @@ class GlobalWithDBTest extends MediaWikiTestCase {
 
        public static function provideWfIsBadImageList() {
                $blacklist = '* [[File:Bad.jpg]] except [[Nasty page]]';
+
                return array(
                        array( 'Bad.jpg', false, $blacklist, true,
                                'Called on a bad image' ),
index 4bd8c68..4184d15 100644 (file)
@@ -87,7 +87,6 @@ class WfAssembleUrlTest extends MediaWikiTestCase {
                                                                $url .= '#' . $fragment;
                                                        }
 
-
                                                        $cases[] = array(
                                                                $parts,
                                                                $url,
index 10b62b3..c60f223 100644 (file)
@@ -152,6 +152,7 @@ class WfBaseConvertTest extends MediaWikiTestCase {
 
                        $x[] = array( $base, $str );
                }
+
                return $x;
        }
 
index 8c67ced..5b622c1 100644 (file)
@@ -103,6 +103,7 @@ class WfExpandUrlTest extends MediaWikiTestCase {
                                }
                        }
                }
+
                return $retval;
        }
 }
index 87193fa..3521d18 100644 (file)
@@ -18,6 +18,7 @@ class WfGetCallerTest extends MediaWikiTestCase {
                if ( $n > 0 ) {
                        return self::intermediateFunction( $level, $n - 1 );
                }
+
                return wfGetCaller( $level );
        }
 
index e4e33d1..604f901 100644 (file)
@@ -24,5 +24,4 @@ class WfShorthandToIntegerTest extends MediaWikiTestCase {
                        array( '1k', 1024, 'One kb lowercased' ),
                );
        }
-
 }
index ddfffe8..3ac33a4 100644 (file)
@@ -12,6 +12,7 @@ class WfTimestampTest extends MediaWikiTestCase {
 
        public static function provideNormalTimestamps() {
                $t = gmmktime( 12, 34, 56, 1, 15, 2001 );
+
                return array(
                        // TS_UNIX
                        array( $t, TS_MW, '20010115123456', 'TS_UNIX to TS_MW' ),
index 8f70b3d..81dd487 100644 (file)
@@ -11,6 +11,7 @@ class HooksTest extends MediaWikiTestCase {
 
        public static function provideHooks() {
                $i = new NothingClass();
+
                return array(
                        array( 'Object and method', array( $i, 'someNonStatic' ), 'changed-nonstatic', 'changed-nonstatic' ),
                        array( 'Object and no method', array( $i ), 'changed-onevent', 'original' ),
@@ -19,14 +20,16 @@ class HooksTest extends MediaWikiTestCase {
                        array( 'Class::method static call', array( 'NothingClass::someStatic' ), 'changed-static', 'original' ),
                        array( 'Global function', array( 'NothingFunction' ), 'changed-func', 'original' ),
                        array( 'Global function with data', array( 'NothingFunctionData', 'data' ), 'data', 'original' ),
-                       array( 'Closure', array( function( &$foo, $bar ) {
-                                       $foo = 'changed-closure';
-                                       return true;
-                               } ), 'changed-closure', 'original' ),
-                       array( 'Closure with data', array( function( $data, &$foo, $bar ) {
-                                       $foo = $data;
-                                       return true;
-                               }, 'data' ), 'data', 'original' )
+                       array( 'Closure', array( function ( &$foo, $bar ) {
+                               $foo = 'changed-closure';
+
+                               return true;
+                       } ), 'changed-closure', 'original' ),
+                       array( 'Closure with data', array( function ( $data, &$foo, $bar ) {
+                               $foo = $data;
+
+                               return true;
+                       }, 'data' ), 'data', 'original' )
                );
        }
 
@@ -86,8 +89,14 @@ class HooksTest extends MediaWikiTestCase {
        }
 
        public function testFalseReturn() {
-               Hooks::register( 'MediaWikiHooksTest001', function( &$foo ) { return false; } );
-               Hooks::register( 'MediaWikiHooksTest001', function( &$foo ) { $foo = 'test'; return true; } );
+               Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) {
+                       return false;
+               } );
+               Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) {
+                       $foo = 'test';
+
+                       return true;
+               } );
                $foo = 'original';
                Hooks::run( 'MediaWikiHooksTest001', array( &$foo ) );
                $this->assertSame( 'original', $foo, 'Hooks continued processing after a false return.' );
@@ -97,18 +106,22 @@ class HooksTest extends MediaWikiTestCase {
         * @expectedException FatalError
         */
        public function testFatalError() {
-               Hooks::register( 'MediaWikiHooksTest001', function() { return 'test'; } );
+               Hooks::register( 'MediaWikiHooksTest001', function () {
+                       return 'test';
+               } );
                Hooks::run( 'MediaWikiHooksTest001', array() );
        }
 }
 
 function NothingFunction( &$foo, &$bar ) {
        $foo = 'changed-func';
+
        return true;
 }
 
 function NothingFunctionData( $data, &$foo, &$bar ) {
        $foo = $data;
+
        return true;
 }
 
@@ -117,6 +130,7 @@ class NothingClass {
 
        public static function someStatic( &$foo, &$bar ) {
                $foo = 'changed-static';
+
                return true;
        }
 
@@ -124,18 +138,21 @@ class NothingClass {
                $this->calls++;
                $foo = 'changed-nonstatic';
                $bar = 'changed-nonstatic';
+
                return true;
        }
 
        public function onMediaWikiHooksTest001( &$foo, &$bar ) {
                $this->calls++;
                $foo = 'changed-onevent';
+
                return true;
        }
 
        public function someNonStaticWithData( $data, &$foo, &$bar ) {
                $this->calls++;
                $foo = $data;
+
                return true;
        }
 }
index 9e3d3a4..4e010d4 100644 (file)
@@ -432,6 +432,7 @@ class HtmlTest extends MediaWikiTestCase {
                foreach ( $types as $type ) {
                        $cases[] = array( $type );
                }
+
                return $cases;
        }
 
@@ -596,6 +597,7 @@ class HtmlTest extends MediaWikiTestCase {
                                isset( $case[3] ) ? $case[3] : ''
                        );
                }
+
                return $ret;
        }
 
@@ -610,5 +612,4 @@ class HtmlTest extends MediaWikiTestCase {
                        'Allow special case "step=any".'
                );
        }
-
 }
index 7698776..12ba226 100644 (file)
@@ -194,6 +194,7 @@ class MWHttpRequestTester extends MWHttpRequest {
                                        throw new MWException( __METHOD__ . ': allow_url_fopen needs to be enabled for pure PHP' .
                                                ' http requests to work. If possible, curl should be used instead. See http://php.net/curl.' );
                                }
+
                                return new PhpHttpRequestTester( $url, $options );
                        default:
                }
index ab93b2b..93ce119 100644 (file)
@@ -123,7 +123,6 @@ class TestConverter extends LanguageConverter {
                        'tg' => new ReplacementArray()
                );
        }
-
 }
 
 class LanguageToTest extends Language {
index c83f7da..ae551c0 100644 (file)
@@ -122,7 +122,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
 
                $po->addImage( "Foo.png" );
 
-
                $this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
                        array( 'Foo.png' ),
                ) );
@@ -133,7 +132,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
 
                $po->addLanguageLink( Title::newFromText( "en:Foo" )->getFullText() );
 
-
                $this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
                        array( 'En', 'Foo' ),
                ) );
index 6c17bf4..becf507 100644 (file)
@@ -59,7 +59,6 @@ class MWFunctionTest extends MediaWikiTestCase {
        public static function someMethod() {
                return func_get_args();
        }
-
 }
 
 class MWBlankClass {
index 6b71b7e..7d6d5a1 100644 (file)
@@ -125,7 +125,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testGetAssociated() {
                $this->assertEquals( NS_TALK, MWNamespace::getAssociated( NS_MAIN ) );
                $this->assertEquals( NS_MAIN, MWNamespace::getAssociated( NS_TALK ) );
-
        }
 
        ### Exceptions with getAssociated()
@@ -201,7 +200,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
                        NS_SPECIAL, NS_MEDIA,
                        "NS_SPECIAL and NS_MEDIA are different subject namespaces"
                );
-
        }
 
        /**
@@ -350,7 +348,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
                        '$wgContentNamespaces is an array with only NS_MAIN by default'
                );
 
-
                # test !is_array( $wgcontentNamespaces )
                $wgContentNamespaces = '';
                $this->assertEquals( NS_MAIN, MWNamespace::getContentNamespaces() );
index 9e50b4c..386ddb8 100644 (file)
@@ -253,5 +253,4 @@ class PathRouterTest extends MediaWikiTestCase {
                $matches = $router->parse( "/wiki/Foo" );
                $this->assertEquals( $matches, array( 'title' => 'bar%20$1' ) );
        }
-
 }
index 7aa3c4a..b909f26 100644 (file)
@@ -77,6 +77,7 @@ class PreferencesTest extends MediaWikiTestCase {
                        , $this->context
                        , $preferences
                );
+
                return $preferences;
        }
 }
index 948b635..4ddc0b0 100644 (file)
@@ -16,6 +16,7 @@ class MediaWikiProvide {
                for ( $i = 1; $i <= $num; $i++ ) {
                        $ret[] = array( $i );
                }
+
                return $ret;
        }
 
@@ -39,6 +40,7 @@ class MediaWikiProvide {
                                $ret[] = array( $day[0], $month[0] );
                        }
                }
+
                return $ret;
        }
 }
index a1e6236..56967de 100644 (file)
@@ -276,5 +276,4 @@ class RecentChangeTest extends MediaWikiTestCase {
                        $msg
                );
        }
-
 }
index f587171..e3a9cfb 100644 (file)
@@ -25,7 +25,6 @@ class RequestContextTest extends MediaWikiTestCase {
                $context->setTitle( $curTitle );
                $this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
                        "When a title is updated the WikiPage should be purged and recreated on-demand with the new title." );
-
        }
 
        public function testImportScopedSession() {
@@ -58,7 +57,7 @@ class RequestContextTest extends MediaWikiTestCase {
                $this->assertEquals( $sinfo['userId'], $context->getUser()->getId(), "Correct context user ID." );
                $this->assertEquals( 'UnitTestContextUser', $context->getUser()->getName(), "Correct context user name." );
 
-               unset ( $sc ); // restore previous context
+               unset( $sc ); // restore previous context
 
                $info = $context->exportSession();
                $this->assertEquals( $oInfo['ip'], $info['ip'], "Correct initial IP address." );
index 60618b1..68db9ad 100644 (file)
@@ -11,6 +11,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
         */
        public static function resourceLoaderRegisterModules( &$resourceLoader ) {
                self::$resourceLoaderRegisterModulesHook = true;
+
                return true;
        }
 
@@ -31,6 +32,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
                self::$resourceLoaderRegisterModulesHook = false;
                $resourceLoader = new ResourceLoader();
                $this->assertTrue( self::$resourceLoaderRegisterModulesHook );
+
                return $resourceLoader;
        }
 
@@ -84,7 +86,8 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 
 /* Stubs */
 
-class ResourceLoaderTestModule extends ResourceLoaderModule {}
+class ResourceLoaderTestModule extends ResourceLoaderModule {
+}
 
 /* Hooks */
 global $wgHooks;
index 39673c0..968aaba 100644 (file)
@@ -78,5 +78,4 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
                        $this->assertTrue( true ); // ok
                }
        }
-
 }
index 9380928..e3b0844 100644 (file)
@@ -403,7 +403,6 @@ class RevisionTest extends MediaWikiTestCase {
                // for immutable content like wikitext, this should be the same object
                $this->assertSame( $content, $content2 );
        }
-
 }
 
 class RevisionTestModifyableContent extends TextContent {
@@ -422,7 +421,6 @@ class RevisionTestModifyableContent extends TextContent {
        public function setText( $text ) {
                $this->mText = $text;
        }
-
 }
 
 class RevisionTestModifyableContentHandler extends TextContentHandler {
index f5aacab..c84f10c 100644 (file)
@@ -148,7 +148,6 @@ class SanitizerTest extends MediaWikiTestCase {
                        array( array( 'foo.' => 'baz' ), 'foo.=baz', 'A . is allowed as last character' ),
                        array( array( 'foo6' => 'baz' ), 'foo6=baz', 'Numbers are allowed' ),
 
-
                        # This bit is more relaxed than XML rules, but some extensions use
                        # it, like ProofreadPage (see bug 27539)
                        array( array( '1foo' => 'baz' ), '1foo=baz', 'Leading numbers are allowed' ),
@@ -246,5 +245,4 @@ class SanitizerTest extends MediaWikiTestCase {
                        $message
                );
        }
-
 }
index fc7d8d0..4cdf020 100644 (file)
@@ -10,6 +10,7 @@ function getSiteParams( $conf, $wiki ) {
                        break;
                }
        }
+
        return array(
                'suffix' => $site,
                'lang' => $lang,
index 0530b44..842e2fc 100644 (file)
@@ -49,6 +49,7 @@ class StringUtilsTest extends MediaWikiTestCase {
                                $escaped .= $char;
                        }
                }
+
                return $escaped;
        }
 
index a793bab..ffa8c42 100644 (file)
@@ -13,14 +13,14 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
                $user = new User();
                $user->mRights = array( 'createpage', 'edit', 'purge' );
 
-               $status = $page->doEditContent( new WikitextContent( '{{Categorising template}}' ), 'Create a page with a template', 0, false, $user );
+               $page->doEditContent( new WikitextContent( '{{Categorising template}}' ), 'Create a page with a template', 0, false, $user );
                $this->assertEquals(
                        array()
                        , $title->getParentCategories()
                );
 
                $template = WikiPage::factory( Title::newFromText( 'Template:Categorising template' ) );
-               $status = $template->doEditContent( new WikitextContent( '[[Category:Solved bugs]]' ), 'Add a category through a template', 0, false, $user );
+               $template->doEditContent( new WikitextContent( '[[Category:Solved bugs]]' ), 'Add a category through a template', 0, false, $user );
 
                // Run the job queue
                JobQueueGroup::destroySingletons();
@@ -33,5 +33,4 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
                        , $title->getParentCategories()
                );
        }
-
 }
index c4d8945..2fb0f49 100644 (file)
@@ -53,6 +53,5 @@ class TestUser {
                        }
                }
                $this->user->saveSettings();
-
        }
 }
index e1e196a..07dcb7d 100644 (file)
@@ -34,7 +34,7 @@ class TimestampTest extends MediaWikiLangTestCase {
         * @expectedException TimestampException
         */
        function testInvalidParse() {
-               $timestamp = new MWTimestamp( "This is not a timestamp." );
+               new MWTimestamp( "This is not a timestamp." );
        }
 
        /**
index 476c194..a11c3d9 100644 (file)
@@ -286,5 +286,4 @@ class TitleMethodsTest extends MediaWikiTestCase {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expectedBool, $title->isWikitextPage() );
        }
-
 }
index e2c079a..b8b0391 100644 (file)
@@ -66,7 +66,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                        $this->user = $this->userUser;
                }
-
        }
 
        function setUserPerm( $perm ) {
@@ -317,7 +316,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                $this->title->userCan( $action, $this->user, true ) );
                        $this->assertEquals( $check[$action][3],
                                $this->title->quickUserCan( $action, $this->user ) );
-
                        # count( User::getGroupsWithPermissions( $action ) ) < 1
                }
        }
@@ -538,7 +536,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->userCan( 'edit', $this->user ) );
                $this->assertEquals( array(),
                        $this->title->getUserPermissionsErrors( 'edit', $this->user ) );
-
        }
 
        function testActionPermissions() {
@@ -562,7 +559,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( true,
                        $this->title->userCan( 'create', $this->user ) );
 
-
                $this->setUserPerm( array( 'createpage' ) );
                $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
                        $this->title->getUserPermissionsErrors( 'create', $this->user ) );
@@ -605,7 +601,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
                $this->assertEquals( false,
                        $this->title->userCan( 'move-target', $this->user ) );
-
        }
 
        function testUserBlock() {
@@ -648,13 +643,13 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                global $wgLocalTZoffset;
                $wgLocalTZoffset = -60;
                $this->user->mBlockedby = $this->user->getName();
-               $this->user->mBlock = new Block( '127.0.8.1', 0, 1, 'no reason given', $now, 0, 10 );
+               $this->user->mBlock = new Block( '127.0.8.1', 0, $this->user->getId(),
+                       'no reason given', $now, 0, 10 );
                $this->assertEquals( array( array( 'blockedtext',
                                '[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
                                'Useruser', null, '23:00, 31 December 1969', '127.0.8.1',
                                $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ) ),
                        $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
-
                # $action != 'read' && $action != 'createaccount' && $user->isBlockedFrom( $this )
                #   $user->blockedFor() == ''
                #   $user->mBlock->mExpiry == 'infinity'
index 970862b..33bd8d6 100644 (file)
@@ -197,6 +197,7 @@ class TitleTest extends MediaWikiTestCase {
                foreach ( $errors as $error ) {
                        $result[] = $error[0];
                }
+
                return $result;
        }
 
index 4bb6daa..f829509 100644 (file)
@@ -587,6 +587,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
 
                $this->assertEquals( $expectedHtml, $text );
+
                return $po;
        }
 
@@ -1014,5 +1015,4 @@ more stuff
 
                $this->assertEquals( $expected, $text );
        }
-
 }
index dca9910..41f3572 100644 (file)
@@ -44,5 +44,4 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
                $page = new WikiPage( $page->getTitle() );
                $this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
        }
-
 }
index 696b145..50638ca 100644 (file)
@@ -47,13 +47,16 @@ class ApiCreateAccountTest extends ApiTestCase {
                $token = $a['token'];
 
                // Finally create the account
-               $ret = $this->doApiRequest( array(
-                       'action' => 'createaccount',
-                       'name' => 'Apitestnew',
-                       'password' => $password,
-                       'token' => $token,
-                       'email' => 'test@domain.test',
-                       'realname' => 'Test Name' ), $ret[2]
+               $ret = $this->doApiRequest(
+                       array(
+                               'action' => 'createaccount',
+                               'name' => 'Apitestnew',
+                               'password' => $password,
+                               'token' => $token,
+                               'email' => 'test@domain.test',
+                               'realname' => 'Test Name'
+                       ),
+                       $ret[2]
                );
 
                $result = $ret[0];
@@ -107,7 +110,7 @@ class ApiCreateAccountTest extends ApiTestCase {
         * @expectedException UsageException
         */
        function testNoName() {
-               $ret = $this->doApiRequest( array(
+               $this->doApiRequest( array(
                        'action' => 'createaccount',
                        'token' => LoginForm::getCreateaccountToken(),
                        'password' => 'password',
@@ -119,7 +122,7 @@ class ApiCreateAccountTest extends ApiTestCase {
         * @expectedException UsageException
         */
        function testNoPassword() {
-               $ret = $this->doApiRequest( array(
+               $this->doApiRequest( array(
                        'action' => 'createaccount',
                        'name' => 'testName',
                        'token' => LoginForm::getCreateaccountToken(),
index 8842766..a3d39dd 100644 (file)
@@ -6,7 +6,6 @@
  * @group medium
  */
 class ApiBlockTest extends ApiTestCase {
-
        protected function setUp() {
                parent::setUp();
                $this->doLogin();
@@ -36,7 +35,6 @@ class ApiBlockTest extends ApiTestCase {
         * previously always considered valid (bug 34212).
         */
        function testMakeNormalBlock() {
-
                $data = $this->getTokens();
 
                $user = User::newFromName( 'UTApiBlockee' );
@@ -53,7 +51,7 @@ class ApiBlockTest extends ApiTestCase {
                $key = array_pop( $keys );
                $pageinfo = $data[0]['query']['pages'][$key];
 
-               $data = $this->doApiRequest( array(
+               $this->doApiRequest( array(
                        'action' => 'block',
                        'user' => 'UTApiBlockee',
                        'reason' => 'Some reason',
@@ -66,7 +64,6 @@ class ApiBlockTest extends ApiTestCase {
                $this->assertEquals( 'UTApiBlockee', (string)$block->getTarget() );
                $this->assertEquals( 'Some reason', $block->mReason );
                $this->assertEquals( 'infinity', $block->mExpiry );
-
        }
 
        /**
index 7d8e01f..f3b9a67 100644 (file)
@@ -161,13 +161,13 @@ class ApiEditPageTest extends ApiTestCase {
                if ( $text !== null ) {
                        if ( $text === '' ) {
                                // can't create an empty page, so create it with some content
-                               list( $re, , ) = $this->doApiRequestWithToken( array(
+                               $this->doApiRequestWithToken( array(
                                        'action' => 'edit',
                                        'title' => $name,
                                        'text' => '(dummy)', ) );
                        }
 
-                       list( $re, , ) = $this->doApiRequestWithToken( array(
+                       list( $re ) = $this->doApiRequestWithToken( array(
                                'action' => 'edit',
                                'title' => $name,
                                'text' => $text, ) );
@@ -176,7 +176,7 @@ class ApiEditPageTest extends ApiTestCase {
                }
 
                // -- try append/prepend --------------------------------------------
-               list( $re, , ) = $this->doApiRequestWithToken( array(
+               list( $re ) = $this->doApiRequestWithToken( array(
                        'action' => 'edit',
                        'title' => $name,
                        $op . 'text' => $append, ) );
@@ -224,7 +224,7 @@ class ApiEditPageTest extends ApiTestCase {
 
                // try to save edit, expect conflict
                try {
-                       list( $re, , ) = $this->doApiRequestWithToken( array(
+                       $this->doApiRequestWithToken( array(
                                'action' => 'edit',
                                'title' => $name,
                                'text' => 'nix bar!',
@@ -280,7 +280,7 @@ class ApiEditPageTest extends ApiTestCase {
 
                // try again, without following the redirect. Should fail.
                try {
-                       list( $re, , ) = $this->doApiRequestWithToken( array(
+                       $this->doApiRequestWithToken( array(
                                'action' => 'edit',
                                'title' => $rname,
                                'text' => 'nix bar!',
index 902b7b8..ae74e38 100644 (file)
@@ -116,6 +116,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                                $mapping[$key] = 'unused';
                        }
                }
+
                return $mapping;
        }
 
@@ -126,12 +127,14 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        'optionname' => null,
                        'optionvalue' => null,
                );
+
                return array_merge( $request, $custom );
        }
 
        private function executeQuery( $request ) {
                $this->mContext->setRequest( new FauxRequest( $request, true, $this->mSession ) );
                $this->mTested->execute();
+
                return $this->mTested->getResult()->getData();
        }
 
@@ -156,6 +159,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                } catch ( UsageException $e ) {
                        $this->assertEquals( 'notloggedin', $e->getCodeString() );
                        $this->assertEquals( 'Anonymous users cannot change preferences', $e->getMessage() );
+
                        return;
                }
                $this->fail( "UsageException was not thrown" );
@@ -169,6 +173,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                } catch ( UsageException $e ) {
                        $this->assertEquals( 'nooptionname', $e->getCodeString() );
                        $this->assertEquals( 'The optionname parameter must be set', $e->getMessage() );
+
                        return;
                }
                $this->fail( "UsageException was not thrown" );
@@ -191,6 +196,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                } catch ( UsageException $e ) {
                        $this->assertEquals( 'nochanges', $e->getCodeString() );
                        $this->assertEquals( 'No changes were requested', $e->getMessage() );
+
                        return;
                }
                $this->fail( "UsageException was not thrown" );
index a42e5aa..b408875 100644 (file)
@@ -16,7 +16,7 @@ class ApiParseTest extends ApiTestCase {
                $somePage = mt_rand();
 
                try {
-                       $data = $this->doApiRequest( array(
+                       $this->doApiRequest( array(
                                'action' => 'parse',
                                'page' => $somePage ) );
 
@@ -26,5 +26,4 @@ class ApiParseTest extends ApiTestCase {
                                "Parse request for nonexistent page must give 'missingtitle' error: " . var_export( $ex->getMessageArray(), true ) );
                }
        }
-
 }
index a7f9229..881eb3f 100644 (file)
@@ -37,5 +37,4 @@ class ApiPurgeTest extends ApiTestCase {
                        $this->assertArrayHasKey( $pages[$v['title']], $v );
                }
        }
-
 }
index 552fbfb..1559bef 100644 (file)
@@ -52,6 +52,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
        protected function editPage( $pageName, $text, $summary = '', $defaultNs = NS_MAIN ) {
                $title = Title::newFromText( $pageName, $defaultNs );
                $page = WikiPage::factory( $title );
+
                return $page->doEditContent( ContentHandler::makeContent( $text, $title ), $summary );
        }
 
@@ -131,6 +132,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                        $session['wsEditToken'] = $session['wsToken'];
                        // add token to request parameters
                        $params['token'] = md5( $session['wsToken'] ) . User::EDIT_TOKEN_SUFFIX;
+
                        return $this->doApiRequest( $params, $session, false, $user );
                } else {
                        throw new Exception( "request data not in right format" );
@@ -164,6 +166,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                        'titles' => 'Main Page',
                        'intoken' => 'edit|delete|protect|move|block|unblock|watch',
                        'prop' => 'info' ), $session, false, $user->user );
+
                return $data;
        }
 
@@ -204,11 +207,14 @@ class UserWrapper {
 }
 
 class MockApi extends ApiBase {
-       public function execute() {}
+       public function execute() {
+       }
 
-       public function getVersion() {}
+       public function getVersion() {
+       }
 
-       public function __construct() {}
+       public function __construct() {
+       }
 
        public function getAllowedParams() {
                return array(
@@ -234,6 +240,7 @@ class ApiTestContext extends RequestContext {
                if ( $user !== null ) {
                        $context->setUser( $user );
                }
+
                return $context;
        }
 }
index 8028491..7e18b6e 100644 (file)
@@ -47,6 +47,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                        // see if it now doesn't exist; reload
                        $title = Title::newFromText( $title->getText(), NS_FILE );
                }
+
                return !( $title && $title instanceof Title && $title->exists() );
        }
 
@@ -69,6 +70,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                foreach ( $dupes as $dupe ) {
                        $success &= $this->deleteFileByTitle( $dupe->getTitle() );
                }
+
                return $success;
        }
 
@@ -105,7 +107,6 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                );
 
                return true;
-
        }
 
        function fakeUploadChunk( $fieldName, $fileName, $type, & $chunkData ) {
@@ -145,5 +146,4 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
        function clearFakeUploads() {
                $_FILES = array();
        }
-
 }
index 0d98b04..c418a87 100644 (file)
@@ -27,7 +27,6 @@ require_once( 'ApiTestCaseUpload.php' );
  * This is pretty sucky... needs to be prettified.
  */
 class ApiUploadTest extends ApiTestCaseUpload {
-
        /**
         * Testing login
         * XXX this is a funny way of getting session context
@@ -59,8 +58,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $this->assertArrayHasKey( 'lgtoken', $result['login'] );
 
                $this->assertNotEmpty( $session, 'API Login must return a session' );
-               return $session;
 
+               return $session;
        }
 
        /**
@@ -118,7 +117,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $this->deleteFileByFileName( $fileName );
                $this->deleteFileByContent( $filePath );
 
-
                if ( !$this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
                        $this->markTestIncomplete( "Couldn't upload file!\n" );
                }
@@ -298,7 +296,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                $exception = false;
                try {
-                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                       list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->user );
                } catch ( UsageException $e ) {
                        $exception = true;
@@ -307,7 +305,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $this->assertEquals( 'Success', $result['upload']['result'] );
                $this->assertFalse( $exception );
 
-
                // second upload with the same content (but different name)
 
                if ( !$this->fakeUploadFile( 'file', $fileNames[1], $mimeType, $filePaths[0] ) ) {
@@ -324,7 +321,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                $exception = false;
                try {
-                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                       list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->user ); // FIXME: leaks a temporary file
                } catch ( UsageException $e ) {
                        $exception = true;
@@ -341,7 +338,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
                unlink( $filePaths[0] );
        }
 
-
        /**
         * @depends testLogin
         */
@@ -382,7 +378,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                $exception = false;
                try {
-                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                       list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->user ); // FIXME: leaks a temporary file
                } catch ( UsageException $e ) {
                        $exception = true;
@@ -411,7 +407,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $this->clearFakeUploads();
                $exception = false;
                try {
-                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                       list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->user );
                } catch ( UsageException $e ) {
                        $exception = true;
@@ -482,7 +478,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        if ( !$chunkSessionKey ) {
                                // Upload fist chunk ( and get the session key )
                                try {
-                                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                                       list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                                self::$users['uploader']->user );
                                } catch ( UsageException $e ) {
                                        $this->markTestIncomplete( $e->getMessage() );
@@ -509,7 +505,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        $this->assertEquals( $resultOffset, $params['offset'] );
                        // Upload current chunk
                        try {
-                               list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                               list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                        self::$users['uploader']->user );
                        } catch ( UsageException $e ) {
                                $this->markTestIncomplete( $e->getMessage() );
@@ -548,7 +544,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $this->clearFakeUploads();
                $exception = false;
                try {
-                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                       list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->user );
                } catch ( UsageException $e ) {
                        $exception = true;
index aefd939..a9bc43a 100644 (file)
@@ -7,7 +7,6 @@
  * @todo This test suite is severly broken and need a full review
  */
 class ApiWatchTest extends ApiTestCase {
-
        protected function setUp() {
                parent::setUp();
                $this->doLogin();
@@ -95,8 +94,7 @@ class ApiWatchTest extends ApiTestCase {
        /**
         */
        function testGetRollbackToken() {
-
-               $pageinfo = $this->getTokens();
+               $this->getTokens();
 
                if ( !Title::newFromText( 'Help:UTPage' )->exists() ) {
                        $this->markTestSkipped( "The article [[Help:UTPage]] does not exist" ); //TODO: just create it?
@@ -168,7 +166,7 @@ class ApiWatchTest extends ApiTestCase {
                $this->assertArrayHasKey( 'delete', $data[0] );
                $this->assertArrayHasKey( 'title', $data[0]['delete'] );
 
-               $data = $this->doApiRequest( array(
+               $this->doApiRequest( array(
                        'action' => 'query',
                        'list' => 'watchlist' ) );
 
index 3040758..1b815ac 100644 (file)
@@ -108,6 +108,7 @@ class RandomImageGenerator {
                foreach ( $filenames as $filename ) {
                        $this->{$imageWriteMethod}( $this->getImageSpec(), $format, $filename );
                }
+
                return $filenames;
        }
 
@@ -156,7 +157,6 @@ class RandomImageGenerator {
                }
 
                return $filenames;
-
        }
 
 
@@ -196,7 +196,6 @@ class RandomImageGenerator {
                                array( 'x' => $originX, 'y' => $originY - $radius )
                        );
                        $draws[] = $draw;
-
                }
 
                $spec['draws'] = $draws;
@@ -216,6 +215,7 @@ class RandomImageGenerator {
                foreach ( $shape as $point ) {
                        $points[] = $point['x'] . ',' . $point['y'];
                }
+
                return join( " ", $points );
        }
 
@@ -337,6 +337,7 @@ class RandomImageGenerator {
                        }
                        $tSpec['draws'][] = $tDraw;
                }
+
                return $tSpec;
        }
 
@@ -384,6 +385,7 @@ class RandomImageGenerator {
                $command = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " . implode( " ", $args );
                $retval = null;
                wfShellExec( $command, $retval );
+
                return ( $retval === 0 );
        }
 
@@ -397,6 +399,7 @@ class RandomImageGenerator {
                for ( $i = 0; $i <= 2; $i++ ) {
                        $components[] = mt_rand( 0, 255 );
                }
+
                return 'rgb(' . join( ', ', $components ) . ')';
        }
 
@@ -414,6 +417,7 @@ class RandomImageGenerator {
                for ( $i = 0; $i < $count; $i += 2 ) {
                        $pairs[] = array( $lines[$i], $lines[$i + 1] );
                }
+
                return $pairs;
        }
 
@@ -461,5 +465,4 @@ class RandomImageGenerator {
 
                return $lines;
        }
-
 }
index a59983d..802a0e1 100644 (file)
@@ -13,7 +13,5 @@ class ApiFormatPhpTest extends ApiFormatTestBase {
 
                $this->assertInternalType( 'array', unserialize( $data ) );
                $this->assertGreaterThan( 0, count( (array)$data ) );
-
        }
-
 }
index e0a84e1..7f32e5f 100644 (file)
@@ -68,6 +68,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                                // put 'continue' params at the end - lazy method
                                $a = strpos( $a, 'continue' ) !== false ? 'zzz ' . $a : $a;
                                $b = strpos( $b, 'continue' ) !== false ? 'zzz ' . $b : $b;
+
                                return strcmp( $a, $b );
                        } );
                        $reqStr = http_build_query( $request );
@@ -103,6 +104,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                                if ( $expectedCount > $count ) {
                                        print "***** $id Finished early in $count turns. $expectedCount was expected\n";
                                }
+
                                return $result;
                        } elseif ( !$useContinue ) {
                                $this->assertFalse( 'Non-smart query must be requested all at once' );
index 7fb5307..bc01ec2 100644 (file)
@@ -20,7 +20,6 @@ class ApiQueryTest extends ApiTestCase {
                        'action' => 'query',
                        'titles' => 'Project:articleA|article_B' ) );
 
-
                $this->assertArrayHasKey( 'query', $data[0] );
                $this->assertArrayHasKey( 'normalized', $data[0]['query'] );
 
@@ -42,7 +41,6 @@ class ApiQueryTest extends ApiTestCase {
                        ),
                        $data[0]['query']['normalized'][1]
                );
-
        }
 
        function testTitlesAreRejectedIfInvalid() {
@@ -65,5 +63,4 @@ class ApiQueryTest extends ApiTestCase {
                $this->assertArrayHasKey( 'missing', $data[0]['query']['pages'][-2] );
                $this->assertArrayHasKey( 'invalid', $data[0]['query']['pages'][-1] );
        }
-
 }
index 3d96beb..d712bc0 100644 (file)
@@ -24,7 +24,6 @@
  * @file
  */
 
-
 /** This class has some common functionality for testing query module
  */
 abstract class ApiQueryTestBase extends ApiTestCase {
@@ -48,6 +47,7 @@ STR;
                        $request = array_merge_recursive( $request, $req );
                        $this->mergeExpected( $expected, $exp );
                }
+
                return array( $request, $expected );
        }
 
@@ -62,6 +62,7 @@ STR;
                $this->assertArrayHasKey( 1, $v, self::PARAM_ASSERT );
                $this->assertType( 'array', $v[0], self::PARAM_ASSERT );
                $this->assertType( 'array', $v[1], self::PARAM_ASSERT );
+
                return $v;
        }
 
index c7e75d9..1c81ea7 100644 (file)
@@ -52,6 +52,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
                for ( $i = $firstKey; $i <= $lastKey; $i++ ) {
                        $expected["cache-key-$i"] = array( "prop-$i" => "value-$i" );
                }
+
                return $expected;
        }
 
@@ -70,7 +71,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
         * @expectedException MWException
         */
        function testConstructorGivenInvalidValue( $maxSize ) {
-               $c = new ProcessCacheLRUTestable( $maxSize );
+               new ProcessCacheLRUTestable( $maxSize );
        }
 
        /**
@@ -125,7 +126,6 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
                        $cache->getCache(),
                        "Filling a $cacheMaxEntries entries cache with $entryToFill entries"
                );
-
        }
 
        /**
@@ -218,9 +218,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
                        ),
                        $cache->getCache()
                );
-
        }
-
 }
 
 /**
index 67d4fde..c345513 100644 (file)
@@ -317,6 +317,7 @@ class DummyContentHandlerForTesting extends ContentHandler {
         */
        public function unserializeContent( $blob, $format = null ) {
                $d = unserialize( $blob );
+
                return new DummyContentForTesting( $d );
        }
 
index 8f53dd3..1c45820 100644 (file)
@@ -77,5 +77,4 @@ class CssContentTest extends MediaWikiTestCase {
        public function testEquals( Content $a, Content $b = null, $equal = false ) {
                $this->assertEquals( $equal, $a->equals( $b ) );
        }
-
 }
index 2d693fe..6632edd 100644 (file)
@@ -269,5 +269,4 @@ class JavaScriptContentTest extends TextContentTest {
                        array( new JavaScriptContent( "hallo" ), new JavaScriptContent( "HALLO" ), false ),
                );
        }
-
 }
index 4fc2d51..28c006c 100644 (file)
@@ -423,5 +423,4 @@ class TextContentTest extends MediaWikiLangTestCase {
                        $this->assertEquals( $expectedNative, $converted->getNativeData() );
                }
        }
-
 }
index 0f6a968..45d8140 100644 (file)
@@ -181,5 +181,4 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
        /*
        public function testGetUndoContent( Revision $current, Revision $undo, Revision $undoafter = null ) {}
        */
-
 }
index caa3368..965a5f3 100644 (file)
@@ -231,7 +231,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                ),
                                "DELETE FROM table " .
                                        "WHERE field IN (" .
-                                               "SELECT field_join FROM table_join WHERE alias = 'text'" .
+                                       "SELECT field_join FROM table_join WHERE alias = 'text'" .
                                        ")"
                        ),
                        array(
@@ -244,7 +244,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                ),
                                "DELETE FROM table " .
                                        "WHERE field IN (" .
-                                               "SELECT field_join FROM table_join " .
+                                       "SELECT field_join FROM table_join " .
                                        ")"
                        ),
                );
@@ -296,8 +296,8 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                "INSERT IGNORE INTO table " .
                                        "(field,field2) " .
                                        "VALUES " .
-                                               "('text','2')," .
-                                               "('multi','3')"
+                                       "('text','2')," .
+                                       "('multi','3')"
                        ),
                );
        }
@@ -330,7 +330,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                "INSERT INTO insert_table " .
                                        "(field_insert,field) " .
                                        "SELECT field_select,field2 " .
-                                               "FROM select_table"
+                                       "FROM select_table"
                        ),
                        array(
                                array(
@@ -342,8 +342,8 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                "INSERT INTO insert_table " .
                                        "(field_insert,field) " .
                                        "SELECT field_select,field2 " .
-                                               "FROM select_table " .
-                                               "WHERE field = '2'"
+                                       "FROM select_table " .
+                                       "WHERE field = '2'"
                        ),
                        array(
                                array(
@@ -357,9 +357,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                "INSERT IGNORE INTO insert_table " .
                                        "(field_insert,field) " .
                                        "SELECT field_select,field2 " .
-                                               "FROM select_table " .
-                                               "WHERE field = '2' " .
-                                               "ORDER BY field"
+                                       "FROM select_table " .
+                                       "WHERE field = '2' " .
+                                       "ORDER BY field"
                        ),
                );
        }
@@ -388,8 +388,8 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                "DELETE FROM replace_table " .
                                        "WHERE ( field='text' ); " .
                                        "INSERT INTO replace_table " .
-                                               "(field,field2) " .
-                                               "VALUES ('text','text2')"
+                                       "(field,field2) " .
+                                       "VALUES ('text','text2')"
                        ),
                        array(
                                array(
@@ -404,8 +404,8 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                "DELETE FROM module_deps " .
                                        "WHERE ( md_module='module' AND md_skin='skin' ); " .
                                        "INSERT INTO module_deps " .
-                                               "(md_module,md_skin,md_deps) " .
-                                               "VALUES ('module','skin','deps')"
+                                       "(md_module,md_skin,md_deps) " .
+                                       "VALUES ('module','skin','deps')"
                        ),
                        array(
                                array(
@@ -426,13 +426,13 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                "DELETE FROM module_deps " .
                                        "WHERE ( md_module='module' AND md_skin='skin' ); " .
                                        "INSERT INTO module_deps " .
-                                               "(md_module,md_skin,md_deps) " .
-                                               "VALUES ('module','skin','deps'); " .
-                               "DELETE FROM module_deps " .
+                                       "(md_module,md_skin,md_deps) " .
+                                       "VALUES ('module','skin','deps'); " .
+                                       "DELETE FROM module_deps " .
                                        "WHERE ( md_module='module2' AND md_skin='skin2' ); " .
                                        "INSERT INTO module_deps " .
-                                               "(md_module,md_skin,md_deps) " .
-                                               "VALUES ('module2','skin2','deps2')"
+                                       "(md_module,md_skin,md_deps) " .
+                                       "VALUES ('module2','skin2','deps2')"
                        ),
                        array(
                                array(
@@ -453,13 +453,13 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                "DELETE FROM module_deps " .
                                        "WHERE ( md_module='module' ) OR ( md_skin='skin' ); " .
                                        "INSERT INTO module_deps " .
-                                               "(md_module,md_skin,md_deps) " .
-                                               "VALUES ('module','skin','deps'); " .
-                               "DELETE FROM module_deps " .
+                                       "(md_module,md_skin,md_deps) " .
+                                       "VALUES ('module','skin','deps'); " .
+                                       "DELETE FROM module_deps " .
                                        "WHERE ( md_module='module2' ) OR ( md_skin='skin2' ); " .
                                        "INSERT INTO module_deps " .
-                                               "(md_module,md_skin,md_deps) " .
-                                               "VALUES ('module2','skin2','deps2')"
+                                       "(md_module,md_skin,md_deps) " .
+                                       "VALUES ('module2','skin2','deps2')"
                        ),
                        array(
                                array(
index 097e57a..815edd2 100644 (file)
@@ -9,6 +9,7 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
 
        function query( $sql, $fname = '', $tempIgnore = false ) {
                $this->lastQuery = $sql;
+
                return true;
        }
 
@@ -327,6 +328,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                $db->sourceFile( "$IP/tests/phpunit/data/db/sqlite/tables-$version.sql" );
                $updater = DatabaseUpdater::newForDB( $db, false, $maint );
                $updater->doUpdates( array( 'core' ) );
+
                return $db;
        }
 
@@ -348,6 +350,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                }
                $list = array_flip( $list );
                sort( $list );
+
                return $list;
        }
 
@@ -359,6 +362,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                        $cols[$col->name] = $col;
                }
                ksort( $cols );
+
                return $cols;
        }
 
@@ -376,6 +380,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                        $indexes[$index->name] = $index;
                }
                ksort( $indexes );
+
                return $indexes;
        }
 
index 1efa279..57df08e 100644 (file)
@@ -36,6 +36,7 @@ class DatabaseTestHelper extends DatabaseBase {
        public function getLastSqls() {
                $lastSqls = implode( '; ', $this->lastSqls );
                $this->lastSqls = array();
+
                return $lastSqls;
        }
 
@@ -78,6 +79,7 @@ class DatabaseTestHelper extends DatabaseBase {
 
        public function tableExists( $table, $fname = __METHOD__ ) {
                $this->checkFunctionName( $fname );
+
                return in_array( $table, (array)$this->tablesExists );
        }
 
index 596d0bd..27d4d0e 100644 (file)
@@ -76,6 +76,7 @@ abstract class ORMRowTest extends \MediaWikiTestCase {
         */
        protected function getRowInstance( array $data, $loadDefaults ) {
                $class = $this->getRowClass();
+
                return new $class( $this->getTableInstance(), $data, $loadDefaults );
        }
 
index 4cadf31..e583d1b 100644 (file)
@@ -45,6 +45,7 @@ class ORMTableTest extends MediaWikiTestCase {
         */
        public function getTable() {
                $class = $this->getTableClass();
+
                return $class::singleton();
        }
 
@@ -84,7 +85,6 @@ class ORMTableTest extends MediaWikiTestCase {
 
                $db->ignoreErrors( false );
        }
-
 }
 
 /**
index 263553a..f32610b 100644 (file)
@@ -122,10 +122,10 @@ class TestORMRowTest extends ORMRowTest {
                        'blob' => new stdClass()
                );
        }
-
 }
 
-class TestORMRow extends ORMRow {}
+class TestORMRow extends ORMRow {
+}
 
 class TestORMTable extends ORMTable {
 
@@ -194,6 +194,4 @@ class TestORMTable extends ORMTable {
        protected function getFieldPrefix() {
                return 'test_';
        }
-
-
 }
index 3991c93..0d6e4d5 100644 (file)
@@ -315,6 +315,7 @@ class FileBackendTest extends MediaWikiTestCase {
                                "Source file $source does not exist ($backendName)." );
                        $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $dest ) ),
                                "Destination file $dest does not exist ($backendName)." );
+
                        return; // done
                }
 
@@ -434,6 +435,7 @@ class FileBackendTest extends MediaWikiTestCase {
                                "Source file $source does not exist ($backendName)." );
                        $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $dest ) ),
                                "Destination file $dest does not exist ($backendName)." );
+
                        return; // done
                }
 
@@ -1369,6 +1371,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        public static function provider_testPrepareAndClean() {
                $base = self::baseStorePath();
+
                return array(
                        array( "$base/unittest-cont1/e/a/z/some_file1.txt", true ),
                        array( "$base/unittest-cont2/a/z/some_file2.txt", true ),
@@ -2192,6 +2195,7 @@ class FileBackendTest extends MediaWikiTestCase {
        // test helper wrapper for backend prepare() function
        private function create( array $params ) {
                $params['op'] = 'create';
+
                return $this->backend->doQuickOperations( array( $params ) );
        }
 
index 7cc25b1..033ae0b 100644 (file)
@@ -1,26 +1,25 @@
 <?php
 
 class FileRepoTest extends MediaWikiTestCase {
-
        /**
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionCanNotBeNull() {
-               $f = new FileRepo();
+               new FileRepo();
        }
 
        /**
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionCanNotBeAnEmptyArray() {
-               $f = new FileRepo( array() );
+               new FileRepo( array() );
        }
 
        /**
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionNeedNameKey() {
-               $f = new FileRepo( array(
+               new FileRepo( array(
                        'backend' => 'foobar'
                ) );
        }
@@ -29,7 +28,7 @@ class FileRepoTest extends MediaWikiTestCase {
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionNeedBackendKey() {
-               $f = new FileRepo( array(
+               new FileRepo( array(
                        'name' => 'foobar'
                ) );
        }
index a89ef98..71a585e 100644 (file)
@@ -69,6 +69,7 @@ class StoreBatchTest extends MediaWikiTestCase {
                $result = $this->repo->store( $srcPath, 'temp', $dstRel, $flags );
                $result->value = $this->repo->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
                $this->createdFiles[] = $result->value;
+
                return $result;
        }
 
index 820f8c5..787b431 100644 (file)
@@ -46,7 +46,8 @@ class JobQueueTest extends MediaWikiTestCase {
                                if ( !( $this->$q instanceof JobQueueDB ) ) {
                                        $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
                                }
-                       } catch ( MWException $e ) {}; // unsupported? (@TODO: what if it was another error?)
+                       } catch ( MWException $e ) {
+                       }; // unsupported? (@TODO: what if it was another error?)
                }
        }
 
@@ -109,7 +110,6 @@ class JobQueueTest extends MediaWikiTestCase {
                $jobs = iterator_to_array( $queue->getAllQueuedJobs() );
                $this->assertEquals( 2, count( $jobs ), "Queue iterator size is correct ($desc)" );
 
-
                $job1 = $queue->pop();
                $this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
 
index 0782e4e..ef263c4 100644 (file)
@@ -88,7 +88,6 @@ class FormatJsonTest extends MediaWikiTestCase {
                        strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
                        'Test encoding an broken json_encode character (U+20000)'
                );
-
        }
 
        public function testDecodeReturnType() {
@@ -156,6 +155,7 @@ class FormatJsonTest extends MediaWikiTestCase {
                                $cases[] = array( $from, '"' . ( $leaveUnescaped ? $from : $to ) . '"' );
                        }
                }
+
                return $cases;
        }
 }
index 37a9b34..7436c43 100644 (file)
@@ -73,6 +73,7 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
         */
        protected function getNew( array $elements = array() ) {
                $class = $this->getInstanceClass();
+
                return new $class( $elements );
        }
 
@@ -197,6 +198,7 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
        public function testOffsetSet( array $elements ) {
                if ( $elements === array() ) {
                        $this->assertTrue( true );
+
                        return;
                }
 
@@ -258,5 +260,4 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
 
                $this->assertArrayEquals( $list, $copy, true, true );
        }
-
 }
index 117a072..ffa6084 100644 (file)
@@ -146,5 +146,4 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                $res = $handler->getTiffByteOrder( $this->filePath . 'test.tiff' );
                $this->assertEquals( 'LE', $res );
        }
-
 }
index e7e95f7..6ad28ac 100644 (file)
@@ -39,6 +39,4 @@ class ExifTest extends MediaWikiTestCase {
                );
                $this->assertEquals( $expected, $data );
        }
-
-
 }
index c9648a7..81a58dd 100644 (file)
@@ -56,5 +56,4 @@ class IPTCTest extends MediaWikiTestCase {
                $res = IPTC::Parse( $iptcData );
                $this->assertEquals( array( '¼' ), $res['Keywords'] );
        }
-
 }
index 3bbce2b..58d791f 100644 (file)
@@ -52,7 +52,6 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
                // encoded as just \xA9.
                $expected = "© 2010 Bawolff";
 
-
                $this->assertArrayHasKey( 'text', $meta );
                $meta = $meta['text'];
                $this->assertArrayHasKey( 'Copyright', $meta );
@@ -149,5 +148,4 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
                        'greyscale-na-png.png' );
                $this->assertEquals( 'greyscale', $meta['colorType'] );
        }
-
 }
index 97a0000..3bf9c59 100644 (file)
@@ -21,6 +21,7 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                $r = new XMLReader();
                if ( !method_exists( $r, 'readInnerXML' ) ) {
                        $this->markTestSkipped( 'XMLReader::readInnerXML() does not exist (libxml >2.6.20 needed).' );
+
                        return;
                }
                $this->assertMetadata( $infile, $expected );
@@ -41,6 +42,7 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
 
        public static function provideSvgFiles() {
                $base = __DIR__ . '/../../data/media';
+
                return array(
                        array(
                                "$base/Wikimedia-logo.svg",
index 86c722b..3e39675 100644 (file)
@@ -65,6 +65,7 @@ class XMPTest extends MediaWikiTestCase {
                        include( $xmpPath . $file[0] . '.result.php' );
                        $data[] = array( $xmp, $result, '[' . $file[0] . '.xmp] ' . $file[1] );
                }
+
                return $data;
        }
 
@@ -157,5 +158,4 @@ class XMPTest extends MediaWikiTestCase {
 
                $this->assertEquals( $expected, $actual );
        }
-
 }
index a2b4e1c..257c40a 100644 (file)
@@ -41,7 +41,5 @@ class XMPValidateTest extends MediaWikiTestCase {
                        array( '2001-05-12T15', null ),
                        array( '2001-12T15:13', null ),
                );
-
        }
-
 }
index 88b07f0..be603e5 100644 (file)
@@ -15,7 +15,6 @@ class BagOStuffTest extends MediaWikiTestCase {
                        $name = $this->getCliArg( 'use-bagostuff=' );
 
                        $this->cache = ObjectCache::newFromId( $name );
-
                } else {
                        // no type defined - use simple hash
                        $this->cache = new HashBagOStuff;
index abc2f61..3939c4f 100644 (file)
@@ -41,6 +41,7 @@ EOT;
                        $parserTester = new $parserTestClassName( $testsName );
                        $suite->addTestSuite( new ReflectionClass ( $parserTester ) );
                }
+
                return $suite;
        }
 }
index 77311b9..934f181 100644 (file)
@@ -86,7 +86,6 @@ class NewParserTest extends MediaWikiTestCase {
                        $tmpGlobals['wgStyleDirectory'] = "$IP/skins";
                }
 
-
                foreach ( $tmpGlobals as $var => $val ) {
                        if ( array_key_exists( $var, $GLOBALS ) ) {
                                $this->savedInitialGlobals[$var] = $GLOBALS[$var];
@@ -432,6 +431,7 @@ class NewParserTest extends MediaWikiTestCase {
                // wfDebug( "Creating upload directory $dir\n" );
                if ( file_exists( $dir ) ) {
                        wfDebug( "Already exists!\n" );
+
                        return $dir;
                }
 
@@ -543,6 +543,7 @@ class NewParserTest extends MediaWikiTestCase {
                        global $wgParserTestFiles;
                        $this->file = $wgParserTestFiles[0];
                }
+
                return new TestFileIterator( $this->file, $this );
        }
 
@@ -717,7 +718,6 @@ class NewParserTest extends MediaWikiTestCase {
                        }
 
                        $id++;
-
                }
        }
 
@@ -911,6 +911,7 @@ class NewParserTest extends MediaWikiTestCase {
                                }
                        }
                }
+
                return $opts;
        }
 
@@ -922,6 +923,7 @@ class NewParserTest extends MediaWikiTestCase {
                if ( substr( $opt, 0, 2 ) == '[[' ) {
                        return substr( $opt, 2, -2 );
                }
+
                return $opt;
        }
 
index 50fe0e4..cacbb85 100644 (file)
@@ -44,6 +44,5 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                        'text' => '<pre style="margin-left: 1.6em">foo</pre>',
                ), $ret, 'callParserFunction works for {{#tag:pre|foo|style=margin-left: 1.6em}}' );
        }
-
        // TODO: Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
 }
index e16b407..c609164 100644 (file)
@@ -68,5 +68,4 @@ class ParserPreloadTest extends MediaWikiTestCase {
                        $msg
                );
        }
-
 }
index 6abca6d..47c47f6 100644 (file)
@@ -87,6 +87,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                # sort them numerically so we will compare simply that we received
                # the expected matches.
                sort( $matches );
+
                return $matches;
        }
 
@@ -172,5 +173,4 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        $this->fetchIds( $this->search->searchTitle( 'smithee' ) ),
                        "Title power search failed" );
        }
-
 }
index 7d867bc..d19cdd0 100644 (file)
@@ -28,6 +28,7 @@ class SearchUpdateTest extends MediaWikiTestCase {
        function update( $text, $title = 'Test', $id = 1 ) {
                $u = new SearchUpdate( $id, $title, $text );
                $u->doUpdate();
+
                return array( MockSearch::$title, MockSearch::$text );
        }
 
index b86636f..e0092a5 100644 (file)
@@ -85,5 +85,4 @@ class MediaWikiSiteTest extends SiteTest {
                $this->assertContains( $path, $site->getPageUrl() );
                $this->assertContains( $expected, $site->getPageUrl( $page ) );
        }
-
 }
index c329839..bd2ae07 100644 (file)
@@ -186,5 +186,4 @@ class SiteListTest extends MediaWikiTestCase {
                        $this->assertTrue( $copy->hasInternalId( $site->getInternalId() ) );
                }
        }
-
 }
index cf4ce94..cf652e9 100644 (file)
@@ -119,5 +119,4 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
                $sites = $store->getSites();
                $this->assertEquals( 0, $sites->count() );
        }
-
 }
index 8033784..b453e74 100644 (file)
@@ -263,5 +263,4 @@ class SiteTest extends MediaWikiTestCase {
 
                $this->assertEquals( $serialization, serialize( $newInstance ) );
        }
-
 }
index a5656a7..f224b7d 100644 (file)
@@ -97,5 +97,4 @@ class TestSites {
                $sitesTable->clear();
                $sitesTable->saveSites( TestSites::getSites() );
        }
-
 }
index add830b..436eb2e 100644 (file)
@@ -42,7 +42,6 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
        /** return false if condition begin with 'rc_timestamp ' */
        private static function filterOutRcTimestampCondition( $var ) {
                return ( false === strpos( $var, 'rc_timestamp ' ) );
-
        }
 
        public function testRcNsFilter() {
@@ -123,5 +122,4 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                        array( NS_TALK, NS_MAIN ),
                );
        }
-
 }
index 15a11ed..c737f05 100644 (file)
@@ -53,7 +53,6 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        )
                        , $message
                );
-
        }
 
        public static function provideSearchOptionsTests() {
@@ -105,6 +104,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
                foreach ( $opt as $name => $value ) {
                        $u->setOption( $name, $value );
                }
+
                return $u;
        }
 
@@ -135,6 +135,5 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        $pageTitle,
                        "Search term '{$term}' should not be expanded in Special:Search <title>"
                );
-
        }
 }
index ac93aa7..a75fba6 100644 (file)
@@ -6,7 +6,6 @@
  * @group Database
  */
 class UploadFromUrlTest extends ApiTestCase {
-
        protected function setUp() {
                parent::setUp();
 
@@ -31,6 +30,7 @@ class UploadFromUrlTest extends ApiTestCase {
                $module->execute();
 
                wfSetupSession( $sessionId );
+
                return array( $module->getResultData(), $req );
        }
 
@@ -175,7 +175,6 @@ class UploadFromUrlTest extends ApiTestCase {
 
                $this->user->addGroup( 'users' );
 
-
                $data = $this->doAsyncUpload( $token );
 
                $this->assertEquals( $data[0]['upload']['result'], 'Warning' );
@@ -236,7 +235,7 @@ class UploadFromUrlTest extends ApiTestCase {
 
                $this->assertFalse( (bool)$talk->getArticleID( Title::GAID_FOR_UPDATE ), 'User talk does not exist' );
 
-               $data = $this->doApiRequest( array(
+               $this->doApiRequest( array(
                        'action' => 'upload',
                        'filename' => 'UploadFromUrlTest.png',
                        'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
@@ -260,7 +259,7 @@ class UploadFromUrlTest extends ApiTestCase {
 
                $exception = false;
                try {
-                       $data = $this->doApiRequest( array(
+                       $this->doApiRequest( array(
                                'action' => 'upload',
                                'filename' => 'UploadFromUrlTest.png',
                                'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
@@ -278,7 +277,6 @@ class UploadFromUrlTest extends ApiTestCase {
                $this->assertFalse( $job );
 
                return;
-
                /*
                // Broken until using leavemessage with ignorewarnings is supported
                $job->run();
@@ -331,7 +329,6 @@ class UploadFromUrlTest extends ApiTestCase {
                return $data;
        }
 
-
        /**
         *
         */
index b809d32..94c78dc 100644 (file)
@@ -130,15 +130,15 @@ class UploadTest extends MediaWikiTestCase {
 }
 
 class UploadTestHandler extends UploadBase {
-       public function initializeFromRequest( &$request ) {}
+       public function initializeFromRequest( &$request ) {
+       }
 
        public function testTitleValidation( $name ) {
                $this->mTitle = false;
                $this->mDesiredDestName = $name;
                $this->mTitleError = UploadBase::OK;
                $this->getTitle();
+
                return $this->mTitleError;
        }
-
-
 }
index 6659dad..4274335 100644 (file)
@@ -96,5 +96,4 @@ abstract class LanguageClassesTestCase extends MediaWikiTestCase {
                unset( $this->languageObject );
                parent::tearDown();
        }
-
 }
index d5dbfb2..80f76a5 100644 (file)
@@ -202,7 +202,6 @@ class LanguageTest extends LanguageClassesTestCase {
                                'formatTimePeriod() rounding, recursion, (>48h)'
                        ),
                );
-
        }
 
        function testTruncate() {
index 464a310..6358ac0 100644 (file)
@@ -56,5 +56,4 @@ class LanguageTrTest extends LanguageClassesTestCase {
 
                );
        }
-
 }
index 73d5dcc..3bf7414 100644 (file)
@@ -89,7 +89,7 @@ class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
                        array( 'n', 'just n' ),
                        array( 'n is in 5', 'is in' ),
                );
+
                return $tests;
        }
-
 }
index f82898f..78a5153 100644 (file)
@@ -124,6 +124,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -145,6 +146,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -271,7 +273,6 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                $this->assertTextNode( "title", $name );
                $this->assertTextNode( "ns", $ns );
                $this->assertTextNode( "id", $id );
-
        }
 
        /**
@@ -299,8 +300,8 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * @param $parentid int|false: (optional) id of the parent revision
         */
        protected function assertRevision( $id, $summary, $text_id, $text_bytes, $text_sha1, $text = false, $parentid = false,
-                                                                          $model = CONTENT_MODEL_WIKITEXT, $format = CONTENT_FORMAT_WIKITEXT ) {
-
+               $model = CONTENT_MODEL_WIKITEXT, $format = CONTENT_FORMAT_WIKITEXT
+       ) {
                $this->assertNodeStart( "revision" );
                $this->skipWhitespace();
 
index 741f8b7..f4b61af 100644 (file)
@@ -128,7 +128,6 @@ class MaintenanceFixup extends Maintenance {
        public function execute() {
                $this->testCase->fail( __METHOD__ . " called unexpectedly" );
        }
-
 }
 
 class MaintenanceTest extends MediaWikiTestCase {
@@ -186,7 +185,6 @@ class MaintenanceTest extends MediaWikiTestCase {
        // test.*Intermittent.* tests), the objective of these tests is not to describe
        // consistent behavior, but rather currently existing behavior.
 
-
        function testOutputEmpty() {
                $this->m->output( "" );
                $this->assertOutputPrePostShutdown( "", false );
@@ -815,6 +813,4 @@ class MaintenanceTest extends MediaWikiTestCase {
                $m2->simulateShutdown();
                $this->assertOutputPrePostShutdown( "foobar\n\n", false );
        }
-
-
 }
index cc00e6e..bc2d737 100644 (file)
@@ -36,7 +36,6 @@ class BaseDumpTest extends MediaWikiTestCase {
        private function assertPrefetchEquals( $expected, $page, $revision ) {
                $this->assertEquals( $expected, $this->dump->prefetch( $page, $revision ),
                        "Prefetch of page $page revision $revision" );
-
        }
 
        function testSequential() {
@@ -181,7 +180,6 @@ class BaseDumpTest extends MediaWikiTestCase {
   </siteinfo>
 ';
 
-
                // An array holding the pages that are available for prefetch
                $available_pages = array();
 
@@ -274,5 +272,4 @@ class BaseDumpTest extends MediaWikiTestCase {
 
                return $fname;
        }
-
 }
index 0962344..7fe48dd 100644 (file)
@@ -80,7 +80,6 @@ class TextPassDumperTest extends DumpTestCase {
                        // DumpTestCase
                        $this->exceptionFromAddDBData = $e;
                }
-
        }
 
        protected function setUp() {
@@ -94,7 +93,6 @@ class TextPassDumperTest extends DumpTestCase {
                        array( $this->pageId2, $this->pageId3, $this->pageId4 ),
                        array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
                        "Page ids increasing without holes" );
-
        }
 
        function testPlain() {
@@ -214,7 +212,6 @@ class TextPassDumperTest extends DumpTestCase {
                $this->assertPageEnd();
 
                $this->assertDumpEnd();
-
        }
 
        /**
@@ -239,7 +236,6 @@ class TextPassDumperTest extends DumpTestCase {
                $minDuration = 2; // We want the dump to take at least this many seconds
                $checkpointAfter = 0.5; // Generate checkpoint after this many seconds
 
-
                // Until a dump takes at least $minDuration seconds, perform a dump and check
                // duration. If the dump did not take long enough increase the iteration
                // count, to generate a bigger stub file next time.
@@ -579,6 +575,7 @@ class TextPassDumperTest extends DumpTestCase {
                $content .= $tail;
                $this->assertEquals( strlen( $content ), file_put_contents(
                        $fname, $content ), "Length of prepared stub" );
+
                return $fname;
        }
 }
index 5cf172e..98d8165 100644 (file)
@@ -39,6 +39,7 @@ class BackupDumperLoggerTest extends DumpTestCase {
                if ( $parameters !== null ) {
                        $logEntry->setParameters( $parameters );
                }
+
                return $logEntry->insert();
        }
 
@@ -75,14 +76,12 @@ class BackupDumperLoggerTest extends DumpTestCase {
                                $user2, NS_MAIN, "PageA", "SomeOtherComment",
                                array( 'key1' => 1, 3 => 'value3' ) );
                        $this->assertGreaterThan( 0, $this->logId3 );
-
                } catch ( Exception $e ) {
                        // We'd love to pass $e directly. However, ... see
                        // documentation of exceptionFromAddDBData in
                        // DumpTestCase
                        $this->exceptionFromAddDBData = $e;
                }
-
        }
 
 
@@ -226,5 +225,4 @@ class BackupDumperLoggerTest extends DumpTestCase {
                // the following statement to catch good output
                $this->expectOutputString( '' );
        }
-
 }
index 07c7670..535e61e 100644 (file)
@@ -79,7 +79,6 @@ class BackupDumperPageTest extends DumpTestCase {
                        // DumpTestCase
                        $this->exceptionFromAddDBData = $e;
                }
-
        }
 
        protected function setUp() {
@@ -93,7 +92,6 @@ class BackupDumperPageTest extends DumpTestCase {
                        array( $this->pageId2, $this->pageId3, $this->pageId4 ),
                        array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
                        "Page ids increasing without holes" );
-
        }
 
        function testFullTextPlain() {
@@ -403,6 +401,4 @@ class BackupDumperPageTest extends DumpTestCase {
 
                $this->expectETAOutput();
        }
-
-
 }
index 4d1d45d..e8df199 100644 (file)
@@ -63,7 +63,6 @@ class SemiMockedFetchText extends FetchText {
 
                return fopen( 'data://text/plain,' . $this->mockStdinText, 'r' );
        }
-
 }
 
 /**
@@ -236,5 +235,4 @@ class FetchTextTest extends MediaWikiTestCase {
                                $this->textId3 . "\n23\nFetchTextTestPage2Text2"
                        ) ) );
        }
-
 }
index 699571b..2c84886 100644 (file)
@@ -64,6 +64,4 @@ class GetSlaveServerTest extends MediaWikiTestCase {
                $this->expectOutputRegex( "/^[[:space:]]*\[wgDBprefix\][[:space:]]*=> "
                        . $wgDBprefix . "$/m" );
        }
-
-
 }
index 2a1ebc3..b425d86 100755 (executable)
@@ -89,7 +89,6 @@ class PHPUnitMaintClass extends Maintenance {
                        unset( $_SERVER['argv'][$key] ); // the option
                        unset( $_SERVER['argv'][$key + 1] ); // its value
                        $_SERVER['argv'] = array_values( $_SERVER['argv'] );
-
                }
        }
 
index 71b8c67..3af805a 100644 (file)
@@ -91,7 +91,7 @@ class ResourcesTest extends MediaWikiTestCase {
                                $property = $reflectedModule->getProperty( $propName );
                                $property->setAccessible( true );
                                $lists = $property->getValue( $module );
-                               foreach ( $lists as $group => $list ) {
+                               foreach ( $lists as $list ) {
                                        foreach ( $list as $key => $value ) {
                                                // We need the same filter as for 'lists',
                                                // due to 'skinStyles'.
@@ -116,7 +116,6 @@ class ResourcesTest extends MediaWikiTestCase {
                                        $file,
                                );
                        }
-
                }
 
                // Restore settings
@@ -124,5 +123,4 @@ class ResourcesTest extends MediaWikiTestCase {
 
                return $cases;
        }
-
 }
index 876876b..850d39c 100644 (file)
@@ -100,7 +100,6 @@ class SideBarTest extends MediaWikiLangTestCase {
 ** http://valid.no.desc.org/
 '
                );
-
        }
 
        /**
index 3200e0b..b1496a9 100644 (file)
@@ -57,7 +57,6 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                $wgNamespaceAliases['Image'] = NS_FILE;
                $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
 
-
                $wgEnableParserCache = false;
                DeferredUpdates::clearPendingUpdates();
                $wgMemc = wfGetMainCache();
@@ -185,6 +184,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
 
                if ( file_exists( $dir ) ) {
                        wfDebug( "Already exists!\n" );
+
                        return $dir;
                }
 
@@ -202,6 +202,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                // the UploadFromUrlTest class
                class_exists( 'UploadFromUrlTest' );
                $suite = new UploadFromUrlTestSuite( 'UploadFromUrlTest' );
+
                return $suite;
        }
 }
index bba3160..713ec4b 100644 (file)
@@ -1,5 +1,13 @@
 ( function ( mw, $ ) {
-       QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment() );
+       QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.taPrefix = mw.util.tooltipAccessKeyPrefix;
+                       mw.util.tooltipAccessKeyPrefix = 'ctrl-alt-';
+               },
+               teardown: function () {
+                       mw.util.tooltipAccessKeyPrefix = this.taPrefix;
+               }
+       } ) );
 
        QUnit.test( 'rawurlencode', 1, function ( assert ) {
                assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
                assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c d', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
        } );
 
-       QUnit.test( 'tooltipAccessKey', 3, function ( assert ) {
-               assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'mw.util.tooltipAccessKeyPrefix must be a string' );
-               assert.ok( mw.util.tooltipAccessKeyRegexp instanceof RegExp, 'mw.util.tooltipAccessKeyRegexp instance of RegExp' );
-               assert.ok( mw.util.updateTooltipAccessKeys, 'mw.util.updateTooltipAccessKeys' );
+       QUnit.test( 'tooltipAccessKey', 4, function ( assert ) {
+               assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'tooltipAccessKeyPrefix must be a string' );
+               assert.equal( $.type( mw.util.tooltipAccessKeyRegexp ), 'regexp', 'tooltipAccessKeyRegexp is a regexp' );
+               assert.ok( mw.util.updateTooltipAccessKeys, 'updateTooltipAccessKeys is non-empty' );
+
+               'Example [a]'.replace( mw.util.tooltipAccessKeyRegexp, function ( sub, m1, m2, m3, m4, m5, m6 ) {
+                       assert.equal( m6, 'a', 'tooltipAccessKeyRegexp finds the accesskey hint' );
+               } );
        } );
 
        QUnit.test( '$content', 2, function ( assert ) {
         * Previously, test elements where invisible to the selector since only
         * one element can have a given id.
         */
-       QUnit.test( 'addPortletLink', 8, function ( assert ) {
+       QUnit.test( 'addPortletLink', 10, function ( assert ) {
                var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo;
 
                pTestTb = '\
                $( '#qunit-fixture' ).append( pTestTb, pCustom, vectorTabs );
 
                tbRL = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
-                       'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l' );
+                       'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l'
+               );
 
                assert.ok( $.isDomElement( tbRL ), 'addPortletLink returns a valid DOM Element according to $.isDomElement' );
 
                        'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', tbRL );
                $tbMW = $( tbMW );
 
+               assert.propEqual(
+                       $tbMW.getAttrs(),
+                       {
+                               id: 't-mworg'
+                       },
+                       'Validate attributes of created element'
+               );
+
+               assert.propEqual(
+                       $tbMW.find( 'a' ).getAttrs(),
+                       {
+                               href: '//mediawiki.org/',
+                               title: 'Go to MediaWiki.org [ctrl-alt-m]',
+                               accesskey: 'm'
+                       },
+                       'Validate attributes of anchor tag in created element'
+               );
 
-               assert.equal( $tbMW.attr( 'id' ), 't-mworg', 'Link has correct ID set' );
                assert.equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
                assert.equal( $tbMW.next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing nextnode)' );
 
-               cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux' );
+               cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
                $cuQuux = $( cuQuux );
 
+               assert.equal( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [ctrl-alt-q]', 'Existing accesskey is stripped and updated' );
+
                assert.equal(
                        $( '#p-test-custom #c-barmenu ul li' ).length,
                        1,
index 2803ff2..1237bb5 100644 (file)
@@ -105,8 +105,6 @@ class AddContentToNewPageTestCase extends SeleniumTestCase {
 
        // Add level 2 headline and verify output in the preview
        public function testAddLevel2HeadLine() {
-               $blnElementPresent = false;
-               $blnTextPresent = false;
                $this->getExistingPage();
                $this->clickEditLink();
                $this->loadWikiEditor();
index 02fcf24..88e5885 100644 (file)
  * @ingroup Testing
  */
 
-class TestRecorder {
+/**
+ * Interface to record parser test results.
+ *
+ * The ITestRecorder is a very simple interface to record the result of
+ * MediaWiki parser tests. One should call start() before running the
+ * full parser tests and end() once all the tests have been finished.
+ * After each test, you should use record() to keep track of your tests
+ * results. Finally, report() is used to generate a summary of your
+ * test run, one could dump it to the console for human consumption or
+ * register the result in a database for tracking purposes.
+ *
+ * @since 1.22
+ */
+interface ITestRecorder {
+
+       /** Called at beginning of the parser test run */
+       public function start();
+
+       /** Called after each test */
+       public function record( $test, $result );
+
+       /** Called before finishing the test run */
+       public function report();
+
+       /** Called at the end of the parser test run */
+       public function end();
+
+}
+
+class TestRecorder implements ITestRecorder {
        var $parent;
        var $term;
 
@@ -481,7 +510,7 @@ class TestFileIterator implements Iterator {
                                        return true;
                                }
 
-                               if ( isset ( $this->sectionData[$this->section] ) ) {
+                               if ( isset( $this->sectionData[$this->section] ) ) {
                                        throw new MWException( "duplicate section '$this->section' at line {$this->lineNum} of $this->file\n" );
                                }