Merge "Add wfSuppressWarnings(); to CologneBlue."
authorReedy <reedy@wikimedia.org>
Sun, 21 Oct 2012 15:51:34 +0000 (15:51 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 21 Oct 2012 15:51:34 +0000 (15:51 +0000)
372 files changed:
INSTALL
README
RELEASE-NOTES-1.21
StartProfiler.sample
UPGRADE
docs/contenthandler.txt
docs/hooks.txt
includes/AutoLoader.php
includes/Collation.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/HistoryBlob.php
includes/Html.php
includes/Import.php
includes/LinkFilter.php
includes/Linker.php
includes/MimeMagic.php
includes/Revision.php
includes/SeleniumWebSettings.php
includes/SkinTemplate.php
includes/SqlDataUpdate.php
includes/Status.php
includes/Title.php
includes/User.php
includes/Wiki.php
includes/WikiPage.php
includes/actions/InfoAction.php
includes/actions/RawAction.php
includes/api/ApiEditPage.php
includes/api/ApiParse.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryORM.php [new file with mode: 0644]
includes/api/ApiQueryRevisions.php
includes/cache/SquidUpdate.php
includes/content/AbstractContent.php
includes/content/Content.php
includes/content/ContentHandler.php
includes/content/CssContent.php
includes/content/CssContentHandler.php [new file with mode: 0644]
includes/content/JavaScriptContent.php
includes/content/JavaScriptContentHandler.php [new file with mode: 0644]
includes/content/MessageContent.php
includes/content/TextContent.php
includes/content/TextContentHandler.php [new file with mode: 0644]
includes/content/WikitextContent.php
includes/content/WikitextContentHandler.php [new file with mode: 0644]
includes/db/Database.php
includes/diff/DifferenceEngine.php
includes/extauth/MediaWiki.php
includes/filebackend/FSFile.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendStore.php
includes/filebackend/TempFSFile.php
includes/filerepo/FSRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/README
includes/installer/Installer.i18n.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/job/Job.php
includes/job/JobQueue.php [new file with mode: 0644]
includes/job/JobQueueDB.php [new file with mode: 0644]
includes/job/JobQueueGroup.php [new file with mode: 0644]
includes/job/RefreshLinksJob.php
includes/libs/JavaScriptMinifier.php
includes/media/BitmapMetadataHandler.php
includes/media/DjVuImage.php
includes/media/Exif.php
includes/media/GIF.php
includes/media/GIFMetadataExtractor.php
includes/media/JpegMetadataExtractor.php
includes/media/MediaTransformOutput.php
includes/media/PNG.php
includes/media/PNGMetadataExtractor.php
includes/media/SVGMetadataExtractor.php
includes/media/XMPInfo.php
includes/media/XMPValidate.php
includes/normal/Utf8CaseGenerate.php
includes/normal/UtfNormal.php
includes/normal/UtfNormalBench.php
includes/normal/UtfNormalDefines.php
includes/normal/UtfNormalGenerate.php
includes/objectcache/EhcacheBagOStuff.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/MemcachedPhpBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCache.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderNoscriptModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/search/SearchIBM_DB2.php
includes/search/SearchMssql.php
includes/search/SearchOracle.php
includes/site/MediaWikiSite.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/templates/Usercreate.php
languages/messages/MessagesAf.php
languages/messages/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAr.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAz.php
languages/messages/MessagesBa.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBn.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesExt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFit.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesGan_hans.php
languages/messages/MessagesGan_hant.php
languages/messages/MessagesGl.php
languages/messages/MessagesGrc.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesHak.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHif_latn.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesLa.php
languages/messages/MessagesLb.php
languages/messages/MessagesLi.php
languages/messages/MessagesLij.php
languages/messages/MessagesLt.php
languages/messages/MessagesLus.php
languages/messages/MessagesLv.php
languages/messages/MessagesLzh.php
languages/messages/MessagesMai.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMhr.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPam.php
languages/messages/MessagesPcd.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPrg.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesSat.php
languages/messages/MessagesScn.php
languages/messages/MessagesSco.php
languages/messages/MessagesSdc.php
languages/messages/MessagesSe.php
languages/messages/MessagesSh.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSli.php
languages/messages/MessagesSo.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesStq.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTg_latn.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTr.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/MessagesVo.php
languages/messages/MessagesVot.php
languages/messages/MessagesVro.php
languages/messages/MessagesWa.php
languages/messages/MessagesWar.php
languages/messages/MessagesWo.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZea.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/README
maintenance/archives/patch-archive-user-index.sql
maintenance/archives/patch-backlinkindexes.sql
maintenance/archives/patch-category.sql
maintenance/archives/patch-categorylinks.sql
maintenance/archives/patch-categorylinksindex.sql
maintenance/archives/patch-externallinks.sql
maintenance/archives/patch-fa_deleted.sql
maintenance/archives/patch-filearchive-user-index.sql
maintenance/archives/patch-filearchive.sql
maintenance/archives/patch-hitcounter.sql
maintenance/archives/patch-image-user-index.sql
maintenance/archives/patch-img_media_type.sql
maintenance/archives/patch-indexes.sql
maintenance/archives/patch-interwiki.sql
maintenance/archives/patch-ipb_anon_only.sql
maintenance/archives/patch-ipb_by_text.sql
maintenance/archives/patch-ipb_deleted.sql
maintenance/archives/patch-ipb_range_start.sql
maintenance/archives/patch-iwlinks.sql
maintenance/archives/patch-job.sql
maintenance/archives/patch-job_token.sql [new file with mode: 0644]
maintenance/archives/patch-langlinks.sql
maintenance/archives/patch-linktables.sql
maintenance/archives/patch-log_search-rename-index.sql
maintenance/archives/patch-log_user_text.sql
maintenance/archives/patch-logging-times-index.sql
maintenance/archives/patch-logging.sql
maintenance/archives/patch-mime_minor_length.sql
maintenance/archives/patch-msg_resource.sql
maintenance/archives/patch-oi_metadata.sql
maintenance/archives/patch-oldimage-user-index.sql
maintenance/archives/patch-pagelinks.sql
maintenance/archives/patch-parsercache.sql
maintenance/archives/patch-pl-tl-il-unique.sql
maintenance/archives/patch-querycache.sql
maintenance/archives/patch-querycachetwo.sql
maintenance/archives/patch-rc_deleted.sql
maintenance/archives/patch-rc_id.sql
maintenance/archives/patch-rc_ip.sql
maintenance/archives/patch-redirect.sql
maintenance/archives/patch-rename-iwl_prefix.sql
maintenance/archives/patch-restructure.sql
maintenance/archives/patch-searchindex.sql
maintenance/archives/patch-templatelinks.sql
maintenance/archives/patch-testrun.sql
maintenance/archives/patch-uploadstash.sql
maintenance/archives/patch-user-realname.sql
maintenance/archives/patch-user_former_groups.sql
maintenance/archives/patch-user_groups.sql
maintenance/archives/patch-user_properties.sql
maintenance/archives/patch-user_rights.sql
maintenance/cssjanus/README
maintenance/hiphop/make
maintenance/hiphop/run-server
maintenance/ibm_db2/patch-categorylinks-better-collation.sql
maintenance/ibm_db2/patch-user_properties.sql
maintenance/ibm_db2/tables.sql
maintenance/language/messages.inc
maintenance/mssql/tables.sql
maintenance/oracle/archives/patch-testrun.sql
maintenance/postgres/archives/patch-testrun.sql
maintenance/postgres/tables.sql
maintenance/runJobs.php
maintenance/sqlite/archives/patch-job_token.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
maintenance/sqlite/archives/searchindex-fts3.sql
maintenance/sqlite/archives/searchindex-no-fts.sql
maintenance/storage/make-blobs
maintenance/tables.sql
resources/Resources.php
resources/jquery/jquery.autoEllipsis.js
resources/jquery/jquery.highlightText.js
resources/jquery/jquery.tablesorter.js
resources/mediawiki/mediawiki.searchSuggest.js
resources/mediawiki/mediawiki.util.js
skins/CologneBlue.php
skins/Vector.php
skins/common/commonContent.css
skins/common/commonElements.css
skins/common/commonInterface.css
skins/common/images/icons/fileicon-psd.png [new file with mode: 0644]
tests/parser/parserTests.txt
tests/parser/parserTestsParserHook.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/CssContentTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/JavascriptContentTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
tests/phpunit/includes/TextContentTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/WikitextContentTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/filerepo/FileBackendTest.php
tests/phpunit/includes/site/SiteListTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/backup_PageTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js

diff --git a/INSTALL b/INSTALL
index c4bb8be..e393631 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -18,7 +18,7 @@ work on Windows as well.
 
 If your PHP is configured as a CGI plug-in rather than an Apache module you may
 experience problems, as this configuration is not well tested. safe_mode is also
-not tested and unlikely to work. 
+not tested and unlikely to work.
 
 If you want math support see the instructions in math/README
 
@@ -34,7 +34,7 @@ http://www.mediawiki.org/wiki/Manual:Installation_guide
 
 ******************* WARNING *******************
 
-REMEMBER: ALWAYS BACK UP YOUR DATABASE BEFORE 
+REMEMBER: ALWAYS BACK UP YOUR DATABASE BEFORE
 ATTEMPTING TO INSTALL OR UPGRADE!!!
 
 ******************* WARNING *******************
diff --git a/README b/README
index 805b8ee..c9ce5db 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-For system requirements, installation and upgrade details, see the files 
+For system requirements, installation and upgrade details, see the files
 RELEASE-NOTES, INSTALL, and UPGRADE.
 
 == MediaWiki ==
@@ -62,7 +62,7 @@ Sections of code written exclusively by Lee Crocker or Erik Moeller are also
 released into the public domain, which does not impair the obligations of users
 under the GPL for use of the whole code or other sections thereof.
 
-MediaWiki makes use of the Sajax Toolkit by modernmethod, 
+MediaWiki makes use of the Sajax Toolkit by modernmethod,
 http://www.modernmethod.com/sajax/ which has the following license:
 
        'This work is licensed under the Creative Commons Attribution
index d8f6506..8eb6a76 100644 (file)
@@ -26,6 +26,14 @@ production.
 * jQuery UI upgraded from 1.8.23 to 1.8.24.
 * Added separate fa_sha1 field to filearchive table. This allows sha1
   searches with the api in miser mode for deleted files.
+* Add initial and programmatic sorting for tablesorter.
+* Add the event "sortEnd.tablesorter", triggered after sorting has completed.
+* The Job system was refactored to allow for different backing stores for queues
+  as well as cross-wiki access to queues, among other things. The schema for the
+  DB queue was changed to support better concurrency and reduce deadlock errors.
+* Added ApiQueryORM class to facilitate creation of query API modules based on
+  tables that have a corresponding ORMTable class.
+* (bug 40876) Icon for PSD (Adobe Photoshop) file types.
 
 === Bug fixes in 1.21 ===
 * (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
index 6bce634..ba8fe8b 100644 (file)
@@ -12,7 +12,7 @@
  *   } else {
  *       $wgProfiler['class'] = 'ProfilerStub';
  *   }
- * 
+ *
  * Configuration of the profiler output can be done in LocalSettings.php
  */
 
diff --git a/UPGRADE b/UPGRADE
index cdaf4f9..46f5e65 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -53,8 +53,8 @@ deleted file archives, and any custom skins.
 
 ==== From the web ====
 
-If you browse to the web-based installation script (usually at 
-/mw-config/index.php) from your wiki installation you can follow the script and 
+If you browse to the web-based installation script (usually at
+/mw-config/index.php) from your wiki installation you can follow the script and
 upgrade your database in place.
 
 ==== From the command line ====
@@ -141,7 +141,7 @@ the web upgrader.
 
 If you absolutely cannot make the UTF-8 upgrade work, you can try
 doing it by hand: dump your old database, convert the dump file
-using iconv as described here: 
+using iconv as described here:
 http://portal.suse.com/sdb/en/2004/05/jbartsh_utf-8.html
 and then reimport it. You can also convert filenames using convmv,
 but note that the old directory hashes will no longer be valid,
index 5a63460..899554a 100644 (file)
@@ -131,7 +131,7 @@ Page content is stored in the database using the same mechanism as before. Non-t
 appropriate serialization and deserialization is handled by the Revision class.
 
 Each revision's content model and serialization format is stored in the revision table (resp. in the archive table, if
-the revision was deleted). The page's (current) content model (that is, the conent model of the latest revision) is also
+the revision was deleted). The page's (current) content model (that is, the content model of the latest revision) is also
 stored in the page table.
 
 Note however that the content model and format is only stored if it differs from the page's default, as determined by
index 10a341d..46ddcfe 100644 (file)
@@ -502,17 +502,6 @@ $section: (No longer used)
 $flags: Flags passed to WikiPage::doEditContent()
 $revision: New Revision of the article
 
-'PageContentInsertComplete': After a new article is created
-$article: WikiPage created
-$user: User creating the article
-$content: New content as a Content object
-$summary: Edit summary/comment
-$isMinor: Whether or not the edit was marked as minor
-$isWatch: (No longer used)
-$section: (No longer used)
-$flags: Flags passed to WikiPage::doEditContent()
-$revision: New Revision of the article
-
 'ArticleMergeComplete': after merging to article using Special:Mergehistory
 $targetTitle: target title (object)
 $destTitle: destination title (object)
@@ -570,15 +559,6 @@ $isminor: minor flag
 $iswatch: watch flag
 $section: section #
 
-'PageContentSave': before an article is saved.
-$article: the WikiPage (object) being saved
-$user: the user (object) saving the article
-$content: the new article content, as a Content object
-$summary: the article summary (comment)
-$isminor: minor flag
-$iswatch: watch flag
-$section: section #
-
 'ArticleSaveComplete': After an article has been updated. DEPRECATED, use PageContentSaveComplete instead.
 $article: WikiPage modified
 $user: User performing the modification
@@ -592,19 +572,6 @@ $revision: New Revision of the article
 $status: Status object about to be returned by doEditContent()
 $baseRevId: the rev ID (or false) this edit was based on
 
-'PageContentSaveComplete': After an article has been updated
-$article: WikiPage modified
-$user: User performing the modification
-$content: New content, as a Content object
-$summary: Edit summary/comment
-$isMinor: Whether or not the edit was marked as minor
-$isWatch: (No longer used)
-$section: (No longer used)
-$flags: Flags passed to WikiPage::doEditContent()
-$revision: New Revision of the article
-$status: Status object about to be returned by doEditContent()
-$baseRevId: the rev ID (or false) this edit was based on
-
 'ArticleUndelete': When one or more revisions of an article are restored
 $title: Title corresponding to the article restored
 $create: Whether or not the restoration caused the page to be created
@@ -1565,12 +1532,45 @@ $categories: associative array, keys are category names, values are category
 $links: array, intended to hold the result. Must be an associative array with
        category types as keys and arrays of HTML links as values.
 
+'PageContentInsertComplete': After a new article is created
+$article: WikiPage created
+$user: User creating the article
+$content: New content as a Content object
+$summary: Edit summary/comment
+$isMinor: Whether or not the edit was marked as minor
+$isWatch: (No longer used)
+$section: (No longer used)
+$flags: Flags passed to WikiPage::doEditContent()
+$revision: New Revision of the article
+
 'PageContentLanguage': allows changing the language in which the content of
 a page is written. Defaults to the wiki content language ($wgContLang).
 $title: Title object
 &$pageLang: the page content language (either an object or a language code)
 $wgLang: the user language
 
+'PageContentSave': before an article is saved.
+$article: the WikiPage (object) being saved
+$user: the user (object) saving the article
+$content: the new article content, as a Content object
+$summary: the article summary (comment)
+$isminor: minor flag
+$iswatch: watch flag
+$section: section #
+
+'PageContentSaveComplete': After an article has been updated
+$article: WikiPage modified
+$user: User performing the modification
+$content: New content, as a Content object
+$summary: Edit summary/comment
+$isMinor: Whether or not the edit was marked as minor
+$isWatch: (No longer used)
+$section: (No longer used)
+$flags: Flags passed to WikiPage::doEditContent()
+$revision: New Revision of the article
+$status: Status object about to be returned by doEditContent()
+$baseRevId: the rev ID (or false) this edit was based on
+
 'PageHistoryBeforeList': When a history page list is about to be constructed.
 $article: the article that the history is loading for
 
index 3ae5a68..1cf6634 100644 (file)
@@ -294,14 +294,14 @@ $wgAutoloadLocalClasses = array(
        'AbstractContent' => 'includes/content/AbstractContent.php',
        'ContentHandler' => 'includes/content/ContentHandler.php',
        'Content' => 'includes/content/Content.php',
-       'CssContentHandler' => 'includes/content/ContentHandler.php',
+       'CssContentHandler' => 'includes/content/CssContentHandler.php',
        'CssContent' => 'includes/content/CssContent.php',
-       'JavaScriptContentHandler' => 'includes/content/ContentHandler.php',
+       'JavaScriptContentHandler' => 'includes/content/JavaScriptContentHandler.php',
        'JavaScriptContent' => 'includes/content/JavaScriptContent.php',
        'MessageContent' => 'includes/content/MessageContent.php',
-       'TextContentHandler' => 'includes/content/ContentHandler.php',
+       'TextContentHandler' => 'includes/content/TextContentHandler.php',
        'TextContent' => 'includes/content/TextContent.php',
-       'WikitextContentHandler' => 'includes/content/ContentHandler.php',
+       'WikitextContentHandler' => 'includes/content/WikitextContentHandler.php',
        'WikitextContent' => 'includes/content/WikitextContent.php',
 
        # includes/actions
@@ -399,6 +399,7 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryLangLinks' => 'includes/api/ApiQueryLangLinks.php',
        'ApiQueryLinks' => 'includes/api/ApiQueryLinks.php',
        'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
+       'ApiQueryORM' => 'includes/api/ApiQueryORM.php',
        'ApiQueryPageProps' => 'includes/api/ApiQueryPageProps.php',
        'ApiQueryProtectedTitles' => 'includes/api/ApiQueryProtectedTitles.php',
        'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php',
@@ -655,6 +656,9 @@ $wgAutoloadLocalClasses = array(
        'EmaillingJob' => 'includes/job/EmaillingJob.php',
        'EnotifNotifyJob' => 'includes/job/EnotifNotifyJob.php',
        'Job' => 'includes/job/Job.php',
+       'JobQueue' => 'includes/job/JobQueue.php',
+       'JobQueueDB' => 'includes/job/JobQueueDB.php',
+       'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
        'RefreshLinksJob' => 'includes/job/RefreshLinksJob.php',
        'RefreshLinksJob2' => 'includes/job/RefreshLinksJob.php',
        'UploadFromUrlJob' => 'includes/job/UploadFromUrlJob.php',
index 8554c2b..3cc7902 100644 (file)
@@ -335,8 +335,12 @@ class IcuCollation extends Collation {
         *     sorts before all items.
         */
        function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
+               if ( $valueCount === 0 ) {
+                       return false;
+               }
+
                $min = 0;
-               $max = $valueCount - 1;
+               $max = $valueCount;
                do {
                        $mid = $min + ( ( $max - $min ) >> 1 );
                        $item = call_user_func( $valueCallback, $mid );
@@ -351,12 +355,15 @@ class IcuCollation extends Collation {
                        }
                } while ( $min < $max - 1 );
 
-               if ( $min == 0 && $max == 0 && $comparison > 0 ) {
-                       // Before the first item
-                       return false;
-               } else {
-                       return $min;
+               if ( $min == 0 ) {
+                       $item = call_user_func( $valueCallback, $min );
+                       $comparison = call_user_func( $comparisonCallback, $target, $item );
+                       if ( $comparison < 0 ) {
+                               // Before the first item
+                               return false;
+                       }
                }
+               return $min;
        }
 
        static function isCjk( $codepoint ) {
index 320ce62..cea63e0 100644 (file)
@@ -530,6 +530,13 @@ $wgAllowAsyncCopyUploads = false;
  */
 $wgCopyUploadsDomains = array();
 
+/**
+ * Enable copy uploads from Special:Upload. $wgAllowCopyUploads must also be
+ * true. If $wgAllowCopyUploads is true, but this is false, you will only be
+ * able to perform copy uploads from the API or extensions (e.g. UploadWizard).
+ */
+$wgCopyUploadsFromSpecialUpload = false;
+
 /**
  * Proxy to use for copy upload requests.
  * @since 1.20
@@ -1404,9 +1411,9 @@ $wgAllDBsAreLocalhost = false;
  * $wgSharedPrefix is the table prefix for the shared database. It defaults to
  * $wgDBprefix.
  *
- * @deprecated In new code, use the $wiki parameter to wfGetLB() to access 
- *   remote databases. Using wfGetLB() allows the shared database to reside on 
- *   separate servers to the wiki's own database, with suitable configuration 
+ * @deprecated In new code, use the $wiki parameter to wfGetLB() to access
+ *   remote databases. Using wfGetLB() allows the shared database to reside on
+ *   separate servers to the wiki's own database, with suitable configuration
  *   of $wgLBFactoryConf.
  */
 $wgSharedDB = null;
@@ -2060,12 +2067,12 @@ $wgMaxSquidPurgeTitles = 400;
 
 /**
  * Whether to use a Host header in purge requests sent to the proxy servers
- * configured in $wgSquidServers. Set this to false to support Squid 
+ * configured in $wgSquidServers. Set this to false to support Squid
  * configured in forward-proxy mode.
  *
  * If this is set to true, a Host header will be sent, and only the path
  * component of the URL will appear on the request line, as if the request
- * were a non-proxy HTTP 1.1 request. Varnish only supports this style of 
+ * were a non-proxy HTTP 1.1 request. Varnish only supports this style of
  * request. Squid supports this style of request only if reverse-proxy mode
  * (http_port ... accel) is enabled.
  *
@@ -2073,7 +2080,7 @@ $wgMaxSquidPurgeTitles = 400;
  * will be sent in the request line, as is the standard for an HTTP proxy
  * request in both HTTP 1.0 and 1.1. This style of request is not supported
  * by Varnish, but is supported by Squid in either configuration (forward or
- * reverse). 
+ * reverse).
  *
  * @since 1.21
  */
@@ -5424,6 +5431,14 @@ $wgJobClasses = array(
  */
 $wgJobTypesExcludedFromDefaultQueue = array();
 
+/**
+ * Map of job types to configuration arrays.
+ * These settings should be global to all wikis.
+ */
+$wgJobTypeConf = array(
+       'default' => array( 'class' => 'JobQueueDB' ),
+);
+
 /**
  * Additional functions to be performed with updateSpecialPages.
  * Expensive Querypages are already updated.
@@ -6307,7 +6322,23 @@ $wgContentHandlerTextFallback = 'ignore';
  *
  * @since 1.21
  */
-$wgContentHandlerUseDB = true;
+$wgContentHandlerUseDB = false;
+
+/**
+ * Determines which types of text are parsed as wikitext. This does not imply that these kinds
+ * of texts are also rendered as wikitext, it only means that links, magic words, etc will have
+ * the effect on the database they would have on a wikitext page.
+ *
+ * @todo: On the long run, it would be nice to put categories etc into a separate structure,
+ * or at least parse only the contents of comments in the scripts.
+ *
+ * @since 1.21
+ */
+$wgTextModelsToParse = array(
+       CONTENT_MODEL_WIKITEXT,    // Just for completeness, wikitext will always be parsed.
+       CONTENT_MODEL_JAVASCRIPT,  // Make categories etc work, people put them into comments.
+       CONTENT_MODEL_CSS,         // Make categories etc work, people put them into comments.
+);
 
 /**
  * Whether the user must enter their password to change their e-mail address
index 2ddd053..882f318 100644 (file)
@@ -171,11 +171,12 @@ define( 'MW_DATE_ISO', 'ISO 8601' );
 /**@{
  * RecentChange type identifiers
  */
-define( 'RC_EDIT', 0);
-define( 'RC_NEW', 1);
-define( 'RC_MOVE', 2); // obsolete
-define( 'RC_LOG', 3);
-define( 'RC_MOVE_OVER_REDIRECT', 4); // obsolete
+define( 'RC_EDIT', 0 );
+define( 'RC_NEW', 1 );
+define( 'RC_MOVE', 2 ); // obsolete
+define( 'RC_LOG', 3 );
+define( 'RC_MOVE_OVER_REDIRECT', 4 ); // obsolete
+define( 'RC_EXTERNAL', 5 );
 /**@}*/
 
 /**@{
index cc41b02..17335e4 100644 (file)
@@ -471,7 +471,7 @@ class EditPage {
                $content = $this->getContentObject();
 
                # Use the normal message if there's nothing to display
-               if ( $this->firsttime && $content->isEmpty() ) {
+               if ( $this->firsttime && ( !$content || $content->isEmpty() ) ) {
                        $action = $this->mTitle->exists() ? 'edit' :
                                ( $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage' );
                        throw new PermissionsError( $action, $permErrors );
@@ -776,6 +776,9 @@ class EditPage {
                $this->edittime = $this->mArticle->getTimestamp();
 
                $content = $this->getContentObject( false ); #TODO: track content object?!
+               if ( $content === false ) {
+                       return false;
+               }
                $this->textbox1 = $this->toEditText( $content );
 
                // activate checkboxes if user wants them to be always active
@@ -803,7 +806,7 @@ class EditPage {
        /**
         * Fetch initial editing page content.
         *
-        * @param $def_text string
+        * @param $def_text string|bool
         * @return mixed string on success, $def_text for invalid sections
         * @private
         * @deprecated since 1.21, get WikiPage::getContent() instead.
@@ -824,7 +827,7 @@ class EditPage {
        }
 
        /**
-        * @param Content|false $def_content The default value to return
+        * @param Content|null $def_content The default value to return
         *
         * @return mixed Content on success, $def_content for invalid sections
         *
@@ -937,11 +940,11 @@ class EditPage {
         * to the original text of the edit.
         *
         * This difers from Article::getContent() that when a missing revision is
-        * encountered the result will be an empty string and not the
+        * encountered the result will be null and not the
         * 'missing-revision' message.
         *
         * @since 1.19
-        * @return string
+        * @return Content|null
         */
        private function getOriginalContent() {
                if ( $this->section == 'new' ) {
@@ -1071,6 +1074,10 @@ class EditPage {
                $parserOptions = ParserOptions::newFromUser( $wgUser );
                $content = $page->getContent( Revision::RAW );
 
+               if ( !$content ) {
+                       return $handler->makeEmptyContent();
+               }
+
                return $content->preloadTransform( $title, $parserOptions );
        }
 
@@ -1652,17 +1659,15 @@ class EditPage {
                if ( $ok ) {
                        $editText = $this->toEditText( $editContent );
                        return true;
-               } else {
-                       return false;
                }
+               return false;
        }
 
        /**
         * @private
         * @todo document
         *
-        * @parma $editText string
-        *
+        * @param $editContent
         * @return bool
         * @since since 1.WD
         */
@@ -1673,19 +1678,21 @@ class EditPage {
 
                // This is the revision the editor started from
                $baseRevision = $this->getBaseRevision();
-               if ( is_null( $baseRevision ) ) {
+               $baseContent = $baseRevision ? $baseRevision->getContent() : null;
+
+               if ( is_null( $baseContent ) ) {
                        wfProfileOut( __METHOD__ );
                        return false;
                }
-               $baseContent = $baseRevision->getContent();
 
                // The current state, we want to merge updates into it
                $currentRevision = Revision::loadFromTitle( $db, $this->mTitle );
-               if ( is_null( $currentRevision ) ) {
+               $currentContent = $currentRevision ? $currentRevision->getContent() : null;
+
+               if ( is_null( $currentContent ) ) {
                        wfProfileOut( __METHOD__ );
                        return false;
                }
-               $currentContent = $currentRevision->getContent();
 
                $handler = ContentHandler::getForModelID( $baseContent->getModel() );
 
@@ -1862,10 +1869,13 @@ class EditPage {
                # Give a notice if the user is editing a deleted/moved page...
                if ( !$this->mTitle->exists() ) {
                        LogEventsList::showLogExtract( $wgOut, array( 'delete', 'move' ), $this->mTitle,
-                               '', array( 'lim' => 10,
-                                          'conds' => array( "log_action != 'revision'" ),
-                                          'showIfEmpty' => false,
-                                          'msgKey' => array( 'recreate-moveddeleted-warn' ) )
+                               '',
+                               array(
+                                       'lim' => 10,
+                                       'conds' => array( "log_action != 'revision'" ),
+                                       'showIfEmpty' => false,
+                                       'msgKey' => array( 'recreate-moveddeleted-warn' )
+                               )
                        );
                }
        }
@@ -1883,29 +1893,36 @@ class EditPage {
                                // Added using template syntax, to take <noinclude>'s into account.
                                $wgOut->addWikiTextTitleTidy( '{{:' . $title->getFullText() . '}}', $this->mTitle );
                                return true;
-                       } else {
-                               return false;
                        }
-               } else {
-                       return false;
                }
+               return false;
        }
 
        /**
-        * Gets an editable textual representation of the given Content object.
+        * Gets an editable textual representation of $content.
         * The textual representation can be turned by into a Content object by the
         * toEditContent() method.
         *
+        * If $content is null or false or a string, $content is returned unchanged.
+        *
         * If the given Content object is not of a type that can be edited using the text base EditPage,
         * an exception will be raised. Set $this->allowNonTextContent to true to allow editing of non-textual
         * content.
         *
-        * @param Content $content
+        * @param Content|null|false|string $content
         * @return String the editable text form of the content.
         *
         * @throws MWException if $content is not an instance of TextContent and $this->allowNonTextContent is not true.
         */
-       protected function toEditText( Content $content ) {
+       protected function toEditText( $content ) {
+               if ( $content === null || $content === false ) {
+                       return $content;
+               }
+
+               if ( is_string( $content ) ) {
+                       return $content;
+               }
+
                if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
                        throw new MWException( "This content model can not be edited as text: "
                                                                . ContentHandler::getLocalizedName( $content->getModel() ) );
@@ -1921,7 +1938,7 @@ class EditPage {
         * an exception will be raised. Set $this->allowNonTextContent to true to allow editing of non-textual
         * content.
         *
-        * @param String|null|false $text Text to unserialize
+        * @param String|null|bool $text Text to unserialize
         * @return Content The content object created from $text. If $text was false or null, false resp. null will be
         *                 returned instead.
         *
@@ -1946,7 +1963,7 @@ class EditPage {
 
        /**
         * Send the edit form and related headers to $wgOut
-        * @param $formCallback Callback that takes an OutputPage parameter; will be called
+        * @param $formCallback Callback|null that takes an OutputPage parameter; will be called
         *     during form output near the top, for captchas and the like.
         */
        function showEditForm( $formCallback = null ) {
@@ -2523,8 +2540,9 @@ HTML
        protected function displayPreviewArea( $previewOutput, $isOnTop = false ) {
                global $wgOut;
                $classes = array();
-               if ( $isOnTop )
+               if ( $isOnTop ) {
                        $classes[] = 'ontop';
+               }
 
                $attribs = array( 'id' => 'wikiPreview', 'class' => implode( ' ', $classes ) );
 
@@ -2577,7 +2595,7 @@ HTML
         * save and then make a comparison.
         */
        function showDiff() {
-               global $wgUser, $wgContLang, $wgParser, $wgOut;
+               global $wgUser, $wgContLang, $wgOut;
 
                $oldtitlemsg = 'currentrev';
                # if message does not exist, show diff against the preloaded default
@@ -2599,16 +2617,26 @@ HTML
                                                        $this->section, $textboxContent,
                                                        $this->summary, $this->edittime );
 
-               ContentHandler::runLegacyHooks( 'EditPageGetDiffText', array( $this, &$newContent ) );
-               wfRunHooks( 'EditPageGetDiffContent', array( $this, &$newContent ) );
+               if ( $newContent ) {
+                       ContentHandler::runLegacyHooks( 'EditPageGetDiffText', array( $this, &$newContent ) );
+                       wfRunHooks( 'EditPageGetDiffContent', array( $this, &$newContent ) );
 
-               $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
-               $newContent = $newContent->preSaveTransform( $this->mTitle, $wgUser, $popts );
+                       $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
+                       $newContent = $newContent->preSaveTransform( $this->mTitle, $wgUser, $popts );
+               }
 
                if ( ( $oldContent && !$oldContent->isEmpty() ) || ( $newContent && !$newContent->isEmpty() ) ) {
                        $oldtitle = wfMessage( $oldtitlemsg )->parse();
                        $newtitle = wfMessage( 'yourtext' )->parse();
 
+                       if ( !$oldContent ) {
+                               $oldContent = $newContent->getContentHandler()->makeEmptyContent();
+                       }
+
+                       if ( !$newContent ) {
+                               $newContent = $oldContent->getContentHandler()->makeEmptyContent();
+                       }
+
                        $de = $oldContent->getContentHandler()->createDifferenceEngine( $this->mArticle->getContext() );
                        $de->setContent( $oldContent, $newContent );
 
@@ -2838,7 +2866,7 @@ HTML
         * @return string
         */
        function getPreviewText() {
-               global $wgOut, $wgUser, $wgParser, $wgRawHtml, $wgLang;
+               global $wgOut, $wgUser, $wgRawHtml, $wgLang;
 
                wfProfileIn( __METHOD__ );
 
@@ -3336,7 +3364,7 @@ HTML
        /**
         * Produce the stock "your edit contains spam" page
         *
-        * @param $match string Text which triggered one or more filters
+        * @param $match string|bool Text which triggered one or more filters
         * @deprecated since 1.17 Use method spamPageWithContent() instead
         */
        static function spamPage( $match = false ) {
index bb8ec5e..05c27fe 100644 (file)
  *
  * @file
  */
+
 /**
- * Base class for general text storage via the "object" flag in old_flags, or 
- * two-part external storage URLs. Used for represent efficient concatenated 
+ * Base class for general text storage via the "object" flag in old_flags, or
+ * two-part external storage URLs. Used for represent efficient concatenated
  * storage, and migration-related pointer objects.
  */
 interface HistoryBlob
@@ -178,7 +178,7 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
         * @return bool
         */
        public function isHappy() {
-               return $this->mSize < $this->mMaxSize 
+               return $this->mSize < $this->mMaxSize
                        && count( $this->mItems ) < $this->mMaxCount;
        }
 }
@@ -341,12 +341,12 @@ class DiffHistoryBlob implements HistoryBlob {
        /** Total uncompressed size */
        var $mSize = 0;
 
-       /** 
-        * Array of diffs. If a diff D from A to B is notated D = B - A, and Z is 
+       /**
+        * Array of diffs. If a diff D from A to B is notated D = B - A, and Z is
         * an empty string:
         *
         *              { item[map[i]] - item[map[i-1]]   where i > 0
-        *    diff[i] = { 
+        *    diff[i] = {
         *              { item[map[i]] - Z                where i = 0
         */
        var $mDiffs;
@@ -379,7 +379,7 @@ class DiffHistoryBlob implements HistoryBlob {
         * The maximum number of text items before the object becomes sad
         */
        var $mMaxCount = 100;
-       
+
        /** Constants from xdiff.h */
        const XDL_BDOP_INS = 1;
        const XDL_BDOP_CPY = 2;
@@ -433,7 +433,7 @@ class DiffHistoryBlob implements HistoryBlob {
         * @throws MWException
         */
        function compress() {
-               if ( !function_exists( 'xdiff_string_rabdiff' ) ){ 
+               if ( !function_exists( 'xdiff_string_rabdiff' ) ){
                        throw new MWException( "Need xdiff 1.5+ support to write DiffHistoryBlob\n" );
                }
                if ( isset( $this->mDiffs ) ) {
@@ -534,7 +534,7 @@ class DiffHistoryBlob implements HistoryBlob {
                # Pure PHP implementation
 
                $header = unpack( 'Vofp/Vcsize', substr( $diff, 0, 8 ) );
-               
+
                # Check the checksum if hash/mhash is available
                $ofp = $this->xdiffAdler32( $base );
                if ( $ofp !== false && $ofp !== substr( $diff, 0, 4 ) ) {
@@ -545,7 +545,7 @@ class DiffHistoryBlob implements HistoryBlob {
                        wfDebug( __METHOD__. ": incorrect base length\n" );
                        return false;
                }
-               
+
                $p = 8;
                $out = '';
                while ( $p < strlen( $diff ) ) {
@@ -579,7 +579,7 @@ class DiffHistoryBlob implements HistoryBlob {
        }
 
        /**
-        * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with 
+        * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
         * the bytes backwards and initialised with 0 instead of 1. See bug 34428.
         *
         * Returns false if no hashing library is available
@@ -589,8 +589,8 @@ class DiffHistoryBlob implements HistoryBlob {
                if ( $init === null ) {
                        $init = str_repeat( "\xf0", 205 ) . "\xee" . str_repeat( "\xf0", 67 ) . "\x02";
                }
-               // The real Adler-32 checksum of $init is zero, so it initialises the 
-               // state to zero, as it is at the start of LibXDiff's checksum 
+               // The real Adler-32 checksum of $init is zero, so it initialises the
+               // state to zero, as it is at the start of LibXDiff's checksum
                // algorithm. Appending the subject string then simulates LibXDiff.
                if ( function_exists( 'hash' ) ) {
                        $hash = hash( 'adler32', $init . $s, true );
@@ -664,7 +664,7 @@ class DiffHistoryBlob implements HistoryBlob {
                if ( isset( $info['base'] ) ) {
                        // Old format
                        $this->mDiffMap = range( 0, count( $this->mDiffs ) - 1 );
-                       array_unshift( $this->mDiffs, 
+                       array_unshift( $this->mDiffs,
                                pack( 'VVCV', 0, 0, self::XDL_BDOP_INSB, strlen( $info['base'] ) ) .
                                $info['base'] );
                } else {
@@ -687,7 +687,7 @@ class DiffHistoryBlob implements HistoryBlob {
         * @return bool
         */
        function isHappy() {
-               return $this->mSize < $this->mMaxSize 
+               return $this->mSize < $this->mMaxSize
                        && count( $this->mItems ) < $this->mMaxCount;
        }
 
index a07dd4c..5be67ab 100644 (file)
@@ -480,7 +480,7 @@ class Html {
                                'class', // html4, html5
                                'accesskey', // as of html5, multiple space-separated values allowed
                                // html4-spec doesn't document rel= as space-separated
-                               // but has been used like that and is now documented as such 
+                               // but has been used like that and is now documented as such
                                // in the html5-spec.
                                'rel',
                        );
@@ -493,7 +493,6 @@ class Html {
                                // values. Implode/explode to get those into the main array as well.
                                if ( is_array( $value ) ) {
                                        // If input wasn't an array, we can skip this step
-                                       
                                        $newValue = array();
                                        foreach ( $value as $k => $v ) {
                                                if ( is_string( $v ) ) {
@@ -576,7 +575,6 @@ class Html {
                                        # @todo FIXME: Is this really true?
                                        $map['<'] = '&lt;';
                                }
-                               
                                $ret .= " $key=$quote" . strtr( $value, $map ) . $quote;
                        }
                }
index 7cc6fb1..71498ac 100644 (file)
@@ -660,7 +660,7 @@ class WikiImporter {
                if ( isset( $revisionInfo['model'] ) ) {
                        $revision->setModel( $revisionInfo['model'] );
                }
-               if ( isset( $revisionInfo['text'] ) ) {
+               if ( isset( $revisionInfo['format'] ) ) {
                        $revision->setFormat( $revisionInfo['format'] );
                }
                $revision->setTitle( $pageInfo['_title'] );
index b19f6c4..c2f6b1e 100644 (file)
@@ -23,7 +23,7 @@
 
 /**
  * Some functions to help implement an external link filter for spam control.
- * 
+ *
  * @todo implement the filter. Currently these are just some functions to help
  * maintenance/cleanupSpam.php remove links to a single specified domain. The
  * next thing is to implement functions for checking a given page against a big
@@ -119,17 +119,17 @@ class LinkFilter {
                // Reverse the labels in the hostname, convert to lower case
                // For emails reverse domainpart only
                if ( $prot == 'mailto:' && strpos($host, '@') ) {
-                       // complete email adress 
+                       // complete email adress
                        $mailparts = explode( '@', $host );
                        $domainpart = strtolower( implode( '.', array_reverse( explode( '.', $mailparts[1] ) ) ) );
                        $host = $domainpart . '@' . $mailparts[0];
                        $like = array( "$prot$host", $db->anyString() );
                } elseif ( $prot == 'mailto:' ) {
                        // domainpart of email adress only. do not add '.'
-                       $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );   
-                       $like = array( "$prot$host", $db->anyString() );                        
+                       $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
+                       $like = array( "$prot$host", $db->anyString() );
                } else {
-                       $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );   
+                       $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
                        if ( substr( $host, -1, 1 ) !== '.' ) {
                                $host .= '.';
                        }
index 0f45165..28c5985 100644 (file)
@@ -1113,8 +1113,11 @@ class Linker {
                        // check if the user has an edit
                        $attribs = array();
                        if ( $redContribsWhenNoEdits ) {
-                               $count = !is_null( $edits ) ? $edits : User::edits( $userId );
-                               if ( $count == 0 ) {
+                               if ( intval( $edits ) === 0 && $edits !== 0 ) {
+                                       $user = User::newFromId( $userId );
+                                       $edits = $user->getEditCount();
+                               }
+                               if ( $edits === 0 ) {
                                        $attribs['class'] = 'new';
                                }
                        }
@@ -1761,7 +1764,7 @@ class Linker {
         */
        public static function buildRollbackLink( $rev, IContextSource $context = null ) {
                global $wgShowRollbackEditCount, $wgMiserMode;
-               
+
                // To config which pages are effected by miser mode
                $disableRollbackEditCountSpecialPage = array( 'Recentchanges', 'Watchlist' );
 
@@ -2118,7 +2121,7 @@ class Linker {
         */
        static function makeBrokenLink( $title, $text = '', $query = '', $trail = '' ) {
                wfDeprecated( __METHOD__, '1.16' );
-               
+
                $nt = Title::newFromText( $title );
                if ( $nt instanceof Title ) {
                        return self::makeBrokenLinkObj( $nt, $text, $query, $trail );
@@ -2147,7 +2150,7 @@ class Linker {
         */
        static function makeLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
                # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
-               
+
                wfProfileIn( __METHOD__ );
                $query = wfCgiToArray( $query );
                list( $inside, $trail ) = self::splitTrail( $trail );
@@ -2181,7 +2184,7 @@ class Linker {
                $title, $text = '', $query = '', $trail = '', $prefix = '' , $aprops = '', $style = ''
        ) {
                # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
-               
+
                wfProfileIn( __METHOD__ );
 
                if ( $text == '' ) {
@@ -2217,7 +2220,7 @@ class Linker {
         */
        static function makeBrokenLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '' ) {
                wfDeprecated( __METHOD__, '1.16' );
-               
+
                wfProfileIn( __METHOD__ );
 
                list( $inside, $trail ) = self::splitTrail( $trail );
@@ -2249,7 +2252,7 @@ class Linker {
         */
        static function makeColouredLinkObj( $nt, $colour, $text = '', $query = '', $trail = '', $prefix = '' ) {
                wfDeprecated( __METHOD__, '1.16' );
-               
+
                if ( $colour != '' ) {
                        $style = self::getInternalLinkAttributesObj( $nt, $text, $colour );
                } else {
index 1873e7b..88383d8 100644 (file)
  * This is used as a fallback to mime.types files.
  * An extensive list of well known mime types is provided by
  * the file mime.types in the includes directory.
- * 
+ *
  * This list concatenated with mime.types is used to create a mime <-> ext
  * map. Each line contains a mime type followed by a space separated list of
- * extensions. If multiple extensions for a single mime type exist or if 
+ * extensions. If multiple extensions for a single mime type exist or if
  * multiple mime types exist for a single extension then in most cases
  * MediaWiki assumes that the first extension following the mime type is the
  * canonical extension, and the first time a mime type appears for a certain
  * extension is considered the canonical mime type.
- * 
+ *
  * (Note that appending $wgMimeTypeFile to the end of MM_WELL_KNOWN_MIME_TYPES
- * sucks because you can't redefine canonical types. This could be fixed by 
+ * sucks because you can't redefine canonical types. This could be fixed by
  * appending MM_WELL_KNOWN_MIME_TYPES behind $wgMimeTypeFile, but who knows
  * what will break? In practice this probably isn't a problem anyway -- Bryan)
  */
@@ -70,7 +70,7 @@ image/x-bmp bmp
 image/gif gif
 image/jpeg jpeg jpg jpe
 image/png png
-image/svg+xml svg 
+image/svg+xml svg
 image/svg svg
 image/tiff tiff tif
 image/vnd.djvu djvu
@@ -352,11 +352,11 @@ class MimeMagic {
                return self::$instance;
        }
 
-       /** 
-        * Returns a list of file extensions for a given mime type as a space 
+       /**
+        * Returns a list of file extensions for a given mime type as a space
         * separated string or null if the mime type was unrecognized. Resolves
         * mime type aliases.
-        * 
+        *
         * @param $mime string
         * @return string|null
         */
@@ -379,10 +379,10 @@ class MimeMagic {
                return null;
        }
 
-       /** 
-        * Returns a list of mime types for a given file extension as a space 
+       /**
+        * Returns a list of mime types for a given file extension as a space
         * separated string or null if the extension was unrecognized.
-        * 
+        *
         * @param $ext string
         * @return string|null
         */
@@ -393,10 +393,10 @@ class MimeMagic {
                return $r;
        }
 
-       /** 
+       /**
         * Returns a single mime type for a given file extension or null if unknown.
         * This is always the first type from the list returned by getTypesForExtension($ext).
-        * 
+        *
         * @param $ext string
         * @return string|null
         */
@@ -414,11 +414,11 @@ class MimeMagic {
        }
 
 
-       /** 
-        * Tests if the extension matches the given mime type. Returns true if a 
-        * match was found, null if the mime type is unknown, and false if the 
+       /**
+        * Tests if the extension matches the given mime type. Returns true if a
+        * match was found, null if the mime type is unknown, and false if the
         * mime type is known but no matches where found.
-        * 
+        *
         * @param $extension string
         * @param $mime string
         * @return bool|null
@@ -436,12 +436,12 @@ class MimeMagic {
                return  in_array( $extension, $ext );
        }
 
-       /** 
-        * Returns true if the mime type is known to represent an image format 
+       /**
+        * Returns true if the mime type is known to represent an image format
         * supported by the PHP GD library.
         *
         * @param $mime string
-        * 
+        *
         * @return bool
         */
        public function isPHPImageType( $mime ) {
@@ -489,19 +489,19 @@ class MimeMagic {
                return in_array( strtolower( $extension ), $types );
        }
 
-       /** 
+       /**
         * Improves a mime type using the file extension. Some file formats are very generic,
-        * so their mime type is not very meaningful. A more useful mime type can be derived 
-        * by looking at the file extension. Typically, this method would be called on the 
+        * so their mime type is not very meaningful. A more useful mime type can be derived
+        * by looking at the file extension. Typically, this method would be called on the
         * result of guessMimeType().
-        * 
+        *
         * Currently, this method does the following:
         *
         * If $mime is "unknown/unknown" and isRecognizableExtension( $ext ) returns false,
-        * return the result of guessTypesForExtension($ext). 
+        * return the result of guessTypesForExtension($ext).
         *
         * If $mime is "application/x-opc+zip" and isMatchingExtension( $ext, $mime )
-        * gives true, return the result of guessTypesForExtension($ext). 
+        * gives true, return the result of guessTypesForExtension($ext).
         *
         * @param $mime String: the mime type, typically guessed from a file's content.
         * @param $ext String: the file extension, as taken from the file name
@@ -511,10 +511,10 @@ class MimeMagic {
        public function improveTypeFromExtension( $mime, $ext ) {
                if ( $mime === 'unknown/unknown' ) {
                        if ( $this->isRecognizableExtension( $ext ) ) {
-                               wfDebug( __METHOD__. ': refusing to guess mime type for .' . 
+                               wfDebug( __METHOD__. ': refusing to guess mime type for .' .
                                        "$ext file, we should have recognized it\n" );
                        } else {
-                               // Not something we can detect, so simply 
+                               // Not something we can detect, so simply
                                // trust the file extension
                                $mime = $this->guessTypesForExtension( $ext );
                        }
@@ -525,7 +525,7 @@ class MimeMagic {
                                // find the proper mime type for that file extension
                                $mime = $this->guessTypesForExtension( $ext );
                        } else {
-                               wfDebug( __METHOD__. ": refusing to guess better type for $mime file, " . 
+                               wfDebug( __METHOD__. ": refusing to guess better type for $mime file, " .
                                        ".$ext is not a known OPC extension.\n" );
                                $mime = 'application/zip';
                        }
@@ -539,16 +539,16 @@ class MimeMagic {
                return $mime;
        }
 
-       /** 
-        * Mime type detection. This uses detectMimeType to detect the mime type 
-        * of the file, but applies additional checks to determine some well known 
-        * file formats that may be missed or misinterpreter by the default mime 
-        * detection (namely XML based formats like XHTML or SVG, as well as ZIP 
+       /**
+        * Mime type detection. This uses detectMimeType to detect the mime type
+        * of the file, but applies additional checks to determine some well known
+        * file formats that may be missed or misinterpreter by the default mime
+        * detection (namely XML based formats like XHTML or SVG, as well as ZIP
         * based formats like OPC/ODF files).
         *
         * @param $file String: the file to check
         * @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
-        *             Set it to false to ignore the extension. DEPRECATED! Set to false, use 
+        *             Set it to false to ignore the extension. DEPRECATED! Set to false, use
         *             improveTypeFromExtension($mime, $ext) later to improve mime type.
         *
         * @return string the mime type of $file
@@ -587,7 +587,7 @@ class MimeMagic {
                // @todo FIXME: Shouldn't this be rb?
                $f = fopen( $file, 'rt' );
                wfRestoreWarnings();
-               
+
                if( !$f ) {
                        return 'unknown/unknown';
                }
@@ -750,7 +750,7 @@ class MimeMagic {
 
                return false;
        }
-       
+
        /**
         * Detect application-specific file type of a given ZIP file from its
         * header data.  Currently works for OpenDocument and OpenXML types...
@@ -759,7 +759,7 @@ class MimeMagic {
         * @param $header String: some reasonably-sized chunk of file header
         * @param $tail   String: the tail of the file
         * @param $ext Mixed: the file extension, or true to extract it from the filename.
-        *             Set it to false (default) to ignore the extension. DEPRECATED! Set to false, 
+        *             Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
         *             use improveTypeFromExtension($mime, $ext) later to improve mime type.
         *
         * @return string
@@ -800,8 +800,8 @@ class MimeMagic {
                        wfDebug( __METHOD__.": detected $mime from ZIP archive\n" );
                } elseif ( preg_match( $openxmlRegex, substr( $header, 30 ) ) ) {
                        $mime = "application/x-opc+zip";
-                       # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere 
-                       if ( $ext !== true && $ext !== false ) { 
+                       # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
+                       if ( $ext !== true && $ext !== false ) {
                                /** This is the mode used by getPropsFromPath
                                * These mime's are stored in the database, where we don't really want
                                * x-opc+zip, because we use it only for internal purposes
@@ -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" && 
+               } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
                                ($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) ) {
                                case "\xEC\xA5\xC1\x00\x0E\x00":
                                case "\xEC\xA5\xC1\x00\x1C\x00":
@@ -850,20 +850,20 @@ class MimeMagic {
                return $mime;
        }
 
-       /** 
-        * Internal mime type detection. Detection is done using an external 
-        * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo 
-        * extension and mime_content_type are tried (in this order), if they 
-        * are available. If the dections fails and $ext is not false, the mime 
+       /**
+        * Internal mime type detection. Detection is done using an external
+        * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo
+        * extension and mime_content_type are tried (in this order), if they
+        * are available. If the dections fails and $ext is not false, the mime
         * type is guessed from the file extension, using guessTypesForExtension.
-        * 
-        * If the mime type is still unknown, getimagesize is used to detect the 
-        * mime type if the file is an image. If no mime type can be determined, 
+        *
+        * If the mime type is still unknown, getimagesize is used to detect the
+        * mime type if the file is an image. If no mime type can be determined,
         * this function returns 'unknown/unknown'.
         *
         * @param $file String: the file to check
         * @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
-        *             Set it to false to ignore the extension. DEPRECATED! Set to false, use 
+        *             Set it to false to ignore the extension. DEPRECATED! Set to false, use
         *             improveTypeFromExtension($mime, $ext) later to improve mime type.
         *
         * @return string the mime type of $file
@@ -1037,7 +1037,7 @@ class MimeMagic {
                return $type;
        }
 
-       /** 
+       /**
         * Returns a media code matching the given mime type or file extension.
         * File extensions are represented by a string starting with a dot (.) to
         * distinguish them from mime types.
@@ -1047,7 +1047,7 @@ class MimeMagic {
         * @return int|string
         */
        function findMediaType( $extMime ) {
-               if ( strpos( $extMime, '.' ) === 0 ) { 
+               if ( strpos( $extMime, '.' ) === 0 ) {
                        // If it's an extension, look up the mime types
                        $m = $this->getTypesForExtension( substr( $extMime, 1 ) );
                        if ( !$m ) {
@@ -1076,7 +1076,7 @@ class MimeMagic {
        }
 
        /**
-        * Get the MIME types that various versions of Internet Explorer would 
+        * Get the MIME types that various versions of Internet Explorer would
         * detect from a chunk of the content.
         *
         * @param $fileName String: the file name (unused at present)
index 2bc98c6..984da69 100644 (file)
  */
 class Revision implements IDBAccessObject {
        protected $mId;
+
+       /**
+        * @var int|null
+        */
        protected $mPage;
        protected $mUserText;
        protected $mOrigUserText;
@@ -38,11 +42,23 @@ class Revision implements IDBAccessObject {
        protected $mComment;
        protected $mText;
        protected $mTextRow;
+
+       /**
+        * @var null|Title
+        */
        protected $mTitle;
        protected $mCurrent;
        protected $mContentModel;
        protected $mContentFormat;
+
+       /**
+        * @var Content
+        */
        protected $mContent;
+
+       /**
+        * @var null|ContentHandler
+        */
        protected $mContentHandler;
 
        // Revision deletion constants
@@ -87,7 +103,7 @@ class Revision implements IDBAccessObject {
         * @param $flags Integer Bitfield (optional)
         * @return Revision or null
         */
-       public static function newFromTitle( $title, $id = 0, $flags = null ) {
+       public static function newFromTitle( $title, $id = 0, $flags = 0 ) {
                $conds = array(
                        'page_namespace' => $title->getNamespace(),
                        'page_title'     => $title->getDBkey()
@@ -98,8 +114,6 @@ class Revision implements IDBAccessObject {
                } else {
                        // Use a join to get the latest revision
                        $conds[] = 'rev_id=page_latest';
-                       // Callers assume this will be up-to-date
-                       $flags = is_int( $flags ) ? $flags : self::READ_LATEST; // b/c
                }
                return self::newFromConds( $conds, (int)$flags );
        }
@@ -910,7 +924,7 @@ class Revision implements IDBAccessObject {
         * @param $user User object to check for, only if FOR_THIS_USER is passed
         *              to the $audience parameter
         * @since 1.21
-        * @return Content
+        * @return Content|null
         */
        public function getContent( $audience = self::FOR_PUBLIC, User $user = null ) {
                if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
@@ -943,7 +957,6 @@ class Revision implements IDBAccessObject {
         */
        public function getRawText() {
                ContentHandler::deprecated( __METHOD__, "1.21" );
-
                return $this->getText( self::RAW );
        }
 
@@ -969,7 +982,6 @@ class Revision implements IDBAccessObject {
 
                        $handler = $this->getContentHandler();
                        $format = $this->getContentFormat();
-                       $title = $this->getTitle();
 
                        if( is_null( $this->mText ) ) {
                                // Load text on demand:
@@ -1024,6 +1036,7 @@ class Revision implements IDBAccessObject {
        /**
         * Returns the content handler appropriate for this revision's content model.
         *
+        * @throws MWException
         * @return ContentHandler
         */
        public function getContentHandler() {
index 7b98568..0e4decf 100644 (file)
@@ -38,7 +38,7 @@ $cookieName = $cookiePrefix . 'Selenium';
 // this is a fallback SQL file
 $testSqlFile = false;
 $testImageZip = false;
-       
+
 // if we find a request parameter containing the test name, set a cookie with the test name
 if ( isset( $_GET['setupTestSuite'] ) ) {
        $setupTestSuiteName = $_GET['setupTestSuite'];
@@ -62,7 +62,7 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
                        true
                );
        }
-       
+
        $testIncludes = array(); // array containing all the includes needed for this test
        $testGlobalConfigs = array(); // an array containg all the global configs needed for this test
        $testResourceFiles = array(); // an array containing all the resource files needed for this test
@@ -72,11 +72,11 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
        if ( isset( $testResourceFiles['images'] ) ) {
                $testImageZip = $testResourceFiles['images'];
        }
-       
+
        if ( isset( $testResourceFiles['db'] ) ) {
                $testSqlFile = $testResourceFiles['db'];
                $testResourceName = getTestResourceNameFromTestSuiteName( $setupTestSuiteName );
-       
+
                switchToTestResources( $testResourceName, false ); // false means do not switch database yet
                setupTestResources( $testResourceName, $testSqlFile, $testImageZip );
        }
@@ -86,7 +86,7 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
 if ( isset( $_GET['clearTestSuite'] ) ) {
        $testSuiteName = getTestSuiteNameFromCookie( $cookieName );
 
-       $expire = time() - 600; 
+       $expire = time() - 600;
        setcookie(
                $cookieName,
                '',
@@ -96,22 +96,22 @@ if ( isset( $_GET['clearTestSuite'] ) ) {
                $wgCookieSecure,
                true
        );
-       
+
        $testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
        teardownTestResources( $testResourceName );
 }
 
 // if a cookie is found, run the appropriate callback to get the config params.
-if ( isset( $_COOKIE[$cookieName] ) ) {                
+if ( isset( $_COOKIE[$cookieName] ) ) {
        $testSuiteName = getTestSuiteNameFromCookie( $cookieName );
        if ( !isset( $wgSeleniumTestConfigs[$testSuiteName] ) ) {
                return;
        }
-       
+
        $testIncludes = array(); // array containing all the includes needed for this test
        $testGlobalConfigs = array(); // an array containg all the global configs needed for this test
        $testResourceFiles = array(); // an array containing all the resource files needed for this test
-       $callback = $wgSeleniumTestConfigs[$testSuiteName]; 
+       $callback = $wgSeleniumTestConfigs[$testSuiteName];
        call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
 
        if ( isset( $testResourceFiles['db'] ) ) {
@@ -123,9 +123,8 @@ if ( isset( $_COOKIE[$cookieName] ) ) {
                require_once( $file );
        }
        foreach ( $testGlobalConfigs as $key => $value ) {
-               if ( is_array( $value ) ) {             
+               if ( is_array( $value ) ) {
                        $GLOBALS[$key] = array_merge( $GLOBALS[$key], $value );
-                       
                } else {
                        $GLOBALS[$key] = $value;
                }
@@ -166,7 +165,7 @@ function setupTestResources( $testResourceName, $testSqlFile, $testImageZip ) {
        if ( $testResourceName == '' ) {
                die( 'Cannot identify a test the resources should be installed for.' );
        }
-       
+
        // create tables
        $dbw = wfGetDB( DB_MASTER );
        $dbw->query( 'DROP DATABASE IF EXISTS ' . $testResourceName );
index 6233228..5a32d47 100644 (file)
@@ -1444,6 +1444,7 @@ abstract class BaseTemplate extends QuickTemplate {
                }
                if ( isset( $this->data['nav_urls']['info'] ) && $this->data['nav_urls']['info'] ) {
                        $toolbox['info'] = $this->data['nav_urls']['info'];
+                       $toolbox['info']['id'] = 't-info';
                }
 
                wfRunHooks( 'BaseTemplateToolbox', array( &$this, &$toolbox ) );
@@ -1749,7 +1750,7 @@ abstract class BaseTemplate extends QuickTemplate {
                        foreach ( array( 'id', 'class', 'active', 'tag' ) as $k ) {
                                unset( $link[$k] );
                        }
-                       if ( isset( $item['id'] ) ) {
+                       if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
                                // The id goes on the <li> not on the <a> for single links
                                // but makeSidebarLink still needs to know what id to use when
                                // generating tooltips and accesskeys.
index 13bb361..d0ead9a 100644 (file)
@@ -109,7 +109,7 @@ abstract class SqlDataUpdate extends DataUpdate {
         * @param $dbkeys Array
         */
        protected function invalidatePages( $namespace, array $dbkeys ) {
-               if ( !count( $dbkeys ) ) {
+               if ( $dbkeys === array() ) {
                        return;
                }
 
@@ -127,10 +127,12 @@ abstract class SqlDataUpdate extends DataUpdate {
                                'page_touched < ' . $this->mDb->addQuotes( $now )
                        ), __METHOD__
                );
+
                foreach ( $res as $row ) {
                        $ids[] = $row->page_id;
                }
-               if ( !count( $ids ) ) {
+
+               if ( $ids === array() ) {
                        return;
                }
 
index 147b0df..763c95c 100644 (file)
@@ -226,7 +226,7 @@ class Status {
        }
 
        /**
-        * Get the error message as HTML. This is done by parsing the wikitext error 
+        * Get the error message as HTML. This is done by parsing the wikitext error
         * message.
         */
        public function getHTML( $shortContext = false, $longContext = false ) {
index ee3e01f..c3e37a0 100644 (file)
@@ -2922,7 +2922,7 @@ class Title {
 
                $linkCache = LinkCache::singleton();
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
-               if ( $cached === null ) { 
+               if ( $cached === null ) {
                        // TODO: check the assumption that the cache actually knows about this title
                        // and handle this, such as get the title from the database.
                        // See https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
index f80319d..a197077 100644 (file)
@@ -817,39 +817,16 @@ class User {
 
        /**
         * Count the number of edits of a user
-        * @todo It should not be static and some day should be merged as proper member function / deprecated -- domas
         *
         * @param $uid Int User ID to check
         * @return Int the user's edit count
+        *
+        * @deprecated since 1.21 in favour of User::getEditCount
         */
        public static function edits( $uid ) {
-               wfProfileIn( __METHOD__ );
-               $dbr = wfGetDB( DB_SLAVE );
-               // check if the user_editcount field has been initialized
-               $field = $dbr->selectField(
-                       'user', 'user_editcount',
-                       array( 'user_id' => $uid ),
-                       __METHOD__
-               );
-
-               if( $field === null ) { // it has not been initialized. do so.
-                       $dbw = wfGetDB( DB_MASTER );
-                       $count = $dbr->selectField(
-                               'revision', 'count(*)',
-                               array( 'rev_user' => $uid ),
-                               __METHOD__
-                       );
-                       $dbw->update(
-                               'user',
-                               array( 'user_editcount' => $count ),
-                               array( 'user_id' => $uid ),
-                               __METHOD__
-                       );
-               } else {
-                       $count = $field;
-               }
-               wfProfileOut( __METHOD__ );
-               return $count;
+               wfDeprecated( __METHOD__, '1.21' );
+               $user = self::newFromId( $uid );
+               return $user->getEditCount();
        }
 
        /**
@@ -1191,7 +1168,9 @@ class User {
        }
 
        /**
-        * Clear various cached data stored in this object.
+        * Clear various cached data stored in this object. The cache of the user table
+        * data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
+        *
         * @param $reloadFrom bool|String Reload user and user_groups table data from a
         *   given source. May be "name", "id", "defaults", "session", or false for
         *   no reload.
@@ -1205,6 +1184,7 @@ class User {
                $this->mEffectiveGroups = null;
                $this->mImplicitGroups = null;
                $this->mOptions = null;
+               $this->mOptionsLoaded = false;
                $this->mEditCount = null;
 
                if ( $reloadFrom ) {
@@ -2466,7 +2446,21 @@ class User {
                if( $this->getId() ) {
                        if ( !isset( $this->mEditCount ) ) {
                                /* Populate the count, if it has not been populated yet */
-                               $this->mEditCount = User::edits( $this->mId );
+                               wfProfileIn( __METHOD__ );
+                               $dbr = wfGetDB( DB_SLAVE );
+                               // check if the user_editcount field has been initialized
+                               $count = $dbr->selectField(
+                                       'user', 'user_editcount',
+                                       array( 'user_id' => $this->mId ),
+                                       __METHOD__
+                               );
+
+                               if( $count === null ) {
+                                       // it has not been initialized. do so.
+                                       $count = $this->initEditCount();
+                               }
+                               wfProfileOut( __METHOD__ );
+                               $this->mEditCount = $count;
                        }
                        return $this->mEditCount;
                } else {
@@ -3008,8 +3002,8 @@ class User {
        }
 
        /**
-        * Add this existing user object to the database. If the user already 
-        * exists, a fatal status object is returned, and the user object is 
+        * Add this existing user object to the database. If the user already
+        * exists, a fatal status object is returned, and the user object is
         * initialised with the data from the database.
         *
         * Previously, this function generated a DB error due to a key conflict
@@ -3022,12 +3016,12 @@ class User {
         *   }
         *   // do something with $user...
         *
-        * However, this was vulnerable to a race condition (bug 16020). By 
+        * However, this was vulnerable to a race condition (bug 16020). By
         * initialising the user object if the user exists, we aim to support this
         * calling sequence as far as possible.
         *
         * Note that if the user exists, this function will acquire a write lock,
-        * so it is still advisable to make the call conditional on isLoggedIn(), 
+        * so it is still advisable to make the call conditional on isLoggedIn(),
         * and to commit the transaction after calling.
         *
         * @return Status
@@ -3057,7 +3051,7 @@ class User {
                        array( 'IGNORE' )
                );
                if ( !$dbw->affectedRows() ) {
-                       $this->mId = $dbw->selectField( 'user', 'user_id', 
+                       $this->mId = $dbw->selectField( 'user', 'user_id',
                                array( 'user_name' => $this->mName ), __METHOD__ );
                        $loaded = false;
                        if ( $this->mId ) {
@@ -3938,43 +3932,63 @@ class User {
        public function incEditCount() {
                if( !$this->isAnon() ) {
                        $dbw = wfGetDB( DB_MASTER );
-                       $dbw->update( 'user',
+                       $dbw->update(
+                               'user',
                                array( 'user_editcount=user_editcount+1' ),
                                array( 'user_id' => $this->getId() ),
-                               __METHOD__ );
+                               __METHOD__
+                       );
 
                        // Lazy initialization check...
                        if( $dbw->affectedRows() == 0 ) {
-                               // Pull from a slave to be less cruel to servers
-                               // Accuracy isn't the point anyway here
-                               $dbr = wfGetDB( DB_SLAVE );
-                               $count = $dbr->selectField( 'revision',
-                                       'COUNT(rev_user)',
-                                       array( 'rev_user' => $this->getId() ),
-                                       __METHOD__ );
-
                                // Now here's a goddamn hack...
+                               $dbr = wfGetDB( DB_SLAVE );
                                if( $dbr !== $dbw ) {
                                        // If we actually have a slave server, the count is
                                        // at least one behind because the current transaction
                                        // has not been committed and replicated.
-                                       $count++;
+                                       $this->initEditCount( 1 );
                                } else {
                                        // But if DB_SLAVE is selecting the master, then the
                                        // count we just read includes the revision that was
                                        // just added in the working transaction.
+                                       $this->initEditCount();
                                }
-
-                               $dbw->update( 'user',
-                                       array( 'user_editcount' => $count ),
-                                       array( 'user_id' => $this->getId() ),
-                                       __METHOD__ );
                        }
                }
                // edit count in user cache too
                $this->invalidateCache();
        }
 
+       /**
+        * Initialize user_editcount from data out of the revision table
+        *
+        * @param $add Integer Edits to add to the count from the revision table
+        * @return Integer Number of edits
+        */
+       protected function initEditCount( $add = 0 ) {
+               // Pull from a slave to be less cruel to servers
+               // Accuracy isn't the point anyway here
+               $dbr = wfGetDB( DB_SLAVE );
+               $count = $dbr->selectField(
+                       'revision',
+                       'COUNT(rev_user)',
+                       array( 'rev_user' => $this->getId() ),
+                       __METHOD__
+               );
+               $count = $count + $add;
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update(
+                       'user',
+                       array( 'user_editcount' => $count ),
+                       array( 'user_id' => $this->getId() ),
+                       __METHOD__
+               );
+
+               return $count;
+       }
+
        /**
         * Get the description of a given right
         *
index e6ccbe5..7a6b37d 100644 (file)
@@ -178,7 +178,7 @@ class MediaWiki {
                wfProfileIn( __METHOD__ );
 
                $request = $this->context->getRequest();
-               $title = $this->context->getTitle();
+               $requestTitle = $title = $this->context->getTitle();
                $output = $this->context->getOutput();
                $user = $this->context->getUser();
 
@@ -302,7 +302,7 @@ class MediaWiki {
                                global $wgArticle;
                                $wgArticle = new DeprecatedGlobal( 'wgArticle', $article, '1.18' );
 
-                               $this->performAction( $article );
+                               $this->performAction( $article, $requestTitle );
                        } elseif ( is_string( $article ) ) {
                                $output->redirect( $article );
                        } else {
@@ -396,8 +396,9 @@ class MediaWiki {
         * Perform one of the "standard" actions
         *
         * @param $page Page
+        * @param $requestTitle The original title, before any redirects were applied
         */
-       private function performAction( Page $page ) {
+       private function performAction( Page $page, Title $requestTitle ) {
                global $wgUseSquid, $wgSquidMaxage;
 
                wfProfileIn( __METHOD__ );
@@ -420,7 +421,7 @@ class MediaWiki {
                if ( $action instanceof Action ) {
                        # Let Squid cache things if we can purge them.
                        if ( $wgUseSquid &&
-                               in_array( $request->getFullRequestURL(), $title->getSquidURLs() )
+                               in_array( $request->getFullRequestURL(), $requestTitle->getSquidURLs() )
                        ) {
                                $output->setSquidMaxage( $wgSquidMaxage );
                        }
@@ -596,28 +597,51 @@ class MediaWiki {
                if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
                        return;
                }
+
                if ( $wgJobRunRate < 1 ) {
                        $max = mt_getrandmax();
                        if ( mt_rand( 0, $max ) > $max * $wgJobRunRate ) {
-                               return;
+                               return; // the higher $wgJobRunRate, the less likely we return here
                        }
                        $n = 1;
                } else {
                        $n = intval( $wgJobRunRate );
                }
 
-               while ( $n-- && false != ( $job = Job::pop() ) ) {
-                       $output = $job->toString() . "\n";
-                       $t = - microtime( true );
-                       $success = $job->run();
-                       $t += microtime( true );
-                       $t = round( $t * 1000 );
-                       if ( !$success ) {
-                               $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
-                       } else {
-                               $output .= "Success, Time: $t ms\n";
+               $group = JobQueueGroup::singleton();
+               $types = $group->getDefaultQueueTypes();
+               shuffle( $types ); // avoid starvation
+
+               // Scan the queues for a job N times...
+               do {
+                       $jobFound = false; // found a job in any queue?
+                       // Find a queue with a job on it and run it...
+                       foreach ( $types as $i => $type ) {
+                               $queue = $group->get( $type );
+                               if ( $queue->isEmpty() ) {
+                                       unset( $types[$i] ); // don't keep checking this queue
+                                       continue;
+                               }
+                               $job = $queue->pop();
+                               if ( $job ) {
+                                       $jobFound = true;
+                                       $output = $job->toString() . "\n";
+                                       $t = - microtime( true );
+                                       $success = $job->run();
+                                       $queue->ack( $job ); // done
+                                       $t += microtime( true );
+                                       $t = round( $t * 1000 );
+                                       if ( !$success ) {
+                                               $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
+                                       } else {
+                                               $output .= "Success, Time: $t ms\n";
+                                       }
+                                       wfDebugLog( 'jobqueue', $output );
+                                       break;
+                               } else {
+                                       unset( $types[$i] ); // don't keep checking this queue
+                               }
                        }
-                       wfDebugLog( 'jobqueue', $output );
-               }
+               } while ( --$n && $jobFound );
        }
 }
index 3deb921..bdec273 100644 (file)
@@ -3336,12 +3336,17 @@ class PoolWorkArticleView extends PoolCounterWork {
                        $content = $this->page->getContent( Revision::RAW );
                } else {
                        $rev = Revision::newFromTitle( $this->page->getTitle(), $this->revid );
+
                        if ( $rev === null ) {
-                               return false;
+                               $content = null;
+                       } else {
+                               #XXX: why use PUBLIC audience here (default), and RAW above?
+                               $content = $rev->getContent();
                        }
+               }
 
-                       #XXX: why use PUBLIC audience here (default), and RAW above?
-                       $content = $rev->getContent();
+               if ( $content === null ) {
+                       return false;
                }
 
                $time = - microtime( true );
index 3adf890..510f4ef 100644 (file)
@@ -203,6 +203,21 @@ class InfoAction extends FormlessAction {
                        $this->msg( 'pageinfo-display-title' ), $displayTitle
                );
 
+               // Is it a redirect? If so, where to?
+               if ( $title->isRedirect() ) {
+                       $pageInfo['header-basic'][] = array(
+                               $this->msg( 'pageinfo-redirectsto' ),
+                               Linker::link( $this->page->getRedirectTarget() ) .
+                               $this->msg( 'word-separator' )->text() .
+                               $this->msg( 'parentheses', Linker::link(
+                                       $this->page->getRedirectTarget(),
+                                       $this->msg( 'pageinfo-redirectsto-info' )->escaped(),
+                                       array(),
+                                       array( 'action' => 'info' )
+                               ) )->text()
+                       );
+               }
+
                // Default sort key
                $sortKey = $title->getCategorySortKey();
                if ( !empty( $pageProperties['defaultsort'] ) ) {
@@ -258,6 +273,14 @@ class InfoAction extends FormlessAction {
                                ->numParams( count( $title->getRedirectsHere() ) )
                );
 
+               // Is it counted as a content page?
+               if ( $this->page->isCountable() ) {
+                       $pageInfo['header-basic'][] = array(
+                               $this->msg( 'pageinfo-contentpage' ),
+                               $this->msg( 'pageinfo-contentpage-yes' )
+                       );
+               }
+
                // Subpages of this page, if subpages are enabled for the current NS
                if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
                        $prefixIndex = SpecialPage::getTitleFor( 'Prefixindex', $title->getPrefixedText() . '/' );
@@ -274,6 +297,30 @@ class InfoAction extends FormlessAction {
                // Page protection
                $pageInfo['header-restrictions'] = array();
 
+               // Is this page effected by the cascading protection of something which includes it?
+               if ( $title->isCascadeProtected() ) {
+                       $cascadingFrom = '';
+                       $sources = $title->getCascadeProtectionSources(); // Array deferencing is in PHP 5.4 :(
+
+                       foreach ( $sources[0] as $sourceTitle ) {
+                               $cascadingFrom .= Html::rawElement( 'li', array(), Linker::linkKnown( $sourceTitle ) );
+                       }
+
+                       $cascadingFrom = Html::rawElement( 'ul', array(), $cascadingFrom );
+                       $pageInfo['header-restrictions'][] = array(
+                               $this->msg( 'pageinfo-protect-cascading-from' ),
+                               $cascadingFrom
+                       );
+               }
+
+               // Is out protection set to cascade to other pages?
+               if ( $title->areRestrictionsCascading() ) {
+                       $pageInfo['header-restrictions'][] = array(
+                               $this->msg( 'pageinfo-protect-cascading' ),
+                               $this->msg( 'pageinfo-protect-cascading-yes' )
+                       );
+               }
+
                // Page protection
                foreach ( $title->getRestrictionTypes() as $restrictionType ) {
                        $protectionLevel = implode( ', ', $title->getRestrictions( $restrictionType ) );
index ec3d60a..71cb397 100644 (file)
@@ -150,18 +150,28 @@ class RawAction extends FormlessAction {
                                // Public-only due to cache headers
                                $content = $rev->getContent();
 
-                               if ( !$content instanceof TextContent ) {
+                               if ( $content === null ) {
+                                       // revision not found (or suppressed)
+                                       $text = false;
+                               } elseif ( !$content instanceof TextContent ) {
+                                       // non-text content
                                        wfHttpError( 415, "Unsupported Media Type", "The requested page uses the content model `"
                                                                                . $content->getModel() . "` which is not supported via this interface." );
                                        die();
+                               } else {
+                                       // want a section?
+                                       $section = $request->getIntOrNull( 'section' );
+                                       if ( $section !== null ) {
+                                               $content = $content->getSection( $section );
+                                       }
+
+                                       if ( $content === null || $content === false ) {
+                                               // section not found (or section not supported, e.g. for JS and CSS)
+                                               $text = false;
+                                       } else {
+                                               $text = $content->getNativeData();
+                                       }
                                }
-
-                               $section = $request->getIntOrNull( 'section' );
-                               if ( $section !== null ) {
-                                       $content = $content->getSection( $section );
-                               }
-
-                               $text = $content->getNativeData();
                        }
                }
 
index 87302e6..ca62bc6 100644 (file)
@@ -128,17 +128,10 @@ class ApiEditPage extends ApiBase {
                {
                        $content = $pageObj->getContent();
 
-                       // @todo: Add support for appending/prepending to the Content interface
-
-                       if ( !( $content instanceof TextContent ) ) {
-                               $mode = $contentHandler->getModelID();
-                               $this->dieUsage( "Can't append to pages using content model $mode", 'appendnotsupported' );
-                       }
-
                        if ( !$content ) {
-                               # If this is a MediaWiki:x message, then load the messages
-                               # and return the message value for x.
                                if ( $titleObj->getNamespace() == NS_MEDIAWIKI ) {
+                                       # If this is a MediaWiki:x message, then load the messages
+                                       # and return the message value for x.
                                        $text = $titleObj->getDefaultMessageText();
                                        if ( $text === false ) {
                                                $text = '';
@@ -150,9 +143,19 @@ class ApiEditPage extends ApiBase {
                                                $this->dieUsage( $ex->getMessage(), 'parseerror' );
                                                return;
                                        }
+                               } else {
+                                       # Otherwise, make a new empty content.
+                                       $content = $contentHandler->makeEmptyContent();
                                }
                        }
 
+                       // @todo: Add support for appending/prepending to the Content interface
+
+                       if ( !( $content instanceof TextContent ) ) {
+                               $mode = $contentHandler->getModelID();
+                               $this->dieUsage( "Can't append to pages using content model $mode", 'appendnotsupported' );
+                       }
+
                        if ( !is_null( $params['section'] ) ) {
                                if ( !$contentHandler->supportsSections() ) {
                                        $modelName = $contentHandler->getModelID();
index a29a0bd..1a55d5a 100644 (file)
@@ -114,7 +114,7 @@ class ApiParse extends ApiBase {
                                        }
 
                                        // Should we save old revision parses to the parser cache?
-                                       $p_result = $this->content->getParserOutput( $titleObj, $popts );
+                                       $p_result = $this->content->getParserOutput( $titleObj, $rev->getId(), $popts );
                                }
                        } else { // Not $oldid, but $pageid or $page
                                if ( $params['redirects'] ) {
@@ -153,7 +153,6 @@ class ApiParse extends ApiBase {
                                        $oldid = $pageObj->getLatest();
                                }
 
-
                                $popts = $pageObj->makeParserOptions( $this->getContext() );
                                $popts->enableLimitReport( !$params['disablepp'] );
 
@@ -204,9 +203,9 @@ class ApiParse extends ApiBase {
 
                        // Not cached (save or load)
                        if ( $params['pst'] ) {
-                               $p_result = $this->pstContent->getParserOutput( $titleObj, $popts );
+                               $p_result = $this->pstContent->getParserOutput( $titleObj, null, $popts );
                        } else {
-                               $p_result = $this->content->getParserOutput( $titleObj, $popts );
+                               $p_result = $this->content->getParserOutput( $titleObj, null, $popts );
                        }
                }
 
@@ -360,7 +359,7 @@ class ApiParse extends ApiBase {
                                !is_null( $pageId ) ? 'page id ' . $pageId : $page->getTitle()->getText() );
 
                        // Not cached (save or load)
-                       return $this->content->getParserOutput( $page->getTitle(), $popts );
+                       return $this->content->getParserOutput( $page->getTitle(), null, $popts );
                } else {
                        // Try the parser cache first
                        // getParserOutput will save to Parser cache if able
index ee55fb5..de02614 100644 (file)
@@ -172,7 +172,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                        $data = $this->getResultData();
                        foreach ( $data['query']['pages'] as $pageid => $arr ) {
-                               if ( !isset( $arr['imagerepository'] ) ) {
+                               if ( is_array( $arr ) && !isset( $arr['imagerepository'] ) ) {
                                        $result->addValue(
                                                array( 'query', 'pages', $pageid ),
                                                'imagerepository', ''
diff --git a/includes/api/ApiQueryORM.php b/includes/api/ApiQueryORM.php
new file mode 100644 (file)
index 0000000..3b18d8a
--- /dev/null
@@ -0,0 +1,264 @@
+<?php
+
+/**
+ * Base query module for querying results from ORMTables.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup API
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+abstract class ApiQueryORM extends ApiQueryBase {
+
+       /**
+        * Returns an instance of the IORMTable table being queried.
+        *
+        * @since 1.21
+        *
+        * @return IORMTable
+        */
+       protected abstract function getTable();
+
+       /**
+        * Returns the name of the individual rows.
+        * For example: page, user, contest, campaign, etc.
+        * This is used to appropriately name elements in XML.
+        * Deriving classes typically override this method.
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       protected function getRowName() {
+               return 'item';
+       }
+
+       /**
+        * Returns the name of the list of rows.
+        * For example: pages, users, contests, campaigns, etc.
+        * This is used to appropriately name nodes in the output.
+        * Deriving classes typically override this method.
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       protected function getListName() {
+               return 'items';
+       }
+
+       /**
+        * Returns the path to where the items results should be added in the result.
+        *
+        * @since 1.21
+        *
+        * @return null|string|array
+        */
+       protected function getResultPath() {
+               return null;
+       }
+
+       /**
+        * Get the parameters, find out what the conditions for the query are,
+        * run it, and add the results.
+        *
+        * @since 1.21
+        */
+       public function execute() {
+               $params = $this->getParams();
+
+               if ( !in_array( 'id', $params['props'] ) ) {
+                       $params['props'][] = 'id';
+               }
+
+               $results = $this->getResults( $params, $this->getConditions( $params ) );
+               $this->addResults( $params, $results );
+       }
+
+       /**
+        * Get the request parameters, handle the * value for the props param
+        * and remove all params set to null (ie those that are not actually provided).
+        *
+        * @since 1.21
+        *
+        * @return array
+        */
+       protected function getParams() {
+               return array_filter(
+                       $this->extractRequestParams(),
+                       function( $prop ) {
+                               return isset( $prop );
+                       }
+               );
+       }
+
+       /**
+        * Get the conditions for the query. These will be provided as
+        * regular parameters, together with limit, props, continue,
+        * and possibly others which we need to get rid off.
+        *
+        * @since 1.21
+        *
+        * @param array $params
+        *
+        * @return array
+        */
+       protected function getConditions( array $params ) {
+               $conditions = array();
+               $fields = $this->getTable()->getFields();
+
+               foreach ( $params as $name => $value ) {
+                       if ( array_key_exists( $name, $fields ) ) {
+                               $conditions[$name] = $value;
+                       }
+               }
+
+               return $conditions;
+       }
+
+       /**
+        * Get the actual results.
+        *
+        * @since 1.21
+        *
+        * @param array $params
+        * @param array $conditions
+        *
+        * @return ORMResult
+        */
+       protected function getResults( array $params, array $conditions ) {
+               return $this->getTable()->select(
+                       $params['props'],
+                       $conditions,
+                       array(
+                               'LIMIT' => $params['limit'] + 1,
+                               'ORDER BY' => $this->getTable()->getPrefixedField( 'id' ) . ' ASC',
+                       ),
+                       __METHOD__
+               );
+       }
+
+       /**
+        * Serialize the results and add them to the result object.
+        *
+        * @since 1.21
+        *
+        * @param array $params
+        * @param ORMResult $results
+        */
+       protected function addResults( array $params, ORMResult $results ) {
+               $serializedResults = array();
+               $count = 0;
+
+               foreach ( $results as /* IORMRow */ $result ) {
+                       if ( ++$count > $params['limit'] ) {
+                               // We've reached the one extra which shows that
+                               // there are additional pages to be had. Stop here...
+                               $this->setContinueEnumParameter( 'continue', $result->getId() );
+                               break;
+                       }
+
+                       $serializedResults[] = $this->formatRow( $result, $params );
+               }
+
+               $this->setIndexedTagNames( $serializedResults );
+               $this->addSerializedResults( $serializedResults );
+       }
+
+       /**
+        * Formats a row to it's desired output format.
+        *
+        * @since 1.21
+        *
+        * @param IORMRow $result
+        * @param array $params
+        *
+        * @return mixed
+        */
+       protected function formatRow( IORMRow $result, array $params ) {
+               return $result->toArray( $params['props'] );
+       }
+
+       /**
+        * Set the tag names for formats such as XML.
+        *
+        * @since 1.21
+        *
+        * @param array $serializedResults
+        */
+       protected function setIndexedTagNames( array &$serializedResults ) {
+               $this->getResult()->setIndexedTagName( $serializedResults, $this->getRowName() );
+       }
+
+       /**
+        * Add the serialized results to the result object.
+        *
+        * @since 1.21
+        *
+        * @param array $serializedResults
+        */
+       protected function addSerializedResults( array $serializedResults ) {
+               $this->getResult()->addValue(
+                       $this->getResultPath(),
+                       $this->getListName(),
+                       $serializedResults
+               );
+       }
+
+       /**
+        * @see ApiBase::getAllowedParams()
+        * @return array
+        */
+       public function getAllowedParams() {
+               $params = array (
+                       'props' => array(
+                               ApiBase::PARAM_TYPE => $this->getTable()->getFieldNames(),
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_REQUIRED => true,
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_DFLT => 20,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'continue' => null,
+               );
+
+               return array_merge( $this->getTable()->getAPIParams(), $params );
+       }
+
+       /**
+        * @see ApiBase::getParamDescription()
+        * @return array
+        */
+       public function getParamDescription() {
+               $descriptions = array (
+                       'props' => 'Fields to query',
+                       'continue' => 'Offset number from where to continue the query',
+                       'limit' => 'Max amount of rows to return',
+               );
+
+               return array_merge( $this->getTable()->getFieldDescriptions(), $descriptions );
+       }
+
+}
index 5aff1e9..881b797 100644 (file)
@@ -540,7 +540,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                }
                        }
                        if ( $this->parseContent ) {
-                               $po = $content->getParserOutput( $title, ParserOptions::newFromContext( $this->getContext() ) );
+                               $po = $content->getParserOutput( $title, $revision->getId(), ParserOptions::newFromContext( $this->getContext() ) );
                                $text = $po->getText();
                        }
 
index a4b2002..6b48fa4 100644 (file)
@@ -129,6 +129,8 @@ class SquidUpdate {
                        return;
                }
 
+               wfDebug( "Squid purge: " . implode( ' ', $urlArr ) . "\n" );
+
                if ( $wgHTCPMulticastRouting ) {
                        SquidUpdate::HTCPPurge( $urlArr );
                }
index 860b4c3..495711a 100644 (file)
@@ -3,7 +3,27 @@
  * A content object represents page content, e.g. the text to show on a page.
  * Content objects have no knowledge about how they relate to Wiki pages.
  *
+ * 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
+ *
  * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
  */
 abstract class AbstractContent implements Content {
 
@@ -11,19 +31,25 @@ abstract class AbstractContent implements Content {
         * Name of the content model this Content object represents.
         * Use with CONTENT_MODEL_XXX constants
         *
+        * @since 1.21
+        *
         * @var string $model_id
         */
        protected $model_id;
 
        /**
-        * @param String $model_id
+        * @param string|null $modelId
+        *
+        * @since 1.21
         */
-       public function __construct( $model_id = null ) {
-               $this->model_id = $model_id;
+       public function __construct( $modelId = null ) {
+               $this->model_id = $modelId;
        }
 
        /**
-        * @see Content::getModel()
+        * @see Content::getModel
+        *
+        * @since 1.21
         */
        public function getModel() {
                return $this->model_id;
@@ -33,41 +59,57 @@ abstract class AbstractContent implements Content {
         * Throws an MWException if $model_id is not the id of the content model
         * supported by this Content object.
         *
-        * @param $model_id int the model to check
+        * @since 1.21
+        *
+        * @param string $modelId The model to check
         *
         * @throws MWException
         */
-       protected function checkModelID( $model_id ) {
-               if ( $model_id !== $this->model_id ) {
-                       throw new MWException( "Bad content model: " .
+       protected function checkModelID( $modelId ) {
+               if ( $modelId !== $this->model_id ) {
+                       throw new MWException(
+                               "Bad content model: " .
                                "expected {$this->model_id}  " .
-                               "but got $model_id." );
+                               "but got $modelId."
+                       );
                }
        }
 
        /**
-        * @see Content::getContentHandler()
+        * @see Content::getContentHandler
+        *
+        * @since 1.21
         */
        public function getContentHandler() {
                return ContentHandler::getForContent( $this );
        }
 
        /**
-        * @see Content::getDefaultFormat()
+        * @see Content::getDefaultFormat
+        *
+        * @since 1.21
         */
        public function getDefaultFormat() {
                return $this->getContentHandler()->getDefaultFormat();
        }
 
        /**
-        * @see Content::getSupportedFormats()
+        * @see Content::getSupportedFormats
+        *
+        * @since 1.21
         */
        public function getSupportedFormats() {
                return $this->getContentHandler()->getSupportedFormats();
        }
 
        /**
-        * @see Content::isSupportedFormat()
+        * @see Content::isSupportedFormat
+        *
+        * @param string $format
+        *
+        * @since 1.21
+        *
+        * @return boolean
         */
        public function isSupportedFormat( $format ) {
                if ( !$format ) {
@@ -78,42 +120,66 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * Throws an MWException if $this->isSupportedFormat( $format ) doesn't
+        * Throws an MWException if $this->isSupportedFormat( $format ) does not
         * return true.
         *
-        * @param $format
+        * @since 1.21
+        *
+        * @param string $format
         * @throws MWException
         */
        protected function checkFormat( $format ) {
                if ( !$this->isSupportedFormat( $format ) ) {
-                       throw new MWException( "Format $format is not supported for content model " .
-                               $this->getModel() );
+                       throw new MWException(
+                               "Format $format is not supported for content model " .
+                               $this->getModel()
+                       );
                }
        }
 
        /**
         * @see Content::serialize
+        *
+        * @param string|null $format
+        *
+        * @since 1.21
+        *
+        * @return string
         */
        public function serialize( $format = null ) {
                return $this->getContentHandler()->serializeContent( $this, $format );
        }
 
        /**
-        * @see Content::isEmpty()
+        * @see Content::isEmpty
+        *
+        * @since 1.21
+        *
+        * @return boolean
         */
        public function isEmpty() {
                return $this->getSize() === 0;
        }
 
        /**
-        * @see Content::isValid()
+        * @see Content::isValid
+        *
+        * @since 1.21
+        *
+        * @return boolean
         */
        public function isValid() {
                return true;
        }
 
        /**
-        * @see Content::equals()
+        * @see Content::equals
+        *
+        * @since 1.21
+        *
+        * @param Content|null $that
+        *
+        * @return boolean
         */
        public function equals( Content $that = null ) {
                if ( is_null( $that ) ) {
@@ -173,7 +239,9 @@ abstract class AbstractContent implements Content {
 
 
        /**
-        * @see Content::getRedirectChain()
+        * @see Content::getRedirectChain
+        *
+        * @since 1.21
         */
        public function getRedirectChain() {
                global $wgMaxRedirects;
@@ -205,15 +273,19 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see Content::getRedirectTarget()
+        * @see Content::getRedirectTarget
+        *
+        * @since 1.21
         */
        public function getRedirectTarget() {
                return null;
        }
 
        /**
-        * @see Content::getUltimateRedirectTarget()
+        * @see Content::getUltimateRedirectTarget
         * @note: migrated here from Title::newFromRedirectRecurse
+        *
+        * @since 1.21
         */
        public function getUltimateRedirectTarget() {
                $titles = $this->getRedirectChain();
@@ -221,7 +293,7 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see Content::isRedirect()
+        * @see Content::isRedirect
         *
         * @since 1.21
         *
@@ -232,10 +304,12 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see Content::updateRedirect()
+        * @see Content::updateRedirect
         *
         * This default implementation always returns $this.
         *
+        * @param Title $target
+        *
         * @since 1.21
         *
         * @return Content $this
@@ -245,42 +319,54 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see Content::getSection()
+        * @see Content::getSection
+        *
+        * @since 1.21
         */
        public function getSection( $sectionId ) {
                return null;
        }
 
        /**
-        * @see Content::replaceSection()
+        * @see Content::replaceSection
+        *
+        * @since 1.21
         */
        public function replaceSection( $section, Content $with, $sectionTitle = ''  ) {
                return null;
        }
 
        /**
-        * @see Content::preSaveTransform()
+        * @see Content::preSaveTransform
+        *
+        * @since 1.21
         */
        public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
                return $this;
        }
 
        /**
-        * @see Content::addSectionHeader()
+        * @see Content::addSectionHeader
+        *
+        * @since 1.21
         */
        public function addSectionHeader( $header ) {
                return $this;
        }
 
        /**
-        * @see Content::preloadTransform()
+        * @see Content::preloadTransform
+        *
+        * @since 1.21
         */
        public function preloadTransform( Title $title, ParserOptions $popts ) {
                return $this;
        }
 
        /**
-        * @see  Content::prepareSave()
+        * @see Content::prepareSave
+        *
+        * @since 1.21
         */
        public function prepareSave( WikiPage $page, $flags, $baseRevId, User $user ) {
                if ( $this->isValid() ) {
@@ -291,7 +377,7 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see  Content::getDeletionUpdates()
+        * @see Content::getDeletionUpdates
         *
         * @since 1.21
         *
@@ -312,10 +398,12 @@ abstract class AbstractContent implements Content {
        }
 
        /**
-        * @see  Content::matchMagicWord()
-        *
         * This default implementation always returns false. Subclasses may override this to supply matching logic.
         *
+        * @see Content::matchMagicWord
+        *
+        * @since 1.21
+        *
         * @param MagicWord $word
         *
         * @return bool
@@ -323,4 +411,4 @@ abstract class AbstractContent implements Content {
        public function matchMagicWord( MagicWord $word ) {
                return false;
        }
-}
\ No newline at end of file
+}
index 6cb9d89..d830dc7 100644 (file)
@@ -3,7 +3,27 @@
  * A content object represents page content, e.g. the text to show on a page.
  * Content objects have no knowledge about how they relate to wiki pages.
  *
+ * 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
+ *
  * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
  */
 interface Content {
 
@@ -17,7 +37,7 @@ interface Content {
         * @todo: test that this actually works
         * @todo: make sure this also works with LuceneSearch / WikiSearch
         */
-       public function getTextForSearchIndex( );
+       public function getTextForSearchIndex();
 
        /**
         * @since 1.21
@@ -31,7 +51,7 @@ interface Content {
         * @TODO: used in WikiPage and MessageCache to get message text. Not so
         *    nice. What should we use instead?!
         */
-       public function getWikitextForTransclusion( );
+       public function getWikitextForTransclusion();
 
        /**
         * Returns a textual representation of the content suitable for use in edit
@@ -39,10 +59,10 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param $maxlength int Maximum length of the summary text
-        * @return   The summary text
+        * @param $maxLength int Maximum length of the summary text
+        * @return string The summary text
         */
-       public function getTextForSummary( $maxlength = 250 );
+       public function getTextForSummary( $maxLength = 250 );
 
        /**
         * Returns native representation of the data. Interpretation depends on
@@ -56,14 +76,14 @@ interface Content {
         *
         * @NOTE: Caller must be aware of content model!
         */
-       public function getNativeData( );
+       public function getNativeData();
 
        /**
         * Returns the content's nominal size in bogo-bytes.
         *
         * @return int
         */
-       public function getSize( );
+       public function getSize();
 
        /**
         * Returns the ID of the content model used by this Content object.
@@ -418,6 +438,8 @@ interface Content {
         * Note that this method is called before any update to the page table is performed. This means that
         * $page may not yet know a page ID.
         *
+        * @since 1.21
+        *
         * @param WikiPage $page The page to be saved.
         * @param int      $flags bitfield for use with EDIT_XXX constants, see WikiPage::doEditContent()
         * @param int      $baseRevId the ID of the current revision
@@ -452,6 +474,8 @@ interface Content {
        /**
         * Returns true if this Content object matches the given magic word.
         *
+        * @since 1.21
+        *
         * @param MagicWord $word the magic word to match
         *
         * @return bool whether this Content object matches the given magic word.
@@ -463,4 +487,4 @@ interface Content {
        #   [11:59] <vvv> Hooks are ugly; make CodeHighlighter interface and a
        #   config to set the class which handles syntax highlighting
        #   [12:00] <vvv> And default it to a DummyHighlighter
-}
\ No newline at end of file
+}
index 4bb4e40..33c803e 100644 (file)
@@ -24,7 +24,27 @@ class MWContentSerializationException extends MWException {
  * type), but wikitext content may be represented by a DOM or AST structure in
  * the future.
  *
+ * 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
+ *
  * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
  */
 abstract class ContentHandler {
 
@@ -77,6 +97,8 @@ abstract class ContentHandler {
                        return $content->getNativeData();
                }
 
+               wfDebugLog( 'ContentHandler', 'Accessing ' . $content->getModel() . ' content as text!' );
+
                if ( $wgContentHandlerTextFallback == 'fail' ) {
                        throw new MWException(
                                "Attempt to get text from Content with model " .
@@ -317,6 +339,9 @@ abstract class ContentHandler {
                        }
                }
 
+               wfDebugLog( 'ContentHandler', 'Created handler for ' . $modelId
+                                       . ': ' . get_class( $handler ) );
+
                ContentHandler::$handlers[$modelId] = $handler;
                return ContentHandler::$handlers[$modelId];
        }
@@ -1081,239 +1106,3 @@ abstract class ContentHandler {
        }
 }
 
-/**
- * @since 1.21
- */
-class TextContentHandler extends ContentHandler {
-
-       public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = array( CONTENT_FORMAT_TEXT ) ) {
-               parent::__construct( $modelId, $formats );
-       }
-
-       /**
-        * Returns the content's text as-is.
-        *
-        * @param $content Content
-        * @param $format string|null
-        * @return mixed
-        */
-       public function serializeContent( Content $content, $format = null ) {
-               $this->checkFormat( $format );
-               return $content->getNativeData();
-       }
-
-       /**
-        * Attempts to merge differences between three versions. Returns a new
-        * Content object for a clean merge and false for failure or a conflict.
-        *
-        * All three Content objects passed as parameters must have the same
-        * content model.
-        *
-        * This text-based implementation uses wfMerge().
-        *
-        * @param $oldContent \Content|string  String
-        * @param $myContent \Content|string   String
-        * @param $yourContent \Content|string String
-        *
-        * @return Content|Bool
-        */
-       public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
-               $this->checkModelID( $oldContent->getModel() );
-               $this->checkModelID( $myContent->getModel() );
-               $this->checkModelID( $yourContent->getModel() );
-
-               $format = $this->getDefaultFormat();
-
-               $old = $this->serializeContent( $oldContent, $format );
-               $mine = $this->serializeContent( $myContent, $format );
-               $yours = $this->serializeContent( $yourContent, $format );
-
-               $ok = wfMerge( $old, $mine, $yours, $result );
-
-               if ( !$ok ) {
-                       return false;
-               }
-
-               if ( !$result ) {
-                       return $this->makeEmptyContent();
-               }
-
-               $mergedContent = $this->unserializeContent( $result, $format );
-               return $mergedContent;
-       }
-
-       /**
-        * Unserializes a Content object of the type supported by this ContentHandler.
-        *
-        * @since 1.21
-        *
-        * @param $text   string serialized form of the content
-        * @param $format null|String the format used for serialization
-        *
-        * @return Content the TextContent object wrapping $text
-        */
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-
-               return new TextContent( $text );
-       }
-
-       /**
-        * Creates an empty TextContent object.
-        *
-        * @since 1.21
-        *
-        * @return Content
-        */
-       public function makeEmptyContent() {
-               return new TextContent( '' );
-       }
-}
-
-/**
- * @since 1.21
- */
-class WikitextContentHandler extends TextContentHandler {
-
-       public function __construct( $modelId = CONTENT_MODEL_WIKITEXT ) {
-               parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT ) );
-       }
-
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-
-               return new WikitextContent( $text );
-       }
-
-       /**
-        * @see ContentHandler::makeEmptyContent
-        *
-        * @return Content
-        */
-       public function makeEmptyContent() {
-               return new WikitextContent( '' );
-       }
-
-
-       /**
-        * Returns a WikitextContent object representing a redirect to the given destination page.
-        *
-        * @see ContentHandler::makeRedirectContent
-        *
-        * @param Title $destination the page to redirect to.
-        *
-        * @return Content
-        */
-       public function makeRedirectContent( Title $destination ) {
-               $mwRedir = MagicWord::get( 'redirect' );
-               $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $destination->getPrefixedText() . "]]\n";
-
-               return new WikitextContent( $redirectText );
-       }
-
-       /**
-        * Returns true because wikitext supports sections.
-        *
-        * @return boolean whether sections are supported.
-        */
-       public function supportsSections() {
-               return true;
-       }
-
-       /**
-        * Returns true, because wikitext supports caching using the
-        * ParserCache mechanism.
-        *
-        * @since 1.21
-        * @return bool
-        */
-       public function isParserCacheSupported() {
-               return true;
-       }
-}
-
-# XXX: make ScriptContentHandler base class, do highlighting stuff there?
-
-/**
- * @since 1.21
- */
-class JavaScriptContentHandler extends TextContentHandler {
-
-       public function __construct( $modelId = CONTENT_MODEL_JAVASCRIPT ) {
-               parent::__construct( $modelId, array( CONTENT_FORMAT_JAVASCRIPT ) );
-       }
-
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-
-               return new JavaScriptContent( $text );
-       }
-
-       public function makeEmptyContent() {
-               return new JavaScriptContent( '' );
-       }
-
-       /**
-        * Returns the english language, because JS is english, and should be handled as such.
-        *
-        * @return Language wfGetLangObj( 'en' )
-        *
-        * @see ContentHandler::getPageLanguage()
-        */
-       public function getPageLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
-       }
-
-       /**
-        * Returns the english language, because CSS is english, and should be handled as such.
-        *
-        * @return Language wfGetLangObj( 'en' )
-        *
-        * @see ContentHandler::getPageViewLanguage()
-        */
-       public function getPageViewLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
-       }
-}
-
-/**
- * @since 1.21
- */
-class CssContentHandler extends TextContentHandler {
-
-       public function __construct( $modelId = CONTENT_MODEL_CSS ) {
-               parent::__construct( $modelId, array( CONTENT_FORMAT_CSS ) );
-       }
-
-       public function unserializeContent( $text, $format = null ) {
-               $this->checkFormat( $format );
-
-               return new CssContent( $text );
-       }
-
-       public function makeEmptyContent() {
-               return new CssContent( '' );
-       }
-
-       /**
-        * Returns the english language, because CSS is english, and should be handled as such.
-        *
-        * @return Language wfGetLangObj( 'en' )
-        *
-        * @see ContentHandler::getPageLanguage()
-        */
-       public function getPageLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
-       }
-
-       /**
-        * Returns the english language, because CSS is english, and should be handled as such.
-        *
-        * @return Language wfGetLangObj( 'en' )
-        *
-        * @see ContentHandler::getPageViewLanguage()
-        */
-       public function getPageViewLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
-       }
-}
index c881380..29527cf 100644 (file)
@@ -1,6 +1,26 @@
 <?php
 /**
+ * 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
+ *
  * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
  */
 class CssContent extends TextContent {
        public function __construct( $text ) {
diff --git a/includes/content/CssContentHandler.php b/includes/content/CssContentHandler.php
new file mode 100644 (file)
index 0000000..e2199c4
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * @since 1.21
+ */
+class CssContentHandler extends TextContentHandler {
+
+       public function __construct( $modelId = CONTENT_MODEL_CSS ) {
+               parent::__construct( $modelId, array( CONTENT_FORMAT_CSS ) );
+       }
+
+       public function unserializeContent( $text, $format = null ) {
+               $this->checkFormat( $format );
+
+               return new CssContent( $text );
+       }
+
+       public function makeEmptyContent() {
+               return new CssContent( '' );
+       }
+
+       /**
+        * Returns the english language, because CSS is english, and should be handled as such.
+        *
+        * @return Language wfGetLangObj( 'en' )
+        *
+        * @see ContentHandler::getPageLanguage()
+        */
+       public function getPageLanguage( Title $title, Content $content = null ) {
+               return wfGetLangObj( 'en' );
+       }
+
+       /**
+        * Returns the english language, because CSS is english, and should be handled as such.
+        *
+        * @return Language wfGetLangObj( 'en' )
+        *
+        * @see ContentHandler::getPageViewLanguage()
+        */
+       public function getPageViewLanguage( Title $title, Content $content = null ) {
+               return wfGetLangObj( 'en' );
+       }
+}
\ No newline at end of file
index ef0a4ac..770f233 100644 (file)
@@ -1,7 +1,27 @@
 <?php
 
 /**
+ * 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
+ *
  * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
  */
 class JavaScriptContent extends TextContent {
        public function __construct( $text ) {
diff --git a/includes/content/JavaScriptContentHandler.php b/includes/content/JavaScriptContentHandler.php
new file mode 100644 (file)
index 0000000..8b080bf
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+
+# XXX: make ScriptContentHandler base class, do highlighting stuff there?
+
+/**
+ * @since 1.21
+ */
+class JavaScriptContentHandler extends TextContentHandler {
+
+       public function __construct( $modelId = CONTENT_MODEL_JAVASCRIPT ) {
+               parent::__construct( $modelId, array( CONTENT_FORMAT_JAVASCRIPT ) );
+       }
+
+       public function unserializeContent( $text, $format = null ) {
+               $this->checkFormat( $format );
+
+               return new JavaScriptContent( $text );
+       }
+
+       public function makeEmptyContent() {
+               return new JavaScriptContent( '' );
+       }
+
+       /**
+        * Returns the english language, because JS is english, and should be handled as such.
+        *
+        * @return Language wfGetLangObj( 'en' )
+        *
+        * @see ContentHandler::getPageLanguage()
+        */
+       public function getPageLanguage( Title $title, Content $content = null ) {
+               return wfGetLangObj( 'en' );
+       }
+
+       /**
+        * Returns the english language, because CSS is english, and should be handled as such.
+        *
+        * @return Language wfGetLangObj( 'en' )
+        *
+        * @see ContentHandler::getPageViewLanguage()
+        */
+       public function getPageViewLanguage( Title $title, Content $content = null ) {
+               return wfGetLangObj( 'en' );
+       }
+}
\ No newline at end of file
index 0e231d8..d38355d 100644 (file)
@@ -5,7 +5,27 @@
  * to represent content from the MediaWiki namespace, and that there is no MessageContentHandler. MessageContent
  * is just intended as glue for wrapping a message programatically.
  *
+ * 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
+ *
  * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
  */
 class MessageContent extends AbstractContent {
 
index 9baa7ab..8e832ec 100644 (file)
@@ -5,7 +5,27 @@
  *
  * TextContent instances are immutable
  *
+ * 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
+ *
  * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
  */
 class TextContent extends AbstractContent {
 
@@ -96,6 +116,22 @@ class TextContent extends AbstractContent {
                return $this->getNativeData();
        }
 
+       /**
+        * Returns a Content object with pre-save transformations applied.
+        * This implementation just trims trailing whitespace.
+        *
+        * @param $title Title
+        * @param $user User
+        * @param $popts ParserOptions
+        * @return Content
+        */
+       public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+               $text = $this->getNativeData();
+               $pst = rtrim( $text );
+
+               return ( $text === $pst ) ? $this : new WikitextContent( $pst );
+       }
+
        /**
         * Diff this content object with another content object..
         *
@@ -144,7 +180,19 @@ class TextContent extends AbstractContent {
                $revId = null,
                ParserOptions $options = null, $generateHtml = true
        ) {
-               # Generic implementation, relying on $this->getHtml()
+               global $wgParser, $wgTextModelsToParse;
+
+               if ( !$options ) {
+                       //NOTE: use canonical options per default to produce cacheable output
+                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
+               }
+
+               if ( in_array( $this->getModel(), $wgTextModelsToParse ) ) {
+                       // parse just to get links etc into the database
+                       $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
+               } else {
+                       $po = new ParserOutput();
+               }
 
                if ( $generateHtml ) {
                        $html = $this->getHtml();
@@ -152,7 +200,7 @@ class TextContent extends AbstractContent {
                        $html = '';
                }
 
-               $po = new ParserOutput( $html );
+               $po->setText( $html );
                return $po;
        }
 
diff --git a/includes/content/TextContentHandler.php b/includes/content/TextContentHandler.php
new file mode 100644 (file)
index 0000000..9dff67e
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * @since 1.21
+ */
+class TextContentHandler extends ContentHandler {
+
+       public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = array( CONTENT_FORMAT_TEXT ) ) {
+               parent::__construct( $modelId, $formats );
+       }
+
+       /**
+        * Returns the content's text as-is.
+        *
+        * @param $content Content
+        * @param $format string|null
+        * @return mixed
+        */
+       public function serializeContent( Content $content, $format = null ) {
+               $this->checkFormat( $format );
+               return $content->getNativeData();
+       }
+
+       /**
+        * Attempts to merge differences between three versions. Returns a new
+        * Content object for a clean merge and false for failure or a conflict.
+        *
+        * All three Content objects passed as parameters must have the same
+        * content model.
+        *
+        * This text-based implementation uses wfMerge().
+        *
+        * @param $oldContent \Content|string  String
+        * @param $myContent \Content|string   String
+        * @param $yourContent \Content|string String
+        *
+        * @return Content|Bool
+        */
+       public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
+               $this->checkModelID( $oldContent->getModel() );
+               $this->checkModelID( $myContent->getModel() );
+               $this->checkModelID( $yourContent->getModel() );
+
+               $format = $this->getDefaultFormat();
+
+               $old = $this->serializeContent( $oldContent, $format );
+               $mine = $this->serializeContent( $myContent, $format );
+               $yours = $this->serializeContent( $yourContent, $format );
+
+               $ok = wfMerge( $old, $mine, $yours, $result );
+
+               if ( !$ok ) {
+                       return false;
+               }
+
+               if ( !$result ) {
+                       return $this->makeEmptyContent();
+               }
+
+               $mergedContent = $this->unserializeContent( $result, $format );
+               return $mergedContent;
+       }
+
+       /**
+        * Unserializes a Content object of the type supported by this ContentHandler.
+        *
+        * @since 1.21
+        *
+        * @param $text   string serialized form of the content
+        * @param $format null|String the format used for serialization
+        *
+        * @return Content the TextContent object wrapping $text
+        */
+       public function unserializeContent( $text, $format = null ) {
+               $this->checkFormat( $format );
+
+               return new TextContent( $text );
+       }
+
+       /**
+        * Creates an empty TextContent object.
+        *
+        * @since 1.21
+        *
+        * @return Content
+        */
+       public function makeEmptyContent() {
+               return new TextContent( '' );
+       }
+}
\ No newline at end of file
index a17bf31..8f1381f 100644 (file)
@@ -1,6 +1,26 @@
 <?php
 /**
+ * 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
+ *
  * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
  */
 class WikitextContent extends TextContent {
 
@@ -96,8 +116,9 @@ class WikitextContent extends TextContent {
 
                $text = $this->getNativeData();
                $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
+               rtrim( $pst );
 
-               return new WikitextContent( $pst );
+               return ( $text === $pst ) ? $this : new WikitextContent( $pst );
        }
 
        /**
diff --git a/includes/content/WikitextContentHandler.php b/includes/content/WikitextContentHandler.php
new file mode 100644 (file)
index 0000000..c6ac2ba
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @since 1.21
+ */
+class WikitextContentHandler extends TextContentHandler {
+
+       public function __construct( $modelId = CONTENT_MODEL_WIKITEXT ) {
+               parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT ) );
+       }
+
+       public function unserializeContent( $text, $format = null ) {
+               $this->checkFormat( $format );
+
+               return new WikitextContent( $text );
+       }
+
+       /**
+        * @see ContentHandler::makeEmptyContent
+        *
+        * @return Content
+        */
+       public function makeEmptyContent() {
+               return new WikitextContent( '' );
+       }
+
+
+       /**
+        * Returns a WikitextContent object representing a redirect to the given destination page.
+        *
+        * @see ContentHandler::makeRedirectContent
+        *
+        * @param Title $destination the page to redirect to.
+        *
+        * @return Content
+        */
+       public function makeRedirectContent( Title $destination ) {
+               $mwRedir = MagicWord::get( 'redirect' );
+               $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $destination->getPrefixedText() . "]]\n";
+
+               return new WikitextContent( $redirectText );
+       }
+
+       /**
+        * Returns true because wikitext supports sections.
+        *
+        * @return boolean whether sections are supported.
+        */
+       public function supportsSections() {
+               return true;
+       }
+
+       /**
+        * Returns true, because wikitext supports caching using the
+        * ParserCache mechanism.
+        *
+        * @since 1.21
+        * @return bool
+        */
+       public function isParserCacheSupported() {
+               return true;
+       }
+}
\ No newline at end of file
index a942afe..48aac9d 100644 (file)
@@ -2992,6 +2992,12 @@ abstract class DatabaseBase implements DatabaseType {
                        } elseif( $this->mTrxAutomatic ) {
                                wfWarn( "$fname: Explicit commit of implicit transaction. Something may be out of sync!" );
                        }
+               } else {
+                       if ( !$this->mTrxLevel ) {
+                               return; // nothing to do
+                       } elseif( !$this->mTrxAutomatic ) {
+                               wfWarn( "$fname: Flushing an explicit transaction, getting out of sync!" );
+                       }
                }
 
                $this->doCommit( $fname );
index 4ca8263..f3dc5a3 100644 (file)
@@ -714,12 +714,19 @@ class DifferenceEngine extends ContextSource {
        /**
         * Generate a diff, no caching.
         *
-        * Subclasses may override this to provide a
+        * This implementation uses generateTextDiffBody() to generate a diff based on the default
+        * serialization of the given Content objects. This will fail if $old or $new are not
+        * instances of TextContent.
+        *
+        * Subclasses may override this to provide a different rendering for the diff,
+        * perhaps taking advantage of the content's native form. This is required for all content
+        * models that are not text based.
         *
         * @param $old Content: old content
         * @param $new Content: new content
         *
         * @since 1.21
+        * @throws MWException if $old or $new are not instances of TextContent.
         */
        function generateContentDiffBody( Content $old, Content $new ) {
                if ( !( $old instanceof TextContent ) ) {
index 0a5efae..c7f6a20 100644 (file)
  *       'DBprefix' => '',
  *   );
  *
- * All fields must be present.  These mean the same things as $wgDBtype, 
- * $wgDBserver, etc.  This implementation is quite crude; it could easily 
- * support multiple database servers, for instance, and memcached, and it 
- * probably has bugs.  Kind of hard to reuse code when things might rely on who 
+ * All fields must be present.  These mean the same things as $wgDBtype,
+ * $wgDBserver, etc.  This implementation is quite crude; it could easily
+ * support multiple database servers, for instance, and memcached, and it
+ * probably has bugs.  Kind of hard to reuse code when things might rely on who
  * knows what configuration globals.
  *
- * If either wiki uses the UserComparePasswords hook, password authentication 
- * might fail unexpectedly unless they both do the exact same validation.  
- * There may be other corner cases like this where this will fail, but it 
+ * If either wiki uses the UserComparePasswords hook, password authentication
+ * might fail unexpectedly unless they both do the exact same validation.
+ * There may be other corner cases like this where this will fail, but it
  * should be unlikely.
  *
  * @ingroup ExternalUser
@@ -62,8 +62,8 @@ class ExternalUser_MediaWiki extends ExternalUser {
         * @return bool
         */
        protected function initFromName( $name ) {
-               # We might not need the 'usable' bit, but let's be safe.  Theoretically 
-               # this might return wrong results for old versions, but it's probably 
+               # We might not need the 'usable' bit, but let's be safe.  Theoretically
+               # this might return wrong results for old versions, but it's probably
                # good enough.
                $name = User::getCanonicalName( $name, 'usable' );
 
@@ -130,14 +130,14 @@ class ExternalUser_MediaWiki extends ExternalUser {
        }
 
        public function authenticate( $password ) {
-               # This might be wrong if anyone actually uses the UserComparePasswords hook 
+               # This might be wrong if anyone actually uses the UserComparePasswords hook
                # (on either end), so don't use this if you those are incompatible.
                return User::comparePasswords( $this->mRow->user_password, $password,
-                       $this->mRow->user_id ); 
+                       $this->mRow->user_id );
        }
 
        public function getPref( $pref ) {
-               # @todo FIXME: Return other prefs too.  Lots of global-riddled code that does 
+               # @todo FIXME: Return other prefs too.  Lots of global-riddled code that does
                # this normally.
                if ( $pref === 'emailaddress'
                && $this->row->user_email_authenticated !== null ) {
index e07c99d..fda356e 100644 (file)
@@ -86,8 +86,8 @@ class FSFile {
 
        /**
         * Guess the MIME type from the file contents alone
-        * 
-        * @return string 
+        *
+        * @return string
         */
        public function getMimeType() {
                return MimeMagic::singleton()->guessMimeType( $this->path, false );
@@ -211,7 +211,7 @@ class FSFile {
 
        /**
         * Get the final file extension from a file system path
-        * 
+        *
         * @param $path string
         * @return string
         */
index 0922919..dd43f82 100644 (file)
@@ -670,8 +670,8 @@ class FSFileBackend extends FileBackendStore {
 
                foreach ( $params['srcs'] as $src ) {
                        $source = $this->resolveToFSPath( $src );
-                       if ( $source === null ) {
-                               $fsFiles[$src] = null; // invalid path
+                       if ( $source === null || !is_file( $source ) ) {
+                               $fsFiles[$src] = null; // invalid path or file does not exist
                        } else {
                                $fsFiles[$src] = new FSFile( $source );
                        }
@@ -700,7 +700,9 @@ class FSFileBackend extends FileBackendStore {
                                } else {
                                        $tmpPath = $tmpFile->getPath();
                                        // Copy the source file over the temp file
+                                       wfSuppressWarnings();
                                        $ok = copy( $source, $tmpPath );
+                                       wfRestoreWarnings();
                                        if ( !$ok ) {
                                                $tmpFiles[$src] = null;
                                        } else {
index 1136fc2..0ef4cd0 100644 (file)
@@ -1073,6 +1073,17 @@ abstract class FileBackend {
                return "mwstore://{$this->name}";
        }
 
+       /**
+        * Get the storage path for the given container for this backend
+        *
+        * @param $container string Container name
+        * @return string Storage path
+        * @since 1.21
+        */
+       final public function getContainerStoragePath( $container ) {
+               return $this->getRootStoragePath() . "/{$container}";
+       }
+
        /**
         * Get the file journal object for this backend
         *
index 440359d..5f562d2 100644 (file)
@@ -834,6 +834,14 @@ abstract class FileBackendStore extends FileBackend {
                        $status = $this->doStreamFile( $params );
                        wfProfileOut( __METHOD__ . '-send-' . $this->name );
                        wfProfileOut( __METHOD__ . '-send' );
+                       if ( !$status->isOK() ) {
+                               // Per bug 41113, nasty things can happen if bad cache entries get
+                               // stuck in cache. It's also possible that this error can come up
+                               // with simple race conditions. Clear out the stat cache to be safe.
+                               $this->clearCache( array( $params['src'] ) );
+                               $this->deleteFileCache( $params['src'] );
+                               trigger_error( "Bad stat cache or race condition for file {$params['src']}." );
+                       }
                } else {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
                }
@@ -1007,6 +1015,7 @@ abstract class FileBackendStore extends FileBackend {
         * Get a list of storage paths to lock for a list of operations
         * Returns an array with 'sh' (shared) and 'ex' (exclusive) keys,
         * each corresponding to a list of storage paths to be locked.
+        * All returned paths are normalized.
         *
         * @param $performOps Array List of FileOp objects
         * @return Array ('sh' => list of paths, 'ex' => list of paths)
@@ -1475,6 +1484,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Do a batch lookup from cache for container stats for all containers
         * used in a list of container names, storage paths, or FileOp objects.
+        * This loads the persistent cache values into the process cache.
         *
         * @param $items Array
         * @return void
@@ -1531,7 +1541,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Get the cache key for a file path
         *
-        * @param $path string Storage path
+        * @param $path string Normalized storage path
         * @return string
         */
        private function fileCacheKey( $path ) {
@@ -1547,6 +1557,10 @@ abstract class FileBackendStore extends FileBackend {
         * @param $val mixed Information to cache
         */
        final protected function setFileCache( $path, $val ) {
+               $path = FileBackend::normalizeStoragePath( $path );
+               if ( $path === null ) {
+                       return; // invalid storage path
+               }
                $this->memCache->add( $this->fileCacheKey( $path ), $val, 7*86400 );
        }
 
@@ -1557,6 +1571,10 @@ abstract class FileBackendStore extends FileBackend {
         * @param $path string Storage path
         */
        final protected function deleteFileCache( $path ) {
+               $path = FileBackend::normalizeStoragePath( $path );
+               if ( $path === null ) {
+                       return; // invalid storage path
+               }
                if ( !$this->memCache->set( $this->fileCacheKey( $path ), 'PURGED', 300 ) ) {
                        trigger_error( "Unable to delete stat cache for file $path." );
                }
@@ -1565,6 +1583,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Do a batch lookup from cache for file stats for all paths
         * used in a list of storage paths or FileOp objects.
+        * This loads the persistent cache values into the process cache.
         *
         * @param $items Array List of storage paths or FileOps
         * @return void
@@ -1581,9 +1600,11 @@ abstract class FileBackendStore extends FileBackend {
                                $paths = array_merge( $paths, $item->storagePathsRead() );
                                $paths = array_merge( $paths, $item->storagePathsChanged() );
                        } elseif ( self::isStoragePath( $item ) ) {
-                               $paths[] = $item;
+                               $paths[] = FileBackend::normalizeStoragePath( $item );
                        }
                }
+               // Get rid of any paths that failed normalization...
+               $paths = array_filter( $paths, 'strlen' ); // remove nulls
                // Get all the corresponding cache keys for paths...
                foreach ( $paths as $path ) {
                        list( $cont, $rel, $s ) = $this->resolveStoragePath( $path );
index 2e45093..11e125c 100644 (file)
@@ -82,7 +82,7 @@ class TempFSFile extends FSFile {
         * Clean up the temporary file only after an object goes out of scope
         *
         * @param $object Object
-        * @return void
+        * @return TempFSFile This object
         */
        public function bind( $object ) {
                if ( is_object( $object ) ) {
@@ -92,24 +92,27 @@ class TempFSFile extends FSFile {
                        }
                        $object->tempFSFileReferences[] = $this;
                }
+               return $this;
        }
 
        /**
         * Set flag to not clean up after the temporary file
         *
-        * @return void
+        * @return TempFSFile This object
         */
        public function preserve() {
                $this->canDelete = false;
+               return $this;
        }
 
        /**
         * Set flag clean up after the temporary file
         *
-        * @return void
+        * @return TempFSFile This object
         */
        public function autocollect() {
                $this->canDelete = true;
+               return $this;
        }
 
        /**
index 9c8d85d..635cb95 100644 (file)
@@ -24,9 +24,9 @@
 /**
  * A repository for files accessible via the local filesystem.
  * Does not support database access or registration.
- * 
+ *
  * This is a mostly a legacy class. New uses should not be added.
- * 
+ *
  * @ingroup FileRepo
  * @deprecated since 1.19
  */
index 4b206c3..1865985 100644 (file)
@@ -86,7 +86,7 @@ class ForeignDBRepo extends LocalRepo {
 
        /**
         * Get a key on the primary cache for this repository.
-        * Returns false if the repository's cache is not accessible at this site. 
+        * Returns false if the repository's cache is not accessible at this site.
         * The parameters are the parts of the key, as for wfMemcKey().
         * @return bool|mixed
         */
index bd76fce..7951fb1 100644 (file)
@@ -61,7 +61,7 @@ class ForeignDBViaLBRepo extends LocalRepo {
 
        /**
         * Get a key on the primary cache for this repository.
-        * Returns false if the repository's cache is not accessible at this site. 
+        * Returns false if the repository's cache is not accessible at this site.
         * The parameters are the parts of the key, as for wfMemcKey().
         * @return bool|string
         */
index 0954422..118e981 100644 (file)
@@ -238,7 +238,7 @@ class LocalRepo extends FileRepo {
                        __METHOD__,
                        array( 'ORDER BY' => 'img_name' )
                );
-               
+
                $result = array();
                foreach ( $res as $row ) {
                        $result[] = $this->newFileFromRow( $row );
@@ -299,7 +299,7 @@ class LocalRepo extends FileRepo {
 
        /**
         * Get a key on the primary cache for this repository.
-        * Returns false if the repository's cache is not accessible at this site. 
+        * Returns false if the repository's cache is not accessible at this site.
         * The parameters are the parts of the key, as for wfMemcKey().
         *
         * @return string
index 885a1de..d3aea9f 100644 (file)
@@ -39,22 +39,3 @@ LocalRepo.php. LocalRepo provides only file access, and LocalFile provides
 database access and higher-level functions such as cache management.
 
 Tim Starling, June 2007
-
-Structure:
-
-File defines an abstract class File.
-    ForeignAPIFile extends File.
-    LocalFile extends File.
-        ForeignDBFile extends LocalFile
-        Image extends LocalFile
-    UnregisteredLocalFile extends File.
-        UploadStashFile extends UnregisteredLocalFile.
-FileRepo defines an abstract class FileRepo.
-    ForeignAPIRepo extends FileRepo
-    FSRepo extends FileRepo
-        LocalRepo extends FSRepo
-            ForeignDBRepo extends LocalRepo
-            ForeignDBViaLBRepo extends LocalRepo
-    NullRepo extends FileRepo
-
-Russ Nelson, March 2011
index 8849ac0..c60fbb0 100644 (file)
@@ -567,11 +567,13 @@ When that has been done, you can '''[$2 enter your wiki]'''.",
  * @author Kghbln
  * @author McDutchie
  * @author Mormegil
+ * @author Nemo bis
  * @author Nike
  * @author Platonides
  * @author Purodha
  * @author Raymond
  * @author SPQRobin
+ * @author Shirayuki
  * @author Siebrand
  * @author Umherirrender
  */
@@ -596,6 +598,8 @@ $messages['qqq'] = array(
        'config-sidebar' => 'Maximum width for words is 24 characters. Only visible part of the translation counts to this limit.',
        'config-env-php' => 'Parameters:
 * $1 is the version of PHP that has been installed.',
+       'config-unicode-pure-php-warning' => 'PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.',
+       'config-unicode-update-warning' => "ICU is a body producing standard software tools for support of Unicode and other internationalization aspects. This message warns the system administrator installing MediaWiki that the server's software is not up-to-date and MediaWiki will have problems handling some characters.",
        'config-no-db' => 'Do not translate: <code>./configure --with-mysql</code>.
 <br />
 Do not translate: <code>php5-mysql</code>.
@@ -603,6 +607,8 @@ Do not translate: <code>php5-mysql</code>.
 Parameters:
 * $1 is comma separated list of database types supported by MediaWiki.',
        'config-no-fts3' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
+       'config-pcre' => 'PCRE is an initialism for "Perl-compatible regular expression". Perl is programming language whose [[:w:regular expression|regular expression]] syntax is popular and used in other languages using a library called PCRE.',
+       'config-pcre-no-utf8' => "PCRE is a name of a programmers' library for supporting regular expressions. It can probably be translated without change.",
        'config-memory-raised' => 'Parameters:
 * $1 is the configured <code>memory_limit</code>.
 * $2 is the value to which <code>memory_limit</code> was raised.',
@@ -640,10 +646,13 @@ Add dir="ltr" to the <nowiki><code></nowiki> for right-to-left languages.',
        'config-connection-error' => '$1 is the external error from the database, such as "DB connection error: Access denied for user \'dba\'@\'localhost\' (using password: YES) (localhost)."
 
 If you\'re translating this message to a right-to-left language, consider writing <nowiki><div dir="ltr">$1.</div></nowiki>. (When the bidi features for HTML5 will be implemented in the browsers, it will probably be a good idea to write it as <nowiki><div dir="auto">$1.</div></nowiki>.)',
+       'config-invalid-schema' => '*$1 - schema name',
        'config-sqlite-dir-unwritable' => 'webserver refers to a software like Apache or Lighttpd.',
        'config-can-upgrade' => 'Parameters:
 * $1 - Version or Revision indicator.',
        'config-show-table-status' => '{{doc-important|"SHOW TABLE STATUS" is a MySQL command. Do not translate this.}}',
+       'config-db-web-account-same' => 'checkbox label',
+       'config-db-web-create' => 'checkbox label',
        'config-ns-generic' => '{{Identical|Project}}',
        'config-admin-name' => '{{Identical|Your name}}',
        'config-admin-password' => '{{Identical|Password}}',
@@ -660,20 +669,109 @@ If you\'re translating this message to a right-to-left language, consider writin
 This message refers to a block of HTML being embedded into the installer page. It comes from the Creative Commons Web site. The block is in the English language. It is a scripted license chooser. When an individual license has been selected, it asks you to klick "proceed" so as to return to the MediaWiki installer page.',
        'config-extensions' => '{{Identical|Extension}}',
        'config-install-step-done' => '{{Identical|Done}}',
+       'config-install-database' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+       'config-install-schema' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
        'config-install-pg-schema-failed' => 'Parameters:
 * $1 = database user name (usernames in the database are unrelated to wiki user names)
 * $2 =',
-       'config-install-user' => 'Message indicates that the user is being created',
+       'config-install-user' => 'Message indicates that the user is being created
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
        'config-install-user-grant-failed' => 'Parameters:
 * $1 is the database username for which granting rights failed
 * $2 is the error message',
-       'config-install-tables' => 'Message indicates that the tables are being created',
-       'config-install-interwiki' => 'Message indicates that the interwikitables are being populated',
+       'config-install-tables' => 'Message indicates that the tables are being created
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+       'config-install-interwiki' => 'Message indicates that the interwikitables are being populated
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+       'config-install-stats' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+       'config-install-keys' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
        'config-insecure-keys' => 'Parameters:
 * $1 - A list of names of the secret keys that were generated.
 * $2 - the number of items in the list $1, to be used with PLURAL.',
-       'config-install-sysop' => 'Message indicates that the administrator user account is being created',
+       'config-install-sysop' => 'Message indicates that the administrator user account is being created
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
        'config-install-subscribe-fail' => '{{doc-important|"mediawiki-announce" is the name of a mailing list and should not be translated.}}',
+       'config-install-mainpage' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
        'config-install-done' => 'Parameters:
 * $1 is the URL to LocalSettings download
 * $2 is a link to the wiki.
@@ -9508,43 +9606,45 @@ I seguenti collegamenti sono in lingua inglese:
  * @author 青子守歌
  */
 $messages['ja'] = array(
-       'config-desc' => 'MediaWikiのインストーラー',
-       'config-title' => 'MediaWiki $1のインストール',
+       'config-desc' => 'MediaWiki のインストーラー',
+       'config-title' => 'MediaWiki $1 のインストール',
        'config-information' => '情報',
-       'config-localsettings-upgrade' => '<code>LocalSettings.php</code>ファイルが検出されました。
-アップグレードするため、ボックス中の<code>$wgUpgradeKey</code>の値を入力してください。
-LocalSettings.phpの中にそれはあるでしょう。',
-       'config-localsettings-key' => 'アップグレードキー:',
+       'config-localsettings-upgrade' => 'ファイル <code>LocalSettings.php</code> を検出しました。
+インストールされているものをアップグレードするには、<code>$wgUpgradeKey</code> の値を以下の欄に入力してください。
+この値は LocalSettings.php 内にあります。',
+       'config-localsettings-cli-upgrade' => 'ファイル LocalSettings.php を検出しました。
+インストールされているものをアップグレードするには、update.php を実行してください',
+       'config-localsettings-key' => 'アップグレード キー:',
        'config-localsettings-badkey' => '与えられたキーが間違っています',
        'config-upgrade-key-missing' => 'MediaWikiの既存インストールを検出しました。
 インストールをアップグレードするために、次の行をLocalSettings.phpの末尾に挿入してください:
 
 $1',
-       'config-localsettings-incomplete' => '現在のLocalSettings.phpは不完全であるようです。
-変数$1が設定されていません。
-LocalSettings.phpを変更してこの変数を設定して、『{{int:Config-continue}}』を押してください。',
-       'config-session-error' => 'セッションの開始エラー$1',
+       'config-localsettings-incomplete' => '既存の LocalSettings.php の内容は不完全のようです。
+変数 $1 が設定されていません。
+LocalSettings.php 内でこの変数を設定して、「{{int:Config-continue}}」をクリックしてください。',
+       'config-session-error' => 'セッションの開始エラー$1',
        'config-session-expired' => 'セッションの有効期限が切れたようです。
 セッションの有効期間は$1に設定されています。
 php.iniの<code>session.gc_maxlifetime</code>を設定することで、この問題を改善できます。
 インストール作業を再起動させてください。',
        'config-no-session' => 'セッションのデータが消失しました!
 php.iniを確認し、<code>session.save_path</code>が適切なディレクトリに設定されていることを確認してください。',
-       'config-your-language' => 'あなたの言語',
+       'config-your-language' => 'あなたの言語:',
        'config-your-language-help' => 'インストール作業に使用する言語を選択してください。',
-       'config-wiki-language' => 'ウィキの言語',
+       'config-wiki-language' => 'ウィキの言語:',
        'config-wiki-language-help' => 'ウィキで主に書き込まれる言語を選択してください。',
-       'config-back' => '←戻る',
+       'config-back' => '← 戻る',
        'config-continue' => '続行 →',
        'config-page-language' => '言語',
-       'config-page-welcome' => 'MediaWikiへようこそ!',
+       'config-page-welcome' => 'MediaWiki へようこそ!',
        'config-page-dbconnect' => 'データベースに接続',
        'config-page-upgrade' => '既存のインストールを更新',
        'config-page-dbsettings' => 'データベースの設定',
        'config-page-name' => '名前',
        'config-page-options' => 'オプション',
        'config-page-install' => 'インストール',
-       'config-page-complete' => '完了',
+       'config-page-complete' => '完了!',
        'config-page-restart' => 'インストールを再起動',
        'config-page-readme' => 'お読みください',
        'config-page-releasenotes' => 'リリースノート',
@@ -9587,12 +9687,12 @@ MediaWikiのインストールはできません。',
 高トラフィックのサイトを運営する場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode正規化に関するページ]をお読みください。",
        'config-unicode-update-warning' => "'''警告''':インストールされているバージョンのUnicode正規化ラッパーは、[http://site.icu-project.org/ ICUプロジェクト]のライブラリの古いバージョンを使用しています。
 Unicodeを少しでも利用する可能性があるなら、[//www.mediawiki.org/wiki/Unicode_normalization_considerations アップグレード]する必要があります。",
-       'config-no-db' => '適切なデータベースドライバが見つかりませんでした!PHPにデータベースドライバをインストールする必要があります。
-次の種類のデータベースが使用できます: $1
+       'config-no-db' => '適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。
+以下の種類のデータベースに対応しています: $1
 
\85±æ\9c\89ã\82µã\83¼ã\83\90ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81ã\82µã\83¼ã\83\90ã\81®ç®¡ç\90\86è\80\85ã\81«é\81©å\88\87ã\81ªã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\83\89ã\83©ã\82¤ã\83\90ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\82\92依頼してください。
-PHPを自分でコンパイルした場合は、たとえば<code>./configure --with-mysql</code>を実行して、データベースクライアントを使用可能に再設定してください。
-DebianまたはUbuntuのパッケージからPHPをインストールした場合は、php5-mysqlモジュールもインストールする必要があります。',
\85±æ\9c\89ã\82µã\83¼ã\83\90ã\83¼ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81é\81©å\88\87ã\81ªã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ ã\83\89ã\83©ã\82¤ã\83\90ã\83¼ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\82\92ã\80\81ã\82µã\83¼ã\83\90ã\83¼ã\81®ç®¡ç\90\86è\80\85ã\81«依頼してください。
+PHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysql</code> を実行して、データベース クライアントを使用できるように再設定してください。
+Debian または Ubuntu のパッケージから PHP をインストールした場合は、php5-mysql モジュールもインストールする必要があります。',
        'config-no-fts3' => "'''警告''':SQLiteは[//sqlite.org/fts3.html FTS3]モジュールなしでコンパイルされており、検索機能はこのバックエンドで利用不可能になります。",
        'config-register-globals' => "'''警告:PHPの<code>[http://php.net/register_globals register_globals]</code>オプションが有効になっています。'''
 '''可能なら無効化してください。'''
@@ -9616,18 +9716,18 @@ MediaWikiは、このモジュールの関数を必要としているため、
 Mandrakeを実行している場合、php-xmlパッケージをインストールしてください。',
        'config-pcre' => 'PCREをサポートしているモジュールが不足しているようです。
 MediaWikiは、Perl互換の正規表現関数の動作が必要です。',
-       'config-pcre-no-utf8' => "'''致命的エラー''': PHPのPCREがPCRE_UTF8サポート無しでコンパイルされています。
-MediaWikiにはUTF-8サポートの関数が必要です。",
+       'config-pcre-no-utf8' => "'''致命的エラー''': PHP の PCRE が PCRE_UTF8 対応なしでコンパイルされているようです。
+MediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
        'config-memory-raised' => 'PHPの<code>memory_limit</code>は$1で、$2に引き上げられました。',
        'config-memory-bad' => "'''警告:'''PHPの<code>memory_limit</code>は$1です。
 これは、非常に遅い可能性があります。
 インストールが失敗するかもしれません!",
-       'config-xcache' => '[http://xcache.lighttpd.net/ XCache]がインストール済み',
-       'config-apc' => '[http://www.php.net/apc APC]がインストール済み',
-       'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache]がインストール済み',
-       'config-no-cache' => "'''è­¦å\91\8aï¼\9a'''[http://www.php.net/apc APC]ã\80\81[http://xcache.lighttpd.net/ XCache]ã\81\82ã\82\8bã\81\84ã\81¯[http://www.iis.net/download/WinCacheForPhp WinCache]のいずれも見つかりませんでした。
+       'config-xcache' => '[http://xcache.lighttpd.net/ XCache] がインストール済み',
+       'config-apc' => '[http://www.php.net/apc APC] がインストール済み',
+       'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] がインストール済み',
+       'config-no-cache' => "'''è­¦å\91\8aï¼\9a'''[http://www.php.net/apc APC]ã\80\81[http://xcache.lighttpd.net/ XCache]ã\80\81[http://www.iis.net/download/WinCacheForPhp WinCache] のいずれも見つかりませんでした。
 オブジェクトのキャッシュは有効化されません。",
-       'config-diff3-bad' => 'GNU diff3が見つかりません。',
+       'config-diff3-bad' => 'GNU diff3 が見つかりません。',
        'config-imagemagick' => 'ImageMagickが見つかりました:<code>$1</code>。
 アップロードが有効なら、画像のサムネイルが利用できます。',
        'config-gd' => 'GD画像ライブラリが内蔵されていることが確認されました。
@@ -9637,9 +9737,9 @@ MediaWikiにはUTF-8サポートの関数が必要です。",
        'config-no-uri' => "'''エラー:'''現在のURIを決定できませんでした。
 インストールは中止されました。",
        'config-using-server' => 'サーバー名「<nowiki>$1</nowiki>」を使用しています。',
-       'config-using-uri' => 'サーバーURL「<nowiki>$1$2</nowiki>」を使用しています。',
-       'config-uploads-not-safe' => "'''警告:'''アップロードの既定ディレクトリ<code>$1</code>が、任意のスクリプト実行に関して脆弱性があります。
-MediaWikiはアップロードされたファイルのセキュリティ上の脅威を確認しますが、アップロードを有効化するまえに、[//www.mediawiki.org/wiki/Manual:Security#Upload_security このセキュリティ上の脆弱性を閉じる]ことが強く推奨されます。",
+       'config-using-uri' => 'サーバー URL「<nowiki>$1$2</nowiki>」を使用しています。',
+       'config-uploads-not-safe' => "'''警告:'''アップロードの既定ディレクトリ <code>$1</code> に、任意のスクリプト実行に関する脆弱性があります。
+MediaWiki はアップロードされたファイルのセキュリティ上の脅威を確認しますが、アップロードを有効化する前に、[//www.mediawiki.org/wiki/Manual:Security#Upload_security このセキュリティ上の脆弱性を解決する]ことを強く推奨します。",
        'config-brokenlibxml' => 'このシステムで使われているPHPとlibxml2のバージョンのこの組み合わせにはバグがあります。具体的には、MediaWikiやその他のウェブアプリケーションでhiddenデータが破損する可能性があります。
 PHPを5.2.9かそれ以降のバージョンに、libxml2を2.7.3かそれ以降のバージョンにアップグレードしてください([//bugs.php.net/bug.php?id=45996 PHPでのバグ情報])。
 インストールを終了します。',
@@ -9647,8 +9747,8 @@ PHPを5.2.9かそれ以降のバージョンに、libxml2を2.7.3かそれ以降
 PHP5.3.2以降に更新するか、この([//bugs.php.net/bug.php?id=50394 PHPに提出されたバグ])を修正するためにPHP5.3.0へ戻してください。
 インストールは中止されました。',
        'config-suhosin-max-value-length' => 'Suhosin がインストールされており、GETパラメータの長さを $1 バイトに制限しています。MediaWiki の ResourceLoader コンポーネントはこの制限を回避しますが、パフォーマンスは低下します。可能な限り、php.ini で suhosin.get.max_value_length を 1024 以上に設定し、同じ値を LocalSettings.php 中で $wgResourceLoaderMaxQueryLength に設定してください。',
-       'config-db-type' => 'データベースの種類',
-       'config-db-host' => 'データベースのホスト',
+       'config-db-type' => 'データベースの種類:',
+       'config-db-host' => 'データベースのホスト:',
        'config-db-host-help' => '異なるサーバー上にデータベースサーバーがある場合、ホスト名またはIPアドレスをここに入力してください。
 
 もし、共有されたウェブホスティングを使用している場合、ホスティングプロバイダーは正確なホスト名を解説しているはずです。
@@ -9656,18 +9756,18 @@ PHP5.3.2以降に更新するか、この([//bugs.php.net/bug.php?id=50394 PHP
 WindowsでMySQLを使用している場合に、「localhost」は、サーバー名としてはうまく働かないでしょう。もしそのような場合は、ローカルIPアドレスとして「127.0.0.1」を試してみてください。
 
 PostgreSQLを使用している場合、UNIXソケットで接続するにはこの欄を空欄のままにしてください。',
-       'config-db-host-oracle' => 'データベースTNS:',
+       'config-db-host-oracle' => 'データベース TNS:',
        'config-db-host-oracle-help' => '有効な[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm ローカル接続名]を入力してください。tnsnames.oraファイルは、このインストールに対して表示されてなければなりません、<br />もしクライアントライブラリ10gもしくはそれ以上を使用している場合、メソッドの名前を[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 簡易接続]で利用できます。',
-       'config-db-wiki-settings' => 'ã\81\93ã\81®ã\82¦ã\82£ã\82­ã\82\92è­\98å\88¥',
-       'config-db-name' => 'データベース名',
+       'config-db-wiki-settings' => 'ã\81\93ã\81®ã\82¦ã\82£ã\82­ã\81®è­\98å\88¥æ\83\85å ±',
+       'config-db-name' => 'データベース名:',
        'config-db-name-help' => 'このウィキを識別する名前を入力してください。
 空白を含めることはできません。
 
 共有ウェブホストを利用している場合、ホスティングプロバイダーが特定の使用可能なデータベース名を提供するか、あるいは管理パネルからデータベースを作成できるようにしているでしょう。',
-       'config-db-name-oracle' => 'データベースのスキーマ',
-       'config-db-install-account' => 'ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81®ã\81\9fã\82\81ã\81®利用者アカウント',
-       'config-db-username' => 'データベースの利用者名:',
-       'config-db-password' => 'データベースのパスワード',
+       'config-db-name-oracle' => 'データベースのスキーマ:',
+       'config-db-install-account' => 'ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81§ä½¿ç\94¨ã\81\99ã\82\8b利用者アカウント',
+       'config-db-username' => 'データベースのユーザー名:',
+       'config-db-password' => 'データベースのパスワード:',
        'config-db-password-empty' => '新しいデータベースの利用者名 $1 のパスワードを入力してください。
 パスワードを設定しないでユーザを作ることもできるかもしれませんが、安全ではありません。',
        'config-db-install-username' => 'インストール中にデータベースに接続するために使うユーザ名を入力してください。これは MediaWiki アカウントのユーザ名 (利用者名) のことではありません。あなたのデータベースでのユーザ名です。',
@@ -9677,62 +9777,63 @@ PostgreSQLを使用している場合、UNIXソケットで接続するにはこ
        'config-db-wiki-account' => 'インストール作業終了後の利用者アカウント',
        'config-db-wiki-help' => '通常のウィキ操作中にデータベースへの接続する時に利用する利用者名とパスワードを入力してください。
 アカウントが存在せず、インストールのアカウントに十分な権限がある場合は、この利用者アカウントは、ウィキを操作する上で最小限の権限を持った状態で作成されます。',
-       'config-db-prefix' => 'データベーステーブルの接頭辞:',
+       'config-db-prefix' => 'データベース テーブルの接頭辞:',
        'config-db-prefix-help' => 'データベースを複数のウィキ間、あるいはMediaWikiと他のウェブアプリケーションで共有する必要がある場合、衝突を避けるために、すべてのテーブル名に接頭辞を付ける必要があります。
 空白は使用できません。
 
 このフィールドは、通常は空のままです。',
        'config-db-charset' => 'データベースの文字セット',
-       'config-charset-mysql5-binary' => 'MySQL 4.1/5.0バイナリ',
+       'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 バイナリ',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
-       'config-charset-mysql4' => 'MySQL 4.0 下位互換UTF-8',
-       'config-charset-help' => "'''警告:'''MySQL 4.1+で'''下位互換UTF-8'''を使用し、その後<code>mysqldump</code>でデータベースをバックアップすると、すべての非ASCII文字が破壊され、不可逆的にバップアップが壊れるかもしれません。
-
-'''バイナリー形式'''では、MediaWikiは、UTF-8テキストを、データベースのバイナリーフィールドに格納します。
-これは、MySQLのUTF-8形式より効率的で、Unicode文字の全範囲を利用できるようになります。
-'''UTF-8形式'''では、MySQLは、データ内でどの文字集合を使用しているかを知っていて、それに対して適切な提示と変換をするでしょうが、
-[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できるようにはなりません。",
-       'config-mysql-old' => 'MySQLの$1以降が要求されています。あなたの所有のものは$2です。',
-       'config-db-port' => 'データベースポート:',
-       'config-db-schema' => 'メディアウィキの図式',
-       'config-db-schema-help' => '上の図式は常に正確です。
-必要である場合のみ、変更してください。',
-       'config-sqlite-dir' => 'SQLiteのデータディレクトリ:',
-       'config-sqlite-dir-help' => "SQLiteは単一のファイル内にすべてのデータを保持しています。
-
-指定したディレクトリは、インストール時にウェブサーバーが書き込める必要があります。
-
-このディレクトリはウェブからアクセス'''不可能'''である必要があります。これがPHPファイルがある場所に配置できない理由です。
-
-インストーラーは同時に<code>.htaccess</code>ファイルに書き込みます。しかし、これが失敗しても誰かがあなたの生のデータベースにアクセスすることが可能となるでしょう。データベースは生のデータ(メールアドレス、パスワードのハッシュ値)の他、削除された版、その他、ウィキ上の制限されているデータを含んでいます。
-
-例えば<code>/var/lib/mediawiki/yourwiki</code>のように、別の場所にデータベースを配置することを検討してください。",
-       'config-oracle-def-ts' => '既定のテーブル領域:',
-       'config-oracle-temp-ts' => '一時的なテーブル領域:',
+       'config-charset-mysql4' => 'MySQL 4.0 後方互換 UTF-8',
+       'config-charset-help' => "'''警告:''' MySQL 4.1+ で'''後方互換 UTF-8''' を使用している状態で、<code>mysqldump</code> でデータベースをバックアップすると、すべての非 ASCII 文字が破壊されてしまい、バックアップが不可逆的に破損してしまいます!
+
+'''バイナリ モード'''では、MediaWiki は、UTF-8 テキストをデータベースのバイナリ フィールドに格納します。
+これは、MySQL の UTF-8 モードより効率的で、Unicode 文字の全範囲を利用できるようになります。
+'''UTF-8 モード'''では、MySQL は、データ内で使用している文字集合を知っているため、適切に表現や変換ができますが、
+[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できません。",
+       'config-mysql-old' => 'MySQL $1 以降が必要です。ご使用中の MySQL は $2 です。',
+       'config-db-port' => 'データベースのポート:',
+       'config-db-schema' => 'MediaWiki のスキーマ:',
+       'config-db-schema-help' => '通常はこのスキーマで問題ありません。
+必要な場合のみ変更してください。',
+       'config-sqlite-dir' => 'SQLite データ ディレクトリ:',
+       'config-sqlite-dir-help' => "SQLite は単一のファイル内にすべてのデータを格納しています。
+
+指定したディレクトリは、インストール時にウェブ サーバーが書き込めるようにしておく必要があります。
+
+このディレクトリはウェブからアクセス'''不可能'''である必要があります。PHP ファイルがある場所には配置できないのはこのためです。
+
+インストーラーは <code>.htaccess</code> ファイルにも書き込みます。しかし、これが失敗した場合は、誰かが生のデータベースにアクセスできてしまいます。
+データベースは、生のデータ (メールアドレス、パスワードのハッシュ値) の他、削除された版、その他ウィキ上の制限されているデータを含んでいます。
+
+例えば <code>/var/lib/mediawiki/yourwiki</code> のように、別の場所にデータベースを配置することを検討してください。",
+       'config-oracle-def-ts' => '既定のテーブル領域:',
+       'config-oracle-temp-ts' => '一時的なテーブル領域:',
        'config-type-mysql' => 'MySQL',
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
        'config-type-ibm_db2' => 'IBM DB2',
-       'config-support-info' => 'メディアウィキは次のようなデータベースシステムをサポートする:
+       'config-support-info' => 'MediaWiki は以下のデータベース システムに対応しています:
 
 $1
 
-もし、データベースシステムが不可視であるならば、以下のようにリスト化されたものを使用してみてください。可能なサポートの指示に従ってください。',
+使用しようとしているデータベース システムが下記の一覧にない場合は、上記リンク先の手順に従ってインストールしてください。',
        'config-support-mysql' => '* $1はMediaWikiの主要な対象で、もっともサポートされています([http://www.php.net/manual/en/mysql.installation.php MySQLのサポート下でPHPをコンパイルする方法])',
        'config-support-postgres' => '* $1は、MySQLの代替として、人気のあるオープンソースデータベースシステムです([http://www.php.net/manual/en/pgsql.installation.php PostgreSQLのサポート下でPHPをコンパイルする方法])',
        'config-support-sqlite' => '* $1は、良くサポートされている、軽量データベースシステムです。([http://www.php.net/manual/en/pdo.installation.php SQLiteのサポート下でPHPをコンパイルする方法]、PDOを使用)',
        'config-support-oracle' => '* $1は商業企業のデータベースです。([http://www.php.net/manual/en/oci8.installation.php OCI8サポートなPHPをコンパイルする方法])',
        'config-support-ibm_db2' => '* $1 は商業企業のデータベースです。',
-       'config-header-mysql' => 'MySQLの設定',
-       'config-header-postgres' => 'PostgreSQLの設定',
-       'config-header-sqlite' => 'SQLiteの設定',
-       'config-header-oracle' => 'Oracleの設定',
-       'config-header-ibm_db2' => 'IBM DB2の設定',
+       'config-header-mysql' => 'MySQL の設定',
+       'config-header-postgres' => 'PostgreSQL の設定',
+       'config-header-sqlite' => 'SQLite の設定',
+       'config-header-oracle' => 'Oracle の設定',
+       'config-header-ibm_db2' => 'IBM DB2 の設定',
        'config-invalid-db-type' => '無効なデータベースの種類',
-       'config-missing-db-name' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\90\8dã\80\8dã\82\92å\85¥å\8a\9bã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99',
-       'config-missing-db-host' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83\9bã\82¹ã\83\88ã\80\8dã\82\92å\85¥å\8a\9bã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99',
-       'config-missing-db-server-oracle' => '「データベースTNS」に値を入力する必要があります',
+       'config-missing-db-name' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\90\8dã\80\8dã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84',
+       'config-missing-db-host' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83\9bã\82¹ã\83\88ã\80\8dã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84',
+       'config-missing-db-server-oracle' => '「データベース TNS」の値を入力してください',
        'config-invalid-db-server-oracle' => '「$1」は無効なデータベース TNS です。
 アスキー英字(a-z、A-Z)、数字(0-9)、アンダーバー(_)、ドット(.)のみを使用してください。',
        'config-invalid-db-name' => '「$1」は無効なデータベース名です。
@@ -9742,43 +9843,43 @@ $1
        'config-connection-error' => '$1。
 
 以下のホスト名、ユーザ名、パスワードをチェックして、再度試してみてください。',
-       'config-invalid-schema' => 'ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82­ã\80\8c$1ã\80\8dã\81«ã\81\8aã\81\91ã\82\8bç\84¡å\8a¹ã\81ªå\9b³å¼\8fです。
-アスキー英字(a-z、A-Z)、数字(0-9)、下線(_)のみを使用してください。',
-       'config-postgres-old' => 'PostgreSQLの$1あるいはそれ以降が必要で、いまのバージョンは$2です。',
+       'config-invalid-schema' => 'ã\80\8c$1ã\80\8dã\81¯ MediaWiki ã\81®ã\82¹ã\82­ã\83¼ã\83\9eã\81¨ã\81\97ã\81¦ç\84¡å\8a¹です。
+ASCII の英数字 (a-z、A-Z、0-9)、下線 (_) のみを使用してください。',
+       'config-postgres-old' => 'PostgreSQL $1 以降が必要です。ご使用中の PostgreSQL は $2 です。',
        'config-sqlite-name-help' => 'あなたのウェキと同一性のある名前を選んでください。
 空白およびハイフンは使用しないでください。
 SQLiteのデータファイル名として使用されます。',
-       'config-sqlite-parent-unwritable-group' => 'データディレクトリ<code><nowiki>$1</nowiki></code>を作成できません。親ディレクトリ<code><nowiki>$2</nowiki></code>は、ウェブサーバーから書き込みできませんでした。
+       'config-sqlite-parent-unwritable-group' => 'データ ディレクトリ <code><nowiki>$1</nowiki></code> を作成できません。ウェブ サーバーは親ディレクトリ <code><nowiki>$2</nowiki></code> に書き込めませんでした。
 
\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«æ©\9fè\83½ã\81¯ã\80\81å®\9fè¡\8cã\81\97ã\81¦ã\81\84ã\82\8bã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\83¼ã\81®ユーザーを特定しました。
-続行するには、<code><nowiki>$3</nowiki></code>ディレクトリを書き込み可能にしてください。
-UnixあるいはLinux上では、以下を実行してください:
\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\83¼ã\81¯ã\80\81ã\82¦ã\82§ã\83\96 ã\82µã\83¼ã\83\90ã\83¼ã\81®å®\9fè¡\8cユーザーを特定しました。
+続行するには、ディレクトリ <code><nowiki>$3</nowiki></code> に書き込めるようにしてください。
+Unix または Linux であれば、以下を実行してください:
 
 <pre>cd $2
 mkdir $3
 chgrp $4 $3
 chmod g+w $3</pre>',
-       'config-sqlite-parent-unwritable-nogroup' => 'データディレクトリ<code><nowiki>$1</nowiki></code>を作成できません。親ディレクトリ<code><nowiki>$2</nowiki></code>は、ウェブサーバから書き込みできませんでした。
+       'config-sqlite-parent-unwritable-nogroup' => 'データ ディレクトリ <code><nowiki>$1</nowiki></code> を作成できません。ウェブ サーバーは、親ディレクトリ <code><nowiki>$2</nowiki></code> に書き込めませんでした。
 
\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«æ©\9fè\83½ã\81¯ã\80\81å®\9fè¡\8cã\81\97ã\81¦ã\81\84ã\82\8bã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\81®ユーザーを特定できませんでした。
-続行するには、<code><nowiki>$3</nowiki></code>ディレクトリを、ウェブサーバ(と他のユーザ!)からグローバルに書き込めるようにしてください。
-UnixあるいはLinux上では、以下を実行してください:
\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\83¼ã\81¯ã\80\81ã\82¦ã\82§ã\83\96 ã\82µã\83¼ã\83\90ã\83¼ã\81®å®\9fè¡\8cユーザーを特定できませんでした。
+続行するには、ディレクトリ <code><nowiki>$3</nowiki></code> に、ウェブ サーバー (と、あらゆる人々!) がグローバルに書き込めるようにしてください。
+Unix または Linux では、以下を実行してください:
 
 <pre>cd $2
 mkdir $3
 chmod a+w $3</pre>',
-       'config-sqlite-mkdir-error' => 'データディレクトリ「$1」の作成中にエラーが発生しました。
+       'config-sqlite-mkdir-error' => 'データ ディレクトリ「$1」を作成する際にエラーが発生しました。
 場所を確認してから、再度試してください。',
        'config-sqlite-dir-unwritable' => 'ディレクトリ「$1」に書き込めません。
-ウェブサーバーが書き込めるようにパーミッションを変更してから、度試してください。',
+ウェブ サーバーが書き込めるようにパーミッションを変更してから、再度試してください。',
        'config-sqlite-connection-error' => '$1。
 
-下記のデータディレクトリとデータベース名を確認してから、再度試してみてください。',
-       'config-sqlite-readonly' => 'ファイル<code>$1</code>は書き込み不能です。',
-       'config-sqlite-cant-create-db' => 'データベースファイル<code>$1</code>を作成できませんでした。',
-       'config-sqlite-fts3-downgrade' => 'PHPはFTS3のサポート、テーブルのダウングレードが無効です。',
-       'config-can-upgrade' => 'ã\81\93ã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\81¯ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82­ã\83\86ã\83¼ã\83\96ã\83«ã\81\8cå­\98å\9c¨ã\81\97ます。
\81\9dã\82\8cã\82\89ã\82\92ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82­$1ã\81«ã\82¢ã\83\83ã\83\97ã\82°ã\83¬ã\83¼ã\83\89ã\81\99ã\82\8bã\81\9fã\82\81ã\81«「続行」をクリックしてください。',
+データ ディレクトリおよびデータベース名を確認してから、再度試してください。',
+       'config-sqlite-readonly' => 'ファイル <code>$1</code> に書き込めません。',
+       'config-sqlite-cant-create-db' => 'データベース ファイル <code>$1</code> を作成できませんでした。',
+       'config-sqlite-fts3-downgrade' => 'PHP が FTS3 に対応していないため、テーブルをダウングレードしています',
+       'config-can-upgrade' => 'ã\81\93ã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\81¯ã\80\80MediaWiki ã\83\86ã\83¼ã\83\96ã\83«ã\81\8cã\81\82ã\82\8aます。
\81\93ã\82\8cã\82\89ã\81®ã\83\86ã\83¼ã\83\96ã\83«ã\82\92 MediaWiki $1 ã\81«ã\82¢ã\83\83ã\83\97ã\82°ã\83¬ã\83¼ã\83\89ã\81\99ã\82\8bã\81«ã\81¯ã\80\81「続行」をクリックしてください。',
        'config-upgrade-done' => "更新は完了しました。
 
 [$1 ウィキを使い始める]ことができます。
@@ -9792,12 +9893,12 @@ chmod a+w $3</pre>',
        'config-show-table-status' => 'SHOW TABLE STATUSクエリーが失敗しました!',
        'config-unknown-collation' => "'''警告:''' データベースは認識されない照合を使用しています。",
        'config-db-web-account' => 'ウェブアクセスのためのデータベースアカウント',
-       'config-db-web-help' => 'ウィキの元来の操作中、ウェブサーバーがデーターベースサーバーに接続できるように、ユーザ名とパスワードを選択してください。',
-       'config-db-web-account-same' => 'インストールのために同じアカウントを使用してください',
-       'config-db-web-create' => '既に存在していないのであれば、アカウントを作成してください',
+       'config-db-web-help' => 'ウィキの通常の操作の際に、ウェブ サーバーがデータベース サーバーに接続できるように、ユーザー名とパスワードを指定してください。',
+       'config-db-web-account-same' => 'インストール作業と同じアカウントを使用する',
+       'config-db-web-create' => 'アカウントが存在しない場合は作成する',
        'config-db-web-no-create-privs' => 'あなたがインストールのために定義したアカウントは、アカウント作成のための特権としては不充分です。
 あなたがここで指定したアカウントは既に存在している必要があります。',
-       'config-mysql-engine' => 'ストレージエンジン:',
+       'config-mysql-engine' => 'ストレージ エンジン:',
        'config-mysql-innodb' => 'InnoDB',
        'config-mysql-myisam' => 'MyISAM',
        'config-mysql-engine-help' => "'''InnoDB'''は、並行処理のサポートに優れているので、ほとんどの場合において最良の選択肢です。
@@ -9807,29 +9908,29 @@ chmod a+w $3</pre>',
        'config-mysql-charset' => 'データベースの文字セット:',
        'config-mysql-binary' => 'バイナリ',
        'config-mysql-utf8' => 'UTF-8',
-       'config-mysql-charset-help' => "'''バイナリー形式'''では、MediaWikiは、UTF-8テキストを、データベースのバイナリーフィールドに格納します。
-これは、MySQLのUTF-8形式より効率的で、Unicode文字の全範囲を利用できるようになります。
+       'config-mysql-charset-help' => "'''バイナリ モード'''では、MediaWiki は、UTF-8 テキストをデータベースのバイナリ フィールドに格納します。
+これは、MySQL の UTF-8 モードより効率的で、Unicode 文字の全範囲を利用できるようになります。
 
-'''UTF-8形式'''では、MySQLは、データ内でどの文字集合を使用しているかを知っていて、それに対して適切な提示と変換をするでしょうが、
-[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 å\9fºæ\9c¬å¤\9aè¨\80èª\9eé\9d¢]ã\81®å¤\96ã\81«ã\81\82ã\82\8bæ\96\87å­\97ã\82\92æ ¼ç´\8dã\81§ã\81\8dã\82\8bã\82\88ã\81\86ã\81«ã\81¯ã\81ªã\82\8aã\81¾ã\81\9bã\82\93ã\80\82",
-       'config-site-name' => 'ウィキの名前:',
+'''UTF-8 モード'''では、MySQL は、データ内で使用している文字集合を知っているため、適切に表現や変換ができますが、
+[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できません。",
+       'config-site-name' => 'ウィキ名:',
        'config-site-name-help' => 'この事象はブラウザーのタイトルバーと他のさまざまな場所に現れる。',
        'config-site-name-blank' => 'サイト名を入力してください。',
-       'config-project-namespace' => 'プロジェクト名前空間',
+       'config-project-namespace' => 'プロジェクト名前空間:',
        'config-ns-generic' => 'プロジェクト',
-       'config-ns-site-name' => 'ウィキ名と同じ$1',
-       'config-ns-other' => 'その他(指定してください)',
+       'config-ns-site-name' => 'ウィキ名と同じ$1',
+       'config-ns-other' => 'その他 (指定してください)',
        'config-ns-other-default' => 'マイウィキ',
        'config-project-namespace-help' => "ウィキペディアの例に従い、多くのウィキは、コンテンツのページとは分離したポリシーページを「'''プロジェクトの名前空間'''」に持っています。
 この名前空間のページのタイトルはすべて、ある接頭辞で始まります。それをここで指定することができます。
-この接頭辞はウィキの名前に由来するのが伝統的ですが、「#」や「:」のような区切り記号を含めることはできません。",
+この接頭辞はウィキの名前に由来するのが伝統的ですが、「#」や「:」のような区切り文字を含めることはできません。",
        'config-ns-invalid' => '"<nowiki>$1</nowiki>"のように指定された名前空間は無効です。
 違うプロジェクト名前空間を指定してください。',
        'config-admin-box' => '管理アカウント',
-       'config-admin-name' => '名前',
-       'config-admin-password' => 'パスワード',
-       'config-admin-password-confirm' => 'パスワードの再入力',
-       'config-admin-help' => 'ここにあなたの希望するユーザ名を入力してください(例えば"Joe Bloggs"など)
+       'config-admin-name' => '名前:',
+       'config-admin-password' => 'パスワード:',
+       'config-admin-password-confirm' => 'パスワードの再入力:',
+       'config-admin-help' => '希望するユーザー名をここに入力してください (例: "Joe Bloggs")
 この名前でこのウィキにログインすることになります。',
        'config-admin-name-blank' => '管理者のユーザ名を入力してください。',
        'config-admin-name-invalid' => '指定されたユーザ名 "<nowiki>$1</nowiki>" は無効です。
@@ -9837,7 +9938,7 @@ chmod a+w $3</pre>',
        'config-admin-password-blank' => '管理者アカウントのパスワードを入力してください。',
        'config-admin-password-same' => 'ユーザ名と同じパスワードは使えません。',
        'config-admin-password-mismatch' => '入力された2つのパスワードが一致しません。',
-       'config-admin-email' => 'メールアドレス',
+       'config-admin-email' => 'メールアドレス:',
        'config-admin-email-help' => 'メールアドレスを入力してください。他の利用者からのメールの受け取り、パスワードのリセット、ウォッチリストに登録したページの更新通知に使用します。空欄のままにすることもできます。',
        'config-admin-error-user' => '"<nowiki>$1</nowiki>"という名前の管理者を作成する際に内部エラーが発生しました。',
        'config-admin-error-password' => '管理者"<nowiki>$1</nowiki>"のパスワードを設定する際に内部エラーが発生しました: <pre>$2</pre>',
@@ -9848,7 +9949,7 @@ chmod a+w $3</pre>',
 残りの設定を飛ばして、今すぐにウィキをインストールできます。',
        'config-optional-continue' => '私にもっと質問してください。',
        'config-optional-skip' => 'もう飽きてしまったので、とにかくウィキをインストールしてください。',
-       'config-profile' => '正しいプロフィールのユーザ:',
+       'config-profile' => '利用者権限のプロファイル:',
        'config-profile-wiki' => '伝統的なウィキ',
        'config-profile-no-anon' => 'アカウントの作成が必要',
        'config-profile-fishbowl' => '承認された編集者のみ',
@@ -9871,7 +9972,7 @@ MediaWikiでは、最近の更新を確認し、神経質な、もしくは悪
        'config-license-cc-by-sa' => 'クリエイティブ・コモンズ 表示-継承',
        'config-license-cc-by' => 'クリエイティブ・コモンズ 表示',
        'config-license-cc-by-nc-sa' => 'クリエイティブ・コモンズ 表示-非営利-継承',
-       'config-license-gfdl' => 'GNUフリー文書利用許諾契約書1.3以降',
+       'config-license-gfdl' => 'GNU フリー文書利用許諾契約書 1.3 以降',
        'config-license-pd' => 'パブリック・ドメイン',
        'config-license-cc-choose' => 'その他のクリエイティブ・コモンズ・ライセンスを選択する',
        'config-license-help' => "多くの公開ウィキでは、すべての寄稿物が[http://freedomdefined.org/Definition フリーライセンス]の元に置かれています。
@@ -9897,40 +9998,40 @@ GFDL は有効なライセンスですが、内容を理解するのは困難で
        'config-email-auth-help' => "この選択肢を有効にすると、利用者がメールアドレスを設定あるいは変更したときに送信されるリンクにより、そのアドレスを確認しなければならなくなります。
 認証済みのアドレスだけが、他の利用者からのメールや、変更通知のメールを受け取ることができます。
 公開ウィキでは、メール機能による潜在的な不正利用の防止のため、この選択肢を設定することが'''推奨'''されます。",
-       'config-email-sender' => '返信メールアドレス:',
+       'config-email-sender' => '返信先メールアドレス:',
        'config-email-sender-help' => '送信メールで返信先として使用するメールアドレスを入力してください。
 このアドレスは、宛先不明の場合の通知の宛先になります。
 多くのメールサーバーでは、少なくともドメイン名部分は有効である必要があります。',
        'config-upload-settings' => '画像およびファイルのアップロード',
        'config-upload-enable' => 'ファイルのアップロードを有効にする',
-       'config-upload-help' => 'ファイルのアップロードは潜在的にあなたのサーバにセキュリティ上の危険をさらします。
-更なる情報のために、マニュアルの[//www.mediawiki.org/wiki/Manual:Security security section] を読むことをすすめます
+       'config-upload-help' => 'ファイルのアップロードは、あなたのサーバーをセキュリティ上の潜在的な危険に晒します。
+この詳細は、マニュアルの [//www.mediawiki.org/wiki/Manual:Security security section] をお読みください
 
\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81§ã\81\8dã\82\8bã\82\88ã\81\86ã\81«ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82­ã\81®ã\83«ã\83¼ã\83\88ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªä¸\8bã\81®<code>images</code>ã\82µã\83\96ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81®ã\83¢ã\83¼ã\83\89ã\82\92å¤\89æ\9b´ã\81\97ã\81¾ã\81\99ã\80\82ã\81\9dã\81\86ã\81\99ã\82\8bã\81\93ã\81¨ã\81§ã\80\81ã\82¦ã\82§ã\83\96ã\82µã\83¼ã\83\90ã\83¼ã\81¯そこに書き込めるようになります。
\83\95ã\82¡ã\82¤ã\83«ã\81®ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\82\92æ\9c\89å\8a¹ã\81«ã\81\99ã\82\8bã\81«ã\81¯ã\80\81MediaWiki ã\81®ã\83«ã\83¼ã\83\88 ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªå\86\85ã\81® <code>images</code> ã\82µã\83\96 ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81®ã\83¢ã\83¼ã\83\89ã\82\92å¤\89æ\9b´ã\81\97ã\81¾ã\81\99ã\80\82ã\81\93ã\82\8cã\81«ã\82\88ã\82\8aã\80\81ã\82¦ã\82§ã\83\96 ã\82µã\83¼ã\83\90ã\83¼ã\81\8cそこに書き込めるようになります。
 そして、このオプションを有効にしてください。',
        'config-upload-deleted' => '削除されたファイルのためのディレクトリ:',
        'config-upload-deleted-help' => '削除されるファイルを保存するためのディレクトリを選択してください。
 これがウェブからアクセスできないことが理想です。',
-       'config-logo' => 'ロゴのURL:',
+       'config-logo' => 'ロゴ のURL:',
        'config-logo-help' => 'MediaWikiの既定の外装では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。
 適切なサイズの画像をアップロードして、そのURLをここに入力してください。
 
 ロゴが不要の場合は、このボックスを空白のままにしてください。',
-       'config-instantcommons' => 'InstantCommons機能を有効にする',
+       'config-instantcommons' => 'Instant Commons 機能を有効にする',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons]は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトで見つかった画像や音声、その他のメディアをウィキ上で利用することができるようになる機能です。
 これを有効化するには、MediaWikiはインターネットに接続できなければなりません。
 
-ウィキメディアコモンズ以外のウィキを同じように設定する方法など、この機能に関する詳細な情報は、[//mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]をご覧ください。',
\82¦ã\82£ã\82­ã\83¡ã\83\87ã\82£ã\82¢ã\83»ã\82³ã\83¢ã\83³ã\82ºä»¥å¤\96ã\81®ã\82¦ã\82£ã\82­ã\82\92å\90\8cã\81\98ã\82\88ã\81\86ã\81«è¨­å®\9aã\81\99ã\82\8bæ\96¹æ³\95ã\81ªã\81©ã\80\81ã\81\93ã\81®æ©\9fè\83½ã\81«é\96¢ã\81\99ã\82\8b詳細ã\81ªæ\83\85å ±ã\81¯ã\80\81[//mediawiki.org/wiki/Manual:$wgForeignFileRepos ã\83\9eã\83\8bã\83¥ã\82¢ã\83«]ã\82\92ã\81\94覧ã\81\8fã\81 ã\81\95ã\81\84ã\80\82',
        'config-cc-error' => 'クリエイティブ・コモンズ・ライセンスの選択器から結果が得られませんでした。
 ライセンスの名前を手動で入力してください。',
        'config-cc-again' => 'もう一度選択してください...',
-       'config-cc-not-chosen' => 'あなたの求めるクリエイティブコモンズのライセンスを選んで、"続行"をクリックしてください。',
+       'config-cc-not-chosen' => '希望するクリエイティブ・コモンズのライセンスを選択して、「続行」をクリックしてください。',
        'config-advanced-settings' => '高度な設定',
        'config-cache-options' => 'オブジェクトのキャッシュの設定:',
-       'config-cache-help' => 'ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81®ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81¯ã\80\81使ç\94¨ã\81\97ã\81\9fã\83\87ã\83¼ã\82¿ã\82\92é »ç¹\81ã\81«ã\82­ã\83£ã\83\83ã\82·ã\83³ã\82°ã\81\99ã\82\8bã\81\93ã\81¨ã\81«ã\82\88ã\81£ã\81¦ã\80\81ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82­ã\81®ã\82¹ã\83\94ã\83¼ã\83\89æ\94¹å\96\84ã\81«ä½¿ç\94¨ã\81\95ã\82\8cます。
-中〜大サイトにおいては、これを有効にするために大変望ましいことです。また小さなサイトにおいても同様な利点をもたらすと考えられます。',
+       'config-cache-help' => 'ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81®ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92使ç\94¨ã\81\99ã\82\8bã\81¨ã\80\81é »ç¹\81ã\81«ä½¿ç\94¨ã\81\99ã\82\8bã\83\87ã\83¼ã\82¿ã\82\92ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\99ã\82\8bã\81\9fã\82\81 MediaWiki ã\81®å\8b\95ä½\9cé\80\9f度ã\82\92æ\94¹å\96\84ã\81§ã\81\8dます。
+中〜大規模サイトではこれを有効にすることを強くお勧めします。小規模サイトでも同様に効果があります。',
        'config-cache-none' => 'キャッシングしない(機能は取り払われます、しかもより大きなウィキサイト上でスピードの問題が発生します)',
-       'config-cache-accel' => 'PHPオブジェクトキャッシング(APC、XCacheあるいはWinCache)',
+       'config-cache-accel' => 'PHP オブジェクト キャッシュ (APC、XCache、WinCache のいずれか)',
        'config-cache-memcached' => 'Memcachedを使用(追加の設定が必要です)',
        'config-memcached-servers' => 'メモリをキャッシュされたサーバ:',
        'config-memcached-help' => 'Memcachedを使用するIPアドレスの一覧。
@@ -9943,31 +10044,37 @@ GFDL は有効なライセンスですが、内容を理解するのは困難で
 これらは更に多くの設定を要求するかもしれませんが、今これらを有効にすることができます。',
        'config-install-alreadydone' => "'''警告:''' 既にMediaWikiがインストール済みで、再びインストールし直そうとしています。
 次のページへ進んでください。",
-       'config-install-begin' => '「{{int:config-continue}}」を押すと、MediaWikiのインストールを開始することができます。
-å¤\89æ\9b´ã\81\97ã\81\9fã\81\84設å®\9aã\81\8cã\81\82ã\82\8cã\81°、「{{int:Config-back}}」を押してください。',
+       'config-install-begin' => '「{{int:config-continue}}」を押すと、MediaWiki のインストールを開始できます。
+å¤\89æ\9b´ã\81\97ã\81\9fã\81\84設å®\9aã\81\8cã\81\82ã\82\8bå ´å\90\88ã\81¯、「{{int:Config-back}}」を押してください。',
        'config-install-step-done' => '実行',
        'config-install-step-failed' => '失敗した',
        'config-install-extensions' => '拡張機能を含む',
        'config-install-database' => 'データベースの構築',
        'config-install-schema' => 'スキーマの作成',
        'config-install-pg-schema-not-exist' => 'PostgreSQL スキーマがありません。',
-       'config-install-pg-schema-failed' => 'テーブルの作成に失敗した。
-ユーザ"$1"が図式"$2"に書き込みができるようにしてください。',
+       'config-install-pg-schema-failed' => 'ã\83\86ã\83¼ã\83\96ã\83«ã\81®ä½\9cæ\88\90ã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82
+利用者「$1」がスキーマ「$2」に書き込めるようにしてください。',
        'config-install-pg-commit' => '変更を送信',
-       'config-install-user' => 'データベースユーザを作成する',
-       'config-install-user-grant-failed' => 'ユーザー「$1」に許可を与えることに失敗しました。:$2',
+       'config-install-user' => 'データベースユーザーの作成',
+       'config-install-user-alreadyexists' => 'ユーザー「$1」は既に存在します',
+       'config-install-user-create-failed' => 'ユーザー「$1」の作成に失敗しました: $2',
+       'config-install-user-grant-failed' => 'ユーザー「$1」に許可を与えることに失敗しました: $2',
+       'config-install-user-missing' => '指定したユーザー「$1」は存在しません。',
+       'config-install-user-missing-create' => '指定したユーザー「$1」は存在しません。
+アカウントを作成する場合は、下の「アカウント作成」をクリックしてください。',
        'config-install-tables' => 'テーブルの作成',
        'config-install-tables-exist' => "'''警告''':MediaWikiテーブルは既に存在するようです。
 作成を飛ばします。",
-       'config-install-tables-failed' => "'''エラー''':テーブルの作成が、次のエラーにより失敗しました:$1",
-       'config-install-interwiki' => 'æ\97¢å®\9aã\81®ã\82¦ã\82£ã\82­é\96\93ã\83\86ã\83¼ã\83\96ã\83«ã\82\92å°\8eå\85¥ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99',
-       'config-install-interwiki-list' => 'ファイル<code>interwiki.list</code>を見つけることができませんでした。',
+       'config-install-tables-failed' => "'''エラー''': テーブルの作成が、以下のエラーにより失敗しました: $1",
+       'config-install-interwiki' => 'æ\97¢å®\9aã\81®ã\82¦ã\82£ã\82­é\96\93ã\83\86ã\83¼ã\83\96ã\83«ã\81®å°\8eå\85¥',
+       'config-install-interwiki-list' => 'ファイル <code>interwiki.list</code> から読み取れませんでした。',
        'config-install-interwiki-exists' => "'''警告''':ウィキ間テーブルは既に登録されているようです。
 既定のテーブルを無視します。",
-       'config-install-keys' => '秘密鍵を生成する',
-       'config-install-sysop' => '管理者のユーザーアカウントを作成する',
-       'config-install-mainpage' => '既定の接続でメインページを作成',
-       'config-install-mainpage-failed' => 'メインページを挿入できませんでした:$1',
+       'config-install-stats' => '統計情報の初期化',
+       'config-install-keys' => '秘密鍵の生成',
+       'config-install-sysop' => '管理者のアカウントの作成',
+       'config-install-mainpage' => 'メインページを既定の内容で作成',
+       'config-install-mainpage-failed' => 'メインページを挿入できませんでした: $1',
        'config-install-done' => "'''おめでとうございます!'''
 MediaWikiのインストールに成功しました。
 
@@ -9983,7 +10090,7 @@ $3
 '''注意''': もし、これを今しなければ、つまり、このファイルをダウンロードせずインストールを終了した場合、この生成された設定ファイルは利用されません。
 
 それを完了すれば、'''[$2 ウィキに入る]'''ことができます。",
-       'config-download-localsettings' => 'LocalSettings.phpをダウンロード',
+       'config-download-localsettings' => 'LocalSettings.php をダウンロード',
        'config-help' => 'ヘルプ',
        'mainpagetext' => "'''MediaWiki のインストールに成功しました。'''",
        'mainpagedocfooter' => 'ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。
@@ -16281,6 +16388,7 @@ $messages['sk'] = array(
 
 /** Slovenian (slovenščina)
  * @author Dbc334
+ * @author Eleassar
  */
 $messages['sl'] = array(
        'config-desc' => 'Namestitveni program za MediaWiki',
@@ -16452,7 +16560,7 @@ Sedaj lahko preskočite preostalo konfiguriranje in zdaj namestite wiki.',
        'config-profile-no-anon' => 'Zahtevano je ustvarjanje računa',
        'config-profile-fishbowl' => 'Samo pooblaščeni urejevalci',
        'config-profile-private' => 'Zasebni wiki',
-       'config-license' => 'Avtorske pravice in dovoljenje:',
+       'config-license' => 'Avtorske pravice in licenca:',
        'config-license-none' => 'Brez noge dovoljenja',
        'config-license-cc-by-sa' => 'Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji',
        'config-license-cc-by' => 'Creative Commons Priznanje avtorstva',
@@ -16474,7 +16582,7 @@ Najbolje je, da mapa ni dostopna preko spleta.',
        'config-cc-error' => 'Izbirnik dovoljenja Creative Commons ni vrnil nobenih rezultatov.
 Vnesite ime dovoljenja ročno.',
        'config-cc-again' => 'Izberi ponovno ...',
-       'config-cc-not-chosen' => 'Izberite dovoljenje Creative Commons, ki ga želite dodati, in kliknite »proceed«.',
+       'config-cc-not-chosen' => 'Izberite licenco Creative Commons, ki jo želite uporabiti, in kliknite »proceed«.',
        'config-advanced-settings' => 'Napredna konfiguracija',
        'config-cache-accel' => 'Predpomnjenje predmetov PHP (APC, XCache ali WinCache)',
        'config-cache-memcached' => 'Uporabi Memcached (zahteva dodatno namestitev in konfiguracijo)',
index a6cb13f..82de913 100644 (file)
@@ -225,6 +225,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'dropField', 'recentchanges', 'rc_moved_to_title',            'patch-rc_moved.sql' ),
                        array( 'addTable', 'sites',                            'patch-sites.sql' ),
                        array( 'addField', 'filearchive',   'fa_sha1',          'patch-fa_sha1.sql' ),
+                       array( 'addField', 'job',           'job_token',         'patch-job_token.sql' ),
                );
        }
 
index 9ad91b7..2942c0b 100644 (file)
@@ -116,6 +116,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'ipblocks',      'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ),
                        array( 'addPgField', 'ipblocks',      'ipb_parent_block_id',            'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
                        array( 'addPgField', 'filearchive',   'fa_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'filearchive',   'fa_sha1',              "TEXT NOT NULL DEFAULT ''" ),
                        array( 'addPgField', 'logging',       'log_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'logging',       'log_id',               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ),
                        array( 'addPgField', 'logging',       'log_params',           'TEXT' ),
@@ -227,6 +228,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgIndex', 'logging',       'logging_page_id_time',   '(log_page,log_timestamp)' ),
                        array( 'addPgIndex', 'iwlinks',       'iwl_prefix_title_from',  '(iwl_prefix, iwl_title, iwl_from)' ),
                        array( 'addPgIndex', 'job',           'job_timestamp_idx',      '(job_timestamp)' ),
+                       array( 'addPgIndex', 'filearchive',   'fa_sha1',                '(fa_sha1)' ),
 
                        array( 'checkIndex', 'pagelink_unique', array(
                                array('pl_from', 'int4_ops', 'btree', 0),
index e7f3939..c3f7a81 100644 (file)
@@ -105,6 +105,7 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
                        array( 'addTable', 'sites',                            'patch-sites.sql' ),
                        array( 'addField', 'filearchive',   'fa_sha1',          'patch-fa_sha1.sql' ),
+                       array( 'addField', 'job',           'job_token',         'patch-job_token.sql' ),
                );
        }
 
index 270671e..0d2803e 100644 (file)
 
 /**
  * Class to both describe a background job and handle jobs.
+ * The queue aspects of this class are now deprecated.
  *
  * @ingroup JobQueue
  */
 abstract class Job {
-
        /**
         * @var Title
         */
@@ -47,172 +47,12 @@ abstract class Job {
         * Run the job
         * @return boolean success
         */
-       abstract function run();
+       abstract public function run();
 
        /*-------------------------------------------------------------------------
         * Static functions
         *------------------------------------------------------------------------*/
 
-       /**
-        * Pop a job of a certain type.  This tries less hard than pop() to
-        * actually find a job; it may be adversely affected by concurrent job
-        * runners.
-        *
-        * @param $type string
-        *
-        * @return Job
-        */
-       static function pop_type( $type ) {
-               wfProfilein( __METHOD__ );
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $dbw->begin( __METHOD__ );
-
-               $row = $dbw->selectRow(
-                       'job',
-                       '*',
-                       array( 'job_cmd' => $type ),
-                       __METHOD__,
-                       array( 'LIMIT' => 1, 'FOR UPDATE' )
-               );
-
-               if ( $row === false ) {
-                       $dbw->commit( __METHOD__ );
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               /* Ensure we "own" this row */
-               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-               $affected = $dbw->affectedRows();
-               $dbw->commit( __METHOD__ );
-
-               if ( $affected == 0 ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               wfIncrStats( 'job-pop' );
-               $namespace = $row->job_namespace;
-               $dbkey = $row->job_title;
-               $title = Title::makeTitleSafe( $namespace, $dbkey );
-               $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ),
-                       $row->job_id );
-
-               $job->removeDuplicates();
-
-               wfProfileOut( __METHOD__ );
-               return $job;
-       }
-
-       /**
-        * Pop a job off the front of the queue
-        *
-        * @param $offset Integer: Number of jobs to skip
-        * @return Job or false if there's no jobs
-        */
-       static function pop( $offset = 0 ) {
-               wfProfileIn( __METHOD__ );
-
-               $dbr = wfGetDB( DB_SLAVE );
-
-               /* Get a job from the slave, start with an offset,
-                       scan full set afterwards, avoid hitting purged rows
-
-                       NB: If random fetch previously was used, offset
-                               will always be ahead of few entries
-               */
-
-               $conditions = self::defaultQueueConditions();
-
-               $offset = intval( $offset );
-               $options = array( 'ORDER BY' => 'job_id', 'USE INDEX' => 'PRIMARY' );
-
-               $row = $dbr->selectRow( 'job', '*',
-                       array_merge( $conditions, array( "job_id >= $offset" ) ),
-                       __METHOD__,
-                       $options
-               );
-
-               // Refetching without offset is needed as some of job IDs could have had delayed commits
-               // and have lower IDs than jobs already executed, blame concurrency :)
-               //
-               if ( $row === false ) {
-                       if ( $offset != 0 ) {
-                               $row = $dbr->selectRow( 'job', '*', $conditions, __METHOD__, $options );
-                       }
-
-                       if ( $row === false ) {
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-               }
-
-               // Try to delete it from the master
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-               $affected = $dbw->affectedRows();
-               $dbw->commit( __METHOD__ );
-
-               if ( !$affected ) {
-                       $dbw->begin( __METHOD__ );
-
-                       // Failed, someone else beat us to it
-                       // Try getting a random row
-                       $row = $dbw->selectRow( 'job', array( 'minjob' => 'MIN(job_id)',
-                               'maxjob' => 'MAX(job_id)' ), '1=1', __METHOD__ );
-                       if ( $row === false || is_null( $row->minjob ) || is_null( $row->maxjob ) ) {
-                               // No jobs to get
-                               $dbw->rollback( __METHOD__ );
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-                       // Get the random row
-                       $row = $dbw->selectRow( 'job', '*',
-                               'job_id >= ' . mt_rand( $row->minjob, $row->maxjob ), __METHOD__ );
-                       if ( $row === false ) {
-                               // Random job gone before we got the chance to select it
-                               // Give up
-                               $dbw->rollback( __METHOD__ );
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-                       // Delete the random row
-                       $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-                       $affected = $dbw->affectedRows();
-                       $dbw->commit( __METHOD__ );
-
-                       if ( !$affected ) {
-                               // Random job gone before we exclusively deleted it
-                               // Give up
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-               }
-
-               // If execution got to here, there's a row in $row that has been deleted from the database
-               // by this thread. Hence the concurrent pop was successful.
-               wfIncrStats( 'job-pop' );
-               $namespace = $row->job_namespace;
-               $dbkey = $row->job_title;
-               $title = Title::makeTitleSafe( $namespace, $dbkey );
-
-               if ( is_null( $title ) ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ), $row->job_id );
-
-               // Remove any duplicates it may have later in the queue
-               $job->removeDuplicates();
-
-               wfProfileOut( __METHOD__ );
-               return $job;
-       }
-
        /**
         * Create the appropriate object to handle a specific job
         *
@@ -223,7 +63,7 @@ abstract class Job {
         * @throws MWException
         * @return Job
         */
-       static function factory( $command, Title $title, $params = false, $id = 0 ) {
+       public static function factory( $command, Title $title, $params = false, $id = 0 ) {
                global $wgJobClasses;
                if( isset( $wgJobClasses[$command] ) ) {
                        $class = $wgJobClasses[$command];
@@ -232,30 +72,6 @@ abstract class Job {
                throw new MWException( "Invalid job command `{$command}`" );
        }
 
-       /**
-        * @param $params
-        * @return string
-        */
-       static function makeBlob( $params ) {
-               if ( $params !== false ) {
-                       return serialize( $params );
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * @param $blob
-        * @return bool|mixed
-        */
-       static function extractBlob( $blob ) {
-               if ( (string)$blob !== '' ) {
-                       return unserialize( $blob );
-               } else {
-                       return false;
-               }
-       }
-
        /**
         * Batch-insert a group of jobs into the queue.
         * This will be wrapped in a transaction with a forced commit.
@@ -264,33 +80,10 @@ abstract class Job {
         * removed later on, when the first one is popped.
         *
         * @param $jobs array of Job objects
+        * @deprecated 1.21
         */
-       static function batchInsert( $jobs ) {
-               if ( !count( $jobs ) ) {
-                       return;
-               }
-               $dbw = wfGetDB( DB_MASTER );
-               $rows = array();
-
-               /**
-                * @var $job Job
-                */
-               foreach ( $jobs as $job ) {
-                       $rows[] = $job->insertFields();
-                       if ( count( $rows ) >= 50 ) {
-                               # Do a small transaction to avoid slave lag
-                               $dbw->begin( __METHOD__ );
-                               $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-                               $dbw->commit( __METHOD__ );
-                               $rows = array();
-                       }
-               }
-               if ( $rows ) { // last chunk
-                       $dbw->begin( __METHOD__ );
-                       $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-                       $dbw->commit( __METHOD__ );
-               }
-               wfIncrStats( 'job-insert', count( $jobs ) );
+       public static function batchInsert( $jobs ) {
+               return JobQueueGroup::singleton()->push( $jobs );
        }
 
        /**
@@ -301,45 +94,34 @@ abstract class Job {
         * large batches of jobs can cause slave lag.
         *
         * @param $jobs array of Job objects
+        * @deprecated 1.21
         */
-       static function safeBatchInsert( $jobs ) {
-               if ( !count( $jobs ) ) {
-                       return;
-               }
-               $dbw = wfGetDB( DB_MASTER );
-               $rows = array();
-               foreach ( $jobs as $job ) {
-                       $rows[] = $job->insertFields();
-                       if ( count( $rows ) >= 500 ) {
-                               $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-                               $rows = array();
-                       }
-               }
-               if ( $rows ) { // last chunk
-                       $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-               }
-               wfIncrStats( 'job-insert', count( $jobs ) );
+       public static function safeBatchInsert( $jobs ) {
+               return JobQueueGroup::singleton()->push( $jobs, JobQueue::QoS_Atomic );
        }
 
-
        /**
-        * SQL conditions to apply on most JobQueue queries
+        * Pop a job of a certain type.  This tries less hard than pop() to
+        * actually find a job; it may be adversely affected by concurrent job
+        * runners.
         *
-        * Whenever we exclude jobs types from the default queue, we want to make
-        * sure that queries to the job queue actually ignore them.
+        * @param $type string
+        * @return Job
+        * @deprecated 1.21
+        */
+       public static function pop_type( $type ) {
+               return JobQueueGroup::singleton()->get( $type )->pop();
+       }
+
+       /**
+        * Pop a job off the front of the queue.
+        * This is subject to $wgJobTypesExcludedFromDefaultQueue.
         *
-        * @return array SQL conditions suitable for Database:: methods
+        * @return Job or false if there's no jobs
+        * @deprecated 1.21
         */
-       static function defaultQueueConditions( ) {
-               global $wgJobTypesExcludedFromDefaultQueue;
-               $conditions = array();
-               if ( count( $wgJobTypesExcludedFromDefaultQueue ) > 0 ) {
-                       $dbr = wfGetDB( DB_SLAVE );
-                       foreach ( $wgJobTypesExcludedFromDefaultQueue as $cmdType ) {
-                               $conditions[] = "job_cmd != " . $dbr->addQuotes( $cmdType );
-                       }
-               }
-               return $conditions;
+       public static function pop() {
+               return JobQueueGroup::singleton()->pop();
        }
 
        /*-------------------------------------------------------------------------
@@ -352,77 +134,63 @@ abstract class Job {
         * @param $params array|bool
         * @param $id int
         */
-       function __construct( $command, $title, $params = false, $id = 0 ) {
+       public function __construct( $command, $title, $params = false, $id = 0 ) {
                $this->command = $command;
                $this->title = $title;
                $this->params = $params;
                $this->id = $id;
 
-               // A bit of premature generalisation
-               // Oh well, the whole class is premature generalisation really
-               $this->removeDuplicates = true;
+               $this->removeDuplicates = false; // expensive jobs may set this to true
        }
 
        /**
-        * Insert a single job into the queue.
-        * @return bool true on success
+        * @return integer May be 0 for jobs stored outside the DB
         */
-       function insert() {
-               $fields = $this->insertFields();
+       public function getId() {
+               return $this->id;
+       }
 
-               $dbw = wfGetDB( DB_MASTER );
+       /**
+        * @return string
+        */
+       public function getType() {
+               return $this->command;
+       }
 
-               if ( $this->removeDuplicates ) {
-                       $res = $dbw->select( 'job', array( '1' ), $fields, __METHOD__ );
-                       if ( $dbw->numRows( $res ) ) {
-                               return true;
-                       }
-               }
-               wfIncrStats( 'job-insert' );
-               return $dbw->insert( 'job', $fields, __METHOD__ );
+       /**
+        * @return Title
+        */
+       public function getTitle() {
+               return $this->title;
        }
 
        /**
         * @return array
         */
-       protected function insertFields() {
-               $dbw = wfGetDB( DB_MASTER );
-               return array(
-                       'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
-                       'job_cmd' => $this->command,
-                       'job_namespace' => $this->title->getNamespace(),
-                       'job_title' => $this->title->getDBkey(),
-                       'job_timestamp' => $dbw->timestamp(),
-                       'job_params' => Job::makeBlob( $this->params )
-               );
+       public function getParams() {
+               return $this->params;
        }
 
        /**
-        * Remove jobs in the job queue which are duplicates of this job.
-        * This is deadlock-prone and so starts its own transaction.
+        * @return bool
         */
-       function removeDuplicates() {
-               if ( !$this->removeDuplicates ) {
-                       return;
-               }
+       public function ignoreDuplicates() {
+               return $this->removeDuplicates;
+       }
 
-               $fields = $this->insertFields();
-               unset( $fields['job_id'] );
-               unset( $fields['job_timestamp'] );
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-               $dbw->delete( 'job', $fields, __METHOD__ );
-               $affected = $dbw->affectedRows();
-               $dbw->commit( __METHOD__ );
-               if ( $affected ) {
-                       wfIncrStats( 'job-dup-delete', $affected );
-               }
+       /**
+        * Insert a single job into the queue.
+        * @return bool true on success
+        * @deprecated 1.21
+        */
+       public function insert() {
+               return JobQueueGroup::singleton()->push( $this );
        }
 
        /**
         * @return string
         */
-       function toString() {
+       public function toString() {
                $paramString = '';
                if ( $this->params ) {
                        foreach ( $this->params as $key => $value ) {
@@ -448,7 +216,7 @@ abstract class Job {
                $this->error = $error;
        }
 
-       function getLastError() {
+       public function getLastError() {
                return $this->error;
        }
 }
diff --git a/includes/job/JobQueue.php b/includes/job/JobQueue.php
new file mode 100644 (file)
index 0000000..6409cff
--- /dev/null
@@ -0,0 +1,185 @@
+<?php
+/**
+ * Job queue base code.
+ *
+ * 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
+ * @defgroup JobQueue JobQueue
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing and running of background jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.20
+ */
+abstract class JobQueue {
+       protected $wiki; // string; wiki ID
+       protected $type; // string; job type
+
+       const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
+
+       /**
+        * @param $params array
+        */
+       protected function __construct( array $params ) {
+               $this->wiki = $params['wiki'];
+               $this->type = $params['type'];
+       }
+
+       /**
+        * Get a job queue object of the specified type.
+        * $params includes:
+        *     class : what job class to use (determines job type)
+        *     wiki  : wiki ID of the wiki the jobs are for (defaults to current wiki)
+        *     type  : The name of the job types this queue handles
+        *
+        * @param $params array
+        * @return JobQueue
+        * @throws MWException
+        */
+       final public static function factory( array $params ) {
+               $class = $params['class'];
+               if ( !MWInit::classExists( $class ) ) {
+                       throw new MWException( "Invalid job queue class '$class'." );
+               }
+               $obj = new $class( $params );
+               if ( !( $obj instanceof self ) ) {
+                       throw new MWException( "Class '$class' is not a " . __CLASS__ . " class." );
+               }
+               return $obj;
+       }
+
+       /**
+        * @return string Wiki ID
+        */
+       final public function getWiki() {
+               return $this->wiki;
+       }
+
+       /**
+        * @return string Job type that this queue handles
+        */
+       final public function getType() {
+               return $this->type;
+       }
+
+       /**
+        * @return bool Quickly check if the queue is empty
+        */
+       final public function isEmpty() {
+               wfProfileIn( __METHOD__ );
+               $res = $this->doIsEmpty();
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see JobQueue::isEmpty()
+        * @return bool
+        */
+       abstract protected function doIsEmpty();
+
+       /**
+        * Push a batch of jobs into the queue
+        *
+        * @param $jobs array List of Jobs
+        * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+        * @return bool
+        */
+       final public function batchPush( array $jobs, $flags = 0 ) {
+               foreach ( $jobs as $job ) {
+                       if ( $job->getType() !== $this->type ) {
+                               throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+                       }
+               }
+               wfProfileIn( __METHOD__ );
+               $ok = $this->doBatchPush( $jobs, $flags );
+               if ( $ok ) {
+                       wfIncrStats( 'job-insert', count( $jobs ) );
+               }
+               wfProfileOut( __METHOD__ );
+               return $ok;
+       }
+
+       /**
+        * @see JobQueue::batchPush()
+        * @return bool
+        */
+       abstract protected function doBatchPush( array $jobs, $flags );
+
+       /**
+        * Pop a job off of the queue
+        *
+        * @return Job|bool Returns false on failure
+        */
+       final public function pop() {
+               wfProfileIn( __METHOD__ );
+               $job = $this->doPop();
+               if ( $job ) {
+                       wfIncrStats( 'job-pop' );
+               }
+               wfProfileOut( __METHOD__ );
+               return $job;
+       }
+
+       /**
+        * @see JobQueue::pop()
+        * @return Job
+        */
+       abstract protected function doPop();
+
+       /**
+        * Acknowledge that a job was completed
+        *
+        * @param $job Job
+        * @return bool
+        */
+       final public function ack( Job $job ) {
+               if ( $job->getType() !== $this->type ) {
+                       throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+               }
+               wfProfileIn( __METHOD__ );
+               $ok = $this->doAck( $job );
+               wfProfileOut( __METHOD__ );
+               return $ok;
+       }
+
+       /**
+        * @see JobQueue::ack()
+        * @return bool
+        */
+       abstract protected function doAck( Job $job );
+
+       /**
+        * Wait for any slaves or backup servers to catch up
+        *
+        * @return void
+        */
+       final public function waitForBackups() {
+               wfProfileIn( __METHOD__ );
+               $this->doWaitForBackups();
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * @see JobQueue::waitForBackups()
+        * @return void
+        */
+       protected function doWaitForBackups() {}
+}
diff --git a/includes/job/JobQueueDB.php b/includes/job/JobQueueDB.php
new file mode 100644 (file)
index 0000000..bea4a6f
--- /dev/null
@@ -0,0 +1,318 @@
+<?php
+/**
+ * Database-backed job queue code.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle job queues stored in the DB
+ *
+ * @ingroup JobQueue
+ * @since 1.20
+ */
+class JobQueueDB extends JobQueue {
+       const CACHE_TTL      = 30; // integer; seconds
+       const MAX_JOB_RANDOM = 2147483647; // 2^31 - 1; used for job_random
+
+       /**
+        * @see JobQueue::doIsEmpty()
+        * @return bool
+        */
+       protected function doIsEmpty() {
+               global $wgMemc;
+
+               $key = $this->getEmptinessCacheKey();
+
+               $isEmpty = $wgMemc->get( $key );
+               if ( $isEmpty === 'true' ) {
+                       return true;
+               } elseif ( $isEmpty === 'false' ) {
+                       return false;
+               }
+
+               $found = $this->getSlaveDB()->selectField(
+                       'job', '1', array( 'job_cmd' => $this->type ), __METHOD__
+               );
+
+               $wgMemc->add( $key, $found ? 'false' : 'true', self::CACHE_TTL );
+       }
+
+       /**
+        * @see JobQueue::doBatchPush()
+        * @return bool
+        */
+       protected function doBatchPush( array $jobs, $flags ) {
+               if ( count( $jobs ) ) {
+                       $dbw = $this->getMasterDB();
+
+                       $rows = array();
+                       foreach ( $jobs as $job ) {
+                               $rows[] = $this->insertFields( $job );
+                       }
+                       $atomic = ( $flags & self::QoS_Atomic );
+                       $key    = $this->getEmptinessCacheKey();
+                       $ttl    = self::CACHE_TTL;
+
+                       $dbw->onTransactionIdle( function() use ( $dbw, $rows, $atomic, $key, $ttl ) {
+                               global $wgMemc;
+
+                               $autoTrx = $dbw->getFlag( DBO_TRX ); // automatic begin() enabled?
+                               if ( $atomic ) {
+                                       $dbw->begin(); // wrap all the job additions in one transaction
+                               } else {
+                                       $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+                               }
+                               try {
+                                       foreach ( array_chunk( $rows, 50 ) as $rowBatch ) { // avoid slave lag
+                                               $dbw->insert( 'job', $rowBatch, __METHOD__ );
+                                       }
+                               } catch ( DBError $e ) {
+                                       if ( $atomic ) {
+                                               $dbw->rollback();
+                                       } else {
+                                               $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+                                       }
+                                       throw $e;
+                               }
+                               if ( $atomic ) {
+                                       $dbw->commit();
+                               } else {
+                                       $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+                               }
+
+                               $wgMemc->set( $key, 'false', $ttl );
+                       } );
+               }
+
+               return true;
+       }
+
+       /**
+        * @see JobQueue::doPop()
+        * @return Job|bool
+        */
+       protected function doPop() {
+               global $wgMemc;
+
+               $uuid = wfRandomString( 32 ); // pop attempt
+
+               $dbw = $this->getMasterDB();
+               $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+
+               $job = false; // job popped off
+               $autoTrx = $dbw->getFlag( DBO_TRX ); // automatic begin() enabled?
+               $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+               try {
+                       do { // retry when our row is invalid or deleted as a duplicate
+                               $row = false; // row claimed
+                               $rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
+                               $gte  = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
+                               // Try to reserve a DB row...
+                               if ( $this->claim( $uuid, $rand, $gte ) || $this->claim( $uuid, $rand, !$gte ) ) {
+                                       // Fetch any row that we just reserved...
+                                       $row = $dbw->selectRow( 'job', '*',
+                                               array( 'job_cmd' => $this->type, 'job_token' => $uuid ), __METHOD__ );
+                                       // Check if another process deleted it as a duplicate
+                                       if ( !$row ) {
+                                               wfDebugLog( 'JobQueueDB', "Row deleted as duplicate by another process." );
+                                               continue; // try again
+                                       }
+                                       // Get the job object from the row...
+                                       $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}'." );
+                                               continue; // try again
+                                       }
+                                       $job = Job::factory( $row->job_cmd, $title,
+                                               self::extractBlob( $row->job_params ), $row->job_id );
+                                       // Delete any *other* duplicate jobs in the queue...
+                                       if ( $job->ignoreDuplicates() && strlen( $row->job_sha1 ) ) {
+                                               $dbw->delete( 'job',
+                                                       array( 'job_sha1' => $row->job_sha1,
+                                                               "job_id != {$dbw->addQuotes( $row->job_id )}" ),
+                                                       __METHOD__
+                                               );
+                                       }
+                               } else {
+                                       $wgMemc->set( $this->getEmptinessCacheKey(), 'true', self::CACHE_TTL );
+                               }
+                               break; // done
+                       } while( true );
+               } catch ( DBError $e ) {
+                       $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+                       throw $e;
+               }
+               $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+
+               return $job;
+       }
+
+       /**
+        * Reserve a row with a single UPDATE without holding row locks over RTTs...
+        * @param $uuid string 32 char hex string
+        * @param $rand integer Random unsigned integer (31 bits)
+        * @param $gte bool Search for job_random >= $random (otherwise job_random <= $random)
+        * @return integer Number of affected rows
+        */
+       protected function claim( $uuid, $rand, $gte ) {
+               $dbw  = $this->getMasterDB();
+               $dir  = $gte ? 'ASC' : 'DESC';
+               $ineq = $gte ? '>=' : '<=';
+               if ( $dbw->getType() === 'mysql' ) {
+                       // Per http://bugs.mysql.com/bug.php?id=6980, we can't use subqueries on the
+                       // same table being changed in an UPDATE query in MySQL (gives Error: 1093).
+                       // Oracle and Postgre have no such limitation. However, MySQL offers an
+                       // alternative here by supporting ORDER BY + LIMIT for UPDATE queries.
+                       // The DB wrapper functions do not support this, so it's done manually.
+                       $dbw->query( "UPDATE {$dbw->tableName( 'job' )}
+                               SET
+                                       job_token = {$dbw->addQuotes( $uuid ) },
+                                       job_token_timestamp = {$dbw->addQuotes( $dbw->timestamp() )}
+                               WHERE (
+                                       job_cmd = {$dbw->addQuotes( $this->type )}
+                                       AND job_token = {$dbw->addQuotes( '' )}
+                                       AND job_random {$ineq} {$dbw->addQuotes( $rand )}
+                               ) ORDER BY job_random {$dir} LIMIT 1",
+                               __METHOD__
+                       );
+               } else {
+                       // Use a subquery to find the job, within an UPDATE to claim it.
+                       // This uses as much of the DB wrapper functions as possible.
+                       $dbw->update( 'job',
+                               array( 'job_token' => $uuid, 'job_token_timestamp' => $dbw->timestamp() ),
+                               array( 'job_id = (' .
+                                       $dbw->selectSQLText( 'job', 'job_id',
+                                               array(
+                                                       'job_cmd'   => $this->type,
+                                                       'job_token' => '',
+                                                       "job_random {$ineq} {$dbw->addQuotes( $rand )}" ),
+                                               __METHOD__,
+                                               array( 'ORDER BY' => "job_random {$dir}", 'LIMIT' => 1 ) ) .
+                                       ')'
+                               ),
+                               __METHOD__
+                       );
+               }
+               return $dbw->affectedRows();
+       }
+
+       /**
+        * @see JobQueue::doAck()
+        * @return Job|bool
+        */
+       protected function doAck( Job $job ) {
+               $dbw = $this->getMasterDB();
+               if ( $dbw->trxLevel() ) {
+                       wfWarn( "Attempted to ack a job in a transaction; committing first." );
+                       $dbw->commit(); // push existing transaction
+               }
+
+               $autoTrx = $dbw->getFlag( DBO_TRX ); // automatic begin() enabled?
+               $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+               try {
+                       // Delete a row with a single DELETE without holding row locks over RTTs...
+                       $dbw->delete( 'job', array( 'job_cmd' => $this->type, 'job_id' => $job->getId() ) );
+               } catch ( Exception $e ) {
+                       $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+                       throw $e;
+               }
+               $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+
+               return true;
+       }
+
+       /**
+        * @see JobQueue::doWaitForBackups()
+        * @return void
+        */
+       protected function doWaitForBackups() {
+               wfWaitForSlaves();
+       }
+
+       /**
+        * @return DatabaseBase
+        */
+       protected function getSlaveDB() {
+               return wfGetDB( DB_SLAVE, array(), $this->wiki );
+       }
+
+       /**
+        * @return DatabaseBase
+        */
+       protected function getMasterDB() {
+               return wfGetDB( DB_MASTER, array(), $this->wiki );
+       }
+
+       /**
+        * @param $job Job
+        * @return array
+        */
+       protected function insertFields( Job $job ) {
+               // Rows that describe the nature of the job
+               $descFields = array(
+                       'job_cmd'       => $job->getType(),
+                       'job_namespace' => $job->getTitle()->getNamespace(),
+                       'job_title'     => $job->getTitle()->getDBkey(),
+                       'job_params'    => self::makeBlob( $job->getParams() ),
+               );
+               // Additional job metadata
+               $dbw = $this->getMasterDB();
+               $metaFields = array(
+                       'job_id'        => $dbw->nextSequenceValue( 'job_job_id_seq' ),
+                       'job_timestamp' => $dbw->timestamp(),
+                       'job_sha1'      => wfBaseConvert( sha1( serialize( $descFields ) ), 16, 36, 32 ),
+                       'job_random'    => mt_rand( 0, self::MAX_JOB_RANDOM )
+               );
+               return ( $descFields + $metaFields );
+       }
+
+       /**
+        * @return string
+        */
+       private function getEmptinessCacheKey() {
+               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'isempty' );
+       }
+
+       /**
+        * @param $params
+        * @return string
+        */
+       protected static function makeBlob( $params ) {
+               if ( $params !== false ) {
+                       return serialize( $params );
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * @param $blob
+        * @return bool|mixed
+        */
+       protected static function extractBlob( $blob ) {
+               if ( (string)$blob !== '' ) {
+                       return unserialize( $blob );
+               } else {
+                       return false;
+               }
+       }
+}
diff --git a/includes/job/JobQueueGroup.php b/includes/job/JobQueueGroup.php
new file mode 100644 (file)
index 0000000..69bcf01
--- /dev/null
@@ -0,0 +1,160 @@
+<?php
+/**
+ * Job queue base code.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing of background jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.20
+ */
+class JobQueueGroup {
+       /** @var Array */
+       protected static $instances = array();
+
+       protected $wiki; // string; wiki ID
+
+       const TYPE_DEFAULT = 1; // integer; job not in $wgJobTypesExcludedFromDefaultQueue
+       const TYPE_ANY     = 2; // integer; any job
+
+       /**
+        * @param $wiki string Wiki ID
+        */
+       protected function __construct( $wiki ) {
+               $this->wiki = $wiki;
+       }
+
+       /**
+        * @param $wiki string Wiki ID
+        * @return JobQueueGroup
+        */
+       public static function singleton( $wiki = false ) {
+               $wiki = ( $wiki === false ) ? wfWikiID() : $wiki;
+               if ( !isset( self::$instances[$wiki] ) ) {
+                       self::$instances[$wiki] = new self( $wiki );
+               }
+               return self::$instances[$wiki];
+       }
+
+       /**
+        * @param $type string
+        * @return JobQueue Job queue object for a given queue type
+        */
+       public function get( $type ) {
+               global $wgJobTypeConf;
+
+               $conf = false;
+               if ( isset( $wgJobTypeConf[$type] ) ) {
+                       $conf = $wgJobTypeConf[$type];
+               } else {
+                       $conf = $wgJobTypeConf['default'];
+               }
+
+               return JobQueue::factory( array(
+                       'class' => $conf['class'],
+                       'wiki'  => $this->wiki,
+                       'type'  => $type,
+               ) );
+       }
+
+       /**
+        * Insert jobs into the respective queues of with the belong
+        *
+        * @param $jobs Job|array A single Job or a list of Jobs
+        * @return bool
+        */
+       public function push( $jobs ) {
+               $jobs = is_array( $jobs ) ? $jobs : array( $jobs );
+
+               $jobsByType = array(); // (job type => list of jobs)
+               foreach ( $jobs as $job ) {
+                       if ( $job instanceof Job ) {
+                               $jobsByType[$job->getType()][] = $job;
+                       } else {
+                               throw new MWException( "Attempted to push a non-Job object into a queue." );
+                       }
+               }
+
+               $ok = true;
+               foreach ( $jobsByType as $type => $jobs ) {
+                       if ( !$this->get( $type )->batchPush( $jobs ) ) {
+                               $ok = false;
+                       }
+               }
+
+               return $ok;
+       }
+
+       /**
+        * Pop a job off one of the job queues
+        *
+        * @param $type integer JobQueueGroup::TYPE_* constant
+        * @return Job|bool Returns false on failure
+        */
+       public function pop( $type = self::TYPE_DEFAULT ) {
+               $types = ( $type == self::TYPE_DEFAULT )
+                       ? $this->getDefaultQueueTypes()
+                       : $this->getQueueTypes();
+               shuffle( $types ); // avoid starvation
+
+               foreach ( $types as $type ) { // for each queue...
+                       $job = $this->get( $type )->pop();
+                       if ( $job ) {
+                               return $job; // found
+                       }
+               }
+
+               return false; // no jobs found
+       }
+
+       /**
+        * Acknowledge that a job was completed
+        *
+        * @param $job Job
+        * @return bool
+        */
+       public function ack( Job $job ) {
+               return $this->get( $job->getType() )->ack( $job );
+       }
+
+       /**
+        * Get the list of queue types
+        *
+        * @return array List of strings
+        */
+       public function getQueueTypes() {
+               global $wgJobClasses;
+
+               return array_keys( $wgJobClasses );
+       }
+
+       /**
+        * Get the list of default queue types
+        *
+        * @return array List of strings
+        */
+       public function getDefaultQueueTypes() {
+               global $wgJobTypesExcludedFromDefaultQueue;
+
+               return array_diff( $this->getQueueTypes(), $wgJobTypesExcludedFromDefaultQueue );
+       }
+}
index c4370f4..a29f29f 100644 (file)
@@ -27,9 +27,9 @@
  * @ingroup JobQueue
  */
 class RefreshLinksJob extends Job {
-
        function __construct( $title, $params = '', $id = 0 ) {
                parent::__construct( 'refreshLinks', $title, $params, $id );
+               $this->removeDuplicates = true; // job is expensive
        }
 
        /**
index 0b4be9a..db5326c 100644 (file)
@@ -59,7 +59,7 @@ class JavaScriptMinifier {
        const TYPE_DO          = 15; // keywords: case, var, finally, else, do, try
        const TYPE_FUNC        = 16; // keywords: function
        const TYPE_LITERAL     = 17; // all literals, identifiers and unrecognised tokens
-       
+
        // Sanity limit to avoid excessive memory usage
        const STACK_LIMIT = 1000;
 
@@ -385,7 +385,7 @@ class JavaScriptMinifier {
                                self::TYPE_LITERAL    => true
                        )
                );
-               
+
                // Rules for when newlines should be inserted if
                // $statementsOnOwnLine is enabled.
                // $newlineBefore is checked before switching state,
@@ -514,7 +514,7 @@ class JavaScriptMinifier {
                                                return self::parseError($s, $end, 'Number with several E' );
                                        }
                                        $end++;
-                                       
+
                                        // + sign is optional; - sign is required.
                                        $end += strspn( $s, '-+', $end );
                                        $len = strspn( $s, '0123456789', $end );
@@ -564,13 +564,13 @@ class JavaScriptMinifier {
                                $out .= ' ';
                                $lineLength++;
                        }
-                       
+
                        $out .= $token;
                        $lineLength += $end - $pos; // += strlen( $token )
                        $last = $s[$end - 1];
                        $pos = $end;
                        $newlineFound = false;
-                       
+
                        // Output a newline after the token if required
                        // This is checked before AND after switching state
                        $newlineAdded = false;
@@ -589,7 +589,7 @@ class JavaScriptMinifier {
                        } elseif( isset( $goto[$state][$type] ) ) {
                                $state = $goto[$state][$type];
                        }
-                       
+
                        // Check for newline insertion again
                        if ( $statementsOnOwnLine && !$newlineAdded && isset( $newlineAfter[$state][$type] ) ) {
                                $out .= "\n";
@@ -598,7 +598,7 @@ class JavaScriptMinifier {
                }
                return $out;
        }
-       
+
        static function parseError($fullJavascript, $position, $errorMsg) {
                // TODO: Handle the error: trigger_error, throw exception, return false...
                return false;
index d2edc9f..2b04f78 100644 (file)
@@ -240,7 +240,7 @@ class BitmapMetadataHandler {
 
                unset( $baseArray['comment'] );
                unset( $baseArray['xmp'] );
-       
+
                $baseArray['metadata'] = $meta->getMetadataArray();
                $baseArray['metadata']['_MW_GIF_VERSION'] = GIFMetadataExtractor::VERSION;
                return $baseArray;
index 6aef562..e2fcaa9 100644 (file)
@@ -228,7 +228,7 @@ class DjVuImage {
        function retrieveMetaData() {
                global $wgDjvuToXML, $wgDjvuDump, $wgDjvuTxt;
                wfProfileIn( __METHOD__ );
-               
+
                if ( isset( $wgDjvuDump ) ) {
                        # djvudump is faster as of version 3.5
                        # http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
@@ -247,7 +247,7 @@ class DjVuImage {
                        $xml = null;
                }
                # Text layer
-               if ( isset( $wgDjvuTxt ) ) { 
+               if ( isset( $wgDjvuTxt ) ) {
                        wfProfileIn( 'djvutxt' );
                        $cmd = wfEscapeShellArg( $wgDjvuTxt ) . ' --detail=page ' . wfEscapeShellArg( $this->mFilename ) ;
                        wfDebug( __METHOD__.": $cmd\n" );
@@ -260,7 +260,7 @@ class DjVuImage {
                                $reg = <<<EOR
                                        /\(page\s[\d-]*\s[\d-]*\s[\d-]*\s[\d-]*\s*"
                                        ((?>    # Text to match is composed of atoms of either:
-                                         \\\\. # - any escaped character 
+                                         \\\\. # - any escaped character
                                          |     # - any character different from " and \
                                          [^"\\\\]+
                                        )*?)
index 104ba55..bdacbc8 100644 (file)
@@ -389,7 +389,7 @@ class Exif {
                $this->charCodeString( 'UserComment' );
                $this->charCodeString( 'GPSProcessingMethod');
                $this->charCodeString( 'GPSAreaInformation' );
-               
+
                //ComponentsConfiguration should really be an array instead of a string...
                //This turns a string of binary numbers into an array of numbers.
 
@@ -402,7 +402,7 @@ class Exif {
                        $ccVals['_type'] = 'ol'; //this is for formatting later.
                        $this->mFilteredExifData['ComponentsConfiguration'] = $ccVals;
                }
-       
+
                //GPSVersion(ID) is treated as the wrong type by php exif support.
                //Go through each byte turning it into a version string.
                //For example: "\x02\x02\x00\x00" -> "2.2.0.0"
@@ -451,8 +451,7 @@ class Exif {
                        }
                        $charCode = substr( $this->mFilteredExifData[$prop], 0, 8);
                        $val = substr( $this->mFilteredExifData[$prop], 8);
-                       
-                       
+
                        switch ($charCode) {
                                case "\x4A\x49\x53\x00\x00\x00\x00\x00":
                                        //JIS
@@ -481,7 +480,7 @@ class Exif {
                                        wfRestoreWarnings();
                                }
                        }
-                       
+
                        //trim and check to make sure not only whitespace.
                        $val = trim($val);
                        if ( strlen( $val ) === 0 ) {
@@ -749,10 +748,10 @@ class Exif {
                        return false;
                }
                if( $count > 1 ) {
-                       foreach( $val as $v ) { 
+                       foreach( $val as $v ) {
                                if( !$this->validate( $section, $tag, $v, true ) ) {
-                                       return false; 
-                               } 
+                                       return false;
+                               }
                        }
                        return true;
                }
index 84b9b8c..da8fc6f 100644 (file)
@@ -29,7 +29,7 @@
 class GIFHandler extends BitmapHandler {
 
        const BROKEN_FILE = '0'; // value to store in img_metadata if error extracting metadata.
-       
+
        function getMetadata( $image, $filename ) {
                try {
                        $parsedGIFMetadata = BitmapMetadataHandler::GIF( $filename );
@@ -143,7 +143,7 @@ class GIFHandler extends BitmapHandler {
                wfSuppressWarnings();
                $metadata = unserialize($image->getMetadata());
                wfRestoreWarnings();
-               
+
                if (!$metadata || $metadata['frameCount'] <=  1) {
                        return $original;
                }
@@ -151,19 +151,19 @@ class GIFHandler extends BitmapHandler {
                /* Preserve original image info string, but strip the last char ')' so we can add even more */
                $info = array();
                $info[] = $original;
-               
+
                if ( $metadata['looped'] ) {
                        $info[] = wfMessage( 'file-info-gif-looped' )->parse();
                }
-               
+
                if ( $metadata['frameCount'] > 1 ) {
                        $info[] = wfMessage( 'file-info-gif-frames' )->numParams( $metadata['frameCount'] )->parse();
                }
-               
+
                if ( $metadata['duration'] ) {
                        $info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
                }
-               
+
                return $wgLang->commaList( $info );
        }
 }
index f6ca775..7a162c3 100644 (file)
@@ -58,7 +58,7 @@ class GIFMetadataExtractor {
                $isLooped = false;
                $xmp = "";
                $comment = array();
-               
+
                if ( !$filename ) {
                        throw new Exception( "No file name specified" );
                } elseif ( !file_exists( $filename ) || is_dir( $filename ) ) {
@@ -107,7 +107,7 @@ class GIFMetadataExtractor {
                                ## Read GCT
                                self::readGCT( $fh, $bpp );
                                fread( $fh, 1 );
-                               self::skipBlock( $fh ); 
+                               self::skipBlock( $fh );
                        } elseif ( $buf == self::$gif_extension_sep ) {
                                $buf = fread( $fh, 1 );
                                if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
@@ -182,23 +182,22 @@ class GIFMetadataExtractor {
 
                                        // NETSCAPE2.0 (application name for animated gif)
                                        if ( $data == 'NETSCAPE2.0' ) {
-                                       
                                                $data = fread( $fh, 2 ); // Block length and introduction, should be 03 01
 
                                                if ($data != "\x03\x01") {
                                                        throw new Exception( "Expected \x03\x01, got $data" );
                                                }
-                                               
+
                                                // Unsigned little-endian integer, loop count or zero for "forever"
                                                $loopData = fread( $fh, 2 );
                                                if ( strlen( $loopData ) < 2 ) throw new Exception( "Ran out of input" );
                                                $loopData = unpack( 'v', $loopData );
                                                $loopCount = $loopData[1];
-                                               
+
                                                if ($loopCount != 1) {
                                                        $isLooped = true;
                                                }
-                                               
+
                                                // Read out terminator byte
                                                fread( $fh, 1 );
                                        } elseif ( $data == 'XMP DataXMP' ) {
index ecf216a..60fd2a0 100644 (file)
@@ -129,7 +129,7 @@ class JpegMetadataExtractor {
                                        // whatever...
                                        $segments["XMP"] = substr( $temp, 29 );
                                        wfDebug( __METHOD__ . ' Found XMP section with wrong app identifier '
-                                               . "Using anyways.\n" ); 
+                                               . "Using anyways.\n" );
                                } elseif ( substr( $temp, 0, 6 ) === "Exif\0\0" ) {
                                        // Just need to find out what the byte order is.
                                        // because php's exif plugin sucks...
index 69bdc2f..97a2d1d 100644 (file)
@@ -196,7 +196,10 @@ abstract class MediaTransformOutput {
         * @return array
         */
        public function getDescLinkAttribs( $title = null, $params = '' ) {
-               $query = $this->page ? ( 'page=' . urlencode( $this->page ) ) : '';
+               $query = '';
+               if ( $this->page && $this->page !== 1 ) {
+                         $query = 'page=' . urlencode( $this->page );
+               }
                if( $params ) {
                        $query .= $query ? '&'.$params : $params;
                }
index 1b329e5..a23821f 100644 (file)
@@ -88,11 +88,11 @@ class PNGHandler extends BitmapHandler {
        function canAnimateThumbnail( $image ) {
                return false;
        }
-       
+
        function getMetadataType( $image ) {
                return 'parsed-png';
        }
-       
+
        function isMetadataValid( $image, $metadata ) {
 
                if ( $metadata === self::BROKEN_FILE ) {
@@ -134,21 +134,21 @@ class PNGHandler extends BitmapHandler {
 
                $info = array();
                $info[] = $original;
-               
+
                if ( $metadata['loopCount'] == 0 ) {
                        $info[] = wfMessage( 'file-info-png-looped' )->parse();
                } elseif ( $metadata['loopCount'] > 1 ) {
                        $info[] = wfMessage( 'file-info-png-repeat' )->numParams( $metadata['loopCount'] )->parse();
                }
-               
+
                if ( $metadata['frameCount'] > 0 ) {
                        $info[] = wfMessage( 'file-info-png-frames' )->numParams( $metadata['frameCount'] )->parse();
                }
-               
+
                if ( $metadata['duration'] ) {
                        $info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
                }
-               
+
                return $wgLang->commaList( $info );
        }
 
index 9dcde40..55f087a 100644 (file)
@@ -124,7 +124,7 @@ class PNGMetadataExtractor {
                                        case 0:
                                                $colorType = 'greyscale';
                                                break;
-                                       case 2: 
+                                       case 2:
                                                $colorType = 'truecolour';
                                                break;
                                        case 3:
index 871d419..456c016 100644 (file)
@@ -75,9 +75,9 @@ class SVGReader {
                        $this->reader->open( $source, null, LIBXML_NOERROR | LIBXML_NOWARNING );
                }
 
-               // Expand entities, since Adobe Illustrator uses them for xmlns 
-               // attributes (bug 31719). Note that libxml2 has some protection 
-               // against large recursive entity expansions so this is not as 
+               // Expand entities, since Adobe Illustrator uses them for xmlns
+               // attributes (bug 31719). Note that libxml2 has some protection
+               // against large recursive entity expansions so this is not as
                // insecure as it might appear to be.
                $this->reader->setParserProperty( XMLReader::SUBST_ENTITIES, true );
 
index 83b8a10..aa411df 100644 (file)
@@ -669,7 +669,7 @@ class XMPInfo {
                         *      'validate'  => 'validateClosed',
                         *      'choices'   => array( '1' => true, '2' => true ),
                         * ),
-                        */ 
+                        */
                ),
                'http://ns.adobe.com/exif/1.0/aux/' => array(
                        'Lens'              => array(
index 5ce3c00..e3fd59f 100644 (file)
@@ -153,7 +153,7 @@ class XMPValidate {
 
                //check if its in a numeric range
                $inRange = false;
-               if ( isset( $info['rangeLow'] ) 
+               if ( isset( $info['rangeLow'] )
                        && isset( $info['rangeHigh'] )
                        && is_numeric( $val )
                        && ( intval( $val ) <= $info['rangeHigh'] )
@@ -342,7 +342,7 @@ class XMPValidate {
                }
 
                $m = array();
-               if ( preg_match( 
+               if ( preg_match(
                        '/(\d{1,3}),(\d{1,2}),(\d{1,2})([NWSE])/D',
                        $val, $m )
                ) {
@@ -354,7 +354,7 @@ class XMPValidate {
                        }
                        $val = $coord;
                        return;
-               } elseif ( preg_match( 
+               } elseif ( preg_match(
                        '/(\d{1,3}),(\d{1,2}(?:.\d*)?)([NWSE])/D',
                        $val, $m )
                ) {
@@ -367,7 +367,7 @@ class XMPValidate {
                        return;
 
                } else {
-                       wfDebugLog( 'XMP', __METHOD__ 
+                       wfDebugLog( 'XMP', __METHOD__
                                . " Expected GPSCoordinate, but got $val." );
                        $val = null;
                        return;
index 368d0bc..d9deb3c 100644 (file)
@@ -49,7 +49,7 @@ while( false !== ($line = fgets( $in ) ) ) {
        $name = $columns[1];
        $simpleUpper = $columns[12];
        $simpleLower = $columns[13];
-       
+
        $source = codepointToUtf8( hexdec( $codepoint ) );
        if( $simpleUpper ) {
                $wikiUpperChars[$source] = codepointToUtf8( hexdec( $simpleUpper ) );
index 08f85bd..64d9618 100644 (file)
@@ -765,7 +765,7 @@ class UtfNormal {
         * @param $string String The string
         * @return String String with the character codes replaced.
         */
-       private static function replaceForNativeNormalize( $string ) { 
+       private static function replaceForNativeNormalize( $string ) {
                $string = preg_replace(
                        '/[\x00-\x08\x0b\x0c\x0e-\x1f]/',
                        UTF8_REPLACEMENT,
index 944c443..6642844 100644 (file)
@@ -19,7 +19,7 @@
  * 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 UtfNormal
  */
index 5142a41..64624b8 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Some constant definitions for the unicode normalization module.
  *
- * Note: these constants must all be resolvable at compile time by HipHop, 
+ * Note: these constants must all be resolvable at compile time by HipHop,
  * since this file will not be executed during request startup for a compiled
  * MediaWiki.
  *
index e4c1138..11d06d4 100644 (file)
@@ -177,7 +177,7 @@ if( $out ) {
  *
  * @file
  */
+
 UtfNormal::\$utfCombiningClass = unserialize( '$serCombining' );
 UtfNormal::\$utfCanonicalComp = unserialize( '$serComp' );
 UtfNormal::\$utfCanonicalDecomp = unserialize( '$serCanon' );
index 156c39e..60d0645 100644 (file)
@@ -28,9 +28,9 @@
  * @ingroup Cache
  */
 class EhcacheBagOStuff extends BagOStuff {
-       var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions, 
+       var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions,
                $requestData, $requestDataPos;
-       
+
        var $curls = array();
 
        /**
@@ -49,7 +49,7 @@ class EhcacheBagOStuff extends BagOStuff {
                }
                $this->servers = $params['servers'];
                $this->cacheName = isset( $params['cache'] ) ? $params['cache'] : 'mw';
-               $this->connectTimeout = isset( $params['connectTimeout'] ) 
+               $this->connectTimeout = isset( $params['connectTimeout'] )
                        ? $params['connectTimeout'] : 1;
                $this->timeout = isset( $params['timeout'] ) ? $params['timeout'] : 1;
                $this->curlOptions = array(
@@ -77,7 +77,7 @@ class EhcacheBagOStuff extends BagOStuff {
                if ( $response['http_code'] >= 300 ) {
                        wfDebug( __METHOD__.": GET failure, got HTTP {$response['http_code']}\n" );
                        wfProfileOut( __METHOD__ );
-                       return false;                   
+                       return false;
                }
                $body = $response['body'];
                $type = $response['content_type'];
@@ -203,9 +203,9 @@ class EhcacheBagOStuff extends BagOStuff {
         * @return int
         */
        protected function attemptPut( $key, $data, $type, $ttl ) {
-               // In initial benchmarking, it was 30 times faster to use CURLOPT_POST 
+               // In initial benchmarking, it was 30 times faster to use CURLOPT_POST
                // than CURLOPT_UPLOAD with CURLOPT_READFUNCTION. This was because
-               // CURLOPT_UPLOAD was pushing the request headers first, then waiting 
+               // CURLOPT_UPLOAD was pushing the request headers first, then waiting
                // for an ACK packet, then sending the data, whereas CURLOPT_POST just
                // sends the headers and the data in a single send().
                $response = $this->doItemRequest( $key,
@@ -232,7 +232,7 @@ class EhcacheBagOStuff extends BagOStuff {
         */
        protected function createCache( $key ) {
                wfDebug( __METHOD__.": creating cache for $key\n" );
-               $response = $this->doCacheRequest( $key, 
+               $response = $this->doCacheRequest( $key,
                        array(
                                CURLOPT_POST => 1,
                                CURLOPT_CUSTOMREQUEST => 'PUT',
@@ -280,7 +280,7 @@ class EhcacheBagOStuff extends BagOStuff {
                if ( array_diff_key( $curlOptions, $this->curlOptions ) ) {
                        // var_dump( array_diff_key( $curlOptions, $this->curlOptions ) );
                        throw new MWException( __METHOD__.": to prevent options set in one doRequest() " .
-                               "call from affecting subsequent doRequest() calls, only options listed " . 
+                               "call from affecting subsequent doRequest() calls, only options listed " .
                                "in \$this->curlOptions may be specified in the \$curlOptions parameter." );
                }
                $curlOptions += $this->curlOptions;
index 813c272..643d2e9 100644 (file)
@@ -101,7 +101,7 @@ class MemcachedBagOStuff extends BagOStuff {
         * @return Mixed
         */
        public function replace( $key, $value, $exptime = 0 ) {
-               return $this->client->replace( $this->encodeKey( $key ), $value, 
+               return $this->client->replace( $this->encodeKey( $key ), $value,
                        $this->fixExpiry( $exptime ) );
        }
 
index 536ba6e..9ac8ad8 100644 (file)
@@ -897,7 +897,7 @@ class MWMemcached {
                                        return false;
                                }
                                if ( substr( $data, -2 ) !== "\r\n" ) {
-                                       $this->_handle_error( $sock, 
+                                       $this->_handle_error( $sock,
                                                'line ending missing from data block from $1' );
                                        return false;
                                }
@@ -1096,7 +1096,7 @@ class MWMemcached {
        }
 
        /**
-        * Read the specified number of bytes from a stream. If there is an error, 
+        * Read the specified number of bytes from a stream. If there is an error,
         * mark the socket dead.
         *
         * @param $sock The socket
@@ -1137,7 +1137,7 @@ class MWMemcached {
        function _fgets( $sock ) {
                $result = fgets( $sock );
                // fgets() may return a partial line if there is a select timeout after
-               // a successful recv(), so we have to check for a timeout even if we 
+               // a successful recv(), so we have to check for a timeout even if we
                // got a string response.
                $data = stream_get_meta_data( $sock );
                if ( $data['timed_out'] ) {
index a46dc71..5a9ee50 100644 (file)
@@ -81,7 +81,7 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
        public function unlock( $key ) {
                return $this->client->unlock( $this->encodeKey( $key ) );
        }
-       
+
        /**
         * @param $key string
         * @param $value int
index e496ddd..2f37c23 100644 (file)
@@ -22,8 +22,8 @@
  */
 
 /**
- * A cache class that replicates all writes to multiple child caches. Reads 
- * are implemented by reading from the caches in the order they are given in 
+ * A cache class that replicates all writes to multiple child caches. Reads
+ * are implemented by reading from the caches in the order they are given in
  * the configuration until a cache gives a positive result.
  *
  * @ingroup Cache
index 9b360f3..83b6016 100644 (file)
@@ -139,8 +139,8 @@ class ObjectCache {
        /**
         * Factory function that creates a memcached client object.
         *
-        * This always uses the PHP client, since the PECL client has a different 
-        * hashing scheme and a different interpretation of the flags bitfield, so 
+        * This always uses the PHP client, since the PECL client has a different
+        * hashing scheme and a different interpretation of the flags bitfield, so
         * switching between the two clients randomly would be disasterous.
         *
         * @param $params array
index f98266e..92e7fcf 100644 (file)
@@ -39,7 +39,7 @@ class ResourceLoader {
 
        /** Associative array mapping module name to info associative array */
        protected $moduleInfos = array();
+
        /** Associative array mapping framework ids to a list of names of test suite modules */
        /** like array( 'qunit' => array( 'mediawiki.tests.qunit.suites', 'ext.foo.tests', .. ), .. ) */
        protected $testModuleNames = array();
@@ -346,7 +346,7 @@ class ResourceLoader {
        public function getModuleNames() {
                return array_keys( $this->moduleInfos );
        }
+
        /**
         * Get a list of test module names for one (or all) frameworks.
         * If the given framework id is unknkown, or if the in-object variable is not an array,
index 7231c0f..db4c758 100644 (file)
@@ -113,6 +113,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        protected $debugRaw = true;
        /** Boolean: Whether mw.loader.state() call should be omitted */
        protected $raw = false;
+       protected $targets = array( 'desktop' );
+
        /**
         * Array: Cache for mtime
         * @par Usage:
@@ -232,6 +234,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                // Lists of strings
                                case 'dependencies':
                                case 'messages':
+                               case 'targets':
                                        $this->{$member} = (array) $option;
                                        break;
                                // Single strings
@@ -620,7 +623,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        protected function readStyleFile( $path, $flip ) {
                $localPath = $this->getLocalPath( $path );
                if ( !file_exists( $localPath ) ) {
-                       throw new MWException( __METHOD__.": style file not found: \"$localPath\"" );
+                       $msg = __METHOD__.": style file not found: \"$localPath\"";
+                       wfDebugLog( 'resourceloader', $msg );
+                       throw new MWException( $msg );
                }
                $style = file_get_contents( $localPath );
                if ( $flip ) {
@@ -668,4 +673,14 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        public function getFlip( $context ) {
                return $context->getDirection() === 'rtl';
        }
+
+       /**
+        * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
+        *
+        * @return array of strings
+        */
+       public function getTargets() {
+               return $this->targets;
+       }
+
 }
index e364b71..8fec0d6 100644 (file)
@@ -376,7 +376,7 @@ abstract class ResourceLoaderModule {
         * NOTE: The mtime of the module's messages is NOT automatically included.
         * If you want this to happen, you'll need to call getMsgBlobMtime()
         * yourself and take its result into consideration.
-        * 
+        *
         * @param $context ResourceLoaderContext: Context object
         * @return Integer: UNIX timestamp
         */
@@ -450,4 +450,13 @@ abstract class ResourceLoaderModule {
                return self::$jsParser;
        }
 
+       /**
+        * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
+        * Default implementation hardcodes 'desktop'.
+        *
+        * @return array of strings
+        */
+       public function getTargets() {
+               return array( 'desktop' );
+       }
 }
index 8e81c8d..bd026f3 100644 (file)
@@ -45,7 +45,7 @@ class ResourceLoaderNoscriptModule extends ResourceLoaderWikiModule {
 
        /**
         * Gets group name
-        * 
+        *
         * @return String: Name of group
         */
        public function getGroup() {
index 03fe1fe..1cc5c1a 100644 (file)
@@ -47,8 +47,8 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
                        'MediaWiki:Print.css' => array( 'type' => 'style', 'media' => 'print' ),
                );
                if ( $wgHandheldStyle ) {
-                       $pages['MediaWiki:Handheld.css'] = array( 
-                               'type' => 'style', 
+                       $pages['MediaWiki:Handheld.css'] = array(
+                               'type' => 'style',
                                'media' => 'handheld' );
                }
                return $pages;
@@ -58,7 +58,7 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
 
        /**
         * Gets group name
-        * 
+        *
         * @return String: Name of group
         */
        public function getGroup() {
index 20ee83f..1d36911 100644 (file)
@@ -114,6 +114,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                $out = '';
                $registrations = array();
                $resourceLoader = $context->getResourceLoader();
+               $target = $context->getRequest()->getVal( 'target', 'desktop' );
 
                // Register sources
                $out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
@@ -121,6 +122,10 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register modules
                foreach ( $resourceLoader->getModuleNames() as $name ) {
                        $module = $resourceLoader->getModule( $name );
+                       $moduleTargets = $module->getTargets();
+                       if ( !in_array( $target, $moduleTargets ) ) {
+                               continue;
+                       }
                        $deps = $module->getDependencies();
                        $group = $module->getGroup();
                        $source = $module->getSource();
@@ -130,33 +135,33 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                $version = wfTimestamp( TS_ISO_8601_BASIC,
                                        $module->getModifiedTime( $context ) );
                                $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $source, $loader );
+                               continue;
                        }
+
                        // Automatically register module
+                       // getModifiedTime() is supposed to return a UNIX timestamp, but it doesn't always
+                       // seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
+                       $moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
+                       $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
+                       // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
+                       // mw.loader.register()
+                       if ( !count( $deps ) && $group === null && $source === 'local' ) {
+                               $registrations[] = array( $name, $mtime );
+                       }
+                       // Modules with dependencies but no group or foreign source pass three arguments
+                       // (name, timestamp, dependencies) to mw.loader.register()
+                       elseif ( $group === null && $source === 'local' ) {
+                               $registrations[] = array( $name, $mtime, $deps );
+                       }
+                       // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
+                       // to mw.loader.register()
+                       elseif ( $source === 'local' ) {
+                               $registrations[] = array( $name, $mtime, $deps, $group );
+                       }
+                       // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
+                       // to mw.loader.register()
                        else {
-                               // getModifiedTime() is supposed to return a UNIX timestamp, but it doesn't always
-                               // seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
-                               $moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
-                               $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
-                               // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
-                               // mw.loader.register()
-                               if ( !count( $deps ) && $group === null && $source === 'local' ) {
-                                       $registrations[] = array( $name, $mtime );
-                               }
-                               // Modules with dependencies but no group or foreign source pass three arguments
-                               // (name, timestamp, dependencies) to mw.loader.register()
-                               elseif ( $group === null && $source === 'local' ) {
-                                       $registrations[] = array( $name, $mtime, $deps );
-                               }
-                               // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
-                               // to mw.loader.register()
-                               elseif ( $source === 'local' ) {
-                                       $registrations[] = array( $name, $mtime, $deps, $group );
-                               }
-                               // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
-                               // to mw.loader.register()
-                               else {
-                                       $registrations[] = array( $name, $mtime, $deps, $group, $source );
-                               }
+                               $registrations[] = array( $name, $mtime, $deps, $group, $source );
                        }
                }
                $out .= ResourceLoader::makeLoaderRegisterScript( $registrations );
index 139048c..d90e8c4 100644 (file)
@@ -48,7 +48,7 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
                global $wgUser;
                return $this->modifiedTime[$hash] = wfTimestamp( TS_UNIX, $wgUser->getTouched() );
        }
-       
+
        /**
         * @param $context ResourceLoaderContext
         * @return array
index 51ed000..368d900 100644 (file)
@@ -186,10 +186,10 @@ class SearchIBM_DB2 extends SearchEngine {
 
                $searchon = $this->db->strencode(join(',', $q));
                $field = $this->getIndexField($fulltext);
-               
+
                // requires Net Search Extender or equivalent
                //return " CONTAINS($field, '$searchon') > 0 ";
-               
+
                return " lcase($field) LIKE lcase('%$searchon%')";
        }
 
index 69c92ba..4edce35 100644 (file)
@@ -78,7 +78,7 @@ class SearchMssql extends SearchEngine {
         * Return a partial WHERE clause to limit the search to the given namespaces
         *
         * @return String
-        * @private                           
+        * @private
         */
        function queryNamespaces() {
                $namespaces = implode( ',', $this->namespaces );
@@ -146,7 +146,7 @@ class SearchMssql extends SearchEngine {
                $match = $this->parseQuery( $filteredTerm, $fulltext );
                $page        = $this->db->tableName( 'page' );
                $searchindex = $this->db->tableName( 'searchindex' );
-               
+
                return 'SELECT page_id, page_namespace, page_title, ftindex.[RANK]' .
                        "FROM $page,FREETEXTTABLE($searchindex , $match, LANGUAGE 'English') as ftindex " .
                        'WHERE page_id=ftindex.[KEY] ';
@@ -196,7 +196,7 @@ class SearchMssql extends SearchEngine {
         */
        function update( $id, $title, $text ) {
                // We store the column data as UTF-8 byte order marked binary stream
-               // because we are invoking the plain text IFilter on it so that, and we want it 
+               // because we are invoking the plain text IFilter on it so that, and we want it
                // to properly decode the stream as UTF-8.  SQL doesn't support UTF8 as a data type
                // but the indexer will correctly handle it by this method.  Since all we are doing
                // is passing this data to the indexer and never retrieving it via PHP, this will save space
index a2db52f..29070e1 100644 (file)
  * @ingroup Search
  */
 class SearchOracle extends SearchEngine {
-       
-       private $reservedWords = array ('ABOUT' => 1, 
-                                                                       'ACCUM' => 1, 
-                                                                       'AND' => 1, 
-                                                                       'BT' => 1, 
-                                                                       'BTG' => 1, 
-                                                                       'BTI' => 1, 
+
+       private $reservedWords = array ('ABOUT' => 1,
+                                                                       'ACCUM' => 1,
+                                                                       'AND' => 1,
+                                                                       'BT' => 1,
+                                                                       'BTG' => 1,
+                                                                       'BTI' => 1,
                                                                        'BTP' => 1,
-                                                                       'FUZZY' => 1, 
-                                                                       'HASPATH' => 1, 
-                                                                       'INPATH' => 1, 
-                                                                       'MINUS' => 1, 
-                                                                       'NEAR' => 1, 
+                                                                       'FUZZY' => 1,
+                                                                       'HASPATH' => 1,
+                                                                       'INPATH' => 1,
+                                                                       'MINUS' => 1,
+                                                                       'NEAR' => 1,
                                                                        'NOT' => 1,
-                                                                       'NT' => 1, 
-                                                                       'NTG' => 1, 
-                                                                       'NTI' => 1, 
-                                                                       'NTP' => 1, 
-                                                                       'OR' => 1, 
-                                                                       'PT' => 1, 
-                                                                       'RT' => 1, 
+                                                                       'NT' => 1,
+                                                                       'NTG' => 1,
+                                                                       'NTI' => 1,
+                                                                       'NTP' => 1,
+                                                                       'OR' => 1,
+                                                                       'PT' => 1,
+                                                                       'RT' => 1,
                                                                        'SQE' => 1,
-                                                                       'SYN' => 1, 
-                                                                       'TR' => 1, 
-                                                                       'TRSYN' => 1, 
-                                                                       'TT' => 1, 
+                                                                       'SYN' => 1,
+                                                                       'TR' => 1,
+                                                                       'TRSYN' => 1,
+                                                                       'TT' => 1,
                                                                        'WITHIN' => 1);
 
        /**
@@ -254,13 +254,13 @@ class SearchOracle extends SearchEngine {
                        ), 'SearchOracle::update' );
 
                // Sync the index
-               // We need to specify the DB name (i.e. user/schema) here so that 
+               // We need to specify the DB name (i.e. user/schema) here so that
                // it can work from the installer, where
                //     ALTER SESSION SET CURRENT_SCHEMA = ...
                // was used.
-               $dbw->query( "CALL ctx_ddl.sync_index(" . 
+               $dbw->query( "CALL ctx_ddl.sync_index(" .
                        $dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_text_idx', 'raw' ) ) . ")" );
-               $dbw->query( "CALL ctx_ddl.sync_index(" . 
+               $dbw->query( "CALL ctx_ddl.sync_index(" .
                        $dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_title_idx', 'raw' ) ) . ")" );
        }
 
index b05c421..71a17c8 100644 (file)
@@ -124,7 +124,12 @@ class MediaWikiSite extends SiteObject {
                $page = static::extractPageRecord( $data, $pageName );
 
                if ( isset( $page['missing'] ) ) {
-                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a missing page title! " . $ret );
+                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! " . $ret );
+                       return false;
+               }
+
+               if ( isset( $page['invalid'] ) ) {
+                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! " . $ret );
                        return false;
                }
 
index 036b867..4c38a78 100644 (file)
@@ -121,7 +121,7 @@ class PageArchive {
         * @return ResultWrapper
         */
        function listRevisions() {
-               global $wgContentHandlerNoDB;
+               global $wgContentHandlerUseDB;
 
                $dbr = wfGetDB( DB_SLAVE );
 
@@ -130,7 +130,7 @@ class PageArchive {
                        'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
                );
 
-               if ( !$wgContentHandlerNoDB ) {
+               if ( $wgContentHandlerUseDB ) {
                        $fields[] = 'ar_content_format';
                        $fields[] = 'ar_content_model';
                }
@@ -194,7 +194,7 @@ class PageArchive {
         * @return Revision
         */
        function getRevision( $timestamp ) {
-               global $wgContentHandlerNoDB;
+               global $wgContentHandlerUseDB;
 
                $dbr = wfGetDB( DB_SLAVE );
 
@@ -213,7 +213,7 @@ class PageArchive {
                        'ar_sha1',
                );
 
-               if ( !$wgContentHandlerNoDB ) {
+               if ( $wgContentHandlerUseDB ) {
                        $fields[] = 'ar_content_format';
                        $fields[] = 'ar_content_model';
                }
@@ -435,7 +435,7 @@ class PageArchive {
         * @return Status, containing the number of revisions restored on success
         */
        private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
-               global $wgContentHandlerNoDB;
+               global $wgContentHandlerUseDB;
 
                if ( wfReadOnly() ) {
                        throw new ReadOnlyError();
@@ -510,7 +510,7 @@ class PageArchive {
                        'ar_len',
                        'ar_sha1');
 
-               if ( !$wgContentHandlerNoDB ) {
+               if ( $wgContentHandlerUseDB ) {
                        $fields[] = 'ar_content_format';
                        $fields[] = 'ar_content_model';
                }
index e3a4c3a..fd24af1 100644 (file)
@@ -790,6 +790,8 @@ class UploadForm extends HTMLForm {
         * @return Array: descriptor array
         */
        protected function getSourceSection() {
+               global $wgCopyUploadsFromSpecialUpload;
+
                if ( $this->mSessionKey ) {
                        return array(
                                'SessionKey' => array(
@@ -803,7 +805,9 @@ class UploadForm extends HTMLForm {
                        );
                }
 
-               $canUploadByUrl = UploadFromUrl::isEnabled() && UploadFromUrl::isAllowed( $this->getUser() );
+               $canUploadByUrl = UploadFromUrl::isEnabled()
+                       && UploadFromUrl::isAllowed( $this->getUser() )
+                       && $wgCopyUploadsFromSpecialUpload;
                $radio = $canUploadByUrl;
                $selectedSourceType = strtolower( $this->getRequest()->getText( 'wpSourceType', 'File' ) );
 
index 98727f1..6e1094f 100644 (file)
@@ -40,7 +40,7 @@ class UsercreateTemplate extends QuickTemplate {
                        'helptext' => $helptext,
                );
        }
-       
+
        function execute() {
                if( $this->data['message'] ) {
 ?>
@@ -187,9 +187,9 @@ class UsercreateTemplate extends QuickTemplate {
                if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
                        foreach ( $this->data['extraInput'] as $inputItem ) { ?>
                <tr>
-                       <?php 
+                       <?php
                                if ( !empty( $inputItem['msg'] ) && $inputItem['type'] != 'checkbox' ) {
-                                       ?><td class="mw-label"><label for="<?php 
+                                       ?><td class="mw-label"><label for="<?php
                                        echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
                                        $this->msgWiki( $inputItem['msg'] ) ?></label><?php
                                } else {
@@ -200,17 +200,17 @@ class UsercreateTemplate extends QuickTemplate {
                                <input type="<?php echo htmlspecialchars( $inputItem['type'] ) ?>" name="<?php
                                echo htmlspecialchars( $inputItem['name'] ); ?>"
                                        tabindex="<?php echo $tabIndex++; ?>"
-                                       value="<?php 
+                                       value="<?php
                                if ( $inputItem['type'] != 'checkbox' ) {
                                        echo htmlspecialchars( $inputItem['value'] );
                                } else {
                                        echo '1';
-                               }                                       
+                               }
                                        ?>" id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
-                                       <?php 
+                                       <?php
                                if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['value'] ) )
-                                       echo 'checked="checked"'; 
-                                       ?> /> <?php 
+                                       echo 'checked="checked"';
+                                       ?> /> <?php
                                        if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['msg'] ) ) {
                                                ?>
                                <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
@@ -224,8 +224,7 @@ class UsercreateTemplate extends QuickTemplate {
                                <?php } ?>
                        </td>
                </tr>
-<?php                          
-                               
+<?php
                        }
                }
 ?>
index 517745c..cd22f49 100644 (file)
@@ -352,7 +352,6 @@ $messages = array(
 'qbbrowse' => 'Snuffel',
 'qbedit' => 'Wysig',
 'qbpageoptions' => 'Bladsyopsies',
-'qbpageinfo' => 'Bladsyinligting',
 'qbmyoptions' => 'My bladsye',
 'qbspecialpages' => 'Spesiale bladsye',
 'faq' => 'Gewilde vrae',
index 06124d0..4228fe0 100644 (file)
@@ -182,7 +182,6 @@ $messages = array(
 'qbbrowse' => 'ቃኝ',
 'qbedit' => 'አርም',
 'qbpageoptions' => 'ይህ ገጽ',
-'qbpageinfo' => 'አግባብ',
 'qbmyoptions' => 'የኔ ገጾች',
 'qbspecialpages' => 'ልዩ ገጾች',
 'faq' => 'ብጊየጥ (ብዙ ጊዜ የሚጠየቁ ጥያቀዎች)',
index 491b186..6b2746a 100644 (file)
@@ -276,7 +276,6 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Ista pachina',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'Pachinas propias',
 'qbspecialpages' => 'Pachinas especials',
 'faq' => 'Preguntas freqüents (FAQ)',
index a378245..522d80a 100644 (file)
@@ -47,6 +47,7 @@
  * @author Riadismet
  * @author Samer
  * @author Sami Lab
+ * @author TTMTT
  * @author Tarawneh
  * @author TheEgyptian
  * @author Uwe a
@@ -613,7 +614,6 @@ $messages = array(
 'qbbrowse' => 'تصفح',
 'qbedit' => 'تعديل',
 'qbpageoptions' => 'هذه الصفحة',
-'qbpageinfo' => 'سياق النص',
 'qbmyoptions' => 'صفحاتي',
 'qbspecialpages' => 'الصفحات الخاصة',
 'faq' => 'الأسئلة المتكررة',
@@ -626,7 +626,7 @@ $messages = array(
 'vector-action-protect' => 'احم',
 'vector-action-undelete' => 'استرجع الحذف',
 'vector-action-unprotect' => 'غير الحماية',
-'vector-simplesearch-preference' => 'مكّن مقترحات البحث المُحسّنة (لواجهة فكتور فقط)',
+'vector-simplesearch-preference' => 'مكّن شريط البحث المبسط (لواجهة فكتور فقط)',
 'vector-view-create' => 'أنشئ',
 'vector-view-edit' => 'تعديل',
 'vector-view-history' => 'اعرض التاريخ',
@@ -1261,6 +1261,9 @@ $2
 'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
 هي موجودة بالفعل.',
 'defaultmessagetext' => 'نص الرسالة الافتراضي',
+'content-failed-to-parse' => 'فشل في تحليل $2 محتوى لـ $1 نموذج: $3',
+'invalid-content-data' => 'بيانات المحتوى غير صالحة',
+'content-not-allowed-here' => '"$1" المحتوى غير مسموح على صفحة [[$2]]',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.
@@ -2187,7 +2190,7 @@ $1',
 'shared-repo' => 'مستودع مشترك',
 'shared-repo-name-wikimediacommons' => 'ويكيميديا كومنز',
 'filepage.css' => '/* CSS المعروض هنا سيضمن في صفحات وصف الملفات، أيضا على الويكيات الأجنبية */',
-'upload-disallowed-here' => 'لأسف لا يمكنك تعديل هذه الصورة.',
+'upload-disallowed-here' => 'للأسف لا يمكنك تعديل هذه الصورة.',
 
 # File reversion
 'filerevert' => 'استرجع $1',
@@ -3047,6 +3050,7 @@ $1',
 'immobile-target-namespace-iw' => 'وصلة الإنترويكي ليست هدفاً صالحاً لنقل صفحة.',
 'immobile-source-page' => 'هذه الصفحة غير قابلة للنقل.',
 'immobile-target-page' => 'غير قادر على النقل إلى العنوان الوجهة هذا.',
+'bad-target-model' => 'الوجهة المطلوبة تستخدم نموذج محتوى مختلف. لا يمكن تحويل من $1 إلى $2.',
 'imagenocrossnamespace' => 'لا يمكن نقل الملف إلى نطاق غير نطاق الملفات',
 'nonfile-cannot-move-to-file' => 'لا يمكن نقل غير الملفات إلى نطاق الملفات',
 'imagetypemismatch' => 'امتداد الملف الجديد لا يطابق نوعه',
@@ -3315,7 +3319,8 @@ $1',
 'spam_deleting' => 'جميع النسخ تحوي رابطا إلى $1، يتم الحذف',
 
 # Info page
-'pageinfo-title' => 'المعلومات ل"$1"',
+'pageinfo-title' => 'المعلومات عن «$1»',
+'pageinfo-not-current' => 'لا يمكن إظهار المعلومات إلا عن المراجعة الأخيرة للصفحة',
 'pageinfo-header-basic' => 'المعلومات الأساسية',
 'pageinfo-header-edits' => 'التعديلات',
 'pageinfo-header-restrictions' => 'حماية الصفحة',
@@ -3329,20 +3334,28 @@ $1',
 'pageinfo-robot-noindex' => 'غير قابلة للفهرسة',
 'pageinfo-views' => 'عدد المشاهدات',
 'pageinfo-watchers' => 'عدد المراقبين',
-'pageinfo-redirects-name' => 'التوجيهات نحو هذه الصفحة',
+'pageinfo-redirects-name' => 'التحويلات إلى هذه الصفحة',
 'pageinfo-subpages-name' => 'الصفحات الفرعية لهذه الصفحة',
-'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|إعادة ØªÙ\88جÙ\8aÙ\87|إعادة ØªÙ\88جÙ\8aÙ\87ات}}; $3 {{PLURAL:$3|غÙ\8aر Ø¥Ø¹Ø§Ø¯Ø© ØªÙ\88جÙ\8aÙ\87|غÙ\8aر Ø¥Ø¹Ø§Ø¯Ø© Ø§Ù\84توجيهات}})',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|إعادة ØªÙ\88جÙ\8aÙ\87|إعادة ØªÙ\88جÙ\8aÙ\87ات}}; $3 {{PLURAL:$3|غÙ\8aر Ø¥Ø¹Ø§Ø¯Ø© ØªÙ\88جÙ\87|غÙ\8aر Ø¥Ø¹Ø§Ø¯Ø© توجيهات}})',
 'pageinfo-firstuser' => 'منشئ الصفحة',
 'pageinfo-firsttime' => 'تاريخ إنشاء الصفحة',
 'pageinfo-lastuser' => 'آخر محرر',
 'pageinfo-lasttime' => 'تاريخ آخر تعديل',
 'pageinfo-edits' => 'عدد التعديلات',
 'pageinfo-authors' => 'عدد المؤلفين المختلفين',
-'pageinfo-recent-edits' => 'عدد التعديلات الأخيرة (خلال  $1 يوم/أيام)',
+'pageinfo-recent-edits' => 'عدد التعديلات الأخيرة (خلال {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يوماً|$1 يوم}})',
 'pageinfo-recent-authors' => 'عدد المؤلفين المختلفين الأخيرين',
-'pageinfo-magic-words' => 'السحرية {{PLURAL:$1|الكلمة|الكلمات}} ($1)',
-'pageinfo-hidden-categories' => 'مخفية {{PLURAL:$1|فئة|فئات}} ($1)',
-'pageinfo-templates' => 'متضمنة {{PLURAL:$1|قالب|قوالب}} ($1)',
+'pageinfo-magic-words' => '{{PLURAL:$1|لا كلمات سحرية|الكلمة|الكلمات}} السحرية ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|لا تصنيفات مخفية|التصنيف المخفي|التصنيفان المخفيان|التصانيف المخفية ($1)}}',
+'pageinfo-templates' => '{{PLURAL:$1|لا قوالب مضمنة|القالب المضمنن|القالبان المضمنان|القوالب المضمنة ($1)}}',
+'pageinfo-toolboxlink' => 'معلومات عن هذه الصفحة',
+'pageinfo-redirectsto' => 'تحويلة إلى',
+'pageinfo-redirectsto-info' => 'معلومات',
+'pageinfo-contentpage' => 'محسوبة كصفحة محتوى',
+'pageinfo-contentpage-yes' => 'نعم',
+'pageinfo-protect-cascading' => 'مصدر توريث  الحماية للصفحات المدمجة',
+'pageinfo-protect-cascading-yes' => 'نعم',
+'pageinfo-protect-cascading-from' => 'حماية الصفحات المدمجة موروثة من',
 
 # Skin names
 'skinname-standard' => 'كلاسيك',
@@ -3964,6 +3977,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[التضمين بالإنترويكي معطل]',
 'scarytranscludefailed' => '[البحث عن القالب فشل ل$1]',
+'scarytranscludefailed-httpstatus' => '[فشل جلب القالب لـ $1: HTTP $2]',
 'scarytranscludetoolong' => '[المسار طويل للغاية]',
 
 # Delete conflict
index b438695..e4d8485 100644 (file)
@@ -445,7 +445,6 @@ $messages = array(
 'qbbrowse' => 'تصفح',
 'qbedit' => 'عدل',
 'qbpageoptions' => ' الصفحه دى',
-'qbpageinfo' => 'السياق',
 'qbmyoptions' => 'صفحاتى',
 'qbspecialpages' => 'الصفحات الخاصة',
 'faq' => 'اسئله بتتسئل كتير',
index 7245f38..0d00d74 100644 (file)
@@ -327,7 +327,6 @@ $messages = array(
 'qbbrowse' => 'ব্ৰাওজ',
 'qbedit' => 'সম্পাদনা',
 'qbpageoptions' => 'এই পৃষ্ঠা',
-'qbpageinfo' => 'প্ৰসংগ',
 'qbmyoptions' => 'মোৰ পৃষ্ঠাসমূহ',
 'qbspecialpages' => 'বিশেষ পৃষ্ঠাসমূহ',
 'faq' => 'সততে উদিত প্ৰশ্নসমূহ (FAQ)',
index 5592b14..9f91067 100644 (file)
@@ -203,7 +203,6 @@ $messages = array(
 'qbbrowse' => 'Restolar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta páxina',
-'qbpageinfo' => 'Contestu',
 'qbmyoptions' => 'Les mios páxines',
 'qbspecialpages' => 'Páxines especiales',
 'faq' => 'EMF (entrugues más frecuentes)',
index 6f57f60..532fd1c 100644 (file)
@@ -230,7 +230,6 @@ $messages = array(
 'qbbrowse' => 'Farura',
 'qbedit' => 'Betara',
 'qbpageoptions' => 'Ikatcuksbu',
-'qbpageinfo' => 'Givabu',
 'qbmyoptions' => 'Jinaf ikatcukseem',
 'qbspecialpages' => 'Aptaf bueem',
 'faq' => 'NEB',
index 1e0c945..e240157 100644 (file)
@@ -223,7 +223,6 @@ $messages = array(
 'qbbrowse' => 'Gözdən keçir',
 'qbedit' => 'Redaktə',
 'qbpageoptions' => 'Bu səhifə',
-'qbpageinfo' => 'Məzmun',
 'qbmyoptions' => 'Mənim səhifələrim',
 'qbspecialpages' => 'Xüsusi səhifələr',
 'faq' => 'TSS',
index 043e6ed..80c8530 100644 (file)
@@ -208,7 +208,6 @@ $messages = array(
 'qbbrowse' => 'Байҡарға',
 'qbedit' => 'Үҙгәртергә',
 'qbpageoptions' => 'Был бит',
-'qbpageinfo' => 'Бит тураһында мәғлүмәттәр',
 'qbmyoptions' => 'Биттәрем',
 'qbspecialpages' => 'Махсус биттәр',
 'faq' => 'ЙБҺ',
@@ -867,7 +866,7 @@ $3 белдергән сәбәп: ''$2''",
 'currentrev' => 'Ағымдағы версия',
 'currentrev-asof' => '$1, ағымдағы версия',
 'revisionasof' => '$1 версияһы',
-'revision-info' => 'Версия: $1; $2',
+'revision-info' => '<div id="viewingold-warning" style="background: #FFBDBD; border: 1px solid #BB7979; color: #000000; margin: 1em 0 .5em; padding: .5em 1em; vertical-align: middle; font-weight: bold; font-family: Palatino Linotype, Microsoft Sans Serif, Arial Unicode MS, Droid Sans; clear: both;">Хәҙер һеҙ был биттең иҫке, <span id="mw-revision-name">$2</span> тарафынан <span id="mw-revision-date">$1</span> һаҡланған версияһын ҡарайһығыҙ. Уның <span class="plainlinks">[{{fullurl:{{FULLPAGENAME}}}} ағымдағы версиянан] айырмаһы булыуы мөмкин</span>.</div>',
 'previousrevision' => '← Алдағы',
 'nextrevision' => 'Киләһе →',
 'currentrevisionlink' => 'Ағымдағы версия',
index 081528b..f33e04f 100644 (file)
@@ -274,7 +274,6 @@ $messages = array(
 'qbbrowse' => 'بروز',
 'qbedit' => 'اصلاح',
 'qbpageoptions' => 'صفحه',
-'qbpageinfo' => 'متن',
 'qbmyoptions' => 'منی صفحات',
 'qbspecialpages' => 'حاصین صفحات',
 'faq' => 'ب.ج.س',
index 22d7628..22cb145 100644 (file)
@@ -242,7 +242,6 @@ $messages = array(
 'qbbrowse' => 'Halungkáta',
 'qbedit' => 'Liwata',
 'qbpageoptions' => 'Ining pahina',
-'qbpageinfo' => 'Konteksto',
 'qbmyoptions' => 'Sakong mga pahina',
 'qbspecialpages' => 'Espesyal na mga pahina',
 'faq' => 'PPK (Pirmihang Pighahapot na mga kahaputan)',
index 6e6e678..ad64f05 100644 (file)
@@ -231,7 +231,6 @@ $messages = array(
 'qbbrowse' => 'Выбраць',
 'qbedit' => 'Правіць',
 'qbpageoptions' => 'Гэтая старонка',
-'qbpageinfo' => 'Кантэкст',
 'qbmyoptions' => 'Свае старонкі',
 'qbspecialpages' => 'Адмысловыя старонкі',
 'faq' => 'ЧАПЫ',
index 51dd768..75f0e68 100644 (file)
@@ -399,7 +399,6 @@ $messages = array(
 'qbbrowse' => 'Праглядзець',
 'qbedit' => 'Рэдагаваць',
 'qbpageoptions' => 'Гэтая старонка',
-'qbpageinfo' => 'Інфармацыя пра старонку',
 'qbmyoptions' => 'Мае старонкі',
 'qbspecialpages' => 'Спэцыяльныя старонкі',
 'faq' => 'Частыя пытаньні',
@@ -1023,6 +1022,15 @@ $2
 'edit-already-exists' => 'Немагчыма стварыць новую старонку.
 Яна ўжо існуе.',
 'defaultmessagetext' => 'Перадвызначаны тэкст паведамленьня',
+'content-failed-to-parse' => 'Зьмест «$2» не адпавядае тыпу $1: $3.',
+'invalid-content-data' => 'Няслушныя зьвесткі',
+'content-not-allowed-here' => 'Зьмест тыпу «$1» на старонцы [[$2]] не дазволены',
+
+# Content models
+'content-model-wikitext' => 'вікі-тэкст',
+'content-model-text' => 'просты тэкст',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Папярэджаньне: гэтая старонка ўтрымлівае зашмат працаёмістых зваротаў да функцыяў парсэра.
@@ -1925,7 +1933,7 @@ $1',
 'shared-repo-from' => '$1',
 'shared-repo' => 'агульнага сховішча',
 'shared-repo-name-wikimediacommons' => 'Вікісховішча',
-'upload-disallowed-here' => 'Ð\9dа Ð¶Ð°Ð»Ñ\8c Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð¾Ð¶Ð°Ñ\86е Ð¿ÐµÑ\80азапÑ\96Ñ\81аÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ð²Ñ\8bÑ\8fвÑ\83.',
+'upload-disallowed-here' => 'Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð¾Ð¶Ð°Ñ\86е Ð¿ÐµÑ\80азапÑ\96Ñ\81аÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\84айл.',
 
 # File reversion
 'filerevert' => 'Вярнуць $1',
@@ -2215,7 +2223,7 @@ $1',
 'emailpagetext' => 'Вы можаце выкарыстоўваць форму ніжэй, каб даслаць гэтаму ўдзельніку ліст па электроннай пошце.
 Адрас электроннай пошты, які Вы пазначалі ў [[Special:Preferences|сваіх наладах]], будзе пазначаны ў полі ліста «Ад», і ўдзельнік зможа даслаць на гэты адрас адказ.',
 'usermailererror' => 'Пры адсыланьні пошты адбылася памылка:',
-'defemailsubject' => 'ЭлекÑ\82Ñ\80оннаÑ\8f Ð¿Ð¾Ñ\88Ñ\82а {{GRAMMAR:родны|{{SITENAME}}}} ад {{GENDER:$1|удзельніка|удзельніцы}} «$1»',
+'defemailsubject' => 'Ð\9bÑ\96Ñ\81Ñ\82 Ð· {{GRAMMAR:родны|{{SITENAME}}}} ад {{GENDER:$1|удзельніка|удзельніцы}} «$1»',
 'usermaildisabled' => 'Электронная пошта ўдзельніка адключаная',
 'usermaildisabledtext' => 'Вы ня можаце дасылаць электронныя лісты іншым удзельнікам {{GRAMMAR:родны|{{SITENAME}}}}',
 'noemailtitle' => 'Адрас электроннай пошты адсутнічае',
@@ -2264,7 +2272,7 @@ $1',
 'watchnochange' => 'Нічога з Вашага сьпісу назіраньня не зьмянілася за паказаны пэрыяд.',
 'watchlist-details' => 'У Вашым сьпісе назіраньня $1 {{PLURAL:$1|старонка|старонкі|старонак}} за выключэньнем старонак абмеркаваньня.',
 'wlheader-enotif' => '* Дасылка паведамленьняў па электроннай пошце ўключаная.',
-'wlheader-showupdated' => "* Ð¡Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð±Ñ\8bлÑ\96 Ð·Ñ\8cмененÑ\8bÑ\8f Ð¿Ð°Ñ\81Ñ\8cлÑ\8f Ð\92аÑ\88ага Ð°Ð¿Ð¾Ñ\88нÑ\8fга Ð²Ñ\96зÑ\8bÑ\82Ñ\83, Ð²Ñ\8bлÑ\83Ñ\87анÑ\8bÑ\8f '''Ñ\82лÑ\83стым''' шрыфтам",
+'wlheader-showupdated' => "* Ð¡Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð±Ñ\8bлÑ\96 Ð·Ñ\8cмененÑ\8bÑ\8f Ð¿Ð°Ñ\81Ñ\8cлÑ\8f Ð\92аÑ\88ага Ð°Ð¿Ð¾Ñ\88нÑ\8fга Ð²Ñ\96зÑ\8bÑ\82Ñ\83, Ð²Ñ\8bлÑ\83Ñ\87анÑ\8bÑ\8f '''Ñ\82оÑ\9eстым''' шрыфтам",
 'watchmethod-recent' => 'прагляд апошніх зьменаў у старонках са сьпісу назіраньня',
 'watchmethod-list' => 'прагляд старонак са сьпісу назіраньня дзеля апошніх зьменах',
 'watchlistcontains' => 'Ваш сьпіс назіраньня зьмяшчае $1 {{PLURAL:$1|старонка|старонкі|старонак}}.',
@@ -2334,7 +2342,7 @@ $UNWATCHURL
 'actioncomplete' => 'Дзеяньне выкананае',
 'actionfailed' => 'Дзеяньне ня выкананае',
 'deletedtext' => '«$1» была выдаленая.
\93лÑ\8fдзÑ\96Ñ\86е Ð¶Ñ\83Ñ\80нал Ð²Ñ\8bдаленÑ\8cнÑ\8fÑ\9e Ñ\83 $2.',
\97апÑ\96Ñ\81Ñ\8b Ð¿Ñ\80а Ð²Ñ\8bдаленÑ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96 Ð·Ñ\8cмÑ\8fÑ\88Ñ\87аÑ\8eÑ\86Ñ\86а Ñ\9e $2.',
 'dellogpage' => 'Журнал выдаленьняў',
 'dellogpagetext' => 'Сьпіс апошніх выдаленьняў.',
 'deletionlog' => 'журнал выдаленьняў',
@@ -2473,7 +2481,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|адноўленая $1 вэрсія|адноўленыя $1 вэрсіі|адноўленыя $1 вэрсіяў}}',
 'undeletedrevisions-files' => 'адноўленыя $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}} і $2 {{PLURAL:$2|файл|файлы|файлаў}}',
 'undeletedfiles' => '{{PLURAL:$1|адноўлены $1 файл|адноўленыя $1 файлы|адноўленыя $1 файлаў}}',
-'cannotundelete' => 'Аднаўленьне не адбылося; нехта іншы мог пасьпець аднавіць старонку раней.',
+'cannotundelete' => 'Памылка аднаўленьня:
+$1',
 'undeletedpage' => "'''Старонка $1 была адноўленая'''
 
 Глядзіце [[Special:Log/delete|журнал выдаленьняў]] для прагляду апошніх выдаленьняў і аднаўненьняў.",
@@ -2773,6 +2782,7 @@ $1',
 'immobile-target-namespace-iw' => 'Інтэрвікі-спасылка — няслушная назва для пераносу старонкі.',
 'immobile-source-page' => 'Гэтую старонку нельга пераносіць.',
 'immobile-target-page' => 'Немагчыма перанесьці старонку пад гэтую назву.',
+'bad-target-model' => 'Выніковая старонка выкарыстоўвае іншы тып зьместу. Немагчыма пераўтварыць $1 у $2.',
 'imagenocrossnamespace' => 'Нельга перанесьці файл у ня-файлавую прастору назваў',
 'nonfile-cannot-move-to-file' => 'Нельга перанесьці ня файл у прастору назваў файлаў',
 'imagetypemismatch' => 'Новае пашырэньне файла не адпавядае яго тыпу',
@@ -3009,6 +3019,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Інфармацыя пра «$1»',
+'pageinfo-not-current' => 'Інфармацыя паказываецца толькі для бягучай вэрсіі.',
 'pageinfo-header-basic' => 'Асноўныя зьвесткі',
 'pageinfo-header-edits' => 'Рэдагаваньні',
 'pageinfo-header-restrictions' => 'Абарона старонкі',
@@ -3037,6 +3048,13 @@ $1',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Схаваная катэгорыя|Схаваныя катэгорыі}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Шаблён|Шаблёны}} ($1)',
 'pageinfo-toolboxlink' => 'Зьвесткі пра старонку',
+'pageinfo-redirectsto' => 'Перанакіроўвае на',
+'pageinfo-redirectsto-info' => 'інфармацыя',
+'pageinfo-contentpage' => 'Лічыцца артыкулам',
+'pageinfo-contentpage-yes' => 'Так',
+'pageinfo-protect-cascading' => 'Адсюль пачынаецца каскадная абарона',
+'pageinfo-protect-cascading-yes' => 'Так',
+'pageinfo-protect-cascading-from' => 'Каскадная абароная пачынаецца з',
 
 # Skin names
 'skinname-standard' => 'Клясычнае',
@@ -3752,6 +3770,8 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'version-entrypoints' => 'Уваходныя адрасы',
 'version-entrypoints-header-entrypoint' => 'Пункт уваходу',
 'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Шлях да артыкула]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Пуць да скрыпту]',
 
 # Special:FilePath
 'filepath' => 'Шлях да файла',
index a61b28c..f482ac3 100644 (file)
@@ -383,7 +383,6 @@ $messages = array(
 'qbbrowse' => 'Избор',
 'qbedit' => 'Редактиране',
 'qbpageoptions' => 'Тази страница',
-'qbpageinfo' => 'Информация за страницата',
 'qbmyoptions' => 'Моите страници',
 'qbspecialpages' => 'Специални страници',
 'faq' => 'ЧЗВ',
index 6c1a2bc..6d72aae 100644 (file)
@@ -288,7 +288,6 @@ $messages = array(
 'qbbrowse' => 'Tangadahi',
 'qbedit' => 'Babak',
 'qbpageoptions' => 'Tungkaran ini',
-'qbpageinfo' => 'Naskah aluran',
 'qbmyoptions' => 'Tungkaran ulun',
 'qbspecialpages' => 'Tungkaran istimiwa',
 'faq' => 'FAQ',
index c44c9ea..c7c2654 100644 (file)
@@ -212,7 +212,6 @@ $messages = array(
 'qbbrowse' => 'ব্রাউজ',
 'qbedit' => 'সম্পাদনা',
 'qbpageoptions' => 'এ পাতার বিকল্পসমূহ',
-'qbpageinfo' => 'পাতা-সংক্রান্ত তথ্য',
 'qbmyoptions' => 'আমার পছন্দ',
 'qbspecialpages' => 'বিশেষ পাতাসমূহ',
 'faq' => 'সম্ভাব্য প্রশ্নসমূহ',
@@ -225,7 +224,7 @@ $messages = array(
 'vector-action-protect' => 'সুরক্ষা',
 'vector-action-undelete' => 'পুনরুদ্ধার',
 'vector-action-unprotect' => 'সুরক্ষা পরিবর্তন',
-'vector-simplesearch-preference' => 'à¦\86রà¦\93 à¦¸à¦®à§\83দà§\8dধ à¦\85নà§\81সনà§\8dধান à¦ªà¦°à¦¾à¦®à¦°à§\8dশ সক্রিয় করুন (শুধুমাত্র ভেক্টর স্কিনের জন্য)',
+'vector-simplesearch-preference' => 'সরল à¦\85নà§\81সনà§\8dধান সক্রিয় করুন (শুধুমাত্র ভেক্টর স্কিনের জন্য)',
 'vector-view-create' => 'তৈরি করুন',
 'vector-view-edit' => 'সম্পাদনা',
 'vector-view-history' => 'ইতিহাস',
@@ -826,6 +825,15 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'edit-already-exists' => 'নতুন পাতা সৃষ্টি করা যায়নি।
 পাতাটি ইতিমধ্যেই বিদ্যমান।',
 'defaultmessagetext' => 'আদি টেক্সট',
+'content-failed-to-parse' => '$1 মডেলের জন্য $2 কন্টেন্ট পার্স করা যাচ্ছে না: $3',
+'invalid-content-data' => 'ভুল কন্টেন্ট ডাটা',
+'content-not-allowed-here' => '"$1" কন্টেন্টটি [[$2]] পাতায় অনুমোদিত নয়',
+
+# Content models
+'content-model-wikitext' => 'উইকিটেক্সট',
+'content-model-text' => 'সাধারণ লেখা',
+'content-model-javascript' => 'জাভাস্ক্রিপ্ট',
+'content-model-css' => 'সিএসএস',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।
@@ -1720,7 +1728,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'uploadnewversion-linktext' => 'এই ফাইলটির একটি নতুন সংস্করণ আপলোড করুন',
 'shared-repo-from' => '$1 থেকে',
 'shared-repo' => 'শেয়ার্ড রিপোজিটরী',
-'upload-disallowed-here' => 'দà§\81à¦\83à¦\96িত à¦\86পনি à¦\8fà¦\87 à¦\9bবিটি প্রতিস্থাপন করতে পারবেন না।',
+'upload-disallowed-here' => 'à¦\86পনি à¦\8fà¦\87 à¦«à¦¾à¦\87লটি প্রতিস্থাপন করতে পারবেন না।',
 
 # File reversion
 'filerevert' => '$1 পূর্বাবস্থায় ফেরত নিন',
index bffea87..390c926 100644 (file)
@@ -323,7 +323,6 @@ $messages = array(
 'qbbrowse' => 'Furchal',
 'qbedit' => 'Kemmañ',
 'qbpageoptions' => 'Pajenn an dibaboù',
-'qbpageinfo' => 'Pajenn gelaouiñ',
 'qbmyoptions' => 'Ma dibaboù',
 'qbspecialpages' => 'Pajennoù dibar',
 'faq' => 'FAG',
index 54f9007..ff0a8a4 100644 (file)
@@ -425,7 +425,6 @@ $messages = array(
 'qbbrowse' => 'Prelistajte',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Opcije stranice',
-'qbpageinfo' => 'Informacije o stranici',
 'qbmyoptions' => 'Moje opcije',
 'qbspecialpages' => 'Posebne stranice',
 'faq' => 'ČPP',
index 0cc6bcb..b0f6a5c 100644 (file)
@@ -340,7 +340,6 @@ $messages = array(
 'qbbrowse' => 'Navega',
 'qbedit' => 'Modifica',
 'qbpageoptions' => 'Opcions de pàgina',
-'qbpageinfo' => 'Informació de pàgina',
 'qbmyoptions' => 'Pàgines pròpies',
 'qbspecialpages' => 'Pàgines especials',
 'faq' => 'PMF',
@@ -1304,7 +1303,7 @@ A continuació es mostra un valor generat de forma aleatòria que podeu fer serv
 'timezoneregion-indian' => 'Oceà Índic',
 'timezoneregion-pacific' => 'Oceà Pacífic',
 'allowemail' => 'Permet que altres usuaris puguin enviar-me correus electrònics',
-'prefs-searchoptions' => 'Preferències de la cerca',
+'prefs-searchoptions' => 'Cerca',
 'prefs-namespaces' => 'Espais de noms',
 'defaultns' => 'Cerca per defecte en els següents espais de noms:',
 'default' => 'per defecte',
index 8259eff..eebf07c 100644 (file)
@@ -292,7 +292,6 @@ $messages = array(
 'qbbrowse' => 'بگه‌ڕێ',
 'qbedit' => 'دەستکاری',
 'qbpageoptions' => 'ئەم پەڕەیە',
-'qbpageinfo' => 'زانیاریی په‌ڕه‌',
 'qbmyoptions' => 'پەڕەکانم',
 'qbspecialpages' => 'پەڕە تایبەتەکان',
 'faq' => 'پرسیار و وەڵام (FAQ)',
index 2c9c6ad..8ed6e83 100644 (file)
@@ -503,7 +503,6 @@ $messages = array(
 'qbbrowse' => 'Listování',
 'qbedit' => 'Editování',
 'qbpageoptions' => 'Tato stránka',
-'qbpageinfo' => 'Kontext',
 'qbmyoptions' => 'Moje volby',
 'qbspecialpages' => 'Speciální stránky',
 'faq' => 'Často kladené otázky',
@@ -2029,7 +2028,7 @@ Možná spíše chcete upravit [$2 tamější stránku s popisem souboru].',
 'shared-repo-from' => 'z {{grammar:2sg|$1}}',
 'shared-repo' => 'sdíleného úložiště',
 'filepage.css' => '/* Zde uvedené CSS se vkládá na stránky s popisem souboru, včetně cizích klientských wiki */',
-'upload-disallowed-here' => 'Tento soubor bohužel nemůžete přepsat.',
+'upload-disallowed-here' => 'Tento soubor nemůžete přepsat.',
 
 # File reversion
 'filerevert' => 'Vrátit zpět $1',
@@ -3120,6 +3119,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 
 # Info page
 'pageinfo-title' => 'Informace o stránce „$1“',
+'pageinfo-not-current' => 'Informace lze zobrazit jen pro aktuální verzi.',
 'pageinfo-header-basic' => 'Základní údaje',
 'pageinfo-header-edits' => 'Historie editací',
 'pageinfo-header-restrictions' => 'Zámek stránky',
@@ -3148,6 +3148,13 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Skrytá|Skryté}} kategorie ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Použitá šablona|Použité šablony}} ($1)',
 'pageinfo-toolboxlink' => 'Informace o stránce',
+'pageinfo-redirectsto' => 'Přesměrovává na',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Stránka se počítá do obsahu',
+'pageinfo-contentpage-yes' => 'Ano',
+'pageinfo-protect-cascading' => 'Kaskádový zámek',
+'pageinfo-protect-cascading-yes' => 'Ano',
+'pageinfo-protect-cascading-from' => 'Zámky pocházejí z kaskádových zámků na',
 
 # Skin names
 'skinname-standard' => 'Klasický',
index 21b5c61..5c5ebf2 100644 (file)
@@ -261,7 +261,6 @@ $messages = array(
 'qbbrowse' => 'Pori',
 'qbedit' => 'Golygu',
 'qbpageoptions' => 'Y dudalen hon',
-'qbpageinfo' => 'Cyd-destun',
 'qbmyoptions' => 'Fy nhudalennau',
 'qbspecialpages' => 'Tudalennau arbennig',
 'faq' => 'Cwestiynau cyffredin',
index 7e5c8ad..97a09b6 100644 (file)
@@ -332,7 +332,6 @@ $messages = array(
 'qbbrowse' => 'Gennemse',
 'qbedit' => 'Redigér',
 'qbpageoptions' => 'Indstillinger for side',
-'qbpageinfo' => 'Information om side',
 'qbmyoptions' => 'Mine indstillinger',
 'qbspecialpages' => 'Specielle sider',
 'faq' => 'OSS',
@@ -952,7 +951,7 @@ Den ser du til at være slettet.',
 'edit-no-change' => 'Din ændring ignoreredes, fordi der ikke var ændring af teksten.',
 'edit-already-exists' => 'En ny side kunne ikke oprettes, fordi den allerede findes.',
 'defaultmessagetext' => 'Standardtekst',
-'content-failed-to-parse' => 'Kunne ikke parse $2 indhold for $1 model: $3',
+'content-failed-to-parse' => 'Kunne ikke fortolke $2-indholdet af $1-modellen: $3',
 'invalid-content-data' => 'Ugyldig indholdsdata',
 'content-not-allowed-here' => '"$1" indhold er ikke tilladt på siden [[$2]]',
 
@@ -1847,7 +1846,7 @@ Måske vil du redigere beskrivelsen på dens [$2 filbeskrivelsesside] der.',
 'uploadnewversion-linktext' => 'Læg en ny version af denne fil op',
 'shared-repo-from' => 'fra $1',
 'shared-repo' => 'et delt filarkiv',
-'upload-disallowed-here' => 'Desværre kan du ikke overskrive dette billede.',
+'upload-disallowed-here' => 'Du kan ikke overskrive denne fil.',
 
 # File reversion
 'filerevert' => 'Gendan $1',
@@ -2850,7 +2849,7 @@ Du kan se på kildeteksten.',
 'tooltip-t-contributions' => 'Se denne brugers bidrag',
 'tooltip-t-emailuser' => 'Send en e-mail til denne bruger',
 'tooltip-t-upload' => 'Upload et billede eller anden mediafil',
-'tooltip-t-specialpages' => 'Liste med alle specielle sider',
+'tooltip-t-specialpages' => 'Liste over alle specialsider',
 'tooltip-t-print' => 'Printervenlig udgave af denne side',
 'tooltip-t-permalink' => 'Permanent henvisning til denne version af denne side',
 'tooltip-ca-nstab-main' => 'Se indholdet',
@@ -2914,6 +2913,7 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 
 # Info page
 'pageinfo-title' => 'Information om "$1"',
+'pageinfo-not-current' => 'Oplysninger vises kun for den aktuelle version.',
 'pageinfo-header-basic' => 'Grundlæggende oplysninger',
 'pageinfo-header-edits' => 'Redigeringshistorik',
 'pageinfo-header-restrictions' => 'Sidebeskyttelse',
@@ -2942,6 +2942,13 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Transkluderet skabelon|Transkluderede skabeloner}} ($1)',
 'pageinfo-toolboxlink' => 'Oplysninger om siden',
+'pageinfo-redirectsto' => 'Omdirigerer til',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Talt som en indholdsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Kaskadebeskyttelser begynder her',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Kaskadebeskyttelser begynder fra',
 
 # Skin names
 'skinname-standard' => 'Klassik',
index bfc89d4..c2782be 100644 (file)
@@ -548,7 +548,6 @@ $messages = array(
 'qbbrowse' => 'Durchsuchen',
 'qbedit' => 'Bearbeiten',
 'qbpageoptions' => 'Seitenoptionen',
-'qbpageinfo' => 'Kontext',
 'qbmyoptions' => 'Meine Seiten',
 'qbspecialpages' => 'Spezialseiten',
 'faq' => 'Häufig gestellte Fragen',
@@ -787,7 +786,7 @@ Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt
 'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
 Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.
 Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
-'sqlhidden' => "''Die SQL-Datenbankabfrage ist verborgen.''",
+'sqlhidden' => '(Die SQL-Datenbankabfrage ist verborgen.)',
 'cascadeprotected' => 'Diese Seite ist zur Bearbeitung gesperrt. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:
 $2',
 'namespaceprotected' => "Du hast nicht die erforderliche Berechtigung, um Seiten im Namensraum '''$1''' bearbeiten zu können.",
@@ -2079,7 +2078,7 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
 'shared-repo-from' => 'aus $1',
 'shared-repo' => 'einem gemeinsam genutzten Medienarchiv',
 'filepage.css' => '/* Das folgende CSS wird auf Dateibeschreibungsseiten, auch auf fremden Client-Wikis, geladen. */',
-'upload-disallowed-here' => 'Leider kannst du dieses Bild nicht überschreiben.',
+'upload-disallowed-here' => 'Du kannst diese Datei nicht überschreiben.',
 
 # File reversion
 'filerevert' => 'Zurücksetzen von „$1“',
@@ -2877,7 +2876,7 @@ Bitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung
 'movepagebtn' => 'Seite verschieben',
 'pagemovedsub' => 'Verschiebung erfolgreich',
 'movepage-moved' => "'''Die Seite „$1“ wurde nach „$2“ verschoben.'''",
-'movepage-moved-redirect' => 'Es wurde eine Weiterleitung erstellt.',
+'movepage-moved-redirect' => 'Eine Weiterleitung wurde erstellt.',
 'movepage-moved-noredirect' => 'Die Erstellung einer Weiterleitung wurde unterdrückt.',
 'articleexists' => 'Unter diesem Namen existiert bereits eine Seite. Bitte wähle einen anderen Namen.',
 'cantmove-titleprotected' => 'Die Verschiebung kann nicht durchgeführt werden, da der Zieltitel zur Erstellung gesperrt ist.',
@@ -3176,7 +3175,7 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 
 # Info page
 'pageinfo-title' => 'Informationen zu „$1“',
-'pageinfo-not-current' => 'Die Information könnte nur für die aktuelle Version angezeigt werden.',
+'pageinfo-not-current' => 'Diese Informationen können nur für die aktuelle Version angezeigt werden.',
 'pageinfo-header-basic' => 'Basisinformationen',
 'pageinfo-header-edits' => 'Bearbeitungsgeschichte',
 'pageinfo-header-restrictions' => 'Seitenschutz',
@@ -3206,6 +3205,13 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 'pageinfo-hidden-categories' => 'Versteckte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
 'pageinfo-templates' => 'Eingebundene {{PLURAL:$1|Vorlage|Vorlagen}} ($1)',
 'pageinfo-toolboxlink' => 'Informationen zur Seite',
+'pageinfo-redirectsto' => 'Weiterleitungen nach',
+'pageinfo-redirectsto-info' => 'Information',
+'pageinfo-contentpage' => 'Gezählt als eine Inhaltsseite',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Seiten mit Kaskadenschutz von hier',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Seiten mit Kaskadenschutz von',
 
 # Skin names
 'skinname-standard' => 'Klassik',
@@ -3835,7 +3841,7 @@ Bitte bestätige, dass du diese Seite wirklich neu erstellen möchten.",
 # Auto-summaries
 'autosumm-blank' => 'Die Seite wurde geleert.',
 'autosumm-replace' => 'Der Seiteninhalt wurde durch einen anderen Text ersetzt: „$1“',
-'autoredircomment' => 'Weiterleitung auf [[$1]] erstellt',
+'autoredircomment' => 'Weiterleitung nach [[$1]] erstellt',
 'autosumm-new' => 'Die Seite wurde neu angelegt: „$1“',
 
 # Size units
index 158e138..30e9a32 100644 (file)
@@ -359,50 +359,50 @@ $messages = array(
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Cayê vurnayışi de tipê nuştışi:',
-'editfont-default' => 'Hesıbyayiya rovıteri',
-'editfont-monospace' => 'Tipê nustey sabıtcagırewtoği',
-'editfont-sansserif' => 'Tipê nustey Sans-serifi',
-'editfont-serif' => 'Tipê nustey Serifi',
+'editfont-default' => 'Qerar cıgeyraoği dest dero',
+'editfont-monospace' => 'Tipê nusteyê sabıtcagırewtoği',
+'editfont-sansserif' => 'Babetê Sans-serifi',
+'editfont-serif' => 'Tipê nusteyê serifi',
 
 # Dates
-'sunday' => 'Bazar',
+'sunday' => 'Kırê',
 'monday' => 'Berarek',
 'tuesday' => 'Telete',
 'wednesday' => 'Çeharşeme',
 'thursday' => 'Pancşeme',
 'friday' => 'Êne',
 'saturday' => 'Bahdê êni',
-'sun' => 'Baz',
-'mon' => 'Ber',
-'tue' => 'Tlt',
+'sun' => 'Krê',
+'mon' => 'Dış',
+'tue' => 'Sêş',
 'wed' => 'Çrş',
-'thu' => 'P',
+'thu' => 'Pşm',
 'fri' => 'Êne',
-'sat' => 'Bah',
+'sat' => 'Şem',
 'january' => 'Çele',
-'february' => 'Zemherı',
+'february' => 'Şıbate',
 'march' => 'Mert',
-'april' => 'Lisane',
-'may_long' => 'Gulan',
+'april' => 'Lizan',
+'may_long' => 'Gulane',
 'june' => 'Heziran',
-'july' => 'Paliyan',
+'july' => 'Temuze',
 'august' => 'Tebaxe',
-'september' => 'Kergan',
-'october' => 'Cıtan',
-'november' => 'Kelverdan',
-'december' => 'Vewran',
+'september' => 'Keşkelun',
+'october' => 'Tışrino Verên',
+'november' => 'Tışrino Peyên',
+'december' => 'Kanun',
 'january-gen' => 'Çele',
-'february-gen' => 'Zemherı',
-'march-gen' => 'Mert',
-'april-gen' => 'Lisan',
-'may-gen' => 'Gulan',
+'february-gen' => 'Şıbate',
+'march-gen' => 'Adar',
+'april-gen' => 'Nisane',
+'may-gen' => 'Gulane',
 'june-gen' => 'Heziran',
-'july-gen' => 'Paliyan',
+'july-gen' => 'Temuze',
 'august-gen' => 'Tebaxe',
-'september-gen' => 'Kergan',
-'october-gen' => 'Cıtan',
-'november-gen' => 'Kelverdan',
-'december-gen' => 'Vewran',
+'september-gen' => 'Keşkelun',
+'october-gen' => 'Tışrino Verên',
+'november-gen' => 'Tışrino Peyên',
+'december-gen' => 'Kanun',
 'jan' => 'Çel',
 'feb' => 'Şbt',
 'mar' => 'Adr',
@@ -441,11 +441,11 @@ $messages = array(
 
 'about' => 'Heqa',
 'article' => 'Wesiqe',
-'newwindow' => '(zerreyê teqeyê newey de beno a)',
+'newwindow' => '(zerreyê pençereyê newey de beno a)',
 'cancel' => 'Bıtexelne',
 'moredotdotdot' => 'Vêşêri...',
 'mypage' => 'Pela mı',
-'mytalk' => 'Verênayışê mı',
+'mytalk' => 'Werênayışê mı',
 'anontalk' => 'Pela werênayışê nê IPy',
 'navigation' => 'Geyrayış',
 'and' => '&#32;u',
@@ -455,7 +455,6 @@ $messages = array(
 'qbbrowse' => 'Rovete',
 'qbedit' => 'Bıvurne',
 'qbpageoptions' => 'Ena pele',
-'qbpageinfo' => 'Gıre',
 'qbmyoptions' => 'Pelê mı',
 'qbspecialpages' => 'Peley xısusi',
 'faq' => 'PZP (Persê ke zehf persiyenê)',
@@ -489,8 +488,8 @@ $messages = array(
 'history' => 'Verora perer',
 'history_short' => 'Vurnayışê verêni',
 'updatedmarker' => 'cıkewtena mına peyêne ra dıme biyo rocane',
-'printableversion' => 'Asayışo çapkerden',
-'permalink' => 'Gıreyo daimi',
+'printableversion' => 'Bınusnayen versiyon',
+'permalink' => 'Gıreyo manayen',
 'print' => 'Çap ke',
 'view' => 'Bıvin',
 'edit' => 'Bıvurnên',
@@ -513,7 +512,7 @@ $messages = array(
 'personaltools' => 'Haletê şexsi',
 'postcomment' => 'Qısımo newe',
 'articlepage' => 'Pela zerreki bıvêne',
-'talk' => 'Werênayış',
+'talk' => 'Behse',
 'views' => 'Asayışi',
 'toolbox' => 'Haceti',
 'userpage' => 'Pela karberi bıvêne',
@@ -559,7 +558,7 @@ $1',
 'policy-url' => 'Project:Terzê hereketi',
 'portal' => 'Portalê şêlıgi',
 'portal-url' => 'Project:Portalê şêlıgi',
-'privacy' => 'Xısusiyeta nımıtin',
+'privacy' => 'Madeyê dızdiye',
 'privacypage' => 'Project:Xısusiyetê nımtışi',
 
 'badaccess' => 'Xeta mısadey',
@@ -902,15 +901,15 @@ Parola vêrdiye: $2',
 'hr_tip' => 'Çıxiza dimdayi (hend akar mefiye)',
 
 # Edit pages
-'summary' => 'Xelese:',
-'subject' => 'Mewzu/serrêze:',
-'minoredit' => 'Vurnayışo qıcek',
-'watchthis' => 'Ena perer teqib ke',
+'summary' => 'Xulasa:',
+'subject' => 'Mersel/Sernuşte:',
+'minoredit' => 'Eno vurnayışo de qıckeko',
+'watchthis' => 'Ena pele seyr ke',
 'savearticle' => 'Pele qeyd ke',
 'preview' => 'Verqayt',
 'showpreview' => 'Verqayti bımocne',
 'showlivepreview' => 'Verqayto cıwın',
-'showdiff' => 'Vurnayışa bıvin',
+'showdiff' => 'Vurnayışan bımocne',
 'anoneditwarning' => 'Teme!: Şıma bı hesabê xo nıkewtê cı. Hurêndiya namey şıma dı IP-adresa şıma qeyd bena u asena.',
 'anonpreviewwarning' => "''Ti hama nicikewte. Qeyd kerdiş zerre tarixê pele de adresê IP yê tu keyd keno.''",
 'missingsummary' => "'''DİQET:''' Şıma kılmnuşte nıkerd.
@@ -1687,9 +1686,9 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'rc-old-title' => '"$1"i orcinalê cı vıraşt',
 
 # Recent changes linked
-'recentchangeslinked' => 'Ney sero vurnayışi',
-'recentchangeslinked-feed' => 'Ney sero vurnayışi',
-'recentchangeslinked-toolbox' => 'Ney sero vurnayışi',
+'recentchangeslinked' => 'Elekeyın vurnayışi',
+'recentchangeslinked-feed' => 'Elekeyın vurnayışi',
+'recentchangeslinked-toolbox' => 'Elekeyın vurnayışi',
 'recentchangeslinked-title' => 'vurnayışan ser "$1"',
 'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
 'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdaoğan de lista de vurnayışê peyênana.
@@ -1996,7 +1995,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'shared-repo' => 'yew embarê repositoryî',
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
 'filepage.css' => '/* CSS placed here is included on the file description page, also included on foreign client wikis */',
-'upload-disallowed-here' => 'Nê asengi sero theba nênusneyêno.',
+'upload-disallowed-here' => 'Şıma nêşenê serê na dosya ra bınusên.',
 
 # File reversion
 'filerevert' => '$1 reyna biyere',
@@ -2313,8 +2312,8 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
-'watchlist' => 'lista mına seyr-kerdışi',
-'mywatchlist' => 'Listey taqiban',
+'watchlist' => 'Lista mına seyrkerdışi',
+'mywatchlist' => 'Lista mına seyrkerdışi',
 'watchlistfor2' => 'Qandê $1 ($2)',
 'nowatchlist' => 'listeya temaşa kerdıişê şıma de yew madde zi çina.',
 'watchlistanontext' => 'qey vurnayişê maddeya listeya temaşakerdişi $1.',
@@ -2572,7 +2571,7 @@ $1',
 # Contributions
 'contributions' => 'İştiraqê karberi',
 'contributions-title' => 'Dekerdenê karber de $1',
-'mycontris' => 'Dekerdeni',
+'mycontris' => 'Dekerdenê mı',
 'contribsub2' => 'Qandê $1 ($2)',
 'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
 'uctop' => '(top)',
@@ -2598,7 +2597,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'sp-contributions-submit' => 'Cı geyre',
 
 # What links here
-'whatlinkshere' => 'Çı tiyay rê gırê beno',
+'whatlinkshere' => 'Gıreyê perer',
 'whatlinkshere-title' => 'Per da "$1" rê perê ke gre danê',
 'whatlinkshere-page' => 'Per:',
 'linkshere' => "Ena peleyan grey biya '''[[:$1]]''':",
@@ -3591,6 +3590,7 @@ mw.loader.using( 'jquery.cookie', function() {
 
 # Info page
 'pageinfo-title' => 'Heq tê "$1"\'i',
+'pageinfo-not-current' => 'Melumat tenya qandê çımraviyarnayışê rocaney mocniyeno.',
 'pageinfo-header-basic' => 'Seron zanayış',
 'pageinfo-header-edits' => 'Vurnayışi verêni',
 'pageinfo-header-restrictions' => 'Xısusiyetê pela',
@@ -3620,6 +3620,13 @@ mw.loader.using( 'jquery.cookie', function() {
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategoriye|Kategoriyan}} ($1) bınımne',
 'pageinfo-templates' => '{{PLURAL:$1|Şablon|Şabloni}} ($1) açarneyayê',
 'pageinfo-toolboxlink' => 'Malumatê perer',
+'pageinfo-redirectsto' => 'Beno hetê',
+'pageinfo-redirectsto-info' => 'melumat',
+'pageinfo-contentpage' => 'Zey jû pela zerreki hesebiyena',
+'pageinfo-contentpage-yes' => 'E',
+'pageinfo-protect-cascading' => 'Sıtarkerdey tiya cı ra yenê war',
+'pageinfo-protect-cascading-yes' => 'E',
+'pageinfo-protect-cascading-from' => 'Sıtarkerdey cı ra yenê war',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -4421,7 +4428,7 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'vurnayışanê eleqadari bıvin',
-'watchlisttools-edit' => 'listey taqiban bıvinê u bıvurnê',
+'watchlisttools-edit' => 'Lista seyrkerdışi bıvênên u bıvurnên',
 'watchlisttools-raw' => 'Listeyê seyr-kerdışi bıvin',
 
 # Iranian month names
index cb60050..a30a6a0 100644 (file)
@@ -303,7 +303,6 @@ $messages = array(
 'qbbrowse' => 'Pśeběraś',
 'qbedit' => 'Pśeměniś',
 'qbpageoptions' => 'Toś ten bok',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Móje boki',
 'qbspecialpages' => 'Specialne boki',
 'faq' => 'FAQ (pšašanja a wótegrona)',
@@ -1804,7 +1803,7 @@ Snaź coš wopisanje na jeje [$2 boku datajowego wopisanja] wobźěłaś.',
 'uploadnewversion-linktext' => 'Nowu wersiju toś teje dataje nagraś',
 'shared-repo-from' => 'z $1',
 'shared-repo' => 'zgromadny repozitorium',
-'upload-disallowed-here' => 'Bóžko njamóžoš toś ten wobraz pśepisaś.',
+'upload-disallowed-here' => 'Njamóžoš toś tu dataju pśepisaś.',
 
 # File reversion
 'filerevert' => 'Slědk wześ $1',
@@ -2861,6 +2860,7 @@ W zespominanju dajo se pśicyna pódaś.',
 
 # Info page
 'pageinfo-title' => 'Informacije za bok "$1"',
+'pageinfo-not-current' => 'Informacije daju se jano za aktualnu wersiju zwobrazniś.',
 'pageinfo-header-basic' => 'Zakładne informacije',
 'pageinfo-header-edits' => 'Historiju wobźěłaś',
 'pageinfo-header-restrictions' => 'Šćit boka',
@@ -2890,6 +2890,13 @@ W zespominanju dajo se pśicyna pódaś.',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowane kategorije}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Zapśěgnjona pśedłoga|Zapśěgnjonej pśedłoze|Zapśěgnjone pśedłogi|Zapśěgnjone pśedłogi}} ($1)',
 'pageinfo-toolboxlink' => 'Informacije wó boku',
+'pageinfo-redirectsto' => 'Pósrědnja dalej k',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage' => 'Licy se ako wopśimjeśowy bok',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading' => 'Kaskadowy šćit wót how',
+'pageinfo-protect-cascading-yes' => 'Jo',
+'pageinfo-protect-cascading-from' => 'Kaskadowy šćit wót',
 
 # Skin names
 'skinname-standard' => 'Klasiski',
index e5858a9..3c31517 100644 (file)
@@ -497,7 +497,6 @@ $messages = array(
 'qbbrowse' => 'Περιήγηση',
 'qbedit' => 'Επεξεργασία',
 'qbpageoptions' => 'Αυτή η σελίδα',
-'qbpageinfo' => 'Συμφραζόμενα',
 'qbmyoptions' => 'Οι σελίδες μου',
 'qbspecialpages' => 'Σελίδες λειτουργιών',
 'faq' => 'Συχνές ερωτήσεις (FAQ)',
index 9e477e0..dc5fb52 100644 (file)
@@ -783,7 +783,6 @@ XHTML id names.
 'qbbrowse'       => 'Browse',
 'qbedit'         => 'Edit',
 'qbpageoptions'  => 'This page',
-'qbpageinfo'     => 'Context',
 'qbmyoptions'    => 'My pages',
 'qbspecialpages' => 'Special pages',
 'faq'            => 'FAQ',
@@ -2466,7 +2465,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'shared-repo'                       => 'a shared repository',
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons', # only translate this message to other languages if you have to change it
 'filepage.css'                      => '/* CSS placed here is included on the file description page, also included on foreign client wikis */', # only translate this message to other languages if you have to change it
-'upload-disallowed-here'            => 'Unfortunately you cannot overwrite this image.',
+'upload-disallowed-here'            => 'You cannot overwrite this file.',
 
 # File reversion
 'filerevert'                => 'Revert $1',
@@ -3774,6 +3773,13 @@ This is probably caused by a link to a blacklisted external site.',
 'pageinfo-templates'           => 'Transcluded {{PLURAL:$1|template|templates}} ($1)',
 'pageinfo-footer'              => '-', # do not translate or duplicate this message to other languages
 'pageinfo-toolboxlink'         => 'Page information',
+'pageinfo-redirectsto'         => 'Redirects to',
+'pageinfo-redirectsto-info'    => 'info',
+'pageinfo-contentpage'         => 'Counted as a content page',
+'pageinfo-contentpage-yes'     => 'Yes',
+'pageinfo-protect-cascading'      => 'Protections are cascading from here',
+'pageinfo-protect-cascading-yes'  => 'Yes',
+'pageinfo-protect-cascading-from' => 'Protections are cascading from',
 
 # Skin names
 'skinname-standard'    => 'Classic', # only translate this message to other languages if you have to change it
@@ -3857,10 +3863,10 @@ By executing it, your system may be compromised.",
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims'     => '$1, $2 × $3', # only translate this message to other languages if you have to change it
-'seconds-abbrev' => '$1s', # only translate this message to other languages if you have to change it
-'minutes-abbrev' => '$1m', # only translate this message to other languages if you have to change it
-'hours-abbrev'   => '$1h', # only translate this message to other languages if you have to change it
-'days-abbrev'    => '$1d', # only translate this message to other languages if you have to change it
+'seconds-abbrev' => '$1 s', # only translate this message to other languages if you have to change it
+'minutes-abbrev' => '$1 min', # only translate this message to other languages if you have to change it
+'hours-abbrev'   => '$1 h', # only translate this message to other languages if you have to change it
+'days-abbrev'    => '$1 d', # only translate this message to other languages if you have to change it
 'seconds'        => '{{PLURAL:$1|$1 second|$1 seconds}}',
 'minutes'        => '{{PLURAL:$1|$1 minute|$1 minutes}}',
 'hours'          => '{{PLURAL:$1|$1 hour|$1 hours}}',
index 8045cf3..ed973de 100644 (file)
@@ -456,7 +456,6 @@ $messages = array(
 'qbbrowse' => 'Foliumi',
 'qbedit' => 'Redakti',
 'qbpageoptions' => 'Paĝagado',
-'qbpageinfo' => 'Paĝinformoj',
 'qbmyoptions' => 'Personaĵoj',
 'qbspecialpages' => 'Specialaj paĝoj',
 'faq' => 'Oftaj demandoj',
index 57f0ba9..d8deff9 100644 (file)
@@ -30,6 +30,7 @@
  * @author Clerc
  * @author Crazymadlover
  * @author Cvmontuy
+ * @author Dalton2
  * @author Danke7
  * @author David0811
  * @author Dferg
@@ -56,6 +57,7 @@
  * @author Locos epraix
  * @author Mahadeva
  * @author Manuelt15
+ * @author Maor X
  * @author McDutchie
  * @author Muro de Aguas
  * @author Omnipaedista
@@ -360,23 +362,23 @@ $linkTrail = '/^([a-záéíóúñ]+)(.*)$/sDu';
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Subrayar enlaces:',
-'tog-justify' => 'Justificar párrafos',
-'tog-hideminor' => 'Ocultar ediciones menores en cambios recientes',
-'tog-hidepatrolled' => 'Ocultar ediciones patrulladas en los cambios recientes',
-'tog-newpageshidepatrolled' => 'Ocultar páginas patrulladas de la lista de páginas nuevas',
-'tog-extendwatchlist' => 'Expandir la lista de seguimiento a todos los cambios, no sólo a los más recientes.',
-'tog-usenewrc' => 'Agrupar los cambios por página en los cambios recientes y en la lista de vigilancia (requiere JavaScript)',
+'tog-justify' => 'Justificar los párrafos',
+'tog-hideminor' => 'Ocultar las ediciones menores en los cambios recientes',
+'tog-hidepatrolled' => 'Ocultar las ediciones patrulladas en los cambios recientes',
+'tog-newpageshidepatrolled' => 'Ocultar las páginas patrulladas de la lista de páginas nuevas',
+'tog-extendwatchlist' => 'Expandir la lista de seguimiento a todos los cambios, no sólo a los más recientes',
+'tog-usenewrc' => 'Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento (requiere JavaScript)',
 'tog-numberheadings' => 'Numerar automáticamente los encabezados',
 'tog-showtoolbar' => 'Mostrar la barra de edición (requiere JavaScript)',
-'tog-editondblclick' => 'Editar páginas con doble clic (requiere JavaScript)',
-'tog-editsection' => 'Habilitar la edición de secciones usando el enlace [editar]',
-'tog-editsectiononrightclick' => 'Habilitar la edición de secciones presionando el botón de la derecha en los títulos de secciones (requiere JavaScript)',
+'tog-editondblclick' => 'Editar las páginas con doble clic (requiere JavaScript)',
+'tog-editsection' => 'Habilitar la edición de secciones mediante el enlace [editar]',
+'tog-editsectiononrightclick' => 'Habilitar la edición de secciones pulsando el botón derecho en los títulos de secciones (requiere JavaScript)',
 'tog-showtoc' => 'Mostrar el índice (para páginas con más de 3 encabezados)',
 'tog-rememberpassword' => 'Recordar mi nombre de usuario y contraseña entre sesiones en este navegador (por un máximo de $1 {{PLURAL:$1|día|días}})',
-'tog-watchcreations' => 'Añadir las páginas que cree y los archivos que cargue a mi lista de vigilancia',
-'tog-watchdefault' => 'Añadir la páginas y archivos que edite a mi lista de vigilancia',
-'tog-watchmoves' => 'Añadir las páginas y archivos que mueva a mi lista de vigilancia',
-'tog-watchdeletion' => 'Añadir la páginas y archivos que borre a mi lista de vigilancia',
+'tog-watchcreations' => 'Añadir las páginas que cree y los archivos que suba a mi lista de seguimento',
+'tog-watchdefault' => 'Añadir las páginas y archivos que edite a mi lista de seguimiento',
+'tog-watchmoves' => 'Añadir las páginas y archivos que mueva a mi lista de seguimiento',
+'tog-watchdeletion' => 'Añadir las páginas y archivos que borre a mi lista de seguimiento',
 'tog-minordefault' => 'Marcar todas las ediciones como menores de manera predeterminada',
 'tog-previewontop' => 'Mostrar previsualización antes del cuadro de edición',
 'tog-previewonfirst' => 'Mostrar previsualización en la primera edición',
@@ -387,23 +389,23 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Revelar mi dirección de correo electrónico en los correos de notificación',
 'tog-shownumberswatching' => 'Mostrar el número de usuarios que la vigilan',
 'tog-oldsig' => 'Firma actual:',
-'tog-fancysig' => 'Tratar firma como wikitexto (sin un enlace automático)',
-'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos, pues necesitas ajustes especiales en tu ordenador; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
-'tog-externaldiff' => 'Utilizar diff externo por defecto (sólo para expertos, pues necesitas ajustes especiales en tu ordenador; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
-'tog-showjumplinks' => 'Habilitar enlaces de accesibilidad «saltar a»',
-'tog-uselivepreview' => 'Usar live preview (JavaScript) (Experimental)',
-'tog-forceeditsummary' => 'Avisar cuando grabe la página sin introducir un resumen de edición',
+'tog-fancysig' => 'Tratar la firma como wikitexto (sin un enlace automático)',
+'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
+'tog-externaldiff' => "Utilizar ''diferencia'' externa por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])",
+'tog-showjumplinks' => 'Habilitar los enlaces de accesibilidad «saltar a»',
+'tog-uselivepreview' => 'Usar previsualización en vivo (requiere JavaScript) (experimental)',
+'tog-forceeditsummary' => 'Avisarme cuando grabe la página sin introducir un resumen de edición',
 'tog-watchlisthideown' => 'Ocultar mis ediciones en la lista de seguimiento',
-'tog-watchlisthidebots' => 'Ocultar ediciones de bots en la lista de seguimiento',
-'tog-watchlisthideminor' => 'Ocultar ediciones menores en la lista de seguimiento',
-'tog-watchlisthideliu' => 'Ocultar ediciones de usuarios registrados en la lista de seguimiento',
-'tog-watchlisthideanons' => 'Ocultar ediciones de usuarios anónimos en la lista de seguimiento',
+'tog-watchlisthidebots' => 'Ocultar las ediciones de bots en la lista de seguimiento',
+'tog-watchlisthideminor' => 'Ocultar las ediciones menores en la lista de seguimiento',
+'tog-watchlisthideliu' => 'Ocultar las ediciones de los usuarios registrados en la lista de seguimiento',
+'tog-watchlisthideanons' => 'Ocultar las ediciones de los usuarios anónimos en la lista de seguimiento',
 'tog-watchlisthidepatrolled' => 'Ocultar las ediciones patrulladas en la lista de seguimiento',
 'tog-ccmeonemails' => 'Recibir copias de los correos que envío a otros usuarios',
-'tog-diffonly' => 'No mostrar el contenido de la página bajo las diferencias',
-'tog-showhiddencats' => 'Mostrar categorías escondidas',
+'tog-diffonly' => "No mostrar bajo las ''diferencias'' el contenido de la página",
+'tog-showhiddencats' => 'Mostrar las categorías escondidas',
 'tog-noconvertlink' => 'Desactivar la conversión de título de enlace',
-'tog-norollbackdiff' => "Omitir el ''diff'' después de revertir",
+'tog-norollbackdiff' => "Omitir la ''diferencia'' después de revertir",
 
 'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
@@ -503,7 +505,6 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Opciones de página',
-'qbpageinfo' => 'Información de página',
 'qbmyoptions' => 'Mis páginas',
 'qbspecialpages' => 'Páginas especiales',
 'faq' => 'Preguntas más frecuentes',
@@ -2054,7 +2055,7 @@ Tal vez desee editar la descripción de su [$2 página de descripción del archi
 'shared-repo-from' => 'de $1',
 'shared-repo' => 'un repositorio compartido',
 'filepage.css' => '/* Los estilos CSS colocados aquí se incluirán en las páginas de descripción de archivos, incluso en los wikis externos que incluyan estas páginas */',
-'upload-disallowed-here' => 'Lamentablemente no puedes sobrescribir esta imagen.',
+'upload-disallowed-here' => 'No puedes sobrescribir este archivo.',
 
 # File reversion
 'filerevert' => 'Revertir $1',
@@ -3161,6 +3162,7 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 
 # Info page
 'pageinfo-title' => 'Información para «$1»',
+'pageinfo-not-current' => 'Únicamente se puede mostrar la información para la revisión actual.',
 'pageinfo-header-basic' => 'Información básica',
 'pageinfo-header-edits' => 'Historial de ediciones',
 'pageinfo-header-restrictions' => 'Protección de página',
@@ -3190,6 +3192,13 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría oculta|Categorías ocultas}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|plantilla incluida|plantillas incluidas}} ($1)',
 'pageinfo-toolboxlink' => 'Información de la página',
+'pageinfo-redirectsto' => 'Redirige a',
+'pageinfo-redirectsto-info' => 'Información',
+'pageinfo-contentpage' => 'Contado como página de contenido',
+'pageinfo-contentpage-yes' => 'Sí',
+'pageinfo-protect-cascading' => 'Protecciones en serie activadas',
+'pageinfo-protect-cascading-yes' => 'Sí',
+'pageinfo-protect-cascading-from' => 'Protecciones en serie activadas',
 
 # Skin names
 'skinname-standard' => 'Estándar',
index 9be5c96..a73374c 100644 (file)
@@ -434,7 +434,6 @@ $messages = array(
 'qbbrowse' => 'Sirvi',
 'qbedit' => 'Redigeeri',
 'qbpageoptions' => 'Lehekülje suvandid',
-'qbpageinfo' => 'Lehekülje andmed',
 'qbmyoptions' => 'Minu suvandid',
 'qbspecialpages' => 'Erileheküljed',
 'faq' => 'KKK',
index 69c3cc6..3c03893 100644 (file)
@@ -269,7 +269,6 @@ $messages = array(
 'qbbrowse' => 'Arakatu',
 'qbedit' => 'Aldatu',
 'qbpageoptions' => 'Orrialde hau',
-'qbpageinfo' => 'Testuingurua',
 'qbmyoptions' => 'Nire orrialdeak',
 'qbspecialpages' => 'Aparteko orrialdeak',
 'faq' => 'Maiz egindako galderak',
@@ -2370,7 +2369,7 @@ Kasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.",
 'move-subpages' => 'Azpiorrialde guztiak ($1-tik gora) mugitu',
 'move-talk-subpages' => 'Azpiorrialdeen eztabaida orrialde guztiak ($1-tik gora) mugitu',
 'movepage-page-exists' => '$1 orrialdea jada badago eta ezin da automatikoki gainetik idatzi.',
-'movepage-page-moved' => '$1 orrialdea $2(e)ra mugitu da.',
+'movepage-page-moved' => '$1 orria $2 izenera aldatu da.',
 'movepage-page-unmoved' => '$1 orrialdea ezin da $2(e)ra mugitu.',
 'movepage-max-pages' => '$1 {{PLURAL:$1|orrialderen|orrialdeen}} maximoa mugitu da eta jada ez dira gehiago mugituko modu automatikoan.',
 'movelogpage' => 'Mugimendu erregistroa',
@@ -3285,6 +3284,8 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
 # New logging system
 'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira',
 'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira',
+'logentry-move-move' => '$1 wikilariak «$3» orria «$4» izenera aldatu du',
+'logentry-move-move_redir-noredirect' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketa bat gainidatzita, birzuzenketarik utzi gabe',
 'newuserlog-byemail' => 'pasahitza e-postaz bidali da',
 
 # Feedback
index 05c119c..bbfb129 100644 (file)
@@ -153,7 +153,6 @@ $messages = array(
 'qbbrowse' => 'Escrucal',
 'qbedit' => 'Eital',
 'qbpageoptions' => 'Esta páhina',
-'qbpageinfo' => 'Contestu',
 'qbmyoptions' => 'Las mis páhinas',
 'qbspecialpages' => 'Páhinas especialis',
 'faq' => 'FAQ',
index 19cb9c3..3f69561 100644 (file)
@@ -576,7 +576,6 @@ $messages = array(
 'qbbrowse' => 'مرور',
 'qbedit' => 'ویرایش',
 'qbpageoptions' => 'این صفحه',
-'qbpageinfo' => 'محتوا',
 'qbmyoptions' => 'صفحه‌های من',
 'qbspecialpages' => 'صفحه‌های ویژه',
 'faq' => 'پرسش‌های متداول',
@@ -1060,32 +1059,30 @@ $2
 'blockedtitle' => 'کاربر بسته شده‌است',
 'blockedtext' => "'''دسترسی حساب کاربری یا نشانی آی‌پی شما بسته شده‌است.'''
 
-این کار توسط $1 انجام شده‌است.
+این قطع دسترسی توسط $1 انجام شده‌است.
 دلیل ارائه‌شده چنین است: $2''
 
 * شروع قطع دسترسی: $8
 * پایان قطع دسترسی: $6
-* کاربری که قطع دسترسی‌اش مد نظر بوده‌است: $7
+* کاربری هدف قطع دسترسی: $7
 
 شما می‌توانید با $1 یا  [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.
-توجه کنید که شما نمی‌توانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]]تان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
+توجه کنید که شما نمی‌توانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
 نشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.
 لطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
 'autoblockedtext' => "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.
-دلیل ارائه شده چنین است:
+دلیل ارائهشده چنین است:
 
 :''$2''
 
 * شروع قطع دسترسی: $8
 * پایان قطع دسترسی: $6
-* کاربری که قطع دسترسی‌اش مد نظر بوده‌است: $7
+* کاربری هدف قطع دسترسی: $7
 
-شما می‌توانید با $1 یا یکی دیگر از [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرید، تا پیرامون این قطع دسترسی صحبت کنید.
-
-توجه کنید که برای ارسال رایانامه در ویکی، باید رایانامهٔ خود را از طریق صفحهٔ [[Special:Preferences|تنظیمات]] فعال کرده باشید، و نیز، باید امکان استفاده از این ویژگی برای شما قطع نباشد.
-
-نشانی آی‌پی فعلی شما $3 است و شمارهٔ قطع دسترسی $5 است.
-لطفاً این شماره را در هر درخواستی که در این باره مطرح می‌کنید ذکر کنید.",
+شما می‌توانید با $1 یا  [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.
+توجه کنید که شما نمی‌توانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
+نشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.
+لطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
 'blockednoreason' => 'دلیلی مشخص نشده‌است',
 'whitelistedittext' => 'برای ویرایش مقاله‌ها باید $1.',
 'confirmedittext' => 'شما باید، پیش از ویرایش صفحه‌ها، نشانی رایانامهٔ خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
@@ -1128,8 +1125,8 @@ $2
 *'''گوگل کروم:'''کلیدهای ''Ctrl+Shift+R'' را با هم فشار دهید. (در رایانه‌های اپل مکینتاش کلید‌های ''⌘-Shift-R'')
 *'''اینترنت اکسپلورر:''' کلید ''Ctrl'' را نگه‌دارید و روی دکمهٔ ''Refresh'' کلیک کنید، یا کلید‌های ''Ctrl-F5'' را با هم فشار دهید
 *'''اپرا:''' حافظهٔ نهانی مرورگر را از طریق منوی ''Tools &rarr; Preferences'' پاک کنید",
-'usercssyoucanpreview' => "'''نکته:''' پیش از ذخیه‌کردن فایل CSS یا JS خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
-'userjsyoucanpreview' => "'''نکته:''' پیش از ذخیره‌کردن فایل CSS یا JS خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+'usercssyoucanpreview' => "'''نکته:''' پیش از ذخیره‌کردن فایل سی‌اس‌اس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+'userjsyoucanpreview' => "''نکته:''' پیش از ذخیره‌کردن فایل جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
 'usercsspreview' => "'''فراموش مکنید که شما فقط دارید پیش‌نمایش سی‌اس‌اس کاربری‌تان را می‌بینید.'''
 '''این سی‌اس‌اس هنوز ذخیره نشده‌است!'''",
 'userjspreview' => "'''به یاد داشته باشید که شما فقط دارید جاوااسکریپت کاربری‌تان را امتحان می‌کنید/پیش‌نمایش آن را می‌بینید.'''
@@ -1229,6 +1226,15 @@ $2
 'edit-already-exists' => 'امکان ساختن صفحهٔ جدید وجود ندارد.
 این صفحه از قبل وجود داشته‌است.',
 'defaultmessagetext' => 'متن پیش‌فرض پیغام',
+'content-failed-to-parse' => 'عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3',
+'invalid-content-data' => 'داده محتوای نامعتبر',
+'content-not-allowed-here' => 'محتوای «$1» در صفحهٔ [[$2]] مجاز نیست',
+
+# Content models
+'content-model-wikitext' => 'ویکی‌متن',
+'content-model-text' => 'متنی ساده',
+'content-model-javascript' => 'جاوااسکریپت',
+'content-model-css' => 'سی‌اس‌اس',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''هشدار:''' این صفحه حاوی تعدادی زیادی فراخوانی دستورهای تجزیه‌گر است.
@@ -1459,7 +1465,7 @@ $1",
 'prevn-title' => '$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} قبلی',
 'nextn-title' => '$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} بعدی',
 'shown-title' => 'نمایش $1 {{PLURAL:$1|نتیجه|نتیجه}} در هر صفحه',
-'viewprevnext' => 'نمایش ($1 {{int:pipe-separator}} $2) ($3).',
+'viewprevnext' => 'نمایش ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'گزینه‌های جستجو',
 'searchmenu-exists' => "'''صفحه‌ای با عنوان \"[[:\$1]]\" در این ویکی وجود دارد.'''",
 'searchmenu-new' => "'''صفحهٔ «[[:$1]]» را در این ویکی بسازید!'''",
@@ -1498,7 +1504,7 @@ $1",
 'powersearch' => 'جستجوی پیشرفته',
 'powersearch-legend' => 'جستجوی پیشرفته',
 'powersearch-ns' => 'جستجو در فضاهای نام:',
-'powersearch-redir' => 'تغییرمسیرها فهرست شوند',
+'powersearch-redir' => 'فهرست‌کردن تغییرمسیرها',
 'powersearch-field' => 'جستجو برای',
 'powersearch-togglelabel' => 'بررسی:',
 'powersearch-toggleall' => 'همه',
@@ -1527,22 +1533,22 @@ $1",
 'prefs-skin' => 'پوسته',
 'skin-preview' => 'پیش‌نمایش',
 'datedefault' => 'بدون ترجیح',
-'prefs-beta' => 'ابزارهای کارآمد',
+'prefs-beta' => 'ویژگی های بتا',
 'prefs-datetime' => 'تاریخ و زمان',
-'prefs-labs' => 'قسمت‌های آزمایشی',
+'prefs-labs' => 'گزینه‌های آزمایشی',
 'prefs-user-pages' => 'صفحه‌های کاربری',
 'prefs-personal' => 'داده‌های کاربر',
 'prefs-rc' => 'تغییرات اخیر',
 'prefs-watchlist' => 'فهرست پی‌گیری‌ها',
 'prefs-watchlist-days' => 'تعداد روزهایی که باید در فهرست پی‌گیری‌ها نمایش داده شود:',
-'prefs-watchlist-days-max' => '(حداکثر $1 {{PLURAL:$1|روز|روز}})',
+'prefs-watchlist-days-max' => 'حداکثر $1 {{PLURAL:$1|روز}}',
 'prefs-watchlist-edits' => 'تعداد ویرایش‌های نشان‌داده‌شده در فهرست پی‌گیری‌های گسترش‌یافته:',
 'prefs-watchlist-edits-max' => 'حداکثر تعداد: ۱۰۰۰',
 'prefs-watchlist-token' => 'رمز فهرست پی‌گیری:',
-'prefs-misc' => 'تنظیمات متفرقه',
+'prefs-misc' => 'متفرقه',
 'prefs-resetpass' => 'تغییر گذرواژه',
 'prefs-changeemail' => 'تغییر رایانامه',
-'prefs-setemail' => 'تغیین آدرس رایانامه',
+'prefs-setemail' => 'تنظیم نشانی رایانامه',
 'prefs-email' => 'گزینه‌های رایانامه',
 'prefs-rendering' => 'نمایش صفحه',
 'saveprefs' => 'ذخیره',
@@ -1557,7 +1563,7 @@ $1",
 'stub-threshold' => 'آستانهٔ ویرایش پیوندهای <a href="#" class="stub">ناقص</a> (بایت):',
 'stub-threshold-disabled' => 'غیرفعال',
 'recentchangesdays' => 'تعداد روزهای نمایش داده‌شده در تغییرات اخیر:',
-'recentchangesdays-max' => '(حداکثر $1 {{PLURAL:$1|روز|روز}})',
+'recentchangesdays-max' => 'حداکثر $1 {{PLURAL:$1|روز}}',
 'recentchangescount' => 'تعداد پیش‌فرض ویرایش‌های نمایش یافته:',
 'prefs-help-recentchangescount' => 'این گزینه شامل تغییرات اخیر، تاریخچهٔ صفحه‌ها و سیاهه‌ها می‌شود.',
 'prefs-help-watchlist-token' => 'پرکردن این بخش با یک کلید رمز سبب ایجاد یک خوراک آراس‌اس برای فهرست پی‌گیری شما می‌شود.
@@ -1582,7 +1588,7 @@ $1",
 'timezoneregion-indian' => 'اقیانوس هند',
 'timezoneregion-pacific' => 'اقیانوس آرام',
 'allowemail' => 'امکان دریافت رایانامه از دیگر کاربران',
-'prefs-searchoptions' => 'گزینه‌های جستجو',
+'prefs-searchoptions' => 'جستجو',
 'prefs-namespaces' => 'فضاهای نام',
 'defaultns' => 'در غیر این صورت جستجو در این فضاهای نام:',
 'default' => 'پیش‌فرض',
@@ -1596,7 +1602,7 @@ $1",
 'prefs-textboxsize' => 'اندازهٔ جعبهٔ ویرایش',
 'youremail' => 'رایانامه:',
 'username' => 'نام کاربری:',
-'uid' => 'Ø´Ù\85ارÙ\87Ù\94 Ú©Ø§Ø±Ø¨Ø±Û\8c:',
+'uid' => 'Ø´Ù\86اسÙ\87Ù\94 Ú©Ø§Ø±Ø¨Ø±:',
 'prefs-memberingroups' => 'عضو این {{PLURAL:$1|گروه|گروه‌ها}}:',
 'prefs-registration' => 'زمان ثبت‌نام:',
 'yourrealname' => 'نام واقعی:',
@@ -1608,7 +1614,7 @@ $1",
 'badsig' => 'امضای خام غیرمجاز.
 لطفاً برچسب‌های اچ‌تی‌ام‌ال را بررسی کنید.',
 'badsiglength' => 'امضای شما بیش از اندازه طولانی است.
-امضا باید کمتر از $1 نویسه طول داشته باشد.',
+امضا باید کمتر از $1 {{PLURAL:$1|نویسه}} طول داشته باشد.',
 'yourgender' => 'جنسیت:',
 'gender-unknown' => 'مشخص‌نشده',
 'gender-male' => 'مرد',
@@ -1616,7 +1622,7 @@ $1",
 'prefs-help-gender' => 'اختیاری: برای خطاب‌شدن با جنسیت درست توسط نرم‌افزار به کار می‌رود.
 این اطلاعات عمومی خواهد بود.',
 'email' => 'رایانامه',
-'prefs-help-realname' => 'نام واقعی اختیاری است
+'prefs-help-realname' => 'نام واقعی اختیاری است.
 اگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.',
 'prefs-help-email' => 'نشانی رایانامه اختیاری‌است، اما فرستادن گذرواژه‌ای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن می‌کند.',
 'prefs-help-email-others' => 'شما همچنین می‌توانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربری‌تان به شما رایانامه بفرستند.
@@ -1691,8 +1697,8 @@ $1",
 'right-read' => 'خواندن صفحه',
 'right-edit' => 'ویرایش صفحه',
 'right-createpage' => 'ایجاد صفحه (در مورد صفحه‌های غیر بحث)',
-'right-createtalk' => 'ایجاد صفحهٔ بحث',
-'right-createaccount' => 'ایجاد حساب کاربری',
+'right-createtalk' => 'ایجاد صفحه‌های بحث',
+'right-createaccount' => 'ایجاد حساب‌های کاربری',
 'right-minoredit' => 'علامت‌زدن ویرایش‌ها به عنوان جزئی',
 'right-move' => 'انتقال صفحه',
 'right-move-subpages' => 'انتقال صفحه‌ها به همراه زیر‌صفحه‌هایشان',
@@ -1717,7 +1723,7 @@ $1",
 'right-deletedhistory' => 'مشاهدهٔ موارد حذف‌شده از تاریخچه، بدون دیدن متن آن‌ها',
 'right-deletedtext' => 'مشاهدهٔ متن حذف‌شده و تغییرات بین نسخه‌های حذف‌شده',
 'right-browsearchive' => 'جستجوی صفحه‌های حذف‌شده',
-'right-undelete' => 'احیای صفحه‌ای حذف‌شده',
+'right-undelete' => 'احیای صفحه‌ها',
 'right-suppressrevision' => 'بازبینی و احیای ویرایش‌هایی که از مدیران پنهان شده‌اند',
 'right-suppressionlog' => 'مشاهدهٔ سیاهه‌های خصوصی',
 'right-block' => 'قطع دسترسی ویرایشی دیگر کاربران',
@@ -2144,7 +2150,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'shared-repo-from' => 'از $1',
 'shared-repo' => 'یک مخزن مشترک',
 'shared-repo-name-wikimediacommons' => 'ویکی‌انبار',
-'upload-disallowed-here' => 'Ù\85تاسÙ\81اÙ\86Ù\87 Ø´Ù\85ا Ù\86Ù\85Û\8c ØªÙ\88اÙ\86Û\8cد Ø§Û\8cÙ\86 Ù\86گاره را بازنویس کنید.',
+'upload-disallowed-here' => 'Ù\85تاسÙ\81اÙ\86Ù\87 Ø´Ù\85ا Ù\86Ù\85Û\8c ØªÙ\88اÙ\86Û\8cد Ø§Û\8cÙ\86 Ù¾Ø±Ù\88Ù\86ده را بازنویس کنید.',
 
 # File reversion
 'filerevert' => 'واگردانی $1',
@@ -2693,8 +2699,8 @@ $NEWPAGE
 'undeletedrevisions' => '$1 نسخه احیا {{PLURAL:$1|شد|شدند}}',
 'undeletedrevisions-files' => '$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
 'undeletedfiles' => '$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
-'cannotundelete' => 'احیا ناموفق بود؛
-ممکن است کس دیگری پیشتر این صفحه را احیا کرده باشد.',
+'cannotundelete' => 'احیا ناموفق بود:
+$1',
 'undeletedpage' => "'''$1 احیا شد'''
 
 برای دیدن سیاههٔ حذف‌ها و احیاهای اخیر به  [[Special:Log/delete|سیاههٔ حذف]] رجوع کنید.",
@@ -3004,6 +3010,7 @@ $1',
 'immobile-target-namespace-iw' => 'پیوند میان‌ویکی هدفی مجاز برای انتقال صفحه نیست.',
 'immobile-source-page' => 'این صفحه قابل انتقال نیست.',
 'immobile-target-page' => 'امکان انتقال به این عنوان مقصد وجود ندارد.',
+'bad-target-model' => 'مقصد مورد نظر از مدل محتوایی متفاوتی استفاده می‌کند. تبدیل $1 به $2 ممکن نیست.',
 'imagenocrossnamespace' => 'امکان انتقال تصویر به فضای نام غیر پرونده وجود ندارد',
 'nonfile-cannot-move-to-file' => 'امکان انتقال محتوای غیر پرونده به فضای نام پرونده وجود ندارد',
 'imagetypemismatch' => 'پسوند پرونده جدید با نوع آن سازگار نیست',
@@ -3241,6 +3248,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'اطلاعات در مورد «$1»',
+'pageinfo-not-current' => 'اطلاعات ممکن است تنها برای نسخهٔ فعلی نمایش داده شود.',
 'pageinfo-header-basic' => 'اطلاعات اولیه',
 'pageinfo-header-edits' => 'ویرایش تاریخچه',
 'pageinfo-header-restrictions' => 'حفاظت از صفحه',
@@ -3269,6 +3277,13 @@ $1',
 'pageinfo-hidden-categories' => '{{PLURAL:$1| ردهٔ|ردهٔ}} پنهان ( $1 )',
 'pageinfo-templates' => '{{PLURAL:$1|الگو|الگو}} استفاده‌شده ($1)',
 'pageinfo-toolboxlink' => 'اطلاعات صفحه',
+'pageinfo-redirectsto' => 'تغییرمسیر به',
+'pageinfo-redirectsto-info' => 'اطلاعات',
+'pageinfo-contentpage' => 'شمرده شده به عنوان صفحهٔ محتویی',
+'pageinfo-contentpage-yes' => 'بله',
+'pageinfo-protect-cascading' => 'محافظت آبشاری از اینجا',
+'pageinfo-protect-cascading-yes' => 'بله',
+'pageinfo-protect-cascading-from' => 'محافظت آبشاری از',
 
 # Skin names
 'skinname-standard' => 'کلاسیک',
index 23d307c..e2d265d 100644 (file)
@@ -13,6 +13,7 @@
  * @author Crt
  * @author ElmA
  * @author Harriv
+ * @author Hyperborean
  * @author Jaakonam
  * @author Jack Phoenix
  * @author Jafeluv
@@ -457,7 +458,6 @@ $messages = array(
 'qbbrowse' => 'Selaa',
 'qbedit' => 'Muokkaa',
 'qbpageoptions' => 'Sivuasetukset',
-'qbpageinfo' => 'Sivun tiedot',
 'qbmyoptions' => 'Asetukset',
 'qbspecialpages' => 'Toimintosivut',
 'faq' => 'Usein kysytyt kysymykset',
@@ -1942,6 +1942,7 @@ Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
 'uploadnewversion-linktext' => 'Tallenna uusi versio tästä tiedostosta',
 'shared-repo-from' => 'kohteesta $1',
 'shared-repo' => 'jaettu mediavarasto',
+'upload-disallowed-here' => 'Et voi korvata tätä tiedostoa.',
 
 # File reversion
 'filerevert' => 'Tiedoston $1 palautus',
@@ -3021,21 +3022,29 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'pageinfo-header-edits' => 'Muutoshistoria',
 'pageinfo-header-restrictions' => 'Sivun suojaus',
 'pageinfo-header-properties' => 'Sivun ominaisuudet',
+'pageinfo-display-title' => 'Sivun otsikko',
 'pageinfo-default-sort' => 'Oletuslajitteluavain',
 'pageinfo-length' => 'Sivun pituus (tavuina)',
 'pageinfo-article-id' => 'Sivun tunniste',
+'pageinfo-robot-index' => 'Indeksoitava',
+'pageinfo-robot-noindex' => 'Ei indeksoitava',
 'pageinfo-views' => 'Katselukertojen määrä',
 'pageinfo-watchers' => 'Sivun tarkkailijoiden lukumäärä',
 'pageinfo-redirects-name' => 'Sivulle johtavat ohjaukset',
 'pageinfo-subpages-name' => 'Sivun alasivut',
 'pageinfo-firstuser' => 'Sivun luonut',
+'pageinfo-firsttime' => 'Sivun luontipäivämäärä',
 'pageinfo-lastuser' => 'Viimeisin muokkaaja',
+'pageinfo-lasttime' => 'Viimeisimmän muokkausksen päivämäärä',
 'pageinfo-edits' => 'Muokkausten kokonaismäärä',
 'pageinfo-authors' => 'Sivun eri muokkaajien kokonaismäärä',
 'pageinfo-magic-words' => '{{PLURAL:$1|Taikasana|Taikasanat}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Piilotettu luokka|Piilotetut luokat}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Sisällytetty malline|Sisällytetyt mallineet}} ($1)',
 'pageinfo-toolboxlink' => 'Sivun tiedot',
+'pageinfo-redirectsto-info' => 'tiedot',
+'pageinfo-contentpage-yes' => 'Kyllä',
+'pageinfo-protect-cascading-yes' => 'Kyllä',
 
 # Skin names
 'skinname-standard' => 'Perus',
@@ -3098,6 +3107,8 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
 'file-info-png-looped' => 'toistuva',
 'file-info-png-repeat' => 'toistettu $1 {{PLURAL:$1|kertaa|kertaa}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|kehys|kehystä}}',
+'file-no-thumb-animation' => "'''Huomautus: Teknisten rajoitusten vuoksi tämän tiedoston pienoiskuvat eivät ole animoituja.'''",
+'file-no-thumb-animation-gif' => "'''Huomautus: Teknisten rajoitusten vuoksi korkearesoluutioisten GIF-kuvien pienoiskuvat eivät ole animoituja.'''",
 
 # Special:NewFiles
 'newimages' => 'Uudet tiedostot',
index a20078a..5f838b8 100644 (file)
@@ -44,7 +44,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Näytä kuinka moni käyttäjä valvoo sivua',
 'tog-oldsig' => 'Nykynen allekirjotus',
 'tog-fancysig' => 'Mookkaamaton allekirjotus ilman auttomaattista linkkiä',
-'tog-externaleditor' => 'Käytä ekterniä tekstiedituuria stantartina. Vain kokenheile käyttäjile, vaatii taattorin asetuksitten muuttamista. Käytä eksterniä tekstiedituuria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
+'tog-externaleditor' => 'Käytä ekterniä tekstiedituuria stantartina. Vain kokenheile käyttäjile, vaatii taattorin asetuksitten muuttamista. Käytä eksterniä tekstiedituuria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. ([//www.mediawiki.org/wiki/Manual:External_editors Ohje])',
 
 # Dates
 'sunday' => 'pyhä',
@@ -120,7 +120,6 @@ $messages = array(
 # Cologne Blue skin
 'qbedit' => 'Mookkaa',
 'qbpageoptions' => 'Tämä sivu',
-'qbpageinfo' => 'Sisältö',
 'qbmyoptions' => 'Minun inställninkit',
 'qbspecialpages' => 'Spesiaali sivut',
 'faq' => 'Useasti kysytyt kysymykset',
index ba766cc..861873b 100644 (file)
@@ -256,7 +256,6 @@ $messages = array(
 'qbbrowse' => 'Kaga',
 'qbedit' => 'Rætta',
 'qbpageoptions' => 'Henda síðan',
-'qbpageinfo' => 'Samanhangur',
 'qbmyoptions' => 'Mínar síður',
 'qbspecialpages' => 'Serstakar síður',
 'faq' => 'OSS',
@@ -494,7 +493,7 @@ Vinarliga royn aftur um fáir minuttir.',
 'editinginterface' => "↓ '''Ávaring:''' Tú rættar eina síðu sum verður brúkt til at geva markamóts tekst til ritbúnaðin (software).
 Broytingar á hesi síðu fara at ávirka útsjóndina á brúkara markamótinum (interface) fyri aðrir brúkarar.
 Fyri at gera týðingar verður tú vinarliga biðin um at umhugsa at brúka [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], sum er verkætlan fyri týðingum av MediaWiki.",
-'sqlhidden' => '↓ (SQL fyrispurningur fjaldur)',
+'sqlhidden' => '(SQL fyrispurningur fjaldur)',
 'cascadeprotected' => 'Henda síðan er vard fyri rættingum, tí hon er í fylgjandi {{PLURAL:$1|síðu, sum er|síðum, sum eru}}
 vardar við "arvaðari síðuverjing"
 $2',
index 2410451..8d1e503 100644 (file)
@@ -517,7 +517,6 @@ $messages = array(
 'qbbrowse' => 'Parcourir',
 'qbedit' => 'Modifier',
 'qbpageoptions' => 'Cette page',
-'qbpageinfo' => 'Contexte',
 'qbmyoptions' => 'Mes pages',
 'qbspecialpages' => 'Pages spéciales',
 'faq' => 'FAQ',
@@ -533,7 +532,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',
@@ -786,7 +785,7 @@ Notez que certaines pages peuvent être encore affichées comme si vous étiez t
 
 Votre compte a été créé.
 N’oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SITENAME}}]].',
-'yourname' => 'Nom d’utilisateur&nbsp;:',
+'yourname' => 'Nom d’utilisateur :',
 'yourpassword' => 'Mot de passe&nbsp;:',
 'yourpasswordagain' => 'Confirmez le mot de passe :',
 'remembermypassword' => 'Me reconnecter automatiquement aux prochaines visites avec ce navigateur (au maximum $1&nbsp;{{PLURAL:$1|jour|jours}})',
@@ -846,7 +845,7 @@ de votre ancien mot de passe et que vous ne souhaitez plus en changer, vous
 pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.',
 'noemail' => "Aucune adresse de courriel n’a été enregistrée pour l'utilisateur « $1 ».",
 'noemailcreate' => 'Vous devez fournir une adresse de courriel valide',
-'passwordsent' => 'Un nouveau mot de passe a été envoyé à l’adresse de courriel de l’utilisateur « $1 ». Veuillez vous reconnecter après l’avoir reçu.',
+'passwordsent' => "Un nouveau mot de passe a été envoyé à l'adresse de courriel de l'utilisateur « $1 ». Veuillez vous reconnecter après l'avoir reçu.",
 'blocked-mailpassword' => 'Votre adresse IP est bloquée en écriture, la fonction de rappel du mot de passe est donc désactivée pour éviter les abus.',
 'eauthentsent' => 'Un courriel de confirmation a été envoyé à l’adresse indiquée.
 Avant qu’un autre courriel ne soit envoyé à ce compte, vous devrez suivre les instructions du courriel et confirmer que le compte est bien le vôtre.',
@@ -976,7 +975,7 @@ Si vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publicati
 Si vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans titre.",
 'summary-preview' => 'Aperçu du résumé :',
 'subject-preview' => 'Prévisualisation du sujet/titre :',
-'blockedtitle' => 'L’utilisateur est bloqué.',
+'blockedtitle' => "L'utilisateur est bloqué.",
 'blockedtext' => "'''Votre compte utilisateur ou votre adresse IP a été bloqué.'''
 
 Le blocage a été effectué par $1.
@@ -1193,7 +1192,7 @@ La raison donnée était ''$2''.",
 'page_first' => 'première',
 'page_last' => 'dernière',
 'histlegend' => 'Légende : ({{int:cur}}) = différence avec la version actuelle, ({{int:last}}) = différence avec la version précédente, <b>{{int:minoreditletter}}</b> = modification mineure',
-'history-fieldset-title' => 'Naviguer dans l’historique',
+'history-fieldset-title' => "Naviguer dans l'historique",
 'history-show-deleted' => 'Masqués seulement',
 'histfirst' => 'première page',
 'histlast' => 'dernière page',
@@ -1490,7 +1489,7 @@ Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
 'timezoneregion-indian' => 'Océan indien',
 'timezoneregion-pacific' => 'Océan pacifique',
 'allowemail' => 'Autoriser l’envoi de courriels venant d’autres utilisateurs',
-'prefs-searchoptions' => 'Options de recherche',
+'prefs-searchoptions' => 'Recherche',
 'prefs-namespaces' => 'Espaces de noms',
 'defaultns' => 'Rechercher par défaut dans ces espaces de noms :',
 'default' => 'défaut',
@@ -1551,7 +1550,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'userrights-user-editname' => 'Entrez un nom d’utilisateur :',
 'editusergroup' => 'Modification des groupes d’utilisateurs',
 'editinguser' => "Modification des droits de l’{{GENDER:$1|utilisateur|utilisatrice}} '''[[User:$1|$1]]''' $2",
-'userrights-editusergroup' => 'Modifier les groupes de l’utilisateur',
+'userrights-editusergroup' => "Modifier les groupes de l'utilisateur",
 'saveusergroups' => 'Enregistrer les groupes de l’utilisateur',
 'userrights-groupsmember' => 'Membre de :',
 'userrights-groupsmember-auto' => 'Membre implicite de :',
@@ -1656,7 +1655,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 # User rights log
 'rightslog' => 'Journal des modifications de droits d’utilisateurs',
 'rightslogtext' => 'Voici l’historique des modifications des droits des utilisateurs.',
-'rightslogentry' => 'a modifié les droits de l’utilisateur « $1 » de $2 à $3',
+'rightslogentry' => "a modifié les droits de l'utilisateur « $1 » de $2 à $3",
 'rightslogentry-autopromote' => 'a été automatiquement promu de $2 à $3',
 'rightsnone' => '(aucun)',
 
@@ -2050,7 +2049,7 @@ Vous voulez peut-être modifier la description sur sa [$2 page de description].'
 'shared-repo' => 'un dépôt partagé',
 'shared-repo-name-wikimediacommons' => 'Wikimédia Commons',
 'filepage.css' => '/* Les styles CSS placés ici sont inclus dans la page de description du fichier, également incluse sur les clients wikis étrangers */',
-'upload-disallowed-here' => 'Malheureusement, vous ne peut pas remplacer cette image.',
+'upload-disallowed-here' => 'Vous ne pouvez pas remplacer ce fichier.',
 
 # File reversion
 'filerevert' => 'Rétablir $1',
@@ -2336,12 +2335,12 @@ Des [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuve
 'mailnologintext' => 'Vous devez être [[Special:UserLogin|identifié]] et avoir indiqué une adresse électronique valide dans vos [[Special:Preferences|préférences]] pour pouvoir envoyer des courriels à d’autres utilisateurs.',
 'emailuser' => 'Lui envoyer un courriel',
 'emailuser-title-target' => 'Envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}',
-'emailuser-title-notarget' => 'Envoyer un courriel à l’utilisateur',
-'emailpage' => 'Envoyer un courriel à l’utilisateur',
+'emailuser-title-notarget' => "Envoyer un courriel à l'utilisateur",
+'emailpage' => "Envoyer un courriel à l'utilisateur",
 'emailpagetext' => 'Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à cet utilisateur.
 L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos préférences]] apparaîtra dans le champ « Expéditeur » de votre message ; ainsi, le destinataire pourra vous répondre directement.',
 'usermailererror' => 'Erreur dans l’objet du courriel :',
-'defemailsubject' => '{{SITENAME}} Courriel de l’utilisateur « $1 »',
+'defemailsubject' => "{{SITENAME}} Courriel de l'utilisateur « $1 »",
 'usermaildisabled' => 'L’envoi de courriels entre utilisateurs est désactivé',
 'usermaildisabledtext' => 'Vous ne pouvez pas envoyer de courriels à d’autres utilisateurs sur ce wiki',
 'noemailtitle' => 'Aucune adresse de courriel',
@@ -2350,7 +2349,7 @@ L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos
 'nowikiemailtext' => 'Cet utilisateur a choisi de ne pas recevoir de courriel de la part d’autres utilisateurs.',
 'emailnotarget' => "Nom d'utilisateur du destinataire inexistant ou invalide.",
 'emailtarget' => "Entrez le nom d'utilisateur du destinataire",
-'emailusername' => "Nom de l'utilisateur :",
+'emailusername' => 'Nom d’utilisateur :',
 'emailusernamesubmit' => 'Soumettre',
 'email-legend' => 'Envoyer un courriel à un autre utilisateur de {{SITENAME}}',
 'emailfrom' => 'De :',
@@ -2362,7 +2361,7 @@ L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos
 'emailccsubject' => 'Copie de votre message à $1 : $2',
 'emailsent' => 'Courriel envoyé',
 'emailsenttext' => 'Votre message a été envoyé par courriel.',
-'emailuserfooter' => 'Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « Envoyer un courriel à l’utilisateur » de {{SITENAME}}.',
+'emailuserfooter' => "Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « Envoyer un courriel à l'utilisateur » de {{SITENAME}}.",
 
 # User Messenger
 'usermessage-summary' => 'A laissé un message système.',
@@ -2631,14 +2630,14 @@ $1',
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => 'Contributions de l’utilisateur',
+'contributions' => "Contributions de l'utilisateur",
 'contributions-title' => 'Liste des contributions de l’utilisateur $1',
 'mycontris' => 'Contributions',
 'contribsub2' => 'Pour $1 ($2)',
 'nocontribs' => 'Aucune modification correspondant à ces critères n’a été trouvée.',
 'uctop' => '(dernière)',
 'month' => 'À partir du mois (et précédents) :',
-'year' => 'À partir de l’année (et précédentes) :',
+'year' => "À partir de l'année (et précédentes) :",
 
 'sp-contributions-newbies' => 'Ne montrer que les contributions des nouveaux utilisateurs',
 'sp-contributions-newbies-sub' => 'Parmi les nouveaux comptes',
@@ -2678,15 +2677,15 @@ La dernière entrée du journal des blocages est indiquée ci-dessous à titre d
 
 # Block/unblock
 'autoblockid' => 'Blocage automatique #$1',
-'block' => 'Bloquer l’utilisateur',
-'unblock' => 'Débloquer l’utilisateur',
-'blockip' => 'Bloquer l’utilisateur',
-'blockip-title' => 'Bloquer l’utilisateur',
-'blockip-legend' => 'Bloquer l’utilisateur',
+'block' => "Bloquer l'utilisateur",
+'unblock' => "Débloquer l'utilisateur",
+'blockip' => "Bloquer l'utilisateur",
+'blockip-title' => "Bloquer l'utilisateur",
+'blockip-legend' => "Bloquer l'utilisateur",
 'blockiptext' => 'Utilisez le formulaire ci-dessous pour bloquer l’accès aux modifications faites à partir d’une adresse IP spécifique ou d’un nom d’utilisateur.
 Une telle mesure ne devrait être prise que pour prévenir le vandalisme et en accord avec les [[{{MediaWiki:Policy-url}}|règles internes]].
 Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont été vandalisées).',
-'ipadressorusername' => 'Adresse IP ou nom d’utilisateur :',
+'ipadressorusername' => "Adresse IP ou nom d'utilisateur :",
 'ipbexpiry' => 'Durée avant expiration :',
 'ipbreason' => 'Motif :',
 'ipbreasonotherlist' => 'Autre motif',
@@ -2753,7 +2752,7 @@ Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.'
 'emailblock' => 'courriel bloqué',
 'blocklist-nousertalk' => 'ne peut modifier sa propre page de discussion',
 'ipblocklist-empty' => 'La liste des adresses IP bloquées est actuellement vide.',
-'ipblocklist-no-results' => 'L’adresse IP ou l’utilisateur demandé n’est pas bloqué.',
+'ipblocklist-no-results' => "L'adresse IP ou l'utilisateur demandé n'est pas bloqué.",
 'blocklink' => 'bloquer',
 'unblocklink' => 'débloquer',
 'change-blocklink' => 'modifier le blocage',
@@ -3146,8 +3145,8 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Utilisateur non enregistré|Utilisateurs non enregistrés}} sur {{SITENAME}}',
-'siteuser' => '{{GENDER:$2|l’utilisateur|l’utilisatrice|l’utilisateur}} $1 de {{SITENAME}}',
-'anonuser' => 'l’utilisateur anonyme $1 de {{SITENAME}}',
+'siteuser' => "{{GENDER:$2|l'utilisateur|l'utilisatrice|l'utilisateur}} $1 de {{SITENAME}}",
+'anonuser' => "l'utilisateur anonyme $1 de {{SITENAME}}",
 'lastmodifiedatby' => 'Cette page a été modifiée pour la dernière fois le $1 à $2 par $3.',
 'othercontribs' => 'Basé sur le travail de $1.',
 'others' => 'autres',
@@ -3167,6 +3166,7 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 
 # Info page
 'pageinfo-title' => 'Informations pour « $1 »',
+'pageinfo-not-current' => 'Les informations peuvent uniquement être affichées pour la révision en cours.',
 'pageinfo-header-basic' => 'Informations de base',
 'pageinfo-header-edits' => 'Historique des modifications',
 'pageinfo-header-restrictions' => 'Protection de la page',
@@ -4000,7 +4000,7 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 * <span class="mw-specialpagecached">Pages spéciales seulement en cache (pourraient être désuètes).</span>',
 'specialpages-group-maintenance' => 'Rapports de maintenance',
 'specialpages-group-other' => 'Autres pages spéciales',
-'specialpages-group-login' => 'S’identifier / s’inscrire',
+'specialpages-group-login' => "S'identifier / s'inscrire",
 'specialpages-group-changes' => 'Modifications récentes et journaux',
 'specialpages-group-media' => 'Rapports et import de fichiers médias',
 'specialpages-group-users' => 'Utilisateurs et droits rattachés',
index fab20f1..e29cee5 100644 (file)
@@ -454,7 +454,6 @@ $messages = array(
 'qbbrowse' => 'Fâre dèfelar',
 'qbedit' => 'Changiér',
 'qbpageoptions' => 'Ceta pâge',
-'qbpageinfo' => 'Contèxto',
 'qbmyoptions' => 'Mes pâges',
 'qbspecialpages' => 'Pâges spèciâles',
 'faq' => 'Quèstions sovent posâyes',
index 6d97dd8..7d8baf0 100644 (file)
@@ -163,7 +163,6 @@ $messages = array(
 'qbbrowse' => 'Bleese',
 'qbedit' => 'Änre',
 'qbpageoptions' => 'Jüdeer sid',
-'qbpageinfo' => 'Sidedoote',
 'qbmyoptions' => 'Min side',
 'qbspecialpages' => 'Spetsjåålside',
 'faq' => 'FAQ',
index 3c792c9..a373aeb 100644 (file)
@@ -176,7 +176,6 @@ $messages = array(
 'qbbrowse' => '查看',
 'qbedit' => '编写',
 'qbpageoptions' => '个页',
-'qbpageinfo' => '个页信息',
 'qbmyoptions' => '偶𠮶选项',
 'qbspecialpages' => '特殊页',
 'faq' => 'FAQ',
index be42d3e..060e337 100644 (file)
@@ -198,7 +198,6 @@ $messages = array(
 'qbbrowse' => '查看',
 'qbedit' => '編寫',
 'qbpageoptions' => '箇頁',
-'qbpageinfo' => '箇頁信息',
 'qbmyoptions' => '我嗰頁面',
 'qbspecialpages' => '特殊頁',
 'faq' => 'FAQ',
index 2186e5a..7552e54 100644 (file)
@@ -369,7 +369,6 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta páxina',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'As miñas páxinas',
 'qbspecialpages' => 'Páxinas especiais',
 'faq' => 'Preguntas máis frecuentes',
@@ -1943,7 +1942,7 @@ Poida que queira editar a descrición da [$2 páxina de descrición do ficheiro]
 'shared-repo-from' => 'de $1',
 'shared-repo' => 'repositorio compartido',
 'filepage.css' => '/** O CSS que se coloque aquí será incluído na páxina de descrición do ficheiro, así como nos wikis de clientes estranxeiros */',
-'upload-disallowed-here' => 'Por desgraza, non pode sobrescribir esta imaxe.',
+'upload-disallowed-here' => 'Non pode sobrescribir este ficheiro.',
 
 # File reversion
 'filerevert' => 'Reverter $1',
@@ -3062,6 +3061,7 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 
 # Info page
 'pageinfo-title' => 'Información sobre "$1"',
+'pageinfo-not-current' => 'Unicamente se pode mostrar a información sobre a revisión actual.',
 'pageinfo-header-basic' => 'Información básica',
 'pageinfo-header-edits' => 'Historial de edicións',
 'pageinfo-header-restrictions' => 'Protección da páxina',
@@ -3090,6 +3090,13 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría agochada|Categorías agochadas}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Modelo incluído|Modelos incluídos}} ($1)',
 'pageinfo-toolboxlink' => 'Información da páxina',
+'pageinfo-redirectsto' => 'Redirixe cara a',
+'pageinfo-redirectsto-info' => 'información',
+'pageinfo-contentpage' => 'Cóntase como páxina de contido',
+'pageinfo-contentpage-yes' => 'Si',
+'pageinfo-protect-cascading' => 'Protección en serie activada',
+'pageinfo-protect-cascading-yes' => 'Si',
+'pageinfo-protect-cascading-from' => 'Protección en serie activada',
 
 # Skin names
 'skinname-standard' => 'Clásica',
index 758f19e..d287798 100644 (file)
@@ -180,7 +180,6 @@ $messages = array(
 'qbbrowse' => 'Ἀλάου',
 'qbedit' => 'Μεταγράφειν',
 'qbpageoptions' => 'Ἥδε ἡ δέλτος',
-'qbpageinfo' => 'Συγκείμενον',
 'qbmyoptions' => 'Οἱ δέλτοι μου',
 'qbspecialpages' => 'Εἰδικαὶ δέλτοι',
 'faq' => 'Τὰ πολλάκις αἰτηθέντα',
index 64978ba..7048d38 100644 (file)
@@ -278,7 +278,6 @@ $messages = array(
 'qbbrowse' => 'Blättre',
 'qbedit' => 'Ändere',
 'qbpageoptions' => 'Sytenoptione',
-'qbpageinfo' => 'Sytedate',
 'qbmyoptions' => 'Ystellige',
 'qbspecialpages' => 'Spezialsytene',
 'faq' => 'Froge, wo vilmol gstellt wäre',
index eea796e..80fe8aa 100644 (file)
@@ -294,7 +294,6 @@ $messages = array(
 'qbbrowse' => 'બ્રાઉઝ',
 'qbedit' => 'ફેરફાર કરો',
 'qbpageoptions' => 'આ પાનું',
-'qbpageinfo' => 'સંદર્ભ',
 'qbmyoptions' => 'મારાં પાનાં',
 'qbspecialpages' => 'ખાસ પાનાં',
 'faq' => 'FAQ
@@ -418,6 +417,8 @@ $1',
 'youhavenewmessages' => 'તમારા માટે $1 ($2).',
 'newmessageslink' => 'નવીન સંદેશ',
 'newmessagesdifflink' => 'છેલ્લો ફેરફાર',
+'youhavenewmessagesfromusers' => 'આપને માટે {{PLURAL:$3|અન્ય સભ્યના|$3 અન્ય સભ્યોના}} $1 છે. ($2).',
+'youhavenewmessagesmanyusers' => 'આપને માટે $1 છે. ($2)',
 'newmessageslinkplural' => '{{PLURAL:$1|નવો સંદેશ|નવાં સંદેશાઓ}}',
 'newmessagesdifflinkplural' => 'છેલ્લા {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
 'youhavenewmessagesmulti' => '$1 ઉપર તમારા માટે નવો સંદેશ છે.',
@@ -531,10 +532,11 @@ Query: $2',
 'protectedpagetext' => 'ફેરફારો થતાં રોકવા માટે આ પાનું સુરક્ષિત કરવામાં આવ્યું છે.',
 'viewsourcetext' => 'આપ આ પાનાનો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:',
 'viewyourtext' => "આપ આ પાનાનાં '''આપનાં સંપાદનો'''નો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:",
-'protectedinterface' => 'આ પાનું સોફ્ટવેર માટે ઇન્ટરફેઇસ ટેક્સટ આપે છે, અને તેને દુરુપયોગ રોકવા માટે સ્થગિત કર્યું છે.',
+'protectedinterface' => 'આ પાનું સોફ્ટવેર માટે ઇન્ટરફેઇસ ટેક્સટ આપે છે, અને તેને દુરુપયોગ રોકવા માટે સ્થગિત કર્યું છે.
+બધાંજ વિકિ માટે ભાષાંતર ઉમેરવા કે બદલવા માટે, કૃપા કરી [//translatewiki.net/ translatewiki.net], મિડિયાવિકિ સ્થાનિયકરણ પ્રકલ્પ, વાપરો.',
 'editinginterface' => "'''ચેતવણી:''' તમે જે પાનામાં ફેરફાર કરી રહ્યા છો તે પાનું સોફ્ટવેર માટે ઇન્ટરફેસ ટેક્સટ પુરી પાડે છે.
-àª\85હà«\80àª\82નà«\8b àª¬àª¦àª²àª¾àªµ àª¬à«\80àª\9cા સભ્યોના ઇન્ટરફેસનાં દેખાવ ઉપર અસરકર્તા બનશે.
-ભાષાàª\82તર àª\95રવા àª®àª¾àª\9fà«\87 àª\95à«\83પા àª\95રà«\80 [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] -- àª®àª¿àª¡àª¿àª¯àª¾àªµàª¿àª\95à«\80 àª²à«\8bàª\95લાàª\87àª\9dà«\87શન àªªà«\8dરàª\95લà«\8dપ વાપરો.",
+àª\85હà«\80àª\82નà«\8b àª¬àª¦àª²àª¾àªµ àª\86 àªµàª¿àª\95િ àªªàª° àª\89પસà«\8dથિત àª\85નà«\8dય સભ્યોના ઇન્ટરફેસનાં દેખાવ ઉપર અસરકર્તા બનશે.
+બધાàª\82àª\9c àªµàª¿àª\95િ àª®àª¾àª\9fà«\87 àª­àª¾àª·àª¾àª\82તર àª\89મà«\87રવા àª\95à«\87 àª¬àª¦àª²àªµàª¾ àª®àª¾àª\9fà«\87 àª\95à«\83પા àª\95રà«\80 [//translatewiki.net/ translatewiki.net], àª®àª¿àª¡àª¿àª¯àª¾àªµàª¿àª\95à«\80 àª¸à«\8dથાનિયàª\95રણ àªªà«\8dરàª\95લà«\8dપ, વાપરો.",
 'sqlhidden' => '(છુપી SQL ક્વેરી)',
 'cascadeprotected' => 'આ પાના પર ફેરફાર પ્રતિબંધિત છે કેમ કે આ પાનું  {{PLURAL:$1|એવું પાનું|એવા પાના}} માં શામિલ છે જેમાં અનુવર્તી (પગથિયામય)સંરક્ષણ સક્રીય છે :
 $2',
@@ -932,6 +934,11 @@ $2
 તે પહેલેથી હાજર છે.',
 'defaultmessagetext' => 'મૂળભૂત સંદેશ લખાણ',
 
+# Content models
+'content-model-wikitext' => 'વિકિલખાણ',
+'content-model-text' => 'સાદું લખાણ',
+'content-model-javascript' => 'જાવાસ્ક્રિપ્ટ',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ચેતવણી:''' આ પાનું ખૂબ ખર્ચાળ પદચ્છેદ સૂત્ર ધરાવે છે.
 
@@ -1277,7 +1284,7 @@ $1",
 'timezoneregion-indian' => 'હિંદ મહાસાગર',
 'timezoneregion-pacific' => 'પ્રશાંત મહાસાગર',
 'allowemail' => 'અન્ય સભ્યો તરફથી આવતા ઇ-મેલને પરવાનગી આપો',
-'prefs-searchoptions' => 'શોધ વિકલ્પો',
+'prefs-searchoptions' => 'શોધો',
 'prefs-namespaces' => 'નામ અવકાશો',
 'defaultns' => 'અન્યથા આ નામ અવકાશ માં શોધો',
 'default' => 'મૂળ વિકલ્પ',
@@ -2373,8 +2380,8 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'undeletedrevisions' => '{{PLURAL:$1|૧ સંપાદન|$1 સંપાદનો}} પુન સ્થાપિત કરાયા',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 ફેરફાર|$1 ફેરફારો}} અને {{PLURAL:$2|1 ફાઈલા|$2 ફાઈલો}} પુનઃસ્થાપિત',
 'undeletedfiles' => '{{PLURAL:$1|1 ફાઇલ|$1 ફાઇલો}} પુનઃસ્થાપિત',
-'cannotundelete' => 'પુનર્જીવિત કરવાનું કાર્ય અસફળ
-કોઇકે આ પાનાને પહેલેથી પુનર્જીવિત કર્યું હોઈ શકે.',
+'cannotundelete' => 'પુનર્જીવિત કરવાનું કાર્ય અસફળ:
+$1',
 'undeletedpage' => "'''$1 પુનઃસ્થાપિત કરાયા'''
 
 તાજેતરમાં હટાવેલા કે પુનઃસ્થાપિત થયેલા ફેરફારની નોંધ નો સંદર્ભ અહીં ઉપ્લબ્ધ [[Special:Log/delete|deletion log]].",
index 1984c01..459e976 100644 (file)
@@ -133,7 +133,6 @@ $messages = array(
 'qbbrowse' => 'Chhà-khon',
 'qbedit' => 'Phiên-siá',
 'qbpageoptions' => 'Vùn-chông sién-hong',
-'qbpageinfo' => 'Vùn-chông chṳ̂-liau',
 'qbmyoptions' => 'Ngô-ke sién-hong',
 'qbspecialpages' => 'Thi̍t-sû hong-mien',
 'faq' => 'Sòng-kien mun-thì kié-tap',
index 6a0b5cb..7fc84c8 100644 (file)
@@ -498,7 +498,6 @@ $messages = array(
 'qbbrowse' => 'דפדוף',
 'qbedit' => 'עריכה',
 'qbpageoptions' => 'אפשרויות דף',
-'qbpageinfo' => 'מידע על הדף',
 'qbmyoptions' => 'האפשרויות שלי',
 'qbspecialpages' => 'דפים מיוחדים',
 'faq' => 'שאלות ותשובות',
@@ -845,7 +844,8 @@ $2',
 'acct_creation_throttle_hit' => 'מבקרים באתר זה דרך כתובת ה־IP שלכם כבר יצרו {{PLURAL:$1|חשבון אחד|$1 חשבונות}} ביום האחרון. זהו המקסימום המותר בתקופה זו.
 לפיכך, מבקרים דרך כתובת ה־IP הזו לא יכולים ליצור חשבונות נוספים ברגע זה.',
 'emailauthenticated' => 'כתובת הדוא"ל שלך אומתה ב־$3, $2.',
-'emailnotauthenticated' => 'כתובת הדוא"ל שלכם <strong>עדיין לא אושרה</strong> - שירותי הדוא"ל הבאים אינם פעילים.',
+'emailnotauthenticated' => 'כתובת הדוא"ל שלכם עדיין לא אושרה.
+לא יישלח אליכם דוא"ל עבור אף אחת מהאפשרויות הבאות.',
 'noemailprefs' => 'אנא ציינו כתובת דוא"ל בהעדפות שלכם כדי שתכונות אלה יעבדו.',
 'emailconfirmlink' => 'אישור כתובת הדוא"ל שלך',
 'invalidemailaddress' => 'כתובת הדוא"ל אינה מתקבלת כיוון שנראה שהיא בפורמט לא נכון.
@@ -2061,7 +2061,7 @@ $1',
 'shared-repo' => 'מקום איחסון משותף',
 'shared-repo-name-wikimediacommons' => 'ויקישיתוף',
 'filepage.css' => '/* הסגנונות הנכתבים כאן יוכללו בדף תיאור הקובץ, כולל באתרי ויקי זרים */',
-'upload-disallowed-here' => '×\9c×\9eר×\91×\94 ×\94צער, ×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 ×\9c×\94×¢×\9c×\95ת ×\92רס×\94 ×\90×\97רת ×©×\9c ×\94ת×\9e×\95× ×\94 ×\94×\96×\90ת.',
+'upload-disallowed-here' => '×\90×\99×\9f ×\91×\90פשר×\95ת×\9b×\9d ×\9c×\93ר×\95ס ×\90ת ×\94ק×\95×\91×¥ ×\94×\96×\94.',
 
 # File reversion
 'filerevert' => 'שחזור $1',
@@ -2350,7 +2350,7 @@ $1',
 'emailuser-title-notarget' => 'שליחת דוא"ל למשתמש',
 'emailpage' => 'שליחת דואר למשתמש',
 'emailpagetext' => 'ניתן להשתמש בטופס כדי לשלוח הודעת דואר אלקטרוני למשתמש זה.
\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×©×\9bת×\91ת×\9d ×\91[[Special:Preferences|×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש ×©×\9c×\9b×\9d]] ×ª×\95פ×\99×¢ ×\9b×\9bת×\95×\91ת ×\9e×\9e× ×\94 × ×©×\9c×\97×\94 ×\94×\94×\95×\93×¢×\94, ×\9b×\93×\99 ×\9c×\90פשר ×ª×\92×\95×\91×\94 ×\99ש×\99ר×\94 ×\9c×\9e×\9bת×\91.',
\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×©×\9bת×\91ת×\9d ×\91[[Special:Preferences|×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש ×©×\9c×\9b×\9d]] ×ª×\95פ×\99×¢ ×\9b×\9bת×\95×\91ת ×©×\94×\94×\95×\93×¢×\94 × ×©×\9c×\97×\94 ×\9e×\9e× ×\94, ×\9b×\93×\99 ×\9c×\90פשר ×ª×\92×\95×\91×\94 ×\99ש×\99ר×\94.',
 'usermailererror' => 'אובייקט הדואר החזיר שגיאה:',
 'defemailsubject' => 'דוא"ל מ{{grammar:תחילית|{{SITENAME}}}} מהמשתמש "$1"',
 'usermaildisabled' => 'שליחת דוא"ל למשתמשים מבוטלת',
@@ -3176,6 +3176,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'מידע על "$1"',
+'pageinfo-not-current' => 'המידע יכול להיות מוצג רק עבור הגרסה הנוכחית.',
 'pageinfo-header-basic' => 'מידע בסיסי',
 'pageinfo-header-edits' => 'היסטוריית עריכות',
 'pageinfo-header-restrictions' => 'הגנה על הדף',
@@ -3204,6 +3205,13 @@ $1',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|קטגוריה מוסתרת|קטגוריות מוסתרות}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|תבנית מוכללת|תבניות מוכללות}} ($1)',
 'pageinfo-toolboxlink' => 'מידע על הדף',
+'pageinfo-redirectsto' => 'מפנה אל',
+'pageinfo-redirectsto-info' => 'מידע',
+'pageinfo-contentpage' => 'נספר כדף תוכן',
+'pageinfo-contentpage-yes' => 'כן',
+'pageinfo-protect-cascading' => 'מופעלת הגנה מדורגת מכאן',
+'pageinfo-protect-cascading-yes' => 'כן',
+'pageinfo-protect-cascading-from' => 'דף זה מוגן בגלל הגנה מדורגת על',
 
 # Skin names
 'skinname-standard' => 'קלאסי',
index c06a669..e78fc8d 100644 (file)
@@ -322,7 +322,6 @@ $messages = array(
 'qbbrowse' => 'ब्राउज़',
 'qbedit' => 'बदलें',
 'qbpageoptions' => 'यह पृष्ठ',
-'qbpageinfo' => 'पृष्ठ जानकारी',
 'qbmyoptions' => 'मेरे पृष्ठ',
 'qbspecialpages' => 'विशेष पृष्ठ',
 'faq' => 'बहुधा पूछित प्रश्न',
index 503beba..e71cc73 100644 (file)
@@ -179,7 +179,6 @@ $messages = array(
 'qbbrowse' => 'Browse karo',
 'qbedit' => 'Badlo',
 'qbpageoptions' => 'Ii panna',
-'qbpageinfo' => 'Vishay',
 'qbmyoptions' => 'Hamar panna',
 'qbspecialpages' => 'Khaas panna',
 'faq' => 'Sab time puchhe waala sawal',
index e30bec1..91fe9f8 100644 (file)
@@ -458,7 +458,6 @@ $messages = array(
 'qbbrowse' => 'Pregledaj',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Postavke stranice',
-'qbpageinfo' => 'O stranici',
 'qbmyoptions' => 'Moje stranice',
 'qbspecialpages' => 'Posebne stranice',
 'faq' => 'Najčešća pitanja',
index 0c59316..a4a648e 100644 (file)
@@ -297,7 +297,6 @@ $messages = array(
 'qbbrowse' => 'Přepytować',
 'qbedit' => 'Wobdźěłać',
 'qbpageoptions' => 'Tuta strona',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Moje strony',
 'qbspecialpages' => 'Specialne strony',
 'faq' => 'Husto stajene prašenja (FAQ)',
@@ -1806,7 +1805,7 @@ Snano chceš wopisanje na jeje [$2 stronje datajoweho wopisanja] wobdźěłać.'
 'uploadnewversion-linktext' => 'nowu wersiju tuteje dataje nahrać',
 'shared-repo-from' => 'z $1',
 'shared-repo' => 'zhromadny repozitorij',
-'upload-disallowed-here' => 'Bohužel njemóžeš tutón wobraz přepisać.',
+'upload-disallowed-here' => 'Njemóžeš tutu dataju přepisać.',
 
 # File reversion
 'filerevert' => 'Wersiju $1 cofnyć',
@@ -2856,6 +2855,7 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 
 # Info page
 'pageinfo-title' => 'Informacije za stronu "$1"',
+'pageinfo-not-current' => 'Informacije hodźa so jenož za aktualnu wersiju zwobraznić.',
 'pageinfo-header-basic' => 'Zakładne informacije',
 'pageinfo-header-edits' => 'Stawizny wobdźěłać',
 'pageinfo-header-restrictions' => 'Škit strony',
@@ -2885,6 +2885,13 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowane kategorije}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Zapřijata předłoha|Zapřijatej předłoze|Zapřijate předłohi|Zapřijate předłohi}} ($1)',
 'pageinfo-toolboxlink' => 'Informacije wo stronje',
+'pageinfo-redirectsto' => 'Sposrědkuje k',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage' => 'Liči so jako wobsahowa strona',
+'pageinfo-contentpage-yes' => 'Haj',
+'pageinfo-protect-cascading' => 'Kaskadowy škit wottud',
+'pageinfo-protect-cascading-yes' => 'Haj',
+'pageinfo-protect-cascading-from' => 'Kaskadowy škit wot',
 
 # Skin names
 'skinname-standard' => 'Klasiski',
index 351b23b..f04aae4 100644 (file)
@@ -456,7 +456,6 @@ $messages = array(
 'qbbrowse' => 'Böngészés',
 'qbedit' => 'Szerkesztés',
 'qbpageoptions' => 'Lapbeállítások',
-'qbpageinfo' => 'Lapinformáció',
 'qbmyoptions' => 'Lapjaim',
 'qbspecialpages' => 'Speciális lapok',
 'faq' => 'GyIK',
index 0a44971..fdda6be 100644 (file)
@@ -416,7 +416,6 @@ $messages = array(
 'qbbrowse' => 'Թերթել',
 'qbedit' => 'Խմբագրել',
 'qbpageoptions' => 'Այս էջը',
-'qbpageinfo' => 'Հոդվածի մասին',
 'qbmyoptions' => 'Իմ էջերը',
 'qbspecialpages' => 'Սպասարկող էջեր',
 'faq' => 'ՀՏՀ',
index cccd468..0926a62 100644 (file)
@@ -287,7 +287,6 @@ $messages = array(
 'qbbrowse' => 'Foliar',
 'qbedit' => 'Modificar',
 'qbpageoptions' => 'Iste pagina',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'Mi paginas',
 'qbspecialpages' => 'Paginas special',
 'faq' => 'FAQ',
@@ -825,9 +824,9 @@ Si tu es un usator anonyme e pensa que commentos irrelevante ha essite dirigite
 Tu pote [[Special:Search/{{PAGENAME}}|cercar le titulo de iste pagina]] in altere paginas,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente],
 o [{{fullurl:{{FULLPAGENAME}}|action=edit}} modificar iste pagina]</span>.',
-'noarticletext-nopermission' => 'Al momento il non ha texto in iste pagina.
+'noarticletext-nopermission' => 'In iste momento il non ha texto in iste pagina.
 Tu pote [[Special:Search/{{PAGENAME}}|cercar le titulo de iste pagina]] in altere paginas,
-o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente].</span>',
+o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente], ma tu non ha le permission de crear iste pagina.</span>',
 'missing-revision' => 'Le version №$1 del pagina nominate "{{PAGENAME}}" non existe.
 
 Isto es generalmente causate per sequer un ligamine de historia obsolete a un pagina que ha essite delite.
@@ -942,6 +941,14 @@ Pare que illo ha essite delite.',
 Illo existe ja.',
 'defaultmessagetext' => 'Texto predefinite del message',
 'content-failed-to-parse' => 'Impossibile processar le contento $2 pro le modello $1: $3',
+'invalid-content-data' => 'Datos de contento invalide',
+'content-not-allowed-here' => 'Le contento "$1" non es permittite in le pagina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitexto',
+'content-model-text' => 'texto simple',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Attention: Iste pagina contine troppo de appellos costose al functiones del analysator syntactic.
@@ -1101,7 +1108,9 @@ Per favor verifica le registros.',
 'revdelete-only-restricted' => 'Error de celar le entrata del $1 a $2: tu non pote render entratas invisibile a administratores sin seliger tamben un del altere optiones de visibilitate.',
 'revdelete-reason-dropdown' => '*Motivos commun pro deletion
 ** Violation de copyright
-** Information personal inappropriate',
+** Information personal o commento inappropriate
+** Nomine de usator inappropriate
+** Information que pote esser diffamatori',
 'revdelete-otherreason' => 'Altere/additional motivo:',
 'revdelete-reasonotherlist' => 'Altere motivo',
 'revdelete-edit-reasonlist' => 'Modificar motivos pro deletion',
@@ -1298,7 +1307,7 @@ Ecce un valor aleatorimente generate que tu pote usar: $1',
 'timezoneregion-indian' => 'Oceano Indian',
 'timezoneregion-pacific' => 'Oceano Pacific',
 'allowemail' => 'Activar reception de e-mail de altere usatores',
-'prefs-searchoptions' => 'Optiones de recerca',
+'prefs-searchoptions' => 'Recerca',
 'prefs-namespaces' => 'Spatios de nomines',
 'defaultns' => 'Alteremente cercar in iste spatios de nomines:',
 'default' => 'predefinite',
@@ -1730,7 +1739,7 @@ Si le problema persiste, contacta un [[Special:ListUsers/sysop|administrator]].'
 'backend-fail-internal' => 'Un error incognite occurreva in le systema de immagazinage "$1".',
 'backend-fail-contenttype' => 'Non poteva determinar le typo de contento del file a immagazinar in "$1".',
 'backend-fail-batchsize' => 'Le systema de immagazinage ha recipite un lot de $1 {{PLURAL:$1|operation|operationes}} de file; le limite es $2 {{PLURAL:$2|operation|operationes}}.',
-'backend-fail-usable' => 'Non poteva scriber le file $1 a causa de permissiones insufficiente o directorios/contentores mancante.',
+'backend-fail-usable' => 'Non poteva leger o scriber le file "$1" a causa de permissiones insufficiente o directorios/contentores mancante.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Non poteva connecter al base de datos de jornal pro le systema de immagazinage "$1".',
@@ -1865,7 +1874,7 @@ Tu vole forsan modificar le description in le [$2 pagina de description del file
 'uploadnewversion-linktext' => 'Incargar un nove version de iste file',
 'shared-repo-from' => 'ab $1',
 'shared-repo' => 'un repositorio partite',
-'upload-disallowed-here' => 'Infortunatemente tu non pote superscriber iste imagine.',
+'upload-disallowed-here' => 'Tu non pote superscriber iste file.',
 
 # File reversion
 'filerevert' => 'Reverter $1',
@@ -2425,8 +2434,8 @@ Es possibile que le adresse URL es invalide, o que le version ha essite restaura
 'undeletedrevisions' => '{{PLURAL:$1|1 version|$1 versiones}} restaurate',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 version|$1 versiones}} e {{PLURAL:$2|1 file|$2 files}} restaurate',
 'undeletedfiles' => '$1 {{PLURAL:$1|archivo|archivos}} restaurate',
-'cannotundelete' => 'Le restauration ha fallite;
-es possibile que un altere persona ha ja restaurate le pagina.',
+'cannotundelete' => 'Le restauration ha fallite:
+$1',
 'undeletedpage' => "'''$1 ha essite restaurate'''
 
 Consulta le [[Special:Log/delete|registro de deletiones]] pro un lista de deletiones e restaurationes recente.",
@@ -2741,6 +2750,7 @@ non pote renominar un pagina al mesme titulo.',
 'immobile-target-namespace-iw' => 'Un ligamine interwiki non es un destination valide pro le renomination de un pagina.',
 'immobile-source-page' => 'Iste pagina non es renominabile.',
 'immobile-target-page' => 'Non pote renominar a iste titulo de destination.',
+'bad-target-model' => 'Le destination desirate usa un altere modello de contento. Non es possibile converter de $1 a $2.',
 'imagenocrossnamespace' => 'Impossibile renominar un file verso un spatio de nomines non-file',
 'nonfile-cannot-move-to-file' => 'Impossibile renominar un non-file verso le spatio de nomines file',
 'imagetypemismatch' => 'Le nove extension del nomine del file non corresponde al typo del file',
@@ -2997,6 +3007,7 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 
 # Info page
 'pageinfo-title' => 'Informationes pro "$1"',
+'pageinfo-not-current' => 'Information pote esser monstrate solmente pro le version actual.',
 'pageinfo-header-basic' => 'Information de base',
 'pageinfo-header-edits' => 'Historia de modificationes',
 'pageinfo-header-restrictions' => 'Protection del pagina',
@@ -3024,6 +3035,14 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'pageinfo-magic-words' => '{{PLURAL:$1|Parola|Parolas}} magic ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria|Categorias}} celate ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Patrono|Patronos}} transcludite ($1)',
+'pageinfo-toolboxlink' => 'Information sur le pagina',
+'pageinfo-redirectsto' => 'Redirige a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Contate como pagina de contento',
+'pageinfo-contentpage-yes' => 'Si',
+'pageinfo-protect-cascading' => 'Protection in cascada a partir de hic',
+'pageinfo-protect-cascading-yes' => 'Si',
+'pageinfo-protect-cascading-from' => 'Protection in cascada a partir de',
 
 # Skin names
 'skinname-standard' => 'Classic',
@@ -3610,6 +3629,7 @@ Iste codice de confirmation expirara a $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Le transclusion interwiki es disactivate]',
 'scarytranscludefailed' => '[Falleva de obtener le patrono pro $1]',
+'scarytranscludefailed-httpstatus' => '[Obtention de patrono fallite pro $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL es troppo longe]',
 
 # Delete conflict
index 9ee48f4..2766fda 100644 (file)
@@ -481,7 +481,6 @@ $messages = array(
 'qbbrowse' => 'Navigasi',
 'qbedit' => 'Sunting',
 'qbpageoptions' => 'Halaman ini',
-'qbpageinfo' => 'Konteks halaman',
 'qbmyoptions' => 'Halaman saya',
 'qbspecialpages' => 'Halaman istimewa',
 'faq' => 'FAQ',
index 38142e0..6f31430 100644 (file)
@@ -179,7 +179,6 @@ $messages = array(
 'qbbrowse' => 'Agbasabasa',
 'qbedit' => 'Urnosen',
 'qbpageoptions' => 'Daytoy a panid',
-'qbpageinfo' => 'Linaon',
 'qbmyoptions' => 'Pampanidko',
 'qbspecialpages' => 'Espesial a pampanid',
 'faq' => 'FAQ',
index 2022be9..4ba8dc3 100644 (file)
@@ -377,7 +377,6 @@ $messages = array(
 'qbbrowse' => 'Flakka',
 'qbedit' => 'Breyta',
 'qbpageoptions' => 'Þessi síða',
-'qbpageinfo' => 'Samhengi',
 'qbmyoptions' => 'Mínar síður',
 'qbspecialpages' => 'Kerfissíður',
 'faq' => 'Algengar spurningar',
index 45cad9a..5eaedf2 100644 (file)
@@ -412,7 +412,6 @@ $messages = array(
 'qbbrowse' => 'Sfoglia',
 'qbedit' => 'Modifica',
 'qbpageoptions' => 'Opzioni pagina',
-'qbpageinfo' => 'Informazioni sulla pagina',
 'qbmyoptions' => 'Le mie pagine',
 'qbspecialpages' => 'Pagine speciali',
 'faq' => 'Domande frequenti',
@@ -1917,7 +1916,7 @@ Probabilmente vuoi modificare la descrizione presente nella [$2 pagina di descri
 'shared-repo-from' => 'da $1',
 'shared-repo' => 'un archivio condiviso',
 'filepage.css' => '/* Il CSS messo qui viene incluso nella pagina di descrizione del file, inclusa anche su wiki client esterni */',
-'upload-disallowed-here' => 'Impossibile sovrascrivere questa immagine.',
+'upload-disallowed-here' => 'Impossibile sovrascrivere questo file.',
 
 # File reversion
 'filerevert' => 'Ripristina $1',
@@ -3003,6 +3002,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 
 # Info page
 'pageinfo-title' => 'Informazioni per "$1"',
+'pageinfo-not-current' => 'Le informazioni possono essere visualizzate solo per la versione corrente.',
 'pageinfo-header-basic' => 'Informazioni di base',
 'pageinfo-header-edits' => 'Cronologia delle modifiche',
 'pageinfo-header-restrictions' => 'Protezione della pagina',
@@ -3031,6 +3031,13 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria nascosta|Categorie nascoste}} ($1)',
 'pageinfo-templates' => 'Template {{PLURAL:$1|incluso|inclusi}}  ($1)',
 'pageinfo-toolboxlink' => 'Informazioni sulla pagina',
+'pageinfo-redirectsto' => 'Reindirizza a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Conteggiata come una pagina di contenuto',
+'pageinfo-contentpage-yes' => 'Sì',
+'pageinfo-protect-cascading' => 'Protezione ricorsiva da qui',
+'pageinfo-protect-cascading-yes' => 'Sì',
+'pageinfo-protect-cascading-from' => 'Protezione ricorsiva ereditata da',
 
 # Patrolling
 'markaspatrolleddiff' => 'Segna la modifica come verificata',
index 15c9173..fb473e3 100644 (file)
@@ -508,7 +508,6 @@ $messages = array(
 'qbbrowse' => '閲覧',
 'qbedit' => '編集',
 'qbpageoptions' => 'このページについて',
-'qbpageinfo' => '関連情報',
 'qbmyoptions' => '自分のページ',
 'qbspecialpages' => '特別ページ',
 'faq' => 'よくある質問と回答',
@@ -801,7 +800,7 @@ $2',
 'nologin' => '登録がまだの場合、$1。',
 'nologinlink' => 'アカウントを作成してください',
 'createaccount' => 'アカウント作成',
-'gotaccount' => '既にアカウントを持っている場合、$1。',
+'gotaccount' => 'アカウントを既に持っている場合、$1。',
 'gotaccountlink' => 'ログインしてください',
 'userlogin-resetlink' => 'ログイン情報をお忘れですか?',
 'createaccountmail' => 'メールで送信',
@@ -1037,7 +1036,7 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 'loginreqtitle' => 'ログインが必要',
 'loginreqlink' => 'ログイン',
 'loginreqpagetext' => '他のページを閲覧するには$1する必要があります。',
-'accmailtitle' => 'パスワードを送信しました。',
+'accmailtitle' => 'パスワードをお送りしました。',
 'accmailtext' => "[[User talk:$1|$1]]のために無作為に生成したパスワードを、$2に送信しました。
 
 この新アカウントのパスワードは、ログインした際に''[[Special:ChangePassword|パスワード変更]]''ページで変更できます。",
@@ -1170,7 +1169,7 @@ IP アドレスは複数の利用者で共有されている場合がありま
 'edit-already-exists' => '新しいページを作成できませんでした。
 そのページは既に存在しています。',
 'defaultmessagetext' => '既定のメッセージ文',
-'content-failed-to-parse' => '$2 の本文を$1モデルとして構文解析できませんでした',
+'content-failed-to-parse' => '$2 の本文を$1モデルとして構文解析できませんでした: $3',
 'invalid-content-data' => '本文データが無効です',
 'content-not-allowed-here' => 'ページ [[$2]] では、「$1」コンテンツは許可されていません',
 
@@ -1305,7 +1304,7 @@ $3が示した理由:''$2''",
 'revdelete-hide-comment' => '編集の要約を隠す',
 'revdelete-hide-user' => '投稿者の利用者名またはIPを隠す',
 'revdelete-hide-restricted' => '他の利用者と同様に管理者からもデータを隠す',
-'revdelete-radio-same' => '(変更しない)',
+'revdelete-radio-same' => '(変更しない)',
 'revdelete-radio-set' => 'はい',
 'revdelete-radio-unset' => 'いいえ',
 'revdelete-suppress' => '他の利用者と同様に管理者からもデータを隠す',
@@ -1436,7 +1435,7 @@ $1",
 'search-suggest' => 'もしかして:$1',
 'search-interwiki-caption' => '姉妹プロジェクト',
 'search-interwiki-default' => '$1の結果:',
-'search-interwiki-more' => '(続き)',
+'search-interwiki-more' => '(続き)',
 'search-relatedarticle' => '関連',
 'mwsuggest-disable' => 'Ajaxによる検索候補の提示を無効にする',
 'searcheverything-enable' => 'すべての名前空間を検索',
@@ -2117,7 +2116,7 @@ $1での[$2 ファイル解説ページ]にある説明を編集したほうが
 'shared-repo' => '共有リポジトリ',
 'shared-repo-name-wikimediacommons' => 'ウィキメディア・コモンズ',
 'filepage.css' => '/* ここに記述したCSSはファイル解説ページにて読み込まれます。また外部のクライアントウィキにも影響します */',
-'upload-disallowed-here' => '残念ながらこの画像には上書きできません。',
+'upload-disallowed-here' => 'このファイルには上書きできません。',
 
 # File reversion
 'filerevert' => '$1を差し戻す',
@@ -2266,7 +2265,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'deadendpagestext' => '以下のページは、{{SITENAME}}の他のページにリンクしていません。',
 'protectedpages' => '保護されているページ',
 'protectedpages-indef' => '無期限保護のみ',
-'protectedpages-cascade' => '連続保護のみ',
+'protectedpages-cascade' => 'カスケード保護のみ',
 'protectedpagestext' => '以下のページは移動や編集が禁止されています',
 'protectedpagesempty' => '指定した条件で保護中のページは現在ありません。',
 'protectedtitles' => '作成保護されているページ名',
@@ -2300,7 +2299,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'booksources-isbn' => 'ISBN:',
 'booksources-go' => '検索',
 'booksources-text' => 'お探しの書籍の新品/中古品を販売している外部サイトへのリンクを以下に列挙します。この書籍についてさらに詳しい情報があるかもしれません:',
-'booksources-invalid-isbn' => '指定したISBN番号は有効ではないようです。情報源から写し間違えていないか確認してください。',
+'booksources-invalid-isbn' => '指定した ISBN は有効ではないようです。情報源から写し間違えていないか確認してください。',
 
 # Special:Log
 'specialloguserlabel' => '実行者:',
@@ -2606,7 +2605,7 @@ $2による直前の版へ変更されました。',
 'protect-fallback' => '「$1」権限が必要',
 'protect-level-autoconfirmed' => '新規利用者と匿名利用者を禁止',
 'protect-level-sysop' => '管理者のみ',
-'protect-summary-cascade' => '連続',
+'protect-summary-cascade' => 'カスケード',
 'protect-expiring' => '$1(UTC)で自動的に解除',
 'protect-expiring-local' => '期限 $1',
 'protect-expiry-indefinite' => '無期限',
@@ -2698,7 +2697,7 @@ $1',
 
 # Namespace form on various pages
 'namespace' => '名前空間:',
-'invert' => '名前空間の選択を反転',
+'invert' => '選択したものを除く',
 'tooltip-invert' => '選択した名前空間 (チェックを入れている場合は、関連付けられた名前空間も含む) のページの変更を非表示にするには、このボックスにチェックを入れる',
 'namespace_association' => '関連付けられた名前空間も含める',
 'tooltip-namespace_association' => '選択した名前空間に関連付けられたトークページ (逆にトークページの名前空間を選択した場合も同様) の名前空間も含めるには、このボックスにチェックを入れる',
@@ -2799,7 +2798,7 @@ $1',
 'ipb-blocklist' => '現在有効なブロックを表示',
 'ipb-blocklist-contribs' => '$1の投稿の一覧',
 'unblockip' => 'ブロックを解除',
-'unblockiptext' => '以ä¸\8bã\81®ã\83\95ã\82©ã\83¼ã\83 ã\82\92使ç\94¨ã\81\97ã\81¦ã\80\81以å\89\8dã\83\96ã\83­ã\83\83ã\82¯ã\81\97ã\81\9fIPã\82¢ã\83\89ã\83¬ã\82¹ã\81¾ã\81\9fã\81¯å\88©ç\94¨è\80\85ã\81\8bã\82\89ã\81®æ\9b¸ã\81\8dè¾¼ã\81¿ã\82¢ã\82¯ã\82»ã\82¹ã\82\92ã\83\96ã\83­ã\83\83ã\82¯解除できます。',
+'unblockiptext' => '以ä¸\8bã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81§å\88©ç\94¨è\80\85ã\81¾ã\81\9fã\81¯IPã\82¢ã\83\89ã\83¬ã\82¹ã\81®ã\83\96ã\83­ã\83\83ã\82¯ã\82\92解除できます。',
 'ipusubmit' => 'このブロックを解除',
 'unblocked' => '[[User:$1|$1]]のブロックを解除しました',
 'unblocked-range' => '$1のブロックは解除されています',
@@ -3253,6 +3252,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 
 # Info page
 'pageinfo-title' => '「$1」の情報',
+'pageinfo-not-current' => '現在のバージョンの情報のみが表示される可能性があります。',
 'pageinfo-header-basic' => '基本情報',
 'pageinfo-header-edits' => '編集履歴',
 'pageinfo-header-restrictions' => 'ページの保護',
@@ -3282,6 +3282,13 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'pageinfo-hidden-categories' => '隠し{{PLURAL:$1|カテゴリ}} ($1)',
 'pageinfo-templates' => '参照読み込みされた{{PLURAL:$1|テンプレート}} ($1)',
 'pageinfo-toolboxlink' => 'ページ情報',
+'pageinfo-redirectsto' => '転送先',
+'pageinfo-redirectsto-info' => '情報',
+'pageinfo-contentpage' => '本文ページとして数える',
+'pageinfo-contentpage-yes' => 'はい',
+'pageinfo-protect-cascading' => 'カスケード保護されている',
+'pageinfo-protect-cascading-yes' => 'はい',
+'pageinfo-protect-cascading-from' => 'カスケード保護の起点',
 
 # Skin names
 'skinname-standard' => 'クラシック',
@@ -3364,6 +3371,9 @@ $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1、 $2 × $3',
+'seconds-abbrev' => '$1 s',
+'hours-abbrev' => '$1 h',
+'days-abbrev' => '$1 d',
 'seconds' => '{{PLURAL:$1|$1 秒}}',
 'minutes' => '{{PLURAL:$1|$1 分}}',
 'hours' => '{{PLURAL:$1|$1 時間}}',
index 8777427..cfc77ad 100644 (file)
@@ -195,7 +195,6 @@ $messages = array(
 'qbbrowse' => 'Navigasi',
 'qbedit' => 'Sunting',
 'qbpageoptions' => 'Kaca iki',
-'qbpageinfo' => 'Kontèks kaca',
 'qbmyoptions' => 'Opsiku',
 'qbspecialpages' => 'Kaca-kaca astaméwa',
 'faq' => 'FAQ (Pitakonan sing kerep diajokaké)',
index 6ff692e..12356df 100644 (file)
@@ -314,7 +314,6 @@ $messages = array(
 'qbbrowse' => 'გადახედე',
 'qbedit' => 'რედაქტირება',
 'qbpageoptions' => 'ეს გვერდი',
-'qbpageinfo' => 'კონტექსტი',
 'qbmyoptions' => 'ჩემი გვერდები',
 'qbspecialpages' => 'სპეციალური გვერდები',
 'faq' => 'ხშირი შეკითხვები',
@@ -327,7 +326,7 @@ $messages = array(
 'vector-action-protect' => 'დაცვა',
 'vector-action-undelete' => 'აღდგენა',
 'vector-action-unprotect' => 'დაცვის დონის შეცვლა',
-'vector-simplesearch-preference' => 'á\83«á\83\94á\83\91á\83\9cá\83\98á\83¡ á\83\92á\83\90á\83¤á\83\90á\83 á\83\97á\83\9dá\83\94á\83\91á\83£á\83\9aá\83\98 á\83\9bá\83\98á\83\9cá\83\98á\83¨á\83\9cá\83\94á\83\91á\83\94á\83\91ის ჩართვა (მხოლოდ ვექტორული იერსახისთვის)',
+'vector-simplesearch-preference' => 'á\83«á\83\94á\83\91á\83\9cá\83\98á\83¡ á\83\92á\83\90á\83¤á\83\90á\83 á\83\97á\83\9dá\83\94á\83\91á\83£á\83\9aá\83\98 á\83\95á\83\94á\83\9aის ჩართვა (მხოლოდ ვექტორული იერსახისთვის)',
 'vector-view-create' => 'შექმნა',
 'vector-view-edit' => 'რედაქტირება',
 'vector-view-history' => 'ისტორია',
@@ -956,6 +955,9 @@ $2
 'edit-already-exists' => 'ახალი გვერდის შექმნა არ მოხერხდა.
 ის უკვე არსებობს.',
 'defaultmessagetext' => 'შეტყობინების სტანდარტული ტექსტი',
+'content-failed-to-parse' => '$2-ის შინაარსი არ შეესაბამება $1-ის ტიპს: $3.',
+'invalid-content-data' => 'დაუშვებელი მონაცემები',
+'content-not-allowed-here' => '„$1“-ის შინაარსი დაუშვებელია [[$2]] გვერდზე',
 
 # Content models
 'content-model-wikitext' => 'ვიკიტექსტი',
@@ -1859,7 +1861,7 @@ $1',
 'shared-repo-from' => ' $1-დან',
 'shared-repo' => 'საერთო საცავიდან',
 'shared-repo-name-wikimediacommons' => 'ვიკისაწყობი',
-'upload-disallowed-here' => 'á\83¡á\83\90á\83\9bá\83¬á\83£á\83®á\83\90á\83 á\83\9dá\83\93, á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83  á\83¨á\83\94á\83\92á\83\98á\83«á\83\9aá\83\98á\83\90á\83\97 á\83\90á\83\9b á\83¡á\83£á\83 á\83\90á\83\97ზე გადაწერა.',
+'upload-disallowed-here' => 'á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83  á\83¨á\83\94á\83\92á\83\98á\83«á\83\9aá\83\98á\83\90á\83\97 á\83\90á\83\9b á\83¤á\83\90á\83\98á\83\9aზე გადაწერა.',
 
 # File reversion
 'filerevert' => 'დააბრუნე $1',
@@ -2703,6 +2705,7 @@ $1',
 'immobile-target-namespace-iw' => 'ინტერვიკის ბმული შეუძლებელია გამოყენებული იქნას გადარქმევისთვის.',
 'immobile-source-page' => 'ამ გვეერდის გადატანა შეუძლებელია.',
 'immobile-target-page' => 'შეუძლებელია მოცემულ სახელზე გადატანა.',
+'bad-target-model' => 'შეუძლებელია $1-ის გარდაქმნა $2-ზე: მონაცემების შეუსაბამო მოდელი.',
 'imagenocrossnamespace' => 'შეუძლებელია ფაილს მიეცეს სახელი სახელთა სხვა სივრციდან',
 'nonfile-cannot-move-to-file' => 'შეუძლებელია არაფაილების გადატანა ფაილის სახელთა სივრცეში',
 'imagetypemismatch' => 'ფაილს ახალი გაფართოება არ შეესაბამება მის ტიპს',
@@ -2950,6 +2953,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'ინფორმაცია „$1“-თვის',
+'pageinfo-not-current' => 'მონაცემები წარმოდგენილია მხოლოდ მიმდინარე რედაქტირებისათვის.',
 'pageinfo-header-basic' => 'საბაზისო ინფორმაცია',
 'pageinfo-header-edits' => 'რედაქტირების ისტორია',
 'pageinfo-header-restrictions' => 'გვერდის დაცვა',
@@ -3605,6 +3609,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[«Interwiki transcluding» გათიშულია]',
 'scarytranscludefailed' => '[$1-თან დაკავშირების შეცდომა]',
+'scarytranscludefailed-httpstatus' => '[ვერ მოხერხდა თარგის ჩატვირთვა $1-თვის: HTTP $2]',
 'scarytranscludetoolong' => '[URL ძალიან გრძელია]',
 
 # Delete conflict
index beb551d..2a4c540 100644 (file)
@@ -13,6 +13,7 @@
  * @author Azwaw
  * @author Mmistmurt
  * @author MoubarikBelkasim
+ * @author Salem333
  * @author Teak
  * @author Urhixidur
  */
@@ -186,7 +187,6 @@ $messages = array(
 'qbbrowse' => 'Ẓer isebtar',
 'qbedit' => 'Beddel',
 'qbpageoptions' => 'Asebter-agi',
-'qbpageinfo' => 'Asatal',
 'qbmyoptions' => 'isebtar inu',
 'qbspecialpages' => 'isebtar usligen',
 'faq' => 'Isteqsiyen',
@@ -783,6 +783,15 @@ Ahat yetwemḥa.',
 'edit-already-exists' => 'Asebter amaynut ur d yesnufu ara.
 Yella yakan.',
 'defaultmessagetext' => 'Izen s lexṣas',
+'content-failed-to-parse' => 'Tasleṭ n ugbur n $2 i talɣa $1 texseṛ : $3',
+'invalid-content-data' => 'Isefka n ugbur ur ɣbelen ara',
+'content-not-allowed-here' => 'Agbur "$1" ur yesɛa ara turagt ɣef usebter [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikiaḍris',
+'content-model-text' => 'aḍris afraray',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Ɣur-wet :''' Asebter agi yesɛa aṭas n tiɣriwin ar tiseɣnin ɣlayen n umsisleḍ taseddast.
@@ -1080,7 +1089,7 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 'prefs-labs' => 'Tiseɣnin « labs »',
 'prefs-user-pages' => 'Isebtar n useqdac',
 'prefs-personal' => 'Profile n wemseqdac',
-'prefs-rc' => 'Ibeddlen imaynuten',
+'prefs-rc' => 'Ibeddilen imaynuten',
 'prefs-watchlist' => 'Umuɣ n uɛessi',
 'prefs-watchlist-days' => 'Amḍan n ussan i ubeqqeḍ deg umuɣ n uɛassi :',
 'prefs-watchlist-days-max' => 'Afellay $1 {{PLURAL:$1|ass|ussan}}',
@@ -1250,6 +1259,7 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'right-upload_by_url' => 'Kter afaylu seg tansa URL',
 'right-purge' => 'Senger tazarkatut n isebtar war asuter n uragag',
 'right-autoconfirmed' => 'Beddel isebtar azinsegdelen',
+'right-bot' => 'Ad yilli yesniret am ukala yeswurmen',
 'right-nominornewtalk' => 'Ur ndeḥ ara tazmilt n inzan imaynuten ma neseqdac abeddel amectuḥ ɣef usebtar n umeslay n yiwen useqdac',
 'right-apihighlimits' => 'Seqdec tilisa tid ɛlayen deg tuttriwin API',
 'right-writeapi' => 'Seqdec API n ubeddel',
@@ -1261,29 +1271,42 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'right-deletedtext' => 'Ẓeṛ aḍris yemḥan d timeẓliwin gar ileqman yemḥan',
 'right-browsearchive' => 'Nadi ɣef isebtar yettumḥan',
 'right-undelete' => 'Erred asebter yemḥan',
+'right-suppressrevision' => 'Ssekyed dɣa erred ileqman yefren i inedbalen',
 'right-suppressionlog' => 'Ẓeṛ iɣmisen usligen',
 'right-block' => 'Kyef deg tira iseqdacen nniḍen',
 'right-blockemail' => 'Sḍiqqef aceggaɛ n tira (e-mail) i yiwen useqdac',
 'right-hideuser' => 'Kyef aseqdac s tuffra n isem-is ar udem n uzayez',
+'right-ipblock-exempt' => 'Zizdew tansiwin IP yekyefen, ikyafen iwurmanen d ikyafen n tagrummiwin IP',
+'right-proxyunbannable' => 'Zizdew ikyafen iwurmanen n iqeddacen proxy',
+'right-unblockself' => 'Ad ekkesen akyaf imanen nsen',
 'right-protect' => 'Beddel aswir n umesten n isebtar dɣa beddel isebtar i gdelen',
 'right-editprotected' => 'Beddel isebtar i gdelen (war asegdel s uceṛcuṛ)',
 'right-editinterface' => 'Beddel agrudem n useqdac',
 'right-editusercssjs' => 'Beddel ifuyla CSS d JavaScript n iseqdacen nniḍen',
 'right-editusercss' => 'Beddel ifuyla CSS n iseqdacen nniḍen',
 'right-edituserjs' => 'Beddel ifuyla JavaScript n iseqdacen nniḍen',
+'right-rollback' => 'Ekkes s urured ibeddilen n umedraw aneggaru deg yiwen asebter',
+'right-markbotedits' => 'Creḍ ibeddilen yetwekkesen am aken d aṛubut i tni beddelen.',
+'right-noratelimit' => 'Ur i tilli ara yeswaɣ sɣur tilisa n utug',
 'right-import' => 'Kter ifuyla seg iWikiyen nniḍen',
 'right-importupload' => 'Azen isebtar seg ufaylu',
+'right-patrol' => 'Creḍ ibeddilen n wiyaḍ nniḍen am aken selkenen',
+'right-autopatrol' => 'Ad i sɛu ibeddilen is creḍen s uwurman am aken ɛessan',
+'right-patrolmarks' => 'Ẓeṛ ticraḍ n uɛassi deg ibeddilen imaynuten',
 'right-unwatchedpages' => 'Ẓeṛ umuɣ n isebtar ur sɛan ara iɛssasen',
 'right-mergehistory' => 'Sdukel amezruy n isebtar',
 'right-userrights' => 'Beddel akkw izerfan n yiwen aseqdac',
 'right-userrights-interwiki' => 'Beddel izerfan n iseqdacen yellan deg awiki nniḍen',
 'right-siteadmin' => 'Sekkweṛ naɣ kkes aseḍru i taffa n isefka',
+'right-override-export-depth' => 'Sifeḍ isebtar akkw d isebtar iqqenen alama tadrut n 5 iswiren',
 'right-sendemail' => 'Ceggaɛ tirawt i iseqdacen nniḍen',
+'right-passwordreset' => 'Ẓeṛ tira n uwennez n awalen uɛaddi',
 
 # User rights log
 'rightslog' => 'Aɣmis n yizerfan n wemseqdac',
 'rightslogtext' => 'Wagi d aɣmis n yibeddlen n yizerfan n wemseqdac',
 'rightslogentry' => 'Yettubeddel izerfan n wemseqdac $1 seg $2 ar $3',
+'rightslogentry-autopromote' => 'yesnerna s uwurman seg $2 ar $3',
 'rightsnone' => '(ulaḥedd)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1299,6 +1322,7 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'action-movefile' => 'beddel isem n ufaylu agi',
 'action-upload' => 'Azen afaylu agi',
 'action-reupload' => 'Sefxes afaylu yellan',
+'action-reupload-shared' => 'fel deg udigan afaylu agi yellan ɣef azadur azduklan',
 'action-upload_by_url' => 'Azen afaylu agi seg tansa URL',
 'action-writeapi' => 'seqdec API n tira',
 'action-delete' => 'mḥu asebter-agi',
@@ -1306,11 +1330,15 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'action-deletedhistory' => 'ẓeṛ amezruy yemḥan n usebter agi',
 'action-browsearchive' => 'nadi ɣef isebtar yettumḥan',
 'action-undelete' => 'erred asebter agi',
+'action-suppressrevision' => 'sekyed dɣa uɣaled ar lqem agi yetwekkesen',
 'action-suppressionlog' => 'ẓeṛ aɣmis agi uslig',
 'action-block' => 'Kyef deg tira aseqdac agi',
 'action-protect' => 'beddel iswiren n umesten i usebter agi',
+'action-rollback' => 'ekkes s urured ibeddilen n umedraw aneggaru yebeddelen yiwen usebter',
 'action-import' => 'Kter asebter agi seg wiki nniḍen',
 'action-importupload' => 'Kter asebter agi seg ufaylu n wezdam (upload)',
+'action-patrol' => 'Creḍ abeddel n wiyaḍ nniḍen am aken tesɛa tacaggart',
+'action-autopatrol' => 'ad sɛuḍ tacaggart i ubeddil ik',
 'action-unwatchedpages' => 'Sken-d tabdart n isebtaren ur yettwalan ara.',
 'action-mergehistory' => 'Sdukel amezruy n usebtar agi',
 'action-userrights' => 'Ẓreg izerfan n imseqdacen yark',
@@ -1320,7 +1348,7 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Abeddel|Ibeddlen}}',
-'recentchanges' => 'Ibeddlen imaynuten',
+'recentchanges' => 'Ibeddilen imaynuten',
 'recentchanges-legend' => 'Tifranin n ibeddilen imaynuten',
 'recentchanges-summary' => 'Ḍfer ibeddilen imaynuten n {{SITENAME}}.',
 'recentchanges-feed-description' => 'Ḍfer ibeddilen imaynuten n wiki-yagi deg usuddem-agi.',
@@ -1375,6 +1403,8 @@ iwakken ad tazneḍ afaylu.',
 'upload_directory_missing' => 'Akaram n taktert n ufaylu ($1) ulac-it dɣa ur d-yesnulfa ara sɣur aqeddac web.',
 'upload_directory_read_only' => 'Weserver/serveur Web ur yezmir ara ad yaru deg ($1).',
 'uploaderror' => 'Agul deg usekcam',
+'upload-recreate-warning' => "'''Ɣur-wet : Afaylu s isem agi yetwekkes naɣ yetembiwel.'''
+Aɣmis n tukksiwin d win n ittembiwilen n usebter agi beqqeḍen d-agi i tilɣa :",
 'uploadtext' => "Sseqdec tiferkit agi iwakken ad ktereḍ ifuyla ɣef uqeddac.
 Iwakken ad ẓṛeḍ naɣ ad nadiḍ tugniwin i ktren uqbel, ẓeṛ [[Special:FileList|umuɣ n tugniwin]]. Taktert tella daɣen deg [[Special:Log/upload|aɣmis n taktert n ifuyla]], dɣa inuzal deg [[Special:Log/delete|aɣmis n inuzal]].
 
@@ -1405,6 +1435,10 @@ Akken ad tessekcmeḍ afaylu deg usebter, seqdec azay am wagi
 'filetype-mime-mismatch' => 'Asiɣzef n ufaylu « .$1 » ur yesɛa ara tuqqna s tawsit MIME id n-ufa deg ufaylu ($2).',
 'filetype-badmime' => 'Ur tettalaseḍ ara ad tazneḍ ufayluwen n anaw n MIME "$1".',
 'filetype-bad-ie-mime' => 'Afaylu ur yezmer ara ad yetwekter acku yetwaf am « $1 » sɣur Internet Explorer. Tawsit agi d tazanbagt acku d tamihawt.',
+'filetype-unwanted-type' => "'''« .$1 »''' d amasal n ufaylu azanbag.
+Ilaq ad seqdeceḍ {{PLURAL:$3|amasal|imusal}} $2.",
+'filetype-banned-type' => "''' « .$1 » '''mačči d {{PLURAL:$4|amasal yesɛan turagt|imusal yesɛan turagt}}. 
+{{PLURAL:$3|Amasal yesɛan turagt d-wagi :|Imusal yesɛan turagt d-wigi :}} $2.",
 'filetype-missing' => 'Afaylu ur yesɛi ara taseggiwit (am ".jpg").',
 'empty-file' => 'Afaylu id cegɛeḍ d-ilem.',
 'file-too-large' => 'Afaylu id cegɛed d-ameqqṛan aṭas.',
@@ -1423,6 +1457,9 @@ Akken ad tessekcmeḍ afaylu deg usebter, seqdec azay am wagi
 'windows-nonascii-filename' => 'Wiki agi ur yebra ara isemawen n ifuyla s isekkilen usligen.',
 'fileexists' => 'Afaylu s yisem-agi yewǧed yagi, ssenqed <strong>[[:$1]]</strong> ma telliḍ mačči meḍmun akken a t-tbeddleḍ.
 [[$1|thumb]]',
+'filepageexists' => 'Asebter n uglam i ufaylu agi yesnulfad yakan d-agi <strong>[[:$1]]</strong>, maca ulac asebter s isem agi.
+Agzul ad efkeḍ tura ur d yettban ara ɣef asebter n uglam.
+Ma tebɣiḍ ad yeban, ilaq ad beddeleḍ s awfus asebter. [[$1|thumb]]',
 'fileexists-extension' => 'Afaylu s yisem yecban wagi yella : [[$2|thumb]]
 * Isem n ufaylu i tezneḍ: <strong>[[:$1]]</strong>
 * Isem n ufaylu i yellan: <strong>[[:$2]]</strong>
@@ -1440,6 +1477,7 @@ Ma tebɣiḍ ad azeneḍ afaylu inek/inem, ilaq ad uɣaleḍ ar deffir dɣa ad a
 Ma tebɣiḍ ad azeneḍ afaylu inek/inem, ilaq ad uɣaleḍ ar deffir dɣa ad as efkeḍ isem amaynut.
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Afaylu agi d-asleg n {{PLURAL:$1|ufaylu agi|ifuyla agi}} :',
+'file-deleted-duplicate' => 'Afaylu am wagi ([[:$1]]) yetwekkes yakan. Ilaq ad selkeneḍ aɣmis n tukksiwin n ufaylu agi uqbel atid ktereḍ tikkelt nniḍen.',
 'uploadwarning' => 'Aɣtal deg wazan n ufayluwen',
 'uploadwarning-text' => 'Beddel aglam n ufaylu dɣa ɛreḍ tikkelt nniḍen',
 'savefile' => 'Smekti afaylu',
@@ -1463,6 +1501,8 @@ Azdam n ifuyla Java ur yesɛa ara turagt, acku zemren ad zizdewen ikyafen n taɣ
 'upload-options' => 'Tixtiṛiyin n taktert ifuyla',
 'watchthisupload' => 'Ɛass asebter agi',
 'filewasdeleted' => 'Afaylu s yisem-agi yettwazen umbeɛd yettumḥa. Ssenqed $1 qbel ad tazniḍ tikelt nniḍen.',
+'filename-bad-prefix' => "Isem n ufaylu yezwer s '''« $1 »''', wagi d isem i sedgeren s uwurman sɣur timsakenwin tumḍinin.
+Xteṛ isem n ufaylu agelmaw.",
 'upload-success-subj' => 'Azen yekfa',
 'upload-success-msg' => 'Taktert inek/inem seg [$2] yesmures. Af-it d-agi : [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'Ugur n taktert',
@@ -1528,18 +1568,29 @@ Ma yella daɣen anezri, ilaq ad meslaye ḍ s  [[Special:ListUsers/sysop|unedbal
 'lockmanager-fail-svr-release' => 'Ulamek an bru izekṛunen ɣef uqeddac $1.',
 
 # ZipDirectoryReader
+'zip-file-open-error' => 'Yella agul mi d neldi afaylu i senqeden ifuyla zip.',
 'zip-wrong-format' => 'Afaylu agi mačči d afaylu n weɣbaṛ ZIP.',
+'zip-bad' => 'Afaylu agi d afaylu n weɣbaṛ ameggafsu naɣ ur nezmer ara an ɣaṛ deg-es.
+Ur nezmer ara aten selken i taɣellist.',
+'zip-unsupported' => 'Afaylu agi d afaylu n weɣbaṛ i seqdacen tiɣariwin ur yeḥemmel ara MediaWiki.
+Taɣellist ines ur tezmer ara at illi teseklen.',
 
 # Special:UploadStash
 'uploadstash' => 'Tazarkatut n taktert',
+'uploadstash-summary' => 'Asebter agi yetefk addaf i ifuyla yekteren (naɣ yesɛan taktert tanazzalt), maca mazal i beqqeḍen deg wiki. Ifuyla agi mazal id banen, ḥaca i useqdac i tni kteren.',
 'uploadstash-clear' => 'Sfeḍ ifuyla deg tazarkatut',
 'uploadstash-nofiles' => 'Ur tesɛiḍ ara ifuyla deg tazarkatut n taktert',
+'uploadstash-badtoken' => 'Aselkem n tigawt agi yexseṛ, ahat acku tilɣa inek/inem n usulu gweḍent ar tasewti nsent. Ɛreḍ tikkelt nniḍen.',
 'uploadstash-errclear' => 'Asfeḍ n ifuyla yefkad taruẓi',
 'uploadstash-refresh' => 'Mucceḍ umuɣ n ifuyla',
 'invalid-chunk-offset' => 'Tiggit n iɣil ur teɣbel ara',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Addaf yugwi',
+'img-auth-nopathinfo' => 'Yexus BATH_INFU.
+Aqeddac inek/inem ur yeseɣwer ara iwakken ad i ɛeddi talɣut agi.
+Ahat i lḥu  s CGI dɣa ur s-yezmer ara i img_auth.
+Ẓeṛ https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'Abrid yesuteren mačči d akaram n taktert yellan deg tawila.',
 'img-auth-badtitle' => 'Ulamek an ssali azwel i ɣbelen seg « $1 ».',
 'img-auth-nologinnWL' => 'Ur teqqneḍ ara dɣa « $1 » ur yella ara deg umuɣ amellal.',
@@ -1547,6 +1598,9 @@ Ma yella daɣen anezri, ilaq ad meslaye ḍ s  [[Special:ListUsers/sysop|unedbal
 'img-auth-isdir' => 'Tɛerdeḍ ad ldiḍ akaram « $1 ».
 Tzemreḍ kan ad ldiḍ ifuyla.',
 'img-auth-streaming' => 'Taɣuri tamaɣlalt n « $1 ».',
+'img-auth-public' => 'Tasɣent n img_auth.php tella i ubeqqeḍ n ifuyla n yiwen wiki uslig.
+Wiki agi yesɣwer am wiki azayez.
+I taɣellist tameqqṛant, img_auth.php yensa.',
 'img-auth-noread' => 'Aseqdac ur yesɛa ara azref deg taɣuri ɣef « $1 ».',
 'img-auth-bad-query-string' => 'URL tesɛa azrar n tuttra ur i ɣbelen ara.',
 
@@ -1574,6 +1628,8 @@ Tzemreḍ kan ad ldiḍ ifuyla.',
 'upload_source_file' => ' (afaylu deg uselkim inek)',
 
 # Special:ListFiles
+'listfiles-summary' => 'Asebter agi uslig i εemmed ad yefk umu n akkw ifuyla i kteren.
+Ma aseqdac as yernu tastayt, ala ifuyla s lqem taneggarut id yekter aseqdac nni ad beqqeḍen.',
 'listfiles_search_for' => 'Nadi ɣef yisem n tugna:',
 'imgfile' => 'afaylu',
 'listfiles' => 'Umuɣ n tugniwin',
@@ -1625,7 +1681,7 @@ Ahat tebɣiḍ ad beddeleḍ aglam is ɣef [$2 asebter is n uglam].',
 'uploadnewversion-linktext' => 'tazneḍ tasiwelt tamaynut n ufaylu-yagi',
 'shared-repo-from' => 'seg : $1',
 'shared-repo' => 'azadur azduklan',
-'upload-disallowed-here' => 'Ur tzemreḍ ara ad semselsiḍ tugna agi.',
+'upload-disallowed-here' => 'Ur tzemreḍ ara ad semselsiḍ afaylu agi.',
 
 # File reversion
 'filerevert' => 'Erred $1',
@@ -1681,6 +1737,7 @@ Ur tettuḍ ara ad selkeneḍ ma ur llan ara izdayen nniḍen ɣer tilɣatin uqb
 
 # Random redirect
 'randomredirect' => 'Asemmimeḍ menwala',
+'randomredirect-nopages' => 'Ulac asebter n alsanamad deg tallunt n isemawen « $1 ».',
 
 # Statistics
 'statistics' => 'Tisnaddanin',
@@ -1696,6 +1753,11 @@ Ur tettuḍ ara ad selkeneḍ ma ur llan ara izdayen nniḍen ɣer tilɣatin uqb
 'statistics-edits' => 'Ibeddilen n isebtar seg aserkeb n {{SITENAME}}',
 'statistics-edits-average' => 'Amḍan allal n ibeddilen sɣur asebter',
 'statistics-views-total' => 'Iskanen',
+'statistics-views-total-desc' => 'Timuɣliwin n isebtar ur llan ara dɣa d isebtar usligen ur sseddant ara',
+'statistics-views-peredit' => 'Tizra s ubeddel',
+'statistics-users' => '[[Special:ListUsers|Iseqdacen]] i siggezen',
+'statistics-users-active' => 'Iseqdacen urmiden',
+'statistics-users-active-desc' => 'Iseqdacen yesɛan xersum yiwet tigawt seg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}',
 'statistics-mostpopular' => 'isebtar mmeẓren aṭṭas',
 
 'disambiguations' => 'Isebtar yesɛan izdayen ɣer isebtar n tiynisemt',
@@ -1706,6 +1768,9 @@ Asebter yella d asebter n tiynisemt lukan yetseqdac talɣa i qqenen ar [[MediaWi
 
 'doubleredirects' => 'Asemmimeḍ yeḍra snat tikwal',
 'doubleredirectstext' => 'Mkull ajerriḍ yesɛa azday ɣer asmimeḍ amezwaru akk d wis sin, ajerriḍ amezwaru n uḍris n usebter wis sin daɣen, iwumi yefkan asmimeḍ ṣaḥiḥ i yessefk ad sɛan isebtar azday ɣur-s.',
+'double-redirect-fixed-move' => 'Alsanamud agi, ɣef ayed asaḍas [[$1]] yetwebeddel isem, yetawi tura ɣer [[$2]].',
+'double-redirect-fixed-maintenance' => 'Yetseɣtu alsanamud aslag seg [[$1]] ɣer [[$2]].',
+'double-redirect-fixer' => 'Aseɣtay n aslanamud',
 
 'brokenredirects' => 'Isemmimḍen imerẓa',
 'brokenredirectstext' => 'Isemmimḍen-agi sɛan izdayen ar isebtar ulac-iten :',
@@ -1722,10 +1787,13 @@ Asebter yella d asebter n tiynisemt lukan yetseqdac talɣa i qqenen ar [[MediaWi
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte/octet|bytes/octets}}',
 'ncategories' => '$1 {{PLURAL:$1|Taggayt|Taggayin}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|azday|izdayen}}',
 'nmembers' => '$1 {{PLURAL:$1|amaslad|imasladen}}',
 'nrevisions' => '$1 {{PLURAL:$1|tasiwelt|tisiwal}}',
 'nviews' => '$1 {{PLURAL:$1|timeẓriwt|tuẓrin}}',
+'nimagelinks' => 'Yetseqdec ɣef $1 {{PLURAL:$1|asebter|isebtar}}',
+'ntransclusions' => 'yetseqdec ɣef $1 {{PLURAL:$1|asebter|isebtar}}',
 'specialpage-empty' => 'Asebter-agi d ilem.',
 'lonelypages' => 'isebtar igujilen',
 'lonelypagestext' => 'Isebtar agi ur sweṛen, ur llan deg isebtar nniḍen n {{SITENAME}}.',
@@ -1738,7 +1806,10 @@ Asebter yella d asebter n tiynisemt lukan yetseqdac talɣa i qqenen ar [[MediaWi
 'popularpages' => 'Isebtar iɣerfanen',
 'wantedcategories' => 'Taggayin mmebɣant',
 'wantedpages' => 'Isebtar mmebɣan',
+'wantedpages-badtitle' => 'Azwel ur yeɣbel ara deg igmad : $1',
 'wantedfiles' => 'Ifuyla yettwasutren s waṭas.',
+'wantedfiletext-cat' => 'Ifuyla agi tseqdacen, maca ulac iten. Ifuyla n izudar agwemmad zemren ad illin deg umuɣ xas llan. Akkw ufrir imkerku ad <del>yetjerreḍ</del>. Isebtar yesɛan ifuyla ur llan ara, ur d-tebanen ara deg [[:$1]].',
+'wantedfiletext-nocat' => 'Ifuyla agi tseqdacen, maca ulac iten. Ifuyla n izudar agwemmad zemren ad illin deg umuɣ xas llan. Akkw ufrir imkerku ad <del>yetjerreḍ</del>.',
 'wantedtemplates' => 'Talɣiwin yetsuteren',
 'mostlinked' => 'Isebtar myezdin aṭas',
 'mostlinkedcategories' => 'Taggayin myezdint aṭas',
@@ -1820,6 +1891,8 @@ Tzemreḍ ad sageneḍ abeqqeḍ s tixtiṛit n tawsit n uɣmis, isem n useqdac
 'allpages-hide-redirects' => 'Ffer isemmimḍen',
 
 # SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Tetwaliḍ lqem n usebter agi yellan deg tazarkatut, lqem agi yezmer ad i sɛu alama d $1.',
+'cachedspecial-viewing-cached-ts' => 'Tetwaliḍ lqem n usebter agi yellan deg tazarkatut, ahat ur yemucceḍ ara.',
 'cachedspecial-refresh-now' => 'Ẓeṛ aneggaru.',
 
 # Special:Categories
@@ -1829,7 +1902,7 @@ Tzemreḍ ad sageneḍ abeqqeḍ s tixtiṛit n tawsit n uɣmis, isem n useqdac
 Ẓeṛ daɣen [[Special:WantedCategories|taggayin yetwesuteren]].',
 'categoriesfrom' => 'Ssken taggayin seg :',
 'special-categories-sort-count' => 'Afran s amḍan n iferdisen',
-'special-categories-sort-abc' => 'Afran s ugemmay',
+'special-categories-sort-abc' => 'afran s ugemmay',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'Isekcam yemḥan',
@@ -1841,21 +1914,32 @@ Tzemreḍ ad sageneḍ abeqqeḍ s tixtiṛit n tawsit n uɣmis, isem n useqdac
 'linksearch-pat' => 'Anadi n tanfalit :',
 'linksearch-ns' => 'Talluntin n isemawen :',
 'linksearch-ok' => 'Nadi',
+'linksearch-text' => 'Tzemreḍ ad seqdeceḍ isekkilen imeẓliyen am « *.wikipedia.org ».
+Ilaq-asen deg udday taɣult n uswir imineg, am amedya « *.org ».<br />
+Ineggafen imazdayen : <code>$1</code> (ur d-renu acemma deg unadi inek/inem)',
 'linksearch-line' => '$1 yeqqen seg $2',
 
 # Special:ListUsers
 'listusersfrom' => 'Ssken imseqdacen seg:',
 'listusers-submit' => 'Ssken',
 'listusers-noresult' => 'Ur yufi ḥedd (amseqdac).',
+'listusers-blocked' => '(yekyef)',
 
 # Special:ActiveUsers
+'activeusers' => 'Umuɣ n iseqdacen urmiden',
+'activeusers-intro' => 'Wagi d umuɣ n iseqdacen yexedmen armud deg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|abeddel n ussan agi ineggura|ibeddilen n ussan agi ineggura}} deg {{PLURAL:$3|ass aneggaru|$3 ussan ineggura}}',
 'activeusers-from' => 'Ssken iseqdacen seg :',
+'activeusers-hidebots' => 'Ffer iṛubuten',
+'activeusers-hidesysops' => 'Ffer inedbalen',
 'activeusers-noresult' => 'Ur yufi aseqdac.',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Aɣmis n isnulfan n  imiḍanen n imseqdacen',
+'newuserlogpagetext' => 'Asebter agi yebeqqeḍ amezruy n usnulfu n imiḍanen n iseqdacen.',
 
 # Special:ListGroupRights
+'listgrouprights' => 'Izerfan n igrawen n iseqdacen',
 'listgrouprights-group' => 'Agraw',
 'listgrouprights-rights' => 'Izerfan',
 'listgrouprights-helppage' => 'Help:Izerfan n igrawen',
@@ -1928,6 +2012,7 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'unwatch' => 'Fakk aɛassi',
 'unwatchthispage' => 'Fakk aɛassi',
 'notanarticle' => 'Mačči d amagrad',
+'notvisiblerev' => 'Lqem tetwemḥa',
 'watchnochange' => 'Ulaḥedd n yiferdas n wumuɣ n uɛessi inek ma yettubeddel deg tawala i textareḍ.',
 'watchlist-details' => 'ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtaren}} mebla isebtaren "amyannan".',
 'wlheader-enotif' => '* Yeǧǧa Email n talɣut.',
@@ -1943,6 +2028,7 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Ad iɛass...',
 'unwatching' => 'Ad ifukk aɛessi...',
+'watcherrortext' => 'Yella anezri imi tebeddeleḍ iɣewwaren n umuɣ inek/inem n uɛassi i « $1 ».',
 
 'enotif_mailer' => 'Email n talɣut n {{SITENAME}}',
 'enotif_reset' => 'Rcem akk isebtar mmeẓren',
@@ -1953,6 +2039,7 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'enotif_subject' => 'Asebter $PAGETITLE n {{SITENAME}} $CHANGEDORCREATED sɣur $PAGEEDITOR',
 'enotif_lastvisited' => 'Ẓer $1 i akk ibeddlen segwasmi tkecmeḍ tikelt taneggarut.',
 'enotif_lastdiff' => 'Ẓer $1 akken ad tmuqleḍ abeddel.',
+'enotif_anon_editor' => 'aseqdac ur i siggezen ara $1',
 'enotif_body' => 'Ay $WATCHINGUSERNAME,
 
 Asebter « $PAGETITLE » n {{SITENAME}} $CHANGEDORCREATED ass n $PAGEEDITDATE sɣur « $PAGEEDITOR », ẓeṛ $PAGETITLE_URL iwakken ad ẓṛeḍ lqem n tura.
@@ -2007,14 +2094,18 @@ Tuɣalin d tadhelt :
 'delete-edit-reasonlist' => 'Beddel tiɣẓinin n umḥu n usebter',
 
 # Rollback
+'rollback' => 'Semmet ibeddilen',
 'rollback_short' => 'Semmet',
 'rollbacklink' => 'semmet',
 'rollbacklinkcount' => 'semmet $1 {{PLURAL:$1|abeddel|ibeddilen}}',
+'rollbacklinkcount-morethan' => 'semmet ugar n $1 {{PLURAL:$1|abeddel|ibeddilen}}',
+'rollbackfailed' => 'Asemmet yexseṛ',
 'cantrollback' => 'Ur yezmir ara ad yessuɣal; yella yiwen kan amseqdac iwumi ibeddel/yexleq asebter-agi.',
 'editcomment' => "Agzul n ubeddel yella: \"''\$1''\".",
 'revertpage' => 'Yessuɣal ibeddlen n [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]]); yettubeddel ɣer tasiwelt taneggarut n [[User:$1|$1]]',
 
 # Edit tokens
+'sessionfailure-title' => 'Anezri n tɣimit',
 'sessionfailure' => 'Yella ugul akk d takmect inek;
 Axdam-agi yebṭel axaṭer waqila yella wemdan nniḍen i yeddem isem n wemseqdac inek.
 G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek, umbeɛd wekki ɣef "Actualiser/reload" akk ad tɛerḍeḍ tikelt nniḍen.',
@@ -2022,28 +2113,50 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 # Protect
 'protectlogpage' => 'Aɣmis n wemḥay',
 'protectedarticle' => '"[[$1]]" yettwaḥrez',
-'protect-title' => 'Ad yeḥrez "$1"',
+'modifiedarticleprotection' => 'yebeddel aswir n usegdel n « [[$1]] »',
+'unprotectedarticle' => 'yekkes asegdel n « [[$1]] »',
+'movedarticleprotection' => 'yesiweḍ iɣewwaren n usegdel seg « [[$2]] » ɣer « [[$1]] »',
+'protect-title' => 'Beddel aswir n usegdel i "$1"',
+'protect-title-notallowed' => 'Ẓeṛ aswir n usegdel n « $1 »',
 'prot_1movedto2' => '[[$1]] yettusmimeḍ ar [[$2]]',
+'protect-badnamespace-title' => 'Tallunt n isemawen ur nezmer ara an segdel',
+'protect-badnamespace-text' => 'Isebtar deg tallunt agi n isemawen ur zemren ara ad sɛun asegdel.',
 'protect-legend' => 'Sentem tiḥḥerzi',
 'protectcomment' => 'Taɣẓint :',
+'protectexpiry' => 'Azmez n tasewti :',
+'protect_expiry_invalid' => 'Azmez n tasewti ur yeɣbel ara.',
+'protect_expiry_old' => 'Azmez n tasewti i ɛedda.',
+'protect-unchain-permissions' => 'Kkes aseḍru i aṭas n tixtiṛiyin n usegdel',
 'protect-default' => '(ameslugen)',
+'protect-fallback' => 'Yeḥweǧ atrug « $1 »',
 'protect-level-sysop' => 'Inedbalen kan',
 'protect-summary-cascade' => 'acercur',
 'protect-expiring' => 'yemmut deg $1 (UTC)',
+'protect-expiring-local' => 'ad i neffeṛ ass n $1',
+'protect-expiry-indefinite' => 'ifeḍ',
+'protect-othertime' => 'Azmez nniḍen n tasewti :',
+'protect-othertime-op' => 'azmez nniḍen n tasewti',
+'protect-existing-expiry' => 'Yella azmez n tasewti : $2 af $3',
 'protect-otherreason' => 'Taɣẓint nniḍen / taɣzint tamarnant :',
 'protect-otherreason-op' => 'Taɣẓint nniḍen',
 'protect-edit-reasonlist' => 'Beddel tiɣẓinin n usegdel',
 'protect-expiry-options' => '1 asrag:1 hour,1 ass:1 day,1 imalas:1 week,2 imalasen:2 weeks,1 aggur:1 month,3 agguren:3 months,6 agguren:6 months,1 assegwas:1 year,adfi:infinite',
 'restriction-type' => 'Turagt',
+'restriction-level' => 'Aswir n ukrif :',
 'minimum-size' => 'Tiddi minimum',
+'maximum-size' => 'Tiddi tafellayt',
+'pagesize' => '(atamḍan)',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Beddel',
 'restriction-move' => 'Smimeḍ',
 'restriction-create' => 'Snulfu',
+'restriction-upload' => 'Taktert n ifuyla',
 
 # Restriction levels
+'restriction-level-sysop' => 'asegdel ummid',
 'restriction-level-autoconfirmed' => 'adu-asegdel',
+'restriction-level-all' => 'akkw aswir',
 
 # Undelete
 'undelete' => 'Ẓer isebtar yettumḥan',
@@ -2051,14 +2164,19 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 'undeletepagetitle' => "'''Umuɣ agi yesɛa ileqman yetwekkesen n [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Ẓer isebtar yettumḥan',
 'undelete-fieldset-title' => 'Erred ileqman',
+'undeleterevisions' => '$1 {{PLURAL:$1|lqem i ɣbeṛen|ileqman i ɣbeṛen}}',
 'undeletelink' => 'ẓeṛ/uɣaled',
 'undeleteviewlink' => 'ẓeṛ',
+'undeleteinvert' => 'Snegdam ayen textareḍ',
 'undeletecomment' => 'Taɣẓint :',
 'undelete-header' => 'Ẓer [[Special:Log/delete|aɣmis n umḥay]] i isebtar ttumḥan tura.',
+'undelete-search-title' => 'Nadi ɣef isebtar yettumḥan',
 'undelete-search-box' => 'Nadi ɣef isebtar yettumḥan',
 'undelete-search-prefix' => 'Ssken isebtar i yebdan s:',
 'undelete-search-submit' => 'Nadi',
 'undelete-no-results' => 'Ur yufi ara ulaḥedd n wawalen i tnadiḍ ɣef isebtar deg iɣbaren.',
+'undelete-show-file-confirm' => 'Tebɣriḍ ad ẓṛeḍ lqem yemḥan n ufaylu « <nowiki>$1</nowiki> » n $2 af $3 ?',
+'undelete-show-file-submit' => 'Ih',
 
 # Namespace form on various pages
 'namespace' => 'Talluntin n isemawen :',
@@ -2078,10 +2196,15 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 'sp-contributions-newbies' => 'Ssken tikkin n yimseqdacen imaynuten kan',
 'sp-contributions-newbies-sub' => 'I yisem yimseqdacen imaynuten',
 'sp-contributions-blocklog' => 'Aɣmis n uɛeṭṭil',
+'sp-contributions-deleted' => 'isekcam yemḥan',
 'sp-contributions-uploads' => 'izdamen',
 'sp-contributions-logs' => 'iɣmisen',
 'sp-contributions-talk' => 'Mmeslay',
 'sp-contributions-userrights' => 'Laɛej iserfan n umseqdac',
+'sp-contributions-blocked-notice' => 'Aseqdac agi yekyef.
+Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
+'sp-contributions-blocked-notice-anon' => 'Tansa IP agi tekyef.
+Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
 'sp-contributions-search' => 'Nadi i tikkin',
 'sp-contributions-username' => 'Tansa IP neɣ isem n wemseqdac:',
 'sp-contributions-toponly' => 'Sekned kan imagraden i beddeleɣ nekk d-aneggaru',
@@ -2107,7 +2230,10 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 'whatlinkshere-filters' => 'Tistaytin',
 
 # Block/unblock
-'blockip' => 'Ɛekkel amseqdac',
+'block' => 'Ɛekkel aseqdac',
+'blockip' => 'Ɛekkel aseqdac',
+'blockip-title' => 'Ɛekkel aseqdac',
+'blockip-legend' => 'Ɛekkel aseqdac',
 'ipadressorusername' => 'Tansa IP neɣ isem n wemseqdac',
 'ipbreason' => 'Ayɣer',
 'ipbsubmit' => 'Ɛekkel amseqdac-agi',
@@ -2206,6 +2332,10 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'export-submit' => 'Ssufeɣ',
 'export-addcattext' => 'Rnu isebtar seg taggayt:',
 'export-addcat' => 'Rnu',
+'export-addnstext' => 'Rnu isebtar deg tallunt n isemawen :',
+'export-addns' => 'Rnu',
+'export-download' => 'Ḥrez deg ufaylu',
+'export-templates' => 'Sekcem tiɣlatin',
 
 # Namespace 8 related
 'allmessages' => 'Izen n system',
@@ -2215,6 +2345,11 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'allmessagestext' => 'Wagi d-umuɣ n inzan yestufan deg tallunt MediaWiki.
 Ẓeṛ [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] dɣa [//translatewiki.net translatewiki.net] ma tebɣiḍ ad ɛiweneḍ i usideg imcettel n MediaWiki.',
 'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' ut yezmir ara ad yettuseqdac axaṭer '''\$wgUseDatabaseMessages''' yettwakkes.",
+'allmessages-filter-legend' => 'Tastayt',
+'allmessages-filter-unmodified' => 'Ur yebeqqeḍ ara',
+'allmessages-filter-all' => 'Akkw',
+'allmessages-filter-modified' => 'Yebeddel',
+'allmessages-prefix' => 'Tastayt s adat :',
 'allmessages-language' => 'Tutlayt :',
 'allmessages-filter-submit' => 'Ruḥ',
 
@@ -2222,6 +2357,7 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'thumbnail-more' => 'Ssemɣer',
 'filemissing' => 'Afaylu ulac-it',
 'thumbnail_error' => 'Agul asmi yexleq tugna tamecṭuḥt: $1',
+'djvu_page_error' => 'Asebter DjVu yeffeɣ seg tilisa',
 
 # Special:Import
 'import' => 'Ssekcem isebtar',
index 3bd73b1..8e1f306 100644 (file)
@@ -520,7 +520,6 @@ $messages = array(
 'qbbrowse' => 'شولۋ',
 'qbedit' => 'وڭدەۋ',
 'qbpageoptions' => 'بۇل بەت',
-'qbpageinfo' => 'اينالا',
 'qbmyoptions' => 'بەتتەرىم',
 'qbspecialpages' => 'ارنايى بەتتەر',
 'faq' => 'ٴجىيى قويىلعان ساۋالدار',
index 39fd628..2d4042f 100644 (file)
@@ -503,7 +503,6 @@ $messages = array(
 'qbbrowse' => 'Шолу',
 'qbedit' => 'Өңдеу',
 'qbpageoptions' => 'Бұл бет',
-'qbpageinfo' => 'Айнала',
 'qbmyoptions' => 'Беттерім',
 'qbspecialpages' => 'Арнайы беттер',
 'faq' => 'Жиі қойылған сауалдар',
index 9c26f06..9c491d9 100644 (file)
@@ -483,7 +483,6 @@ $messages = array(
 'qbbrowse' => 'Şolw',
 'qbedit' => 'Öñdew',
 'qbpageoptions' => 'Bul bet',
-'qbpageinfo' => 'Aýnala',
 'qbmyoptions' => 'Betterim',
 'qbspecialpages' => 'Arnaýı better',
 'faq' => 'Jïi qoýılğan sawaldar',
index 7f53780..77898c1 100644 (file)
@@ -406,7 +406,6 @@ $messages = array(
 'qbbrowse' => 'រាវរក',
 'qbedit' => 'កែប្រែ',
 'qbpageoptions' => 'ទំព័រនេះ',
-'qbpageinfo' => 'ព័ត៌មានទំព័រ',
 'qbmyoptions' => 'ទំព័ររបស់ខ្ញុំ',
 'qbspecialpages' => 'ទំព័រពិសេសៗ',
 'faq' => 'សំណួរដែលសួរញឹកញាប់',
index de43d34..d0edf3a 100644 (file)
@@ -206,7 +206,6 @@ $messages = array(
 'qbbrowse' => 'ವಿಹರಿಸು',
 'qbedit' => 'ಸಂಪಾದಿಸು',
 'qbpageoptions' => 'ಈ ಪುಟ',
-'qbpageinfo' => 'ಸನ್ನಿವೇಶ',
 'qbmyoptions' => 'ನನ್ನ ಪುಟಗಳು',
 'qbspecialpages' => 'ವಿಶೇಷ ಪುಟಗಳು',
 'faq' => 'ಸಾಮಾನ್ಯವಾಗಿ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು',
@@ -459,6 +458,7 @@ $2',
 'createaccount' => 'ಹೊಸ ಖಾತೆ ತೆರೆಯಿರಿ',
 'gotaccount' => "ಈಗಾಗಲೇ ಖಾತೆಯಿದೆಯೇ? '''$1'''.",
 'gotaccountlink' => 'ಲಾಗ್ ಇನ್',
+'userlogin-resetlink' => 'ನಿಮ್ಮ ಲಾಗಿನ್ ವಿವರಗಳನ್ನು ಮರೆತಿದ್ದೀರಾ?',
 'createaccountmail' => 'ಇ-ಅಂಚೆಯ ಮೂಲಕ',
 'createaccountreason' => 'ಕಾರಣ:',
 'badretype' => 'ನೀವು ಕೊಟ್ಟ ಪ್ರವೇಶಪದಗಳು ಬೇರೆಬೇರೆಯಾಗಿವೆ.',
@@ -825,6 +825,7 @@ $2',
 'nextn-title' => 'ಮುಂದಿನ $1 {{PLURAL:$1|ಫಲಿತಾಂಶ|ಫಲಿತಾಂಶಗಳು}}',
 'shown-title' => 'ಪ್ರತಿ ಪುಟದಲ್ಲಿಯೂ $1 {{PLURAL:$1|result|results}} ತೋರಿಸು',
 'viewprevnext' => 'ವೀಕ್ಷಿಸು ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''\"[[:\$1]]\" ಹೆಸರಿನ ಪುಟ ಈ ವಿಕಿಯಲ್ಲಿದೆ.'''",
 'searchmenu-new' => "'''''[[:$1]]'' ಪುಟವನ್ನು ಈ ವಿಕಿಯಲ್ಲಿ ಸೃಷ್ಟಿಸಿ!'''",
 'searchhelp-url' => 'Help:ಪರಿವಿಡಿ',
 'searchprofile-articles' => 'ಲೇಖನ ಪುಟ',
@@ -1029,7 +1030,10 @@ $2',
 'recentchanges-legend' => 'ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳ ಆಯ್ಕೆಗಳು',
 'recentchanges-summary' => 'ವಿಕಿಗೆ ಮಾಡಲ್ಪಟ್ಟ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳನ್ನು ಈ ಪುಟದಲ್ಲಿ ನೀವು ಕಾಣಬಹುದು.',
 'recentchanges-feed-description' => 'ವಿಕಿಯಲ್ಲಿ ಆಗುವ ಹೊಸ ಬದಲಾವಣೆಗಳ ಮೇಲೆ ನಿಗ ಇಡಲು ಉಪಯೋಗವಾಗುವ ಫೀಡು.',
+'recentchanges-label-newpage' => 'ಈ ಸಂಪಾದನೆ ಹೊಸ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಿದೆ',
 'recentchanges-label-minor' => 'ಇದು ಚುಟುಕಾದ ಬದಲಾವಣೆ',
+'recentchanges-label-bot' => 'ಈ ಸಂಪಾದನೆಯನ್ನು ಒಂದು ಬಾಟ್ ಮಾಡಿದೆ',
+'recentchanges-label-unpatrolled' => 'ಈ ಸಂಪಾದನೆಯನ್ನು ಇನ್ನೂ ಪರೀಕ್ಷೆಗೆ ಒಳಪಡಿಸಿಲ್ಲ',
 'rcnote' => "$5, $4 ವರೆಗೆ ಹಿಂದಿನ {{PLURAL:$2|ದಿನದಲ್ಲಿ|'''$2''' ದಿನಗಳಲ್ಲಿ}} ಮಾಡಲಾಗಿರುವ {{PLURAL:$1|'''೧''' ಬದಲಾವಣೆ|'''$1''' ಬದಲಾವಣೆಗಳು}} ಕೆಳಗಿವೆ.",
 'rcnotefrom' => "'''$2''' ಇಂದ ಆಗಿರುವ ಬದಲಾವಣೆಗಳು ಕೆಳಗಿವೆ (ಕೊನೆಯ '''$1'''ರವರೆಗೆ ತೋರಿಸಲಾಗಿದೆ).",
 'rclistfrom' => '$1 ಇಂದ ಪ್ರಾರಂಭಿಸಿ ಮಾಡಲಾದ ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಿ',
@@ -1152,6 +1156,7 @@ $2',
 ಈ URL ಸರಿಯಿದೆ ಮತ್ತು ಆ ತಾಣ ಕಾರ್ಯ ಮಾಡುತ್ತಿದೆ ಎಂದು ಮತ್ತೊಮ್ಮೆ ಪರೀಕ್ಷಿಸಿ.',
 'upload-curl-error28' => 'ಅಪ್ಲೋಡ್ ಕಾಲಾವಧಿ ಮೀರಿದೆ',
 
+'license' => 'ಪರವಾನಗಿ:',
 'license-header' => 'ಪರವಾನಗಿ',
 'upload_source_url' => ' (ಒಂದು ಮನ್ನಿತ, ಸಾರ್ವಜನಿಕವಾಗಿ ಎಟಕುವ URL)',
 'upload_source_file' => ' (ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿರುವ ಒಂದು ಫೈಲು)',
@@ -1357,6 +1362,7 @@ $2',
 'linksearch' => 'ಹೊರಗಿನ ಸಂಪರ್ಕಗಳು',
 'linksearch-ns' => 'ನಾಮವರ್ಗ:',
 'linksearch-ok' => 'ಹುಡುಕು',
+'linksearch-line' => '$1 ನ್ನು $2 ರಿಂದ ಜೋಡಿಸಲಾಗಿದೆ',
 
 # Special:ListUsers
 'listusersfrom' => 'ಇದರಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಬಳಕೆದಾರರನ್ನು ತೋರಿಸು:',
@@ -1399,6 +1405,7 @@ $2',
 # Watchlist
 'watchlist' => 'ವೀಕ್ಷಣಾ ಪಟ್ಟಿ',
 'mywatchlist' => 'ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿ',
+'watchlistfor2' => '$1 ($2) ಗೆ',
 'nowatchlist' => 'ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ ಯಾವುದೇ ಪುಟಗಳಿಲ್ಲ',
 'watchlistanontext' => 'ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯನ್ನು ನೋಡಲು ಅಥವ ಸಂಪಾದಿಸಲು ದಯವಿಟ್ಟು $1 ಮಾಡಿ.',
 'watchnologin' => 'ಲಾಗಿನ್ ಆಗಿಲ್ಲ',
@@ -1442,6 +1449,7 @@ $2',
 'confirmdeletetext' => 'ಒಂದು ಪುಟವನ್ನು ಮತ್ತು ಅದರ ಸಂಪೂರ್ಣ ಇತಿಹಾಸವನ್ನು ನೀವು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಿಹಾಕುತ್ತಿರುವಿರಿ.
 ಇದನ್ನು ನೀವು ಮಾಡಬಯಸುವಿರಿ, ಇದರ ಪರಿಣಾಮಗಳನ್ನು ಬಲ್ಲಿರಿ, ಮತ್ತು [[{{MediaWiki:Policy-url}}|ಕಾರ್ಯನೀತಿಗಳ]] ಅನುಸಾರ ಇದನ್ನು ಮಾಡುತ್ತಿದ್ದೀರಿ ಎಂದು ದೃಢಪಡಿಸಿ.',
 'actioncomplete' => 'ಕಾರ್ಯ ಸಂಪೂರ್ಣ',
+'actionfailed' => 'ಕ್ರಿಯೆ ವಿಫಲವಾಗಿದೆ',
 'deletedtext' => '"$1" ಅನ್ನು ಅಳಿಸಲಾಯಿತು.
 ಇತ್ತೀಚೆಗಿನ ಅಳಿಸುವಿಕೆಗಳ ಪಟ್ಟಿಗಾಗಿ $2 ಅನ್ನು ನೋಡಿ.',
 'dellogpage' => 'ಅಳಿಸುವಿಕೆ ದಾಖಲೆ',
@@ -1542,11 +1550,13 @@ $2',
 'sp-contributions-newbies' => 'ಹೊಸ ಖಾತೆಗಳ ಕಾಣಿಕೆಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು',
 'sp-contributions-newbies-sub' => 'ಹೊಸ ಖಾತೆಗಳಿಗೆ',
 'sp-contributions-blocklog' => 'ತಡೆಹಿಡಿಯುವಿಕೆ ದಾಖಲೆ',
+'sp-contributions-uploads' => 'ಅಪ್ಲೋಡುಗಳು',
 'sp-contributions-logs' => 'ದಾಖಲೆಗಳು',
 'sp-contributions-talk' => 'ಚರ್ಚೆ',
 'sp-contributions-userrights' => 'ಬಳಕೆದಾರ ಹಕ್ಕುಗಳ ನಿರ್ವಹಣೆ',
 'sp-contributions-search' => 'ಸಂಪಾದನೆಗಳನ್ನು ಹುಡುಕು',
 'sp-contributions-username' => 'IP ವಿಳಾಸ ಅಥವ ಬಳಕೆಯ ಹೆಸರು:',
+'sp-contributions-toponly' => 'ಕೇವಲ ಇತ್ತೀಚಿನ ಪರಿಷ್ಕರಣೆಗೆ ಸಂಬಂಧಿಸಿದ ಸಂಪಾದನೆಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು',
 'sp-contributions-submit' => 'ಹುಡುಕು',
 
 # What links here
@@ -1565,6 +1575,7 @@ $2',
 'whatlinkshere-hideredirs' => '$1 ಪುನರ್ನಿರ್ದೇಶನಗಳು',
 'whatlinkshere-hidetrans' => '$1 ಸೇರಿಸುವಿಕೆಗಳು',
 'whatlinkshere-hidelinks' => '$1 ಕೊಂಡಿಗಳು',
+'whatlinkshere-hideimages' => '$1 ಚಿತ್ರ ಕೊಂಡಿಗಳು',
 'whatlinkshere-filters' => 'ಶೋಧಕಗಳು',
 
 # Block/unblock
@@ -1847,15 +1858,15 @@ $1',
 'metadata-collapse' => 'ವಿಸ್ತಾರವಾದ ವಿವರಗಳನ್ನು ಅಡಗಿಸು',
 'metadata-fields' => 'ಈ ಸಂದೇಶದಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡಲಾಗಿರುವ EXIF ಮೇಲ್ದರ್ಜೆ ಮಾಹಿತಿ ಚಿತ್ರ ಪುಟದಲ್ಲಿ ಸೇರಿಸಲಾಗುತ್ತದೆ. ಪುಟದಲ್ಲಿ ಮೇಲ್ದರ್ಜೆ ಮಾಹಿತಿ ಪಟ್ಟಿಯನ್ನು ತೆರೆದಾಗ ಇವು ಕಾಣುತ್ತದೆ.
 ಉಳಿದವುಗಳು ಮೂಲಸ್ಥಿತಿಯಲ್ಲಿ ಅಗೋಚರವಾಗಿರುತ್ತವೆ.
-* ಸೃಷ್ಟಿ
-* ಮಾದರಿ
-* ಮೂಲಸಮಯದಿನಾಂಕ
-* ಅನಾವರಣಸಮಯ
+* make
+* model
+* datetimeoriginal
+* exposuretime
 * fnumber
 * isospeedratings
 * focallength
-* ಕಲಾವಿದ
-* ಕೃತಿಸ್ವಾಮ್ಯ
+* artist
+* copyright
 * imagedescription
 * gpslatitude
 * gpslongitude
index 8c134a2..8bd46c0 100644 (file)
@@ -489,7 +489,6 @@ $messages = array(
 'qbbrowse' => '탐색',
 'qbedit' => '편집',
 'qbpageoptions' => '문서 기능',
-'qbpageinfo' => '문서 정보',
 'qbmyoptions' => '내 사용자 문서',
 'qbspecialpages' => '특수 문서',
 'faq' => '자주 묻는 질문',
@@ -522,7 +521,7 @@ $messages = array(
 'searcharticle' => '가기',
 'history' => '문서 역사',
 'history_short' => '역사',
-'updatedmarker' => '마지막으로 읽은 뒤 바뀌었음',
+'updatedmarker' => '마지막으로 방문한 뒤 바뀜',
 'printableversion' => '인쇄용 문서',
 'permalink' => '고유링크',
 'print' => '인쇄',
@@ -731,7 +730,7 @@ URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니
 이 문서에 있는 내용을 바꾸면 이 위키에 있는 모든 사용자에게 영향을 끼칩니다.
 모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하시기 바랍니다.",
 'sqlhidden' => '(SQL 쿼리 숨겨짐)',
-'cascadeprotected' => '이 문서는 연쇄 보호가 걸린 {{PLURAL:$1|문서}}에 포함되어 있어 함께 보호됩니다. 연쇄 보호된 문서:
+'cascadeprotected' => '이 문서는 다음 "연쇄적" 보호가 걸린 {{PLURAL:$1|문서}}에 포함되어 있어 함께 보호됩니다:
 $2',
 'namespaceprotected' => "'''$1''' 이름공간을 편집할 수 있는 권한이 없습니다.",
 'customcssprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 CSS 문서를 편집할 수 없습니다.',
@@ -2076,7 +2075,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'shared-repo' => '공용 저장소',
 'shared-repo-name-wikimediacommons' => '위키미디어 공용',
 'filepage.css' => '/* 이 CSS 설정은 파일 설명 문서에 포함되며, 또한 해외 클라이언트 위키에 포함됩니다 */',
-'upload-disallowed-here' => 'ì£\84ì\86¡í\95\98ì§\80ë§\8c ì\9d´ ê·¸ë¦¼ì\9d\84 ë\8d®ì\96´ 쓸 수 없습니다.',
+'upload-disallowed-here' => 'ì\9d´ í\8c\8cì\9d¼ì\9d\84 ë\8d®ì\96´쓸 수 없습니다.',
 
 # File reversion
 'filerevert' => '$1 되돌리기',
@@ -3209,6 +3208,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 # Info page
 'pageinfo-title' => '"$1" 문서에 대한 정보',
+'pageinfo-not-current' => '정보는 현재 판만을 보여줄 수 있습니다.',
 'pageinfo-header-basic' => '기본 정보',
 'pageinfo-header-edits' => '편집 역사',
 'pageinfo-header-restrictions' => '문서 보호',
@@ -3232,12 +3232,19 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'pageinfo-lasttime' => '최근 편집 날짜',
 'pageinfo-edits' => '총 편집 수',
 'pageinfo-authors' => '총 서로 다른 편집자 수',
-'pageinfo-recent-edits' => '최근 편집 수 (지난 $1 이내)',
+'pageinfo-recent-edits' => '최근 편집 수 (지난 $1 이내)',
 'pageinfo-recent-authors' => '최근 기여자 수',
 'pageinfo-magic-words' => '매직 {{PLURAL:$1|워드}} ($1개)',
 'pageinfo-hidden-categories' => '숨은 {{PLURAL:$1|분류}} ($1개)',
 'pageinfo-templates' => '포함한 {{PLURAL:$1|틀}} ($1개)',
 'pageinfo-toolboxlink' => '문서 정보',
+'pageinfo-redirectsto' => '넘겨주기 대상',
+'pageinfo-redirectsto-info' => '정보',
+'pageinfo-contentpage' => '내용 문서로 집계',
+'pageinfo-contentpage-yes' => '예',
+'pageinfo-protect-cascading' => '여기서의 연쇄적 보호',
+'pageinfo-protect-cascading-yes' => '예',
+'pageinfo-protect-cascading-from' => '연쇄적 보호한 기점',
 
 # Skin names
 'skinname-standard' => '클래식',
index acfa367..6ba2d82 100644 (file)
@@ -184,7 +184,6 @@ $messages = array(
 'qbbrowse' => 'Къарау',
 'qbedit' => 'Тюрлендир',
 'qbpageoptions' => 'Бу бет',
-'qbpageinfo' => 'Бетни юсюнден',
 'qbmyoptions' => 'Бетлерим',
 'qbspecialpages' => 'Къуллукъчу бетле',
 'faq' => 'FAQ',
index 51f588d..d38342d 100644 (file)
@@ -356,7 +356,6 @@ $messages = array(
 'qbbrowse' => 'Aanluure',
 'qbedit' => 'Ändere',
 'qbpageoptions' => 'Sigge Enstellunge',
-'qbpageinfo' => 'Üvver de Sigg',
 'qbmyoptions' => 'Ming Sigge',
 'qbspecialpages' => 'Spezial Sigge',
 'faq' => 'FAQ',
@@ -1092,6 +1091,15 @@ Ene Jrond weße mer nit.',
 'edit-no-change' => 'Do häs ja nix aan dä Sigg jeändert, do dom_mer och nix domet.',
 'edit-already-exists' => 'Kunnt kei neu Sigg aanlääje. Di Sigg jidd_et ald.',
 'defaultmessagetext' => 'Dä standaadmäßije Tex',
+'content-failed-to-parse' => 'Et wohr nit müjjelesch, dä Enhalld met däm <i lang="en">MIME-Typ</i> $2 för en Dattei met $1 dren ze verwooschte: $3.',
+'invalid-content-data' => 'Di Daate en dä Sigg sen onjöltesch.',
+'content-not-allowed-here' => 'Ene Enhalld vun dä Zoot „$1“ es op dä Sigg „[[$2]]“ nit zohjelohße.',
+
+# Content models
+'content-model-wikitext' => 'Wikitäx',
+'content-model-text' => 'Eijnfache Tex',
+'content-model-javascript' => 'JavaSkrepp',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Opjepaß:''' Die Sigg heh määt zovill Opwand met Paaser-Funkßjohne.
@@ -1902,7 +1910,7 @@ Als Jrond es aanjejovve: „$2“',
 'backend-fail-internal' => 'Ene onklohre Fähler es opjetrodde met däm Schpeischersysteem „$1“.',
 'backend-fail-contenttype' => 'Mer kunnte de Zoot Enhalt nit eruß krijje, di en dä Dattei „$1“ faßjehallde wääde sull.',
 'backend-fail-batchsize' => 'Dat Schpeischersysteem hät ene Pöngel met {{PLURAL:$1|einem Befähl|$1 Befähle|keinem Befähl}} krääje, ävver et kann bloß {{PLURAL:$2|eine Befähl|$2 Befähle|keine Befähl}} op eijmohl.',
-'backend-fail-usable' => 'Mer kunnte di Dattei $1 nit schrieve, weil e Verzeischnes udder ene container fählt, udder et Rääsch, dren ze schrieve.',
+'backend-fail-usable' => 'Mer kunnte di Dattei $1 nit lässe udder schrieve, weil e Verzeischnes udder ene container fählt, udder et Rääsch, dren ze lässe udder ze schrieve.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Mer kunnte kein Verbendong opnämme met dä Daatebangk för et Logbooch vum Schpeischersysteem „$1“.',
@@ -2038,7 +2046,7 @@ Velleisch sullts De dä [$2 Täx övver se doh]  aanpasse.',
 'shared-repo-from' => 'uß $1',
 'shared-repo' => 'ene jemeinsame Beshtand',
 'filepage.css' => '/* Heh dat CSS küdd op Sigge övver Dateije, och di vun ander Wikis jehollt woode sin. */',
-'upload-disallowed-here' => 'Onjlöklescherwies kanns De heh dat Beld nit övverschriive.',
+'upload-disallowed-here' => 'Do kanns heh di Dattei nit övverschriive.',
 
 # File reversion
 'filerevert' => '„$1“ zerök holle',
@@ -2621,7 +2629,7 @@ Versione för die neu Sigg enjerich. Die neu Sigg weed nit ersetz.',
 'undeletedrevisions' => '{{PLURAL:$1|ein Version|$1 Versione}} zeröckjehollt',
 'undeletedrevisions-files' => 'Zesammejenomme {{PLURAL:$1|Ein Version|<strong>$1</strong> Versione|<strong>Kein</strong> Version}} vun {{PLURAL:$2|eine Datei|<strong>$2</strong> Dateie|<strong>nix</strong>}} zeröckjehollt',
 'undeletedfiles' => '{{PLURAL:$1|Ein Datei|<strong>$1</strong> Dateie|<strong>Kein</strong> Dateie}} zeröckjehollt',
-'cannotundelete' => '<strong>Dä.</strong> Dat Zeröckholle jing donevve. Mach sinn, dat ene andere Metmaacher flöcker wor, un et ald et eets jedon hät, un jetz es die Sigg ald widder do jewäse.',
+'cannotundelete' => '<strong>Dä.</strong> Et Zeröckholle jing donevve. Maach sinn, dat ene andere Metmaacher flöcker wor, un et et eets jedon hät, un jetz es die Sigg ald widder do jewäse.',
 'undeletedpage' => '<strong>De Sigg „$1“ es jetz widder do</strong>
 Luur Der et [[Special:Log/delete|Logboch met de fottjeschmesse Sigge]] aan, do häs De de Neuste fottjeschmesse
 un widder herjehollte Sigge.',
@@ -2934,6 +2942,7 @@ Di Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg 
 'immobile-target-namespace-iw' => 'Ene Ingerwikilink es nix, woh mer en Sigg hen ömnenne künnt!',
 'immobile-source-page' => 'Di Sigg kann nit ömjenannt wääde.',
 'immobile-target-page' => 'Op dä Tittel kann kei Sigg ömjenannt wääde.',
+'bad-target-model' => 'De Zielsigg moß uß en ander Zoot Daate beschtonn, un vun „$1“ noh „$2“ künne mer nit ömwandele.',
 'imagenocrossnamespace' => 'Dateije kam_mer nor in et Appachtemang „{{ns:file}}“ donn, noh woanders hen kam_mer se och nit ömnemme!',
 'nonfile-cannot-move-to-file' => 'Mer kann nix uußer Datteije esu ömnänne, dat et em Appachtemang „{{ns:file}}“ landt',
 'imagetypemismatch' => 'De neu Datei-Endong moß met däm Datei-Tüp zesamme passe',
@@ -3204,6 +3213,7 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 
 # Info page
 'pageinfo-title' => 'Övver di Sigg: „$1“',
+'pageinfo-not-current' => 'Esu en Aanjaabe künne mer bloß övver de Neuste Version vun dä Sigg maache.',
 'pageinfo-header-basic' => 'Jrundlääje Aanjabe',
 'pageinfo-header-edits' => 'De Änderonge',
 'pageinfo-header-restrictions' => 'Siggeschoz',
@@ -3232,6 +3242,13 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Ein verstoche Saachjropp|$1 verstoche Saachjroppe|Kein verstoche Saachjropp}}',
 'pageinfo-templates' => '{{PLURAL:$1|Ein Schablohn|$1 Schablohne|Kein Schablohn}} opjerohfe',
 'pageinfo-toolboxlink' => 'Övver heh di Sigg',
+'pageinfo-redirectsto' => 'Leidt öm op',
+'pageinfo-redirectsto-info' => 'Aanjaabe övver di Sigg',
+'pageinfo-contentpage' => 'Zällt als en Sigg vom Enhalld vum Wiki',
+'pageinfo-contentpage-yes' => 'Joh',
+'pageinfo-protect-cascading' => 'Ene Siggeschoz weed vun heh verärf',
+'pageinfo-protect-cascading-yes' => 'Joh',
+'pageinfo-protect-cascading-from' => 'Ene Siggeschoz weed jeärf vun',
 
 # Skin names
 'skinname-standard' => 'Klassesch',
@@ -4218,7 +4235,7 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
 'duration-minutes' => '{{PLURAL:$1|ein Menutt|$1 Menutte|kein Menutt}}',
 'duration-hours' => '{{PLURAL:$1|en Stund|$1 Stunde|kein Shtund}}',
 'duration-days' => '{{PLURAL:$1|ene Daach|$1 Dääsch|keine Daach}}',
-'duration-weeks' => '{{PLURAL: $1|en Woch|§1 Woche|kein Woch}}',
+'duration-weeks' => '{{PLURAL: $1|en Woch|$1 Woche|kein Woch}}',
 'duration-years' => '{{PLURAL:$1|e Johr|$1 Johre|kei Johr}}',
 'duration-decades' => '{{PLURAL:$1|zehn Johre|$1 Johrzehnte|kei Johrzehnt}}',
 'duration-centuries' => '{{PLURAL:$1|e Johrhondert|$1 Johrhonderte|kei Johrhondert}}',
index 11dee6e..93f517c 100644 (file)
@@ -237,7 +237,6 @@ $messages = array(
 'qbbrowse' => 'Bigere',
 'qbedit' => 'Biguherîne',
 'qbpageoptions' => 'Ev rûpel',
-'qbpageinfo' => 'Naverok',
 'qbmyoptions' => 'Rûpelên min',
 'qbspecialpages' => 'Rûpelên taybet',
 'faq' => 'PGP',
@@ -305,7 +304,7 @@ $messages = array(
 'categorypage' => 'Li rûpela kategoriyê binêre',
 'viewtalkpage' => 'Li gotûbêjê binêre',
 'otherlanguages' => 'Zimanên din',
-'redirectedfrom' => '(ji $1 hate beralîkirin)',
+'redirectedfrom' => '(Ji $1 hate beralîkirin)',
 'redirectpagesub' => 'Rûpelê beralî bike',
 'lastmodifiedat' => 'Ev rûpel cara dawî di $2, $1 de hate guherandin.',
 'viewcount' => 'Ev rûpel {{PLURAL:$1|carekê|caran}} tê xwestin.',
@@ -2048,7 +2047,7 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 # Auto-summaries
 'autosumm-blank' => 'Rûpel hate vala kirin',
 'autosumm-replace' => "'$1' ket şûna rûpelê.",
-'autoredircomment' => 'ji bo [[$1]] hate beralîkirin',
+'autoredircomment' => 'Ji bo [[$1]] hate beralîkirin',
 'autosumm-new' => 'Rûpela nû: "$1"',
 
 # Live preview
index 96e79b7..9b37238 100644 (file)
@@ -290,7 +290,6 @@ $messages = array(
 'qbbrowse' => 'Perspicere',
 'qbedit' => 'Recensere',
 'qbpageoptions' => 'Optiones paginae',
-'qbpageinfo' => 'Contextus',
 'qbmyoptions' => 'Paginae meae',
 'qbspecialpages' => 'Paginae speciales',
 'faq' => 'Quaestiones frequentes',
index a7db1eb..3cc772c 100644 (file)
@@ -325,7 +325,6 @@ $messages = array(
 'qbbrowse' => 'Duerchsichen',
 'qbedit' => 'Änneren',
 'qbpageoptions' => 'Säitenoptiounen',
-'qbpageinfo' => 'Kontext',
 'qbmyoptions' => 'Meng Säiten',
 'qbspecialpages' => 'Spezialsäiten',
 'faq' => 'FAQ',
@@ -938,6 +937,7 @@ Si gouf anscheinend geläscht.",
 'edit-no-change' => 'Är ännerung gouf ignoréiert, well Dir näischt um Text geännert hutt.',
 'edit-already-exists' => 'Déi nei Säit konnt net ugeluecht ginn, well et se scho gëtt.',
 'defaultmessagetext' => 'Standardtext',
+'content-not-allowed-here' => '"$1"-Inhalt ass op der Säit [[$2]] net erlaabt',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -957,6 +957,7 @@ Et däerfen net méi wéi $2 {{PLURAL:$2|Ufro|Ufroe}} sinn, aktuell {{PLURAL:$2|
 'parser-template-loop-warning' => 'Endlos Schleef an der Schabloun: [[$1]] entdeckt',
 'parser-template-recursion-depth-warning' => "D'Limit vun der Zuel vun de Verschachtelunge vu Schabloune gouf iwwerschratt ($1)",
 'language-converter-depth-warning' => "D'Limite vun der déift vun der Sproochëmwandlung gouf iwwerschratt ($1)",
+'parser-unstrip-loop-warning' => 'Endlos Schleef entdeckt',
 'converter-manual-rule-error' => 'An der Regel iwwer déi manuell Ëmwandlung vun der Sprooch gouf e Feeler fonnt',
 
 # "Undo" feature
@@ -1821,7 +1822,7 @@ Dir kënnt seng Beschreiwung op senger [$2 Beschreiwungssäit] änneren.',
 'shared-repo-from' => 'vu(n) $1',
 'shared-repo' => 'e gemeinsam genotzte Medienarchiv',
 'shared-repo-name-wikimediacommons' => 'Wikimedia-Commons',
-'upload-disallowed-here' => 'Leider kënnt Dir dëst Bild net iwwerschreiwen.',
+'upload-disallowed-here' => 'Dir kënnt Dir dëse Fichier net iwwerschreiwen.',
 
 # File reversion
 'filerevert' => '"$1" zrécksetzen',
@@ -2780,6 +2781,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 'import-error-invalid' => 'D\'Säit "$1" gouf net importéiert well hiren Numm net valabel ass.',
 'import-options-wrong' => 'Falsch {{PLURAL:$2|Optioun|Optiounen}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Déi Basis-Säit déi Dir uginn hutt ass kee valabelen Titel.',
+'import-rootpage-nosubpage' => 'Am Nummraum "$1" vun der Basis-Säit si keng Ënnersäiten erlaabt.',
 
 # Import log
 'importlogpage' => 'Lëscht vun den Säitenimporten',
@@ -2907,6 +2909,7 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 
 # Info page
 'pageinfo-title' => 'Informatioun iwwer "$1"',
+'pageinfo-not-current' => 'Dës Informatioune kënnen nëmme fir dës Versioun gewise ginn.',
 'pageinfo-header-basic' => 'Basisinformatiounen',
 'pageinfo-header-edits' => 'Historique vun den Ännerungen',
 'pageinfo-header-restrictions' => 'Spär vun der Säit',
@@ -2931,6 +2934,11 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 'pageinfo-hidden-categories' => 'Verstoppte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
 'pageinfo-templates' => 'Agebonne {{PLURAL:$1|Schabloun|Schabloune}} ($1)',
 'pageinfo-toolboxlink' => "Informatiounen iwwert d'Säit",
+'pageinfo-redirectsto' => 'Viruleedung op',
+'pageinfo-redirectsto-info' => 'Informatioun',
+'pageinfo-contentpage' => 'Als Säit mat Inhalt gezielt',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading-yes' => 'Jo',
 
 # Skin names
 'skinname-standard' => 'Klassesch',
index 7360204..f0c2282 100644 (file)
@@ -301,7 +301,6 @@ $messages = array(
 'qbbrowse' => 'Bladere',
 'qbedit' => 'Bewirke',
 'qbpageoptions' => 'Pagina-opties',
-'qbpageinfo' => 'Pagina-informatie',
 'qbmyoptions' => 'mien opties',
 'qbspecialpages' => "Speciaal pagina's",
 'faq' => 'FAQ (väölgesjtèlde vraoge)',
index 04cfd83..b816058 100644 (file)
@@ -232,7 +232,6 @@ $messages = array(
 'qbfind' => 'Attrêuva',
 'qbedit' => 'Cangia',
 'qbpageoptions' => "Opsioîn de 'sta paggina",
-'qbpageinfo' => 'Informassion inscia paggina',
 'qbmyoptions' => 'E mæ paggine',
 'qbspecialpages' => 'Pagine speçiä',
 'faq' => 'Domande frequenti',
index 724e7e9..4334317 100644 (file)
@@ -326,7 +326,6 @@ $messages = array(
 'qbbrowse' => 'Naršymas',
 'qbedit' => 'Taisyti',
 'qbpageoptions' => 'Šis puslapis',
-'qbpageinfo' => 'Kontekstas',
 'qbmyoptions' => 'Mano puslapiai',
 'qbspecialpages' => 'Specialieji puslapiai',
 'faq' => 'DUK',
index df75921..c431b99 100644 (file)
@@ -156,7 +156,6 @@ $messages = array(
 'qbbrowse' => 'Fangvêl rawh',
 'qbedit' => 'Siamţhatna',
 'qbpageoptions' => 'He phêk hi',
-'qbpageinfo' => 'Thukhawchang',
 'qbmyoptions' => 'Ka phêkte',
 'qbspecialpages' => 'Phêk vohbîkte',
 'faq' => 'Zawhzin',
@@ -1151,7 +1150,7 @@ Hmangtu azira i thliarhran erawh chuan a hmangtuina a hlankai hnuhnüng ber taks
 Ahnuaih hian {{PLURAL:$1|zawmtu hmasa ber|zawmtu hmasa $1-te}} kan rawn tlar chhuak e.
 Zawmtu zawng zawng [[Special:WhatLinksHere/$2|tlarchhuahna hetah hian a awm]] e.',
 'nolinkstoimage' => 'He taksa zawmtu/hmanna phêk pakhat mah a awm lo.',
-'morelinkstoimage' => 'Hemi taksa zawmpui dang [[Special:WhatLinksHere/$1|enna}}.',
+'morelinkstoimage' => 'Hemi taksa zawmpui dang [[Special:WhatLinksHere/$1|enna]].',
 'linkstoimage-redirect' => '$1 (taksa hruailuhna) $2',
 'duplicatesoffile' => 'A hnuaia taksa{{PLURAL:$1||te}} khu hë taksa nihpui{{PLURAL:$1||te}} a{{PLURAL:$1||n}} ni ([[Special:FileDuplicateSearch/$2|chanchin kimchang]]):',
 'sharedupload' => 'Hë taksa hi $1-a mi a ni a, hna-hmachhawp dangin a hmang vè mai thei.',
index 72e6a04..f8e3bc9 100644 (file)
@@ -193,7 +193,6 @@ $messages = array(
 'qbbrowse' => 'Navigācija',
 'qbedit' => 'Izmainīšana',
 'qbpageoptions' => 'Šī lapa',
-'qbpageinfo' => 'Konteksts',
 'qbmyoptions' => 'Manas lapas',
 'qbspecialpages' => 'Īpašās lapas',
 'faq' => 'BUJ',
index b519d82..43ef687 100644 (file)
@@ -291,7 +291,6 @@ $messages = array(
 'qbbrowse' => '覽',
 'qbedit' => '纂',
 'qbpageoptions' => '此頁',
-'qbpageinfo' => '內文',
 'qbmyoptions' => '吾好',
 'qbspecialpages' => '非凡',
 'faq' => '頻答問',
index 2cdf041..98788e6 100644 (file)
@@ -170,7 +170,6 @@ $messages = array(
 'qbbrowse' => 'गवेषण करू',
 'qbedit' => 'सम्पादन करू',
 'qbpageoptions' => 'ई पन्ना',
-'qbpageinfo' => 'विषय',
 'qbmyoptions' => 'हमर पन्ना सभ',
 'qbspecialpages' => 'विशेष पन्ना सभ',
 'faq' => 'त्वरित प्रश्नोत्तरी',
index 967f98d..f7b70be 100644 (file)
@@ -287,7 +287,6 @@ $messages = array(
 'qbbrowse' => 'Ванондома',
 'qbedit' => 'Петнема',
 'qbpageoptions' => 'Тя лопась',
-'qbpageinfo' => 'Контекстсь',
 'qbmyoptions' => 'Монь лопане',
 'qbspecialpages' => 'Башка тевонь лопат',
 'faq' => 'Сидеста Кеподеви Кизефксне',
index 288f118..b537a3e 100644 (file)
@@ -361,7 +361,6 @@ $messages = array(
 'qbbrowse' => 'Tadiavina',
 'qbedit' => 'Hanova',
 'qbpageoptions' => 'Ity pejy ity',
-'qbpageinfo' => 'Pejy fanoroana',
 'qbmyoptions' => 'Ny pejiko',
 'qbspecialpages' => 'Pejy manokana',
 'faq' => 'FMM',
index 77eb3d2..46b691a 100644 (file)
@@ -662,7 +662,7 @@ $messages = array(
 'filehist-dimensions' => 'Кугытшо',
 'filehist-filesize' => 'Файлын кугытшо',
 'filehist-comment' => 'Файл нерген:',
-'imagelinks' => 'Файл деке кылвер-влак',
+'imagelinks' => 'Файлым кучылтмаш',
 'linkstoimage' => 'Тиде {{PLURAL:$1|$1 лаштык саде файл дене кылдалтын|$1 лаштык-влак саде файл дене кылдалтыныт}}:',
 'nolinkstoimage' => 'Тиде файл дене кылдалтше ик лаштыкат уке.',
 'sharedupload' => 'Тиде файлын верже: $1, туге гынат, тудым моло веренат кучылташ лиеш.',
@@ -719,6 +719,7 @@ $messages = array(
 'shortpages' => 'Кӱчык лаштык-влак',
 'longpages' => 'Кужу лаштык-влак',
 'protectedpages' => 'Тӧрлатымаш деч аралыме лаштык-влак',
+'usercreated' => '$1, $2 шагатлан {{GENDER:$3|регистрацийым эртен|регистрацийым эртен}}',
 'newpages' => 'У лаштык-влак',
 'newpages-username' => 'Пайдаланышын лӱмжӧ:',
 'move' => 'Кусараш',
@@ -877,6 +878,7 @@ $messages = array(
 'whatlinkshere-hideredirs' => 'вес вере колтымаш-влакым $1',
 'whatlinkshere-hidetrans' => 'пуртымашым $1',
 'whatlinkshere-hidelinks' => 'кылвер-влакым $1',
+'whatlinkshere-hideimages' => 'сӱрет деке кылвер-влакым $1',
 'whatlinkshere-filters' => 'Фильтр-влак',
 
 # Block/unblock
@@ -935,6 +937,7 @@ $messages = array(
 'export' => 'Лаштык-влакым келыштараш',
 
 # Namespace 8 related
+'allmessagesname' => 'Лӱм',
 'allmessages-filter-all' => 'Чыла',
 
 # Thumbnails
index c531689..163bc26 100644 (file)
@@ -491,7 +491,6 @@ $messages = array(
 'qbbrowse' => 'Прелистај',
 'qbedit' => 'Уреди',
 'qbpageoptions' => 'Оваа страница',
-'qbpageinfo' => 'Содржина на страница',
 'qbmyoptions' => 'Мои страници',
 'qbspecialpages' => 'Специјални страници',
 'faq' => 'ЧПП',
@@ -566,7 +565,7 @@ $messages = array(
 'lastmodifiedat' => 'Оваа страница последен пат е изменета на $1 во $2 ч.',
 'viewcount' => 'Оваа страница била посетена {{PLURAL:$1|еднаш|$1 пати}}.',
 'protectedpage' => 'Заштитена страница',
-'jumpto' => 'Скокни на:',
+'jumpto' => 'Ð\9fÑ\80еÑ\98ди на:',
 'jumptonavigation' => 'содржини',
 'jumptosearch' => 'барај',
 'view-pool-error' => 'За жал во моментов опслужувачите се преоптоварени.
@@ -2073,7 +2072,7 @@ $1',
 'shared-repo' => 'заедничко складиште',
 'shared-repo-name-wikimediacommons' => 'Заедничката Ризница',
 'filepage.css' => '/* Тука поставените каскадни стилски страници (CSS) се вклучени во страницата за опис на податотеката, како и на клиентските викија */',
-'upload-disallowed-here' => 'Нажалост, не можете да ја замените сликава со нова.',
+'upload-disallowed-here' => 'Нажалост, не можете да презапишете врз сликава.',
 
 # File reversion
 'filerevert' => 'Врати $1',
@@ -3205,6 +3204,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Информации за „$1“',
+'pageinfo-not-current' => 'Информациите може да се прикажат само за тековната ревизија.',
 'pageinfo-header-basic' => 'Основни информации',
 'pageinfo-header-edits' => 'Историја на уредувања',
 'pageinfo-header-restrictions' => 'Заштита на страницата',
@@ -3234,6 +3234,13 @@ $1',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Скриена категорија|Скриени категории}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Превметнат шаблон|Превметнати шаблони}} ($1)',
 'pageinfo-toolboxlink' => 'Информации за страницата',
+'pageinfo-redirectsto' => 'Пренасочува кон',
+'pageinfo-redirectsto-info' => 'инфо',
+'pageinfo-contentpage' => 'Се вбројува во содржински страници',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading' => 'Каскадната заштита на страниците важи од тука',
+'pageinfo-protect-cascading-yes' => 'Да',
+'pageinfo-protect-cascading-from' => 'Страници со каскадна заштита од',
 
 # Skin names
 'skinname-standard' => 'Класично',
index 097e531..fc159a1 100644 (file)
@@ -472,7 +472,6 @@ $messages = array(
 'qbbrowse' => 'ബ്രൗസ്',
 'qbedit' => 'തിരുത്തുക',
 'qbpageoptions' => 'ഈ താൾ',
-'qbpageinfo' => 'സന്ദർഭം',
 'qbmyoptions' => 'എന്റെ താളുകൾ',
 'qbspecialpages' => 'പ്രത്യേക താളുകൾ',
 'faq' => 'പതിവുചോദ്യങ്ങൾ',
@@ -1985,7 +1984,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'shared-repo' => 'ഒരു പങ്കുവെക്കപ്പെട്ട സംഭരണി',
 'shared-repo-name-wikimediacommons' => 'വിക്കിമീഡിയ കോമൺസ്',
 'filepage.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. പ്രമാണ വിവരണ താളുകളിൽ ഉൾപ്പെടുത്തപ്പെടുന്നതായിരിക്കും, ബാഹ്യ ക്ലൈന്റ് വിക്കികളിലും അത് ലഭ്യമായിരിക്കും */',
-'upload-disallowed-here' => 'നിർഭാà´\97àµ\8dയവശാൽ à´\88 à´\9aà´¿à´¤àµ\8dà´°à´¤àµ\8dതിനàµ\81 à´®àµ\81à´\95ളിൽ à´®à´±àµ\8dà´±àµ\8aà´°àµ\81 à´\9aà´¿à´¤àµ\8dà´°ം ചേർക്കാൻ താങ്കൾക്ക് കഴിയില്ല.',
+'upload-disallowed-here' => 'à´\88 à´ªàµ\8dരമാണതàµ\8dതിനàµ\81 à´®àµ\81à´\95ളിൽ à´®à´±àµ\8dà´±àµ\8aà´°àµ\81 à´ªàµ\8dരമാണം ചേർക്കാൻ താങ്കൾക്ക് കഴിയില്ല.',
 
 # File reversion
 'filerevert' => '$1 തിരസ്ക്കരിക്കുക',
@@ -3088,6 +3087,7 @@ $1',
 
 # Info page
 'pageinfo-title' => '"$1" എന്ന താളിന്റെ വിവരങ്ങൾ',
+'pageinfo-not-current' => 'ഇപ്പോഴത്തെ നാൾപ്പതിപ്പിൽ മാത്രമേ വിവരങ്ങൾ പ്രദർശിപ്പിക്കപ്പെടാനിടയുള്ളു.',
 'pageinfo-header-basic' => 'അടിസ്ഥാനവിവരങ്ങൾ',
 'pageinfo-header-edits' => 'തിരുത്തൽചരിത്രം',
 'pageinfo-header-restrictions' => 'സംരക്ഷണം',
@@ -3116,6 +3116,10 @@ $1',
 'pageinfo-hidden-categories' => 'മറഞ്ഞിരിക്കുന്ന {{PLURAL:$1|വർഗ്ഗം|വർഗ്ഗങ്ങൾ}} ($1)',
 'pageinfo-templates' => 'ഉൾപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}} ($1)',
 'pageinfo-toolboxlink' => 'താളിന്റെ വിവരങ്ങൾ',
+'pageinfo-redirectsto' => 'തിരിച്ചുവിടുന്നു',
+'pageinfo-redirectsto-info' => 'വിവരം',
+'pageinfo-contentpage' => 'ഉള്ളടക്ക താളായി എണ്ണുന്നവ',
+'pageinfo-contentpage-yes' => 'അതെ',
 
 # Skin names
 'skinname-standard' => 'സാർവത്രികം',
index 284fca6..ab2a010 100644 (file)
@@ -186,7 +186,6 @@ $messages = array(
 'qbbrowse' => 'Дэлгэх',
 'qbedit' => 'Засварлах',
 'qbpageoptions' => 'Энэ хуудас',
-'qbpageinfo' => 'Агуулга',
 'qbmyoptions' => 'Миний хуудсууд',
 'qbspecialpages' => 'Тусгай хуудсууд',
 'faq' => 'Тогтмол тавигддаг асуултууд',
index 73c0a09..ad74677 100644 (file)
@@ -464,7 +464,6 @@ $messages = array(
 'qbbrowse' => 'न्याहाळा',
 'qbedit' => 'संपादन',
 'qbpageoptions' => 'हे पान',
-'qbpageinfo' => 'सामग्री',
 'qbmyoptions' => 'माझी पाने',
 'qbspecialpages' => 'विशेष पाने',
 'faq' => 'नेहमीची प्रश्नावली',
index d41d9ea..9b2d5fe 100644 (file)
@@ -338,7 +338,6 @@ $messages = array(
 'qbbrowse' => 'Semak imbas',
 'qbedit' => 'Sunting',
 'qbpageoptions' => 'Laman ini',
-'qbpageinfo' => 'Konteks',
 'qbmyoptions' => 'Laman-laman saya',
 'qbspecialpages' => 'Laman khas',
 'faq' => 'Soalan Lazim',
index 9f4aeb4..432c871 100644 (file)
@@ -418,7 +418,6 @@ $messages = array(
 'qbbrowse' => 'Qalleb',
 'qbedit' => 'Immodifika',
 'qbpageoptions' => 'Din il-paġna',
-'qbpageinfo' => 'Kuntest',
 'qbmyoptions' => 'Il-paġni tiegħi',
 'qbspecialpages' => 'Paġni speċjali',
 'faq' => 'Mistoqsijiet komuni',
index ebf9541..26d0596 100644 (file)
@@ -11,6 +11,7 @@
  * @author Boivie
  * @author Brik
  * @author Byrial
+ * @author Cocu
  * @author Danmichaelo
  * @author Dittaeva
  * @author Eirik
@@ -458,7 +459,6 @@ $messages = array(
 'qbbrowse' => 'Bla gjennom',
 'qbedit' => 'Rediger',
 'qbpageoptions' => 'Sideinnstillinger',
-'qbpageinfo' => 'Sideinformasjon',
 'qbmyoptions' => 'Egne innstillinger',
 'qbspecialpages' => 'Spesialsider',
 'faq' => 'Ofte stilte spørsmål',
@@ -2002,7 +2002,7 @@ Kanskje du vil redigere beskrivelsen på dens [$2 filbeskrivelsesside].',
 'uploadnewversion-linktext' => 'Last opp en ny versjon av denne filen',
 'shared-repo-from' => 'fra $1',
 'shared-repo' => 'et delt fillager',
-'upload-disallowed-here' => 'Beklageligvis kan du ikke overskrive dette bildet.',
+'upload-disallowed-here' => 'Du kan ikke overskrive denne filen.',
 
 # File reversion
 'filerevert' => 'Tilbakestill $1',
@@ -3090,6 +3090,7 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 
 # Info page
 'pageinfo-title' => 'Informasjon om «$1»',
+'pageinfo-not-current' => 'Informasjonen vises kanskje bare for den gjeldende revisjonen.',
 'pageinfo-header-basic' => 'Grunnleggende informasjon',
 'pageinfo-header-edits' => 'Redigeringshistorikk',
 'pageinfo-header-restrictions' => 'Sidebeskyttelse',
@@ -3118,6 +3119,13 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
 'pageinfo-templates' => 'Transkludert {{PLURAL:$1|mal|maler}} ($1)',
 'pageinfo-toolboxlink' => 'Sideinformasjon',
+'pageinfo-redirectsto' => 'Omdirigerer til',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Talt som innholdsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Dypbeskyttelse starter herfra',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Dypbeskyttelse fra',
 
 # Skin names
 'skinname-standard' => 'Standard',
index a23b88a..289b68b 100644 (file)
@@ -359,7 +359,6 @@ $messages = array(
 'qbbrowse' => 'Blädern',
 'qbedit' => 'Ännern',
 'qbpageoptions' => 'Disse Sied',
-'qbpageinfo' => 'Sietendaten',
 'qbmyoptions' => 'Instellen',
 'qbspecialpages' => 'Spezialsieten',
 'faq' => 'Faken stellte Fragen',
index a416c5c..7ed5534 100644 (file)
@@ -453,7 +453,6 @@ $messages = array(
 'qbbrowse' => 'Blaojen',
 'qbedit' => 'Bewark',
 'qbpageoptions' => 'Disse zied',
-'qbpageinfo' => 'Ziedinformasie',
 'qbmyoptions' => 'Veurkeuren',
 'qbspecialpages' => 'Spesiale ziejen',
 'faq' => 'Vragen die vake esteld wörden',
index f93fabb..9d06fc6 100644 (file)
@@ -200,7 +200,6 @@ $messages = array(
 'qbbrowse' => 'ब्राउज गर्ने',
 'qbedit' => 'सम्पादन गर्ने',
 'qbpageoptions' => 'यो पेज',
-'qbpageinfo' => 'सन्दर्भ',
 'qbmyoptions' => 'मेरो पेज',
 'qbspecialpages' => 'विशेष पृष्ठहरु',
 'faq' => 'धैरै सोधिएका प्रश्नहरु',
index bc68ac8..fdb6d41 100644 (file)
@@ -495,7 +495,6 @@ $messages = array(
 'qbbrowse' => 'Bladeren',
 'qbedit' => 'Bewerken',
 'qbpageoptions' => 'Deze pagina',
-'qbpageinfo' => 'Pagina-informatie',
 'qbmyoptions' => "Mijn pagina's",
 'qbspecialpages' => 'Speciale pagina’s',
 'faq' => 'Veel gestelde vragen',
@@ -735,7 +734,7 @@ Bewerken is niet mogelijk.',
 'viewsourcetext' => 'U kunt de brontekst van deze pagina bekijken en kopiëren:',
 'viewyourtext' => "U kunt '''uw bewerkingen''' aan de brontekst van deze pagina bekijken en kopiëren:",
 'protectedinterface' => "Deze pagina bevat tekst voor berichten van de software op deze wiki en is beveiligd om misbruik te voorkomen.
-Om vertalingen voor alle wiki's toe te voegen of te wijzigen, gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki.",
+Gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki, om vertalingen voor alle wiki's toe te voegen of te wijzigen.",
 'editinginterface' => "'''Waarschuwing:''' u bewerkt een pagina die interfacetekst voor de software bevat.
 Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen op deze wiki.
 Om vertalingen toe te voegen of te wijzigen voor alle wiki's, gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki.",
@@ -1154,6 +1153,9 @@ Deze lijkt verwijderd te zijn.',
 'edit-already-exists' => 'De pagina is niet aangemaakt.
 Deze bestaat al.',
 'defaultmessagetext' => 'Standaardinhoud',
+'content-failed-to-parse' => 'Het was niet mogelijk de inhoud van het MIME-type $2 voor het model $1 te verwerken: $3.',
+'invalid-content-data' => 'Ongeldige inhoudsgegevens',
+'content-not-allowed-here' => 'De inhoud "$1" is niet toegestaan op pagina [[$2]].',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -2095,7 +2097,7 @@ U kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].',
 'shared-repo' => 'een gedeelde mediadatabank',
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
 'filepage.css' => "/ * De CSS die hier geplaatst wordt, wordt opgenomen in de bestandsbeschrijvingspagina en wordt ook opgenomen op externe wiki's (via externe repositories) * /",
-'upload-disallowed-here' => 'U kunt deze afbeelding helaas niet overschrijven.',
+'upload-disallowed-here' => 'U kunt dit bestand niet overschrijven.',
 
 # File reversion
 'filerevert' => '$1 terugdraaien',
@@ -2958,6 +2960,7 @@ Wilt u deze verwijderen om plaats te maken voor de te hernoemen pagina?',
 'immobile-target-namespace-iw' => 'Een interwikiverwijzing is geen geldige bestemming voor het hernoemen van een pagina.',
 'immobile-source-page' => 'Deze pagina kan niet hernoemd worden.',
 'immobile-target-page' => 'Het is niet mogelijk te hernoemen naar die paginanaam.',
+'bad-target-model' => 'De gewenste bestemming gebruikt een ander inhoudsmodel. Het is niet mogelijk om te zetten van $1 naar $2.',
 'imagenocrossnamespace' => 'Een mediabestand kan niet naar een andere naamruimte verplaatst worden',
 'nonfile-cannot-move-to-file' => 'Het is niet mogelijk te hernoemen van en naar de bestandsnaamruimte',
 'imagetypemismatch' => 'De nieuwe bestandsextensie is niet gelijk aan het bestandstype',
@@ -3228,6 +3231,7 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 
 # Info page
 'pageinfo-title' => 'Informatie over "$1"',
+'pageinfo-not-current' => 'Gegegevens worden mogelijk alleen weergegeven voor de huidige versie.',
 'pageinfo-header-basic' => 'Basisgegevens',
 'pageinfo-header-edits' => 'Bewerkingsgeschiedenis',
 'pageinfo-header-restrictions' => 'Paginabeveiliging',
@@ -3256,6 +3260,13 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 'pageinfo-hidden-categories' => 'Verborgen {{PLURAL:$1|categorie|categorieën}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Gebruikt sjabloon|Gebruikte sjablonen}} ($1)',
 'pageinfo-toolboxlink' => 'Paginagegevens',
+'pageinfo-redirectsto' => 'Verwijst door naar',
+'pageinfo-redirectsto-info' => 'informatie',
+'pageinfo-contentpage' => 'Geteld als pagina met inhoud',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Beveiligingen werken vanaf hier door',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Pagina is beveiligd vanuit een andere pagina',
 
 # Skin names
 'skinname-standard' => 'Klassiek',
index 47ceef3..110cc1f 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Boivie
+ * @author Cocu
  * @author Dittaeva
  * @author Diupwijk
  * @author Eirik
@@ -459,7 +460,6 @@ $messages = array(
 'qbbrowse' => 'Bla gjennom',
 'qbedit' => 'Endre',
 'qbpageoptions' => 'Denne sida',
-'qbpageinfo' => 'Samanheng',
 'qbmyoptions' => 'Sidene mine',
 'qbspecialpages' => 'Spesialsider',
 'faq' => 'OSS',
@@ -1792,11 +1792,13 @@ $1',
 'upload-too-many-redirects' => 'URL-en inneheldt for mange omdirigeringar',
 'upload-unknown-size' => 'Ukjend storleik',
 'upload-http-error' => 'Ein HTTP-feil oppstod: $1',
+'upload-copy-upload-invalid-domain' => 'Kopiopplastingar er ikkje tilgjengelege frå dette domenet.',
 
 # File backend
 'backend-fail-stream' => 'Kunne ikkje strøyma fila «$1».',
 'backend-fail-backup' => 'Kunne ikkje tryggingskopiera fila «$1».',
 'backend-fail-notexists' => 'Fila $1 finst ikkje.',
+'backend-fail-hashes' => 'Kunne ikkje henta filnummer for samanlikning.',
 'backend-fail-notsame' => 'Ein ikkje-identisk fil finst alt på «$1».',
 'backend-fail-invalidpath' => '$1 er ikkje ein gyldig lagringsstig.',
 'backend-fail-delete' => 'Kunne ikkje sletta fila «$1».',
@@ -1809,9 +1811,27 @@ $1',
 'backend-fail-closetemp' => 'Kunne ikkje lata att mellombels fil.',
 'backend-fail-read' => 'Kunne ikkje lesa fila «$1».',
 'backend-fail-create' => 'Kunne ikkje oppretta fila «$1».',
+'backend-fail-maxsize' => 'Kunne ikkje skriva fila «$1» av di ho er større enn {{PLURAL:$2|éin byte|$2 byte}}.',
+'backend-fail-readonly' => "Largingsbaksystemet «$1» er for tida skriveverna. Oppgjeven grunn er: «''$2''»",
+'backend-fail-synced' => 'Fila «$1» er i ei inkonsistent stode i dei interne lagringsbaksystema',
+'backend-fail-connect' => 'Kunne ikkje kopla til filbaksystemet «$1».',
+'backend-fail-internal' => 'Ein ukjend feil oppstod i lagringsbaksystemet «$1».',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Kunne ikkje kopla til journaldatabasen for lagringsbaksystemet «$1».',
+'filejournal-fail-dbquery' => 'Kunne ikkje oppdatera journaldatabasen for lagringsbaksystemet «$1».',
 
 # Lock manager
+'lockmanager-notlocked' => 'Kunne ikkje låsa opp «$1» av di han ikkje er låst',
+'lockmanager-fail-closelock' => 'Kunne ikkje lata att låsefila for «$1».',
+'lockmanager-fail-deletelock' => 'Kunne ikkje sletta låsefila for «$1».',
+'lockmanager-fail-acquirelock' => 'Kunne ikkje henta lås for «$1».',
+'lockmanager-fail-openlock' => 'Kunne ikkje opna låsefila for «$1».',
 'lockmanager-fail-releaselock' => 'Kunne ikkje løysa låsen for «$1».',
+'lockmanager-fail-db-bucket' => 'Kunne ikkje kontakta nok låsedatabasar i bytta $1.',
+'lockmanager-fail-db-release' => 'Kunne ikkje løysa låsane på databasen $1.',
+'lockmanager-fail-svr-acquire' => 'Kunne ikkje henta låsane på tenaren $1.',
+'lockmanager-fail-svr-release' => 'Kunne ikkje løysa låsane på tenaren $1.',
 
 # ZipDirectoryReader
 'zip-wrong-format' => 'Den oppgjevne fila var ikkje ei ZIP-fil',
@@ -1819,6 +1839,7 @@ $1',
 Ho kan ikkje tryggingskontrollerast.',
 
 # Special:UploadStash
+'uploadstash-errclear' => 'Fjerning av filene var mislykka.',
 'uploadstash-refresh' => 'Oppdater fillista',
 
 # img_auth script messages
@@ -1912,7 +1933,7 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
 'uploadnewversion-linktext' => 'Last opp ny versjon av denne fila',
 'shared-repo-from' => 'frå $1',
 'shared-repo' => 'eit sams fillager',
-'upload-disallowed-here' => 'Diverre kan du ikkje overskriva dette biletet.',
+'upload-disallowed-here' => 'Du kan ikkje overskriva denne fila.',
 
 # File reversion
 'filerevert' => 'Rulla attende $1',
@@ -2433,7 +2454,8 @@ Innhaldet i dei sletta versjonane er berre tilgjengeleg for administratorar.',
 'undeletedrevisions' => '{{PLURAL:$1|Éin versjon|$1 versjonar}} attoppretta.',
 'undeletedrevisions-files' => '{{PLURAL:$1|Éin versjon|$1 versjonar}} og {{PLURAL:$2|éi fil|$2 filer}} er attoppretta',
 'undeletedfiles' => '{{PLURAL:$1|Éi fil|$1 filer}} er attoppretta',
-'cannotundelete' => 'Feil ved attoppretting, andre kan allereie ha attoppretta sida.',
+'cannotundelete' => 'Attopprettinga gjekk ikkje:
+$1',
 'undeletedpage' => "'''$1 er attoppretta'''
 
 Sjå [[Special:Log/delete|sletteloggen]] for eit oversyn over sider som nyleg er sletta eller attoppretta.",
@@ -2993,6 +3015,11 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'pageinfo-magic-words' => '{{PLURAL:$1|Trylleord}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Løynd kategori|Løynde kategoriar}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Inkludert mal|Inkluderte malar}} ($1)',
+'pageinfo-contentpage' => 'Tald som ei innhaldsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Djupvern byrjar her',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Djupvern byrjar i',
 
 # Skin names
 'skinname-standard' => 'Klassisk',
@@ -3238,6 +3265,7 @@ Andre er gøymde som standard.
 'exif-headline' => 'Overskrift',
 'exif-credit' => 'Opphavrettseigar/filgjevar',
 'exif-source' => 'Kjelde',
+'exif-editstatus' => 'Den redaksjonelle stoda til biletet',
 'exif-urgency' => 'Prioritet',
 'exif-objectcycle' => 'Tid på dagen mediet er meint for',
 'exif-contact' => 'Kontaktinformasjon',
@@ -3248,12 +3276,19 @@ Andre er gøymde som standard.
 'exif-datetimeexpires' => 'Skal ikkje nyttast etter',
 'exif-datetimereleased' => 'Frigjeve',
 'exif-lens' => 'Objektiv',
+'exif-serialnumber' => 'Serienummeret på kameraet',
 'exif-cameraownername' => 'Eigar av kameraet',
 'exif-label' => 'Merkelapp',
+'exif-nickname' => 'Det uformelle namnet på biletet',
 'exif-rating' => 'Vurdering (av 5)',
 'exif-copyrighted' => 'Opphavsrettsstode',
 'exif-copyrightowner' => 'Opphavsrettseigar',
 'exif-usageterms' => 'Bruksvilkår',
+'exif-originaldocumentid' => 'Unik ID til originaldokumentet',
+'exif-licenseurl' => 'URL for opphavsrettsløyve',
+'exif-morepermissionsurl' => 'Alternativ løyveinformasjon',
+'exif-attributionurl' => 'Når dette verket vert nytta, lenkja til',
+'exif-preferredattributionname' => 'Når dette verket vert nytta, godskriv',
 'exif-pngfilecomment' => 'PNG-filkommentar',
 'exif-disclaimer' => 'Atterhald',
 'exif-contentwarning' => 'Innholdsåtvaring',
@@ -3520,6 +3555,30 @@ Dersom dette *ikkje* er deg, følg denne lenkja for avbryte stadfestinga av e-po
 
 $5
 
+Denne stadfestingskoden vert forelda $4.',
+'confirmemail_body_changed' => 'Nokon, truleg deg, frå IP-adressa $1, har endra e-postadressa til kontoen «$2» på {{SITENAME}} til denne e-postadressa.
+
+For å stadfesta at denne kontoen faktisk høyrer til deg, og for å slå på
+funksjonar knytte til e-post på {{SITENAME}}, opna denne lenkja i nettlesaren din:
+
+$3
+
+Om brukarkontoen *ikkje* høyrer til deg, fylg denne lenkja for å bryta av stadfestinga av e-postadressa:
+
+$5
+
+Denne stadfestingskoden vert forelda $4.',
+'confirmemail_body_set' => 'Nokon, truleg deg, frå IP-adressa $1, har sett e-postadressa til kontoen «$2» på {{SITENAME}} til denne e-postadressa.
+
+For å stadfesta at denne kontoen faktisk høyrer til deg, og for å slå på
+funksjonar knytte til e-post på {{SITENAME}}, opna denne lenkja i nettlesaren din:
+
+$3
+
+Om brukarkontoen *ikkje* høyrer til deg, fylg denne lenkja for å bryta av stadfestinga av e-postadressa:
+
+$5
+
 Denne stadfestingskoden vert forelda $4.',
 'confirmemail_invalidated' => 'Stadfestinga av e-postadresse er avbrote',
 'invalidateemail' => 'Avbryt stadfestinga av e-postadressa',
@@ -3527,6 +3586,7 @@ Denne stadfestingskoden vert forelda $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Interwiki-tilkopling er slått av]',
 'scarytranscludefailed' => '[Henting av mal for $1 gjekk ikkje]',
+'scarytranscludefailed-httpstatus' => '[Henting av mal for $1 gjekk ikkje: HTTP $2]',
 'scarytranscludetoolong' => '[URL-en er for lang]',
 
 # Delete conflict
index f27be7b..d0b3ec7 100644 (file)
@@ -13,6 +13,7 @@
  * @author Fryed-peach
  * @author Jfblanc
  * @author Kaganer
+ * @author McDutchie
  * @author Spacebirdy
  * @author Горан Анђелковић
  * @author לערי ריינהארט
@@ -436,7 +437,6 @@ $messages = array(
 'qbbrowse' => 'Far desfilar',
 'qbedit' => 'Modificar',
 'qbpageoptions' => 'Opcions de la pagina',
-'qbpageinfo' => 'Pagina d’entresenhas',
 'qbmyoptions' => 'Mas opcions',
 'qbspecialpages' => 'Paginas especialas',
 'faq' => 'FAQ',
@@ -1318,7 +1318,7 @@ Vaquí una valor generada aleatòriament que podètz utilizar : $1',
 'timezoneregion-indian' => 'Ocean Indian',
 'timezoneregion-pacific' => 'Ocean Pacific',
 'allowemail' => 'Autorizar lo mandadís de corrièr electronic venent d’autres utilizaires',
-'prefs-searchoptions' => 'Opcions de recèrca',
+'prefs-searchoptions' => 'Recèrca',
 'prefs-namespaces' => 'Noms d’espacis',
 'defaultns' => 'Autrament recercar dins aquestes espacis de noms :',
 'default' => 'defaut',
index 6f4779d..89c91c4 100644 (file)
@@ -401,7 +401,6 @@ $messages = array(
 'qbbrowse' => 'ଖୋଜିବା',
 'qbedit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
 'qbpageoptions' => 'ଏହି ପୃଷ୍ଠାଟି',
-'qbpageinfo' => 'ଭିତର ଚିଜ',
 'qbmyoptions' => 'ମୋ ପୃଷ୍ଠାଗୁଡ଼ିକ',
 'qbspecialpages' => 'ବିଶେଷ ପୃଷ୍ଠା',
 'faq' => 'ବାରମ୍ବାର ପଚରାଯାଉଥିବା ପ୍ରଶ୍ନ',
@@ -930,10 +929,10 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 ଆପଣ [[Special:Search/{{PAGENAME}}|ଏହି ଲେଖାଟିର ନାଆଁ]] ବାକି ପୃଷ୍ଠାମାନଙ୍କରେ ଖୋଜି ପାରନ୍ତି,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}ରେ ଯୋଡ଼ାଯାଇଥିବା ବାକି ପୃଷ୍ଠାସବୁକୁ ଖୋଜି ପାରନ୍ତି],
 କିମ୍ବା [{{fullurl:{{FULLPAGENAME}}|action=edit}} ଏହି ପୃଷ୍ଠାଟିକୁ ବଦଳାଇ ପାରନ୍ତି]</span> ।',
-'noarticletext-nopermission' => 'ଏହି ପୃଷ୍ଠାଟିରେ କିଛି ବି ଲେଖା ନାହିଁ ।
-ଆପଣ [[Special:Search/{{PAGENAME}}|ଏହି ଲେଖାଟିର ନାଆଁ]] ବାକି ପୃଷ୍ଠାମାନଙ୍କରେ ଖୋଜି ପାରନ୍ତି,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}ରେ ଯୋଡ଼ାଯାଇଥିବା ବାକି ପୃଷ୍ଠାସବୁକୁ ଖୋଜି ପାରନ୍ତି],
-କିମ୍ବା [{{fullurl:{{FULLPAGENAME}}|action=edit}} ଏହି ପୃଷ୍ଠାଟିକୁ ବଦଳାଇ ପାରନ୍ତି]</span> ।',
+'noarticletext-nopermission' => 'à¬\8fବà­\87 à¬\8fହି à¬ªà­\83ଷà­\8dଠାà¬\9fିରà­\87 à¬\95ିà¬\9bି à¬¬à¬¿ à¬²à­\87à¬\96ା à¬¨à¬¾à¬¹à¬¿à¬\81 à¥¤
+ଆପଣ [[Special:Search/{{PAGENAME}}|ଏହି ଲେଖାଟିର ନାଆଁ]] ବାକି ପୃଷ୍ଠାମାନଙ୍କରେ ଖୋଜି ପାରନ୍ତି, କିମ୍ବା
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}ରେ ଯୋଡ଼ାଯାଇଥିବା ବାକି ପୃଷ୍ଠାସବୁକୁ ଖୋଜି ପାରନ୍ତି]
+</span>, କିନ୍ତୁ ଏହି ପୃଷ୍ଠାଟିକୁ ଆପଣ ତିଆରି କରିପାରିବେ ନାହିଁ ।',
 'missing-revision' => '"{{PAGENAME}}" ନାମରେ ଥିବା ପୃଷ୍ଠାଟିର #$1 ପୁନରାବୃତ୍ତି ନାହିଁ ।
 
 ପୁରୁଣା ହୋଇଯାଇଥିବା ଇତିହାସ ଲିଙ୍କ ଯାହା ଏକ ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାକୁ ଦିଆଯାଇଥିବାରୁ ଏହା ସାଧାରଣତଃ ହୋଇଥାଏ ।
@@ -1049,6 +1048,9 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 ଏହା ଅଗରୁ ଅଛି ।',
 'defaultmessagetext' => 'ଡିଫଲ୍ଟ ମେସେଜ ଲେଖାଗୁଡିକ',
 
+# Content models
+'content-model-wikitext' => 'ଉଇକିଟେକ୍ସଟ',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ଚେତାବନୀ:''' ଏହି ପୃଷ୍ଠାରେ ଅନେକ ଗୁଡ଼ିଏ ମୂଲ୍ୟବାନ ପାର୍ସର ଫଙ୍କସନ କଲ ଅଛି ।
 
@@ -3007,11 +3009,12 @@ MediaWiki ବ୍ୟବହାର କରି [[Special:Import|ପୃଷ୍ଠା 
 
 # Info page
 'pageinfo-title' => '"$1"ର ବିବରଣୀ',
+'pageinfo-header-basic' => 'ସାଧାରଣ ଜାଣିବା କଥା',
 'pageinfo-header-edits' => 'ବଦଳସବୁ',
 'pageinfo-article-id' => 'ପୃଷ୍ଠା ଆଇଡ଼ି',
 'pageinfo-views' => 'ଦେଖଣା ସଂଖ୍ୟା',
 'pageinfo-watchers' => 'ଦେଖଣାହାରି ସଂଖ୍ୟା',
-'pageinfo-edits' => 'ସମ୍ପାଦନା ସଂଖ୍ୟା:',
+'pageinfo-edits' => 'ସମ୍ପାଦନା ସଂଖ୍ୟା',
 'pageinfo-authors' => 'ନିଆରା ଲେଖକଙ୍କ ସଂଖ୍ୟା',
 
 # Patrolling
@@ -3056,6 +3059,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 ପିକ୍ସେଲ, ଫାଇଲ ଆକାର: $3, MIME ପ୍ରକାର: $4, $5 ଗୋଟି {{PLURAL:$5|ପୃଷ୍ଠା|ପୃଷ୍ଠା}}',
 'file-nohires' => 'ବଡ଼ ରେଜୋଲୁସନ ନାହିଁ ।',
 'svg-long-desc' => 'SVG ଫାଇଲ, ସାଧାରଣ ମାପ $1 × $2 ପିକ୍ସେଲ, ଫାଇଲ ଆକାର: $3',
+'svg-long-desc-animated' => 'Animated SVG ଫାଇଲ, ସାଧାରଣ ମାପ $1 × $2 ପିକ୍ସେଲ, ଫାଇଲ ଆକାର: $3',
 'show-big-image' => 'ପୁରା ବଡ଼ ଆକାରରେ',
 'show-big-image-preview' => 'ଏହି ଦେଖଣାର ଆକାର: $1 ।',
 'show-big-image-other' => 'ବାକି {{PLURAL:$2|ରେଜୋଲୁସନ|ରେଜୋଲୁସନ}}: $1.',
@@ -3852,6 +3856,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 
 # Search suggestions
 'searchsuggest-search' => 'ଖୋଜିବା',
+'searchsuggest-containing' => 'ଧାରଣ ହେଉଛି...',
 
 # API errors
 'api-error-badaccess-groups' => 'ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ ।',
@@ -3899,7 +3904,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'duration-days' => '$1 {{PLURAL:$1|ଦିନ|ଦିନଗୁଡିକ}}',
 'duration-weeks' => '$1 {{PLURAL: $1|ସପ୍ତାହ|ସପ୍ତାହଗୁଡିକ}}',
 'duration-years' => '$1 {{PLURAL:$1|year|years}}',
-'duration-decades' => '$1 {{PLURAL:$1|decade|decades}',
+'duration-decades' => '$1 {{PLURAL:$1|decade|decades}}',
 'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
 
index bebf4fe..81c18a7 100644 (file)
@@ -234,7 +234,6 @@ $messages = array(
 'qbbrowse' => 'Фен',
 'qbedit' => 'Ивын',
 'qbpageoptions' => 'Ацы фарс',
-'qbpageinfo' => 'Фарсы контекст',
 'qbmyoptions' => 'Мæ фæрстæ',
 'qbspecialpages' => 'Сæрмагонд фæрстæ',
 'faq' => 'FAQ',
@@ -458,7 +457,7 @@ $1',
 'badtitletext' => 'Æрдомд фарсы ном уыд рæдыдимæ кæнæ афтид кæнæ та йæ æхсæн-æвзаг æви йæ интервики æрвитæн раст нæ уыд.
 Гæнæн ис Номы ис ахæм дамгъæтæ, кæдон уым æвæрын нæй гæнæн.',
 'perfcached' => 'Бындæр цы рардтæ ис, уыдон сты кешгонд æмæ гæнæн ис базæронд сты. Кешы гæнæн ис уа æппæты фылдæр {{PLURAL:$1|иу фæстиуæг|$1 фæстиуæджы}}.',
-'perfcachedts' => 'Бындæр цы рардтæ ис, уыдон сты кешгонд æмæ фæстаг хатт нæуæггонд æрцыдысты $1. Кешы гæнæн ис уа æппæты фылдæр {{PLURAL:$1|иу фæстиуæг|$1 фæстиуæджы}}.',
+'perfcachedts' => 'Бындæр цы рардтæ ис, уыдон сты кешгонд æмæ фæстаг хатт нæуæггонд æрцыдысты $1. Кешы гæнæн ис уа æппæты фылдæр {{PLURAL:$4|иу фæстиуæг|$4 фæстиуæджы}}.',
 'querypage-no-updates' => 'Ацы фарсы нæуæгкæнын ныртæккæ хицæн у.
 Цы рардтæ дзы ис, уыдон нæуæг нæ кæндзысты.',
 'wrong_wfQuery_params' => 'Рæдыд параметртæ wfQuery() функцийæн<br />
index 96176c0..b003cb7 100644 (file)
@@ -147,7 +147,6 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'qbbrowse' => 'Bation (browse)',
 'qbedit' => 'Mag-edit',
 'qbpageoptions' => 'Ining bulung',
-'qbpageinfo' => 'Kontekstu/kabilian',
 'qbmyoptions' => 'Deng kakung bulung',
 'qbspecialpages' => 'Bulung a makabukud',
 'faq' => 'Maralas a Kukutang (MAK)',
index 6aad410..7d5451b 100644 (file)
@@ -139,7 +139,6 @@ $messages = array(
 'qbbrowse' => 'Trifouille',
 'qbedit' => 'Editer',
 'qbpageoptions' => 'Chol pache-lo',
-'qbpageinfo' => 'Conteske',
 'qbmyoptions' => 'Mes paches',
 'qbspecialpages' => 'Espéciales paches',
 'faq' => 'FAQ',
index ac63621..31ea8bf 100644 (file)
@@ -438,7 +438,6 @@ $messages = array(
 'qbbrowse' => 'Przeglądanie',
 'qbedit' => 'Edycja',
 'qbpageoptions' => 'Ta strona',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Moje strony',
 'qbspecialpages' => 'strony specjalne',
 'faq' => 'FAQ',
index 8055888..aa734de 100644 (file)
@@ -186,7 +186,6 @@ $messages = array(
 'qbbrowse' => 'Sfeuja',
 'qbedit' => 'Modìfica',
 'qbpageoptions' => 'Opsion dla pàgina',
-'qbpageinfo' => 'Anformassion rësguard a la pàgina',
 'qbmyoptions' => 'Mie opsion',
 'qbspecialpages' => 'Pàgine speciaj',
 'faq' => 'Chestion frequente',
@@ -808,7 +807,7 @@ A esist già.',
 'defaultmessagetext' => "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
 'content-failed-to-parse' => "Faliment ëd l'anàlisi dël contnù ëd $2 për ël model $1: $3",
 'invalid-content-data' => 'Dat dël contnù pa bon',
-'content-not-allowed-here' => 'Contnù ëd "$1" pa përmëttù an sla pagina [[$2]]',
+'content-not-allowed-here' => "Ël contnù «$1» a l'é nen autorisà an sla pàgina [[$2]]",
 
 # Content models
 'content-model-wikitext' => 'test wiki',
@@ -1731,7 +1730,7 @@ Peul desse ch'a veula modifiché la descrission dzora soa [pàgina ëd descrissi
 'shared-repo-from' => 'da $1',
 'shared-repo' => "n'archivi condivis",
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
-'upload-disallowed-here' => 'Për maleur a peul pa rampiassé sta figura.',
+'upload-disallowed-here' => 'A peul pa rampiassé sto archivi.',
 
 # File reversion
 'filerevert' => "Buté torna $1 tanme ch'a l'era",
@@ -2580,7 +2579,7 @@ L'artìcol ëd destinassion «[[:$1]]» a-i é già. Veul-lo scancelelo për av
 'immobile-target-namespace-iw' => "Na liura interwiki a l'é pa na destinassion vàlida për tramudé na pàgina.",
 'immobile-source-page' => 'Sta pàgina-sì as peul pa tramudesse.',
 'immobile-target-page' => 'As peul pa tramudesse vers cost tìtol ëd destinassion.',
-'bad-target-model' => 'La destinassion vorsùa a dòvra un model ëd contnù diferent. As peul pa convertisse da $1 a $2.',
+'bad-target-model' => 'La destinassion vorsùa a deuvra un model ëd contnù diferent. As peul pa convertisse da $1 a $2.',
 'imagenocrossnamespace' => "As peul pa tramudesse n'archivi a në spassi nominal diferent",
 'nonfile-cannot-move-to-file' => "As peul nen tramudesse lòn ch'a l'é pa n'archivi a lë spassi nominal dj'archivi",
 'imagetypemismatch' => "La neuva estension ëd l'archivi a corispond pa a sò tipo",
@@ -2825,6 +2824,7 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 
 # Info page
 'pageinfo-title' => 'Anformassion për «$1»',
+'pageinfo-not-current' => "L'anformassion a peul mach esse mostà për la revision corenta.",
 'pageinfo-header-basic' => 'Anformassion ëd base',
 'pageinfo-header-edits' => 'Modìfiche',
 'pageinfo-header-restrictions' => 'Protession ëd la pàgina',
@@ -2853,6 +2853,13 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorìa|Categorìe}} stërmà ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|stamp contnù|stamp contnù}} ($1)',
 'pageinfo-toolboxlink' => 'Anformassion an sla pàgina',
+'pageinfo-redirectsto' => 'Ridiression-a a',
+'pageinfo-redirectsto-info' => 'anformassion',
+'pageinfo-contentpage' => 'Contà com na pagina ëd contnù',
+'pageinfo-contentpage-yes' => 'É!',
+'pageinfo-protect-cascading' => 'Le protession a son a cascada da sì',
+'pageinfo-protect-cascading-yes' => 'É!',
+'pageinfo-protect-cascading-from' => 'Le protession a son a cascada da',
 
 # Patrolling
 'markaspatrolleddiff' => 'Marché coma verificà',
@@ -3150,10 +3157,10 @@ J'àutri a saran stërmà coma stàndard.
 'exif-orientation-4' => 'Arvirà dzor-sota',
 'exif-orientation-5' => 'Arvirà dzor-sota e ëd 90° contramostra',
 'exif-orientation-6' => 'Arvirà ëd 90° contramostra',
-'exif-orientation-7' => 'Arvirà dzorsota e ëd 90° ant ël sens dla mostra',
+'exif-orientation-7' => 'Arvirà dzor-sota e ëd 90° ant ël sens dla mostra',
 'exif-orientation-8' => 'Arvirà ëd 90° ant ël sens dla mostra',
 
-'exif-planarconfiguration-1' => 'për blòch (chunky)',
+'exif-planarconfiguration-1' => 'dàit a blòch',
 'exif-planarconfiguration-2' => 'an planar',
 
 'exif-xyresolution-i' => '$1 pont për pòles (dpi)',
@@ -3168,19 +3175,19 @@ J'àutri a saran stërmà coma stàndard.
 'exif-exposureprogram-2' => 'Programa normal',
 'exif-exposureprogram-3' => 'Priorità ëd temp',
 'exif-exposureprogram-4' => 'Priorità ëd diaframa',
-'exif-exposureprogram-5' => "Programa creativ (coregiù për avej pì ëd profondità 'd camp)",
-'exif-exposureprogram-6' => "Programa d'assion (coregiù për avej ël temp pì curt che as peul)",
-'exif-exposureprogram-7' => 'Programa ritrat (për fotografìe pijaite da davsin, con lë sfond fòra feu)',
+'exif-exposureprogram-5' => "Programa creativ (coregiù për avèj pì ëd profondità 'd camp)",
+'exif-exposureprogram-6' => "Programa d'assion (coregiù për avèj ël temp pì curt che as peul)",
+'exif-exposureprogram-7' => 'Programa ritrat (për fotografìe pijàite da davzin, con lë sfond fòra feu)',
 'exif-exposureprogram-8' => 'Panorama (sogèt lontan e con lë sfond a feu)',
 
 'exif-subjectdistance-value' => '$1 méter',
 
-'exif-meteringmode-0' => 'Pa conossù',
+'exif-meteringmode-0' => 'Dësconossù',
 'exif-meteringmode-1' => 'Media',
 'exif-meteringmode-2' => 'Media centrà',
-'exif-meteringmode-3' => 'Quadrèt (Spot)',
-'exif-meteringmode-4' => 'Vàire quadrèt (MultiSpot)',
-'exif-meteringmode-5' => 'Schema (Pattern)',
+'exif-meteringmode-3' => 'Quadrèt',
+'exif-meteringmode-4' => 'Vàire quadrèt',
+'exif-meteringmode-5' => 'Schema',
 'exif-meteringmode-6' => 'Parsial',
 'exif-meteringmode-255' => "n'àutr",
 
index 22e90e8..2efddb7 100644 (file)
@@ -166,7 +166,6 @@ $messages = array(
 'qbbrowse' => 'لبو',
 'qbedit' => 'لکھو',
 'qbpageoptions' => 'اے صفہ',
-'qbpageinfo' => 'محول',
 'qbmyoptions' => 'میرے صفے',
 'qbspecialpages' => 'خاص صفے',
 'faq' => 'FAQ',
index 7571d87..f0d44b3 100644 (file)
@@ -152,7 +152,6 @@ Pāusai en kategōrijai "$1"',
 'qbbrowse' => 'Pradirēis',
 'qbedit' => 'Redigīs',
 'qbpageoptions' => 'Šin pāusan',
-'qbpageinfo' => 'Kōnteksts',
 'qbmyoptions' => 'Majāi pāusai',
 'qbspecialpages' => 'Speciālai pāusai',
 'faq' => 'Ukadeznai prasīsenei',
index d7cf926..8053935 100644 (file)
@@ -299,7 +299,6 @@ $messages = array(
 'qbbrowse' => 'سپړل',
 'qbedit' => 'سمول',
 'qbpageoptions' => 'همدا مخ',
-'qbpageinfo' => 'متن',
 'qbmyoptions' => 'زما پاڼې',
 'qbspecialpages' => 'ځانګړي مخونه',
 'faq' => 'ډ-ځ-پ',
@@ -513,7 +512,7 @@ $1',
 په ټولو ويکي ګانو کې د ژباړې د ورګډولو او يا هم د ژباړې د سمون او بدلون لپاره د مېډياويکي د ځايتابه پروژه [//translatewiki.net/ translatewiki.net] وکاروۍ.',
 'editinginterface' => "'''ګواښنه:''' تاسو په يوه داسې مخ کې بدلون راولی کوم چې د يوې پوستکالی د ليدنمخ متن په توګه کارېږي.
 په همدې مخ کې بدلون راوستل به د نورو کارنانو د ليدنمخ بڼه اغېزمنه کړي.
-د ژباړې لپاره، مهرباني وکړی د [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]، وېبځي ته ولاړ شی. دا وېبځی د ميډياويکي د ځايتابه پروژه ده او د همدې پر کارولو غور وکړی.",
+د ژباړې د ورګډولو او بدلون لپاره، مهرباني وکړی د [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]، وېبځي ته ولاړ شی. دا وېبځی د ميډياويکي د ځايتابه پروژه ده.",
 'sqlhidden' => '(د SQL پوښتن پټ دی)',
 'namespaceprotected' => "تاسې د '''$1''' په نوم-تشيال کې د مخونو د سمولو اجازه نه لرۍ.",
 'customcssprotected' => 'تاسې د دې CSS مخ د سمولو اجازه نه لرۍ، دا ځکه چې دا مخ د بل کارن شخصي امستنې لري.',
@@ -1237,7 +1236,7 @@ $1',
 'upload' => 'دوتنه پورته کول',
 'uploadbtn' => 'دوتنه پورته کول',
 'uploadnologin' => 'غونډال کې نه ياست ننوتي',
-'uploadnologintext' => 'د دوتنو د پورته کولو لپاره بايد غونډال کې [[Special:Userlogin|ننوځۍ]].',
+'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، نو لومړی غونډال کې [[Special:UserLogin|ورننوځۍ]].',
 'uploaderror' => 'د پورته کولو ستونزه',
 'uploadtext' => "د دوتنې د پورته کېدو لپاره لاندينی چوکاټ وکاروۍ.
 که چېرته د پخونيو پورته شويو دوتنو کتل او پلټل غواړۍ نو [[Special:FileList|د پورته شويو دوتنو لړليک]] ته ورشۍ، [[Special:Log/upload|د (بيا) پورته شويو دوتنو يادښتونه]] او [[Special:Log/delete|د ړنګېدو يادښتونه]] هم کتلای شی.
@@ -1647,7 +1646,7 @@ $1',
 'wlheader-showupdated' => "* هغه مخونه چې وروستی ځل ستاسو د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک نښه شوي.",
 'watchlistcontains' => 'ستاسې کتنلړ $1 {{PLURAL:$1|مخ|مخونه}} لري.',
 'iteminvalidname' => "د '$1' توکي سره ستونزه، ناسم نوم ...",
-'wlnote' => "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر يوه ساعت|تېرو '''$2''' ساعتونو}} کې تر $4 نېټې او $5 بجو پېښ شوي.",
+'wlnote' => "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر ساعت|تېرو '''$2''' ساعتونو}} کې تر $3 نېټې او $4 بجو پېښ شوي.",
 'wlshowlast' => 'وروستي $1 ساعتونه $2 ورځې $3 ښکاره کړه',
 'watchlist-options' => 'د کتنلړ خوښنې',
 
@@ -2118,9 +2117,19 @@ $UNWATCHURL  نه ليدنه وکړۍ
 
 # Info page
 'pageinfo-title' => 'د "$1" مالومات',
+'pageinfo-header-basic' => 'بنسټيز مالومات',
 'pageinfo-header-edits' => 'د سمون پېښليک',
+'pageinfo-header-restrictions' => 'مخ ژغورنه',
+'pageinfo-header-properties' => 'د مخ ځانتياوې',
+'pageinfo-display-title' => 'ښکارېدونکی سرليک',
+'pageinfo-article-id' => 'د مخ پېژند',
+'pageinfo-robot-index' => 'ليکلړوړ',
+'pageinfo-robot-noindex' => 'ليکلړوړ نه',
 'pageinfo-views' => 'د کتنو شمېر',
 'pageinfo-watchers' => 'د مخ د کتونکو شمېر',
+'pageinfo-redirects-name' => 'دې مخ ته ورګرځونې',
+'pageinfo-subpages-name' => 'دې مخ ته څېرمه مخونه',
+'pageinfo-firstuser' => 'مخ جوړونکی',
 'pageinfo-edits' => 'د ټولو سمونونو شمېر',
 
 # Skin names
index cc58d37..aaee1a5 100644 (file)
@@ -454,7 +454,6 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta página',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'Minhas páginas',
 'qbspecialpages' => 'Páginas especiais',
 'faq' => 'FAQ',
@@ -467,7 +466,7 @@ $messages = array(
 'vector-action-protect' => 'Proteger',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Alterar protecção',
-'vector-simplesearch-preference' => 'Activar sugestões de busca melhoradas (apenas no tema Vector)',
+'vector-simplesearch-preference' => 'Activar barra de buscas simplificada (apenas no tema Vector)',
 'vector-view-create' => 'Criar',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver histórico',
index 5db359b..649fa98 100644 (file)
@@ -314,7 +314,7 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Sublinhar ligação:',
+'tog-underline' => 'Sublinhar links:',
 'tog-justify' => 'Justificar parágrafos',
 'tog-hideminor' => 'Ocultar edições menores nas mudanças recentes',
 'tog-hidepatrolled' => 'Ocultar edições patrulhadas nas mudanças recentes',
@@ -324,7 +324,7 @@ $messages = array(
 'tog-numberheadings' => 'Auto-numerar cabeçalhos',
 'tog-showtoolbar' => 'Mostrar barra de edição (JavaScript)',
 'tog-editondblclick' => 'Editar páginas quando houver clique duplo (JavaScript)',
-'tog-editsection' => 'Habilitar edição de seção via ligações [editar]',
+'tog-editsection' => 'Ativar a edição de seções com links [editar]',
 'tog-editsectiononrightclick' => 'Habilitar edição de seção por clique com o botão direito no título da seção (JavaScript)',
 'tog-showtoc' => 'Mostrar Tabela de Conteúdos (para páginas com mais de três cabeçalhos)',
 'tog-rememberpassword' => 'Recordar os meus dados neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
@@ -342,10 +342,10 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Revelar o meu endereço de email nas notificações',
 'tog-shownumberswatching' => 'Mostrar o número de usuários que estão vigiando',
 'tog-oldsig' => 'Assinatura existente:',
-'tog-fancysig' => 'Tratar assinatura como wikitexto (sem ligação automática)',
+'tog-fancysig' => 'Tratar assinatura como wikitexto (sem link automático)',
 'tog-externaleditor' => 'Utilizar editor externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
 'tog-externaldiff' => 'Utilizar comparador de versões externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-showjumplinks' => 'Ativar ligações de acessibilidade "ir para"',
+'tog-showjumplinks' => 'Ativar links de acessibilidade "ir para"',
 'tog-uselivepreview' => 'Utilizar pré-visualização em tempo real (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Avisar-me ao introduzir um sumário vazio',
 'tog-watchlisthideown' => 'Ocultar as minhas edições da lista de páginas vigiadas',
@@ -440,7 +440,7 @@ $messages = array(
 'listingcontinuesabbrev' => 'cont.',
 'index-category' => 'Páginas indexadas',
 'noindex-category' => 'Páginas não indexadas',
-'broken-file-category' => 'Páginas com ligações quebradas para arquivos',
+'broken-file-category' => 'Páginas com links inválidos para arquivos',
 
 'about' => 'Sobre',
 'article' => 'Página de conteúdo',
@@ -458,7 +458,6 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta página',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'Minhas páginas',
 'qbspecialpages' => 'Páginas especiais',
 'faq' => 'FAQ',
@@ -471,7 +470,7 @@ $messages = array(
 'vector-action-protect' => 'Proteger',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Alterar a proteção',
-'vector-simplesearch-preference' => 'Ativar sugestões de busca melhoradas (apenas no tema Vector)',
+'vector-simplesearch-preference' => 'Ativar barra simplificada de buscas (apenas no skin Vector)',
 'vector-view-create' => 'Criar',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver histórico',
@@ -493,7 +492,7 @@ $messages = array(
 'history_short' => 'Histórico',
 'updatedmarker' => 'atualizado desde a minha última visita',
 'printableversion' => 'Versão para impressão',
-'permalink' => 'Ligação permanente',
+'permalink' => 'Link permanente',
 'print' => 'Imprimir',
 'view' => 'Ver',
 'edit' => 'Editar',
@@ -623,7 +622,7 @@ Veja a [[Special:Version|página sobre a versão do sistema]].',
 # Main script and global functions
 'nosuchaction' => 'Ação inexistente',
 'nosuchactiontext' => 'A ação especificada pela URL é inválida.
-Você deve ter se enganado ao digitar a URL, ou seguiu uma ligação incorreta.
+Você deve ter se enganado ao digitar a URL, ou acessou um link incorreto.
 Isso também pode indicar um erro no software usado no sítio {{SITENAME}}.',
 'nosuchspecialpage' => 'Esta página especial não existe',
 'nospecialpagetext' => '<strong>Você requisitou uma página especial inválida.</strong>
@@ -633,12 +632,12 @@ Uma lista de páginas especiais válidas poderá ser encontrada em [[Special:Spe
 # General errors
 'error' => 'Erro',
 'databaseerror' => 'Erro no banco de dados',
-'dberrortext' => 'Ocorreu um erro de sintaxe de busca no banco de dados.
-Isto pode indicar um problema com o \'\'software\'\'.
+'dberrortext' => 'Ocorreu um erro de sintaxe na busca no banco de dados.
+Isto pode indicar um bug no software.
 A última tentativa de busca no banco de dados foi:
-<blockquote><tt>$1</tt></blockquote>
-na função "<tt>$2</tt>".
-O banco de dados retornou o erro "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+na função "<code>$2</code>".
+O banco de dados retornou o erro "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Ocorreu um erro de sintaxe de busca no banco de dados.
 A última tentativa de busca no banco de dados foi:
 "$1"
@@ -652,10 +651,10 @@ O banco de dados retornou o erro "$3: $4".',
 Quem fez o bloqueio oferece a seguinte explicação: $1',
 'missing-article' => 'O banco de dados não encontrou o texto de uma página que deveria ter encontrado, com o nome "$1" $2.
 
-Isso normalmente é causado ao acessar uma ligação de diferença (diff) desatualizada ou para o histórico de uma página que foi apagada.
+Isso normalmente é causado ao acessar um link de diferença (dif) desatualizado ou para o histórico de uma página que foi apagada.
 
-Se não for este o caso, você pode ter encontrado um defeito (bug) no software.
-Anote o URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].',
+Se este não for o caso, você pode ter encontrado um defeito (bug) no software.
+Anote a URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].',
 'missingarticle-rev' => '(revisão#: $1)',
 'missingarticle-diff' => '(Dif.: $1, $2)',
 'readonly_lag' => 'O banco de dados foi automaticamente bloqueado enquanto os servidores secundários se sincronizam com o principal',
@@ -850,12 +849,17 @@ Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senh
 'passwordreset-capture-help' => 'Se marcar esta caixa, o e-mail (com a senha temporária) será-lhe mostrado, além de ser enviado para o usuário.',
 'passwordreset-email' => 'Endereço de e-mail:',
 'passwordreset-emailtitle' => 'Detalhes da conta em {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, do endereço IP $1) solicitou um lembrete do seu detalhes de conta para {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
+'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, a partir do endereço IP $1)
+solicitou um lembrete dos seus detalhes de conta para {{SITENAME}} ($4).
+{{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
 
 $2
 
-{{PLURAL:$3|Esta senha temporária |Essas senhas temporárias}} vão expirar em {{PLURAL:$5|um dia|$5 dias}}.
-Você deve efetuar login e escolher uma nova senha agora. Se você conseguir lembrar da senha, ignore este e-mail e continue usando sua senha anterior, do contrário, prossiga com as instruções clicando na ligação.',
+{{PLURAL:$3|Esta senha temporária vai|Essas senhas temporárias vão}} expirar em {{PLURAL:$5|um dia|$5 dias}}.
+Você deve efetuar login e escolher uma nova senha agora.
+Se você conseguir lembrar da senha, ignore este e-mail e continue
+usando sua senha anterior. Caso contrário, prossiga com as instruções
+disponíveis no link.',
 'passwordreset-emailtext-user' => 'O usuário $1 da {{SITENAME}} pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
 
 $2
@@ -883,10 +887,10 @@ Senha temporária: $2',
 'bold_tip' => 'Texto em negrito',
 'italic_sample' => 'Texto em itálico',
 'italic_tip' => 'Texto em itálico',
-'link_sample' => 'Título da ligação',
-'link_tip' => 'Ligação interna',
-'extlink_sample' => 'http://www.example.com título da ligação',
-'extlink_tip' => 'Ligação externa (lembre-se do prefixo http://)',
+'link_sample' => 'Título do link',
+'link_tip' => 'Link interno',
+'extlink_sample' => 'http://www.example.com título do link',
+'extlink_tip' => 'Link externo (lembre-se do prefixo http://)',
 'headline_sample' => 'Conteúdo do cabeçalho',
 'headline_tip' => 'Seção de nível 2',
 'nowiki_sample' => 'Inserir texto não-formatado aqui',
@@ -894,7 +898,7 @@ Senha temporária: $2',
 'image_sample' => 'Exemplo.jpg',
 'image_tip' => 'Arquivo embutido',
 'media_sample' => 'Exemplo.ogg',
-'media_tip' => 'Ligação para o arquivo',
+'media_tip' => 'Link para o arquivo',
 'sig_tip' => 'Sua assinatura, com hora e data',
 'hr_tip' => 'Linha horizontal (use de forma moderada)',
 
@@ -962,7 +966,7 @@ Ela pode ter sido movida ou removido enquanto você estava vendo a página.',
 
 A senha para esta nova conta pode ser alterada na página ''[[Special:ChangePassword|de troca de senha]]'', após a autenticação.",
 'newarticle' => '(Nova)',
-'newarticletext' => "Você seguiu uma ligação para uma página que ainda não existe.
+'newarticletext' => "Você seguiu um link para uma página que ainda não existe.
 Para criá-la, comece escrevendo na caixa abaixo (veja [[{{MediaWiki:Helppage}}|a página de ajuda]] para mais informações).
 Se você chegou aqui por engano, clique no botão '''voltar''' do seu navegador.",
 'anontalkpagetext' => "---- ''Esta é a página de discussão para um usuário anônimo que ainda não criou uma conta ou que não a usa, de forma que temos de utilizar o endereço de IP para identificá-lo(a). Tal endereço de IP pode ser compartilhado por vários usuários. Se você é um usuário anônimo e acha que comentários irrelevantes foram direcionados a você, por gentileza, [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]], a fim de evitar futuras confusões com outros usuários anônimos.''",
@@ -971,7 +975,7 @@ Você pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]]
 ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} criar esta página]</span>.',
 'noarticletext-nopermission' => 'No momento, não há conteúdo nesta página
 Você pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas,
-ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados] </span>.',
+ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados] </span>. Note que, no entanto, você não tem permissão para criar esta página.',
 'missing-revision' => 'A revisão #$1 da página denominada "{{PAGENAME}}" não existe.
 
 Isto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.
@@ -1434,7 +1438,7 @@ Eis um valor gerado aleatoriamente que você pode usar: $1",
 'timezoneregion-indian' => 'Oceano Índico',
 'timezoneregion-pacific' => 'Oceano Pacífico',
 'allowemail' => 'Permitir que outros usuários me enviem e-mails',
-'prefs-searchoptions' => 'Opções de busca',
+'prefs-searchoptions' => 'Busca',
 'prefs-namespaces' => 'Espaços nominais',
 'defaultns' => 'Caso contrário pesquisar nestes espaços nominais:',
 'default' => 'padrão',
index 981bd81..6684e66 100644 (file)
@@ -2840,7 +2840,12 @@ This message was something like "unlock move protection" in the past.',
 'protect-text' => 'Intro of the protection interface. See [[meta:Protect]] for more information.',
 'protect-default' => '{{Identical|Default}}',
 'protect-fallback' => 'This message is used as an option in the protection form on wikis were extra protection levels have been configured.',
-'protect-summary-cascade' => 'Used in edit summary when cascade protecting a page.',
+'protect-summary-cascade' => 'Used in edit summary when cascade protecting a page. Appears in protection log. See [[Special:Log]] and [[m:Special:Log]].
+
+Also used in [[Special:ProtectedPages]] when a page is cascade protected. See example: [[m:Special:ProtectedPages]].<br />
+See also:
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}',
 'protect-expiring' => 'Used in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.
 * $1 is a date and time
 * $2 is a date (optional)
@@ -2888,9 +2893,21 @@ Options for the duration of the page protection. Example: See e.g. [[MediaWiki:P
 {{Identical|Create}}',
 
 # Restriction levels
-'restriction-level-sysop' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level' and in brackets after each page name entry. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.",
-'restriction-level-autoconfirmed' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level', and in brackets after each page name entry. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.",
-'restriction-level-all' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level'. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.",
+'restriction-level-sysop' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level' and in brackets after each page name entry. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.
+
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}
+*{{msg-mw|Restriction-level-all}}",
+'restriction-level-autoconfirmed' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level', and in brackets after each page name entry. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.
+
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}
+*{{msg-mw|Restriction-level-all}}",
+'restriction-level-all' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level'. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.
+
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}
+*{{msg-mw|Restriction-level-all}}",
 
 # Undelete
 'undelete' => 'Name of special page for admins as displayed in [[Special:SpecialPages]].
@@ -3511,7 +3528,7 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
 # Info page
 'pageinfo-title' => 'Page title for action=info. Parameters:
 * $1 is the page name',
-'pageinfo-not-current' => 'Error message displayed when information for an old revision is requested.',
+'pageinfo-not-current' => 'Error message displayed when information for an old revision is requested. Example: [{{fullurl:Project:News|oldid=4266597&action=info}}]',
 'pageinfo-header-basic' => 'Table section header in action=info.',
 'pageinfo-header-edits' => 'Table section header in action=info.',
 'pageinfo-header-restrictions' => 'Table section header in action=info.',
@@ -3548,6 +3565,17 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
 'pageinfo-templates' => 'The list of templates transcluded within the page. Parameters:
 * $1 is the number of templates transcluded within the page.',
 'pageinfo-toolboxlink' => "Information link for the page (like 'What links here', but to action=info for the current page instead)",
+'pageinfo-redirectsto' => 'Key for the row shown if this page is a redirect.',
+'pageinfo-redirectsto-info' => 'Text to put in parentheses for the link to the action=info of the redirect target.',
+'pageinfo-contentpage' => 'Key for the row shown on [{{fullurl:News|action=info}} action=info] if this page is [[mw:Manual:Article count|counted as a content page]]',
+'pageinfo-contentpage-yes' => 'Yes, this page is a content page',
+'pageinfo-protect-cascading' => 'Key for the row which shows whether this page has cascading protection enabled
+*{{msg-mw|Pageinfo-protect-cascading}}
+*{{msg-mw|Pageinfo-protect-cascading-yes}}',
+'pageinfo-protect-cascading-yes' => 'Yes, protections are cascading from here
+*{{msg-mw|Pageinfo-protect-cascading}}
+*{{msg-mw|Pageinfo-protect-cascading-yes}}',
+'pageinfo-protect-cascading-from' => 'Key for a list of pages where protections are cascading from',
 
 # Skin names
 'skinname-standard' => '{{optional}}
index 8e7e833..afb3cc7 100644 (file)
@@ -411,7 +411,6 @@ $messages = array(
 'qbbrowse' => 'Maskapuy',
 'qbedit' => "Llamk'apuy",
 'qbpageoptions' => "P'anqap akllanankuna",
-'qbpageinfo' => "P'anqamanta willay",
 'qbmyoptions' => 'Akllanaykuna',
 'qbspecialpages' => "Sapaq p'anqakuna",
 'faq' => 'Pasaq tapuykuna',
index dd972bb..ec3693a 100644 (file)
@@ -446,7 +446,6 @@ pe titlul secțiunii (JavaScript)',
 'qbbrowse' => 'Răsfoiește',
 'qbedit' => 'Modificare',
 'qbpageoptions' => 'Opțiuni ale paginii',
-'qbpageinfo' => 'Informații ale paginii',
 'qbmyoptions' => 'Paginile mele',
 'qbspecialpages' => 'Pagini speciale',
 'faq' => 'Întrebări frecvente',
@@ -1587,7 +1586,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'right-rollback' => 'Revocarea rapidă a modificărilor ultimului utilizator care a modificat o pagină particulară',
 'right-markbotedits' => 'Marchează revenirea ca modificare efectuată de robot',
 'right-noratelimit' => 'Neafectat de limitele raportului',
-'right-import' => 'Importă pagini de la alte wiki',
+'right-import' => 'Importă pagini de la alte wikiuri',
 'right-importupload' => 'Importă pagini dintr-o încărcare de fișier',
 'right-patrol' => 'Marchează modificările altora ca patrulate',
 'right-autopatrol' => 'Modificările proprii marcate ca patrulate',
@@ -1986,7 +1985,7 @@ Poate doriți să-i modificați descrierea pe [$2 pagina sa descriptivă] de aco
 'uploadnewversion-linktext' => 'Încarcă o versiune nouă a acestui fișier',
 'shared-repo-from' => 'de la $1',
 'shared-repo' => 'un depozit partajat',
-'upload-disallowed-here' => 'Din păcate, nu puteți suprascrie această imagine.',
+'upload-disallowed-here' => 'Nu puteți suprascrie acest fișier.',
 
 # File reversion
 'filerevert' => 'Revenire $1',
@@ -3095,6 +3094,7 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 
 # Info page
 'pageinfo-title' => 'Informații pentru „$1”',
+'pageinfo-not-current' => 'Informațiile se pot afișa doar pentru versiunea curentă.',
 'pageinfo-header-basic' => 'Informații de bază',
 'pageinfo-header-edits' => 'Istoric modificări',
 'pageinfo-header-restrictions' => 'Protecție pagină',
@@ -3123,6 +3123,13 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorie ascunsă|Categorii ascunse}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Format inclus|Formate incluse}} ($1)',
 'pageinfo-toolboxlink' => 'Informații despre pagină',
+'pageinfo-redirectsto' => 'Redirecționează către',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Numărată ca pagină cu conținut',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading' => 'Protecțiile provin în cascadă de aici',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-protect-cascading-from' => 'Protecțiile provin în cascadă de la',
 
 # Skin names
 'skinname-standard' => 'Clasic',
index b26a477..d9ed9c9 100644 (file)
@@ -173,7 +173,6 @@ $messages = array(
 'qbbrowse' => 'Sfoglie',
 'qbedit' => 'Cange',
 'qbpageoptions' => 'Pàgene currende',
-'qbpageinfo' => 'Condeste',
 'qbmyoptions' => 'Pàggene mije',
 'qbspecialpages' => 'Pàggene speciale',
 'faq' => 'FAQ',
index 0e4a24a..94b5039 100644 (file)
@@ -41,6 +41,7 @@
  * @author HalanTul
  * @author Huuchin
  * @author Illusion
+ * @author Incnis Mrsi
  * @author Iniquity
  * @author Innv
  * @author Jackie
@@ -62,6 +63,7 @@
  * @author Sagan
  * @author Shirayuki
  * @author Sk
+ * @author Spider
  * @author TarzanASG
  * @author Temuri rajavi
  * @author Vago
@@ -540,7 +542,6 @@ $messages = array(
 'qbbrowse' => 'Просмотреть',
 'qbedit' => 'Править',
 'qbpageoptions' => 'Настройки страницы',
-'qbpageinfo' => 'Сведения о странице',
 'qbmyoptions' => 'Ваши настройки',
 'qbspecialpages' => 'Специальные страницы',
 'faq' => 'ЧаВО',
@@ -553,7 +554,7 @@ $messages = array(
 'vector-action-protect' => 'Защитить',
 'vector-action-undelete' => 'Восстановить',
 'vector-action-unprotect' => 'Изменить защиту',
-'vector-simplesearch-preference' => 'Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ñ\80аÑ\81Ñ\88иÑ\80еннÑ\8bе Ð¿Ð¾Ð¸Ñ\81ковÑ\8bе Ð¿Ð¾Ð´Ñ\81казки (только для оформления «Векторное»)',
+'vector-simplesearch-preference' => 'Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ñ\83пÑ\80оÑ\89Ñ\91ннÑ\83Ñ\8e Ñ\81Ñ\82Ñ\80окÑ\83 Ð¿Ð¾Ð¸Ñ\81ка (только для оформления «Векторное»)',
 'vector-view-create' => 'Создание',
 'vector-view-edit' => 'Правка',
 'vector-view-history' => 'История',
@@ -1181,6 +1182,15 @@ $2
 'edit-already-exists' => 'Невозможно создать новую страницу.
 Она уже существует.',
 'defaultmessagetext' => 'Текст по умолчанию',
+'content-failed-to-parse' => 'Содержимое $2 не соответствует типу $1: $3.',
+'invalid-content-data' => 'Недопустимые данные',
+'content-not-allowed-here' => 'Содержимое "$1" недопустимо на странице [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'викитекст',
+'content-model-text' => 'обычный текст',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Внимание. Эта страница содержит слишком много вызовов ресурсоёмких функций.
@@ -2089,7 +2099,7 @@ $1',
 'shared-repo-from' => 'из $1',
 'shared-repo' => 'общего хранилища',
 'shared-repo-name-wikimediacommons' => 'Викисклада',
-'upload-disallowed-here' => 'Ð\9a Ñ\81ожалениÑ\8e, Ð²Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80езапиÑ\81аÑ\82Ñ\8c Ñ\8dÑ\82о Ð¸Ð·Ð¾Ð±Ñ\80ажение.',
+'upload-disallowed-here' => 'Ð\92Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80езапиÑ\81аÑ\82Ñ\8c Ñ\8dÑ\82оÑ\82 Ñ\84айл.',
 
 # File reversion
 'filerevert' => 'Возврат к старой версии $1',
@@ -2633,7 +2643,8 @@ $UNWATCHURL
 'undeletedrevisions' => '$1 {{PLURAL:$1|изменение|изменения|изменений}} восстановлено',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|версия|версии|версий}} и $2 {{PLURAL:$2|файл|файла|файлов}} восстановлено',
 'undeletedfiles' => '$1 {{PLURAL:$1|файл восстановлен|файла восстановлено|файлов восстановлено}}',
-'cannotundelete' => 'Ошибка восстановления. Возможно, кто-то другой уже восстановил страницу.',
+'cannotundelete' => 'Ошибка восстановления:
+$1',
 'undeletedpage' => "'''Страница «$1» была восстановлена.'''
 
 Для просмотра списка последних удалений и восстановлений см. [[Special:Log/delete|журнал удалений]].",
@@ -2937,6 +2948,7 @@ $1',
 'immobile-target-namespace-iw' => 'Ссылка интервики не может быть использована для переименования.',
 'immobile-source-page' => 'Эту страницу нельзя переименовать.',
 'immobile-target-page' => 'Нельзя присвоить странице это имя.',
+'bad-target-model' => 'Невозможно преобразовать $1 в $2: несовместимые модели данных.',
 'imagenocrossnamespace' => 'Невозможно дать файлу имя из другого пространства имён',
 'nonfile-cannot-move-to-file' => 'Невозможно переименовывать страницы в файлы',
 'imagetypemismatch' => 'Новое расширение файла не соответствует его типу',
@@ -3201,6 +3213,7 @@ The wiki server can't provide data in a format your client can read.",
 
 # Info page
 'pageinfo-title' => 'Сведения по «$1»',
+'pageinfo-not-current' => 'Данные предоставляются только для текущей правки.',
 'pageinfo-header-basic' => 'Основные сведения',
 'pageinfo-header-edits' => 'История изменений',
 'pageinfo-header-restrictions' => 'Защита страницы',
@@ -3229,6 +3242,9 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-magic-words' => '{{PLURAL:$1|Магическое слово|Магические слова}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Скрытая категория|Скрытых категорий}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Шаблон|Шаблонов}} ($1)',
+'pageinfo-toolboxlink' => 'Сведения о странице',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading-yes' => 'Да',
 
 # Skin names
 'skinname-standard' => 'Классическое',
@@ -3823,6 +3839,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Интервики-включение отключено]',
 'scarytranscludefailed' => '[Ошибка обращения к шаблону $1]',
+'scarytranscludefailed-httpstatus' => '[Не удалось загрузить шаблон для $1: HTTP $2]',
 'scarytranscludetoolong' => '[Слишком длинный URL]',
 
 # Delete conflict
@@ -4124,7 +4141,7 @@ MediaWiki распространяется в надежде, что она бу
 'sqlite-no-fts' => '$1 без поддержки полнотекстового поиска',
 
 # New logging system
-'logentry-delete-delete' => '$1 удалил страницу $3',
+'logentry-delete-delete' => '$1 {{GENDER:$1|удалил|удалила}} страницу $3',
 'logentry-delete-restore' => '$1 восстановил страницу $3',
 'logentry-delete-event' => '$1 изменил видимость {{PLURAL:$5|$5 записи журнала|$5 записей журнала|$5 записей журнала}} на $3: $4',
 'logentry-delete-revision' => '$1 изменил видимость {{PLURAL:$5|$5 версии|$5 версий|$5 версий}} на странице $3: $4',
index 2f6168c..0865153 100644 (file)
@@ -262,7 +262,6 @@ $messages = array(
 'qbbrowse' => 'Переглядати',
 'qbedit' => 'Едітовати',
 'qbpageoptions' => 'Тота сторінка',
-'qbpageinfo' => 'Контекст',
 'qbmyoptions' => 'Мої сторінкы',
 'qbspecialpages' => 'Шпеціалны сторінкы',
 'faq' => 'Часты звідованя',
index 39bd1d2..d83b5df 100644 (file)
@@ -424,7 +424,6 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
 'qbbrowse' => 'ब्राउस् इत्येतत् करोतु।',
 'qbedit' => 'सम्पाद्यताम्',
 'qbpageoptions' => 'इदं पृष्ठम्',
-'qbpageinfo' => 'प्रसंगः',
 'qbmyoptions' => 'मम पृष्ठानि',
 'qbspecialpages' => 'विशेषपृष्ठानि',
 'faq' => 'बहुधा पृच्छ्यमानाः प्रश्नाः',
index be7b5d0..f126d89 100644 (file)
@@ -187,7 +187,6 @@ $messages = array(
 'qbbrowse' => 'Көр',
 'qbedit' => 'Уларыт',
 'qbpageoptions' => 'Бу сирэй',
-'qbpageinfo' => 'Ис хоһооно',
 'qbmyoptions' => 'Мин сирэйдэрим',
 'qbspecialpages' => 'Аналлаах сирэйдэр',
 'faq' => 'FAQ',
index dd50025..5c89ca8 100644 (file)
@@ -163,7 +163,6 @@ $messages = array(
 'qbbrowse' => 'Sendra',
 'qbedit' => 'Tońge',
 'qbpageoptions' => 'Noa sakam',
-'qbpageinfo' => 'Sakam reaḱ thuti',
 'qbmyoptions' => 'In̕anḱ sakamko',
 'qbspecialpages' => 'Asokay teaḱ sakamko',
 'faq' => 'Baḍae kupuliko',
@@ -650,7 +649,7 @@ Onate noa ạrgumenṭkodo bạgi giḍi hoena.",
 'last' => 'Laha renaḱ',
 'page_first' => 'Pahilaḱ',
 'page_last' => 'Mucạt́aḱ',
-'histlegend' => "Farak bachao: oka nãwã aroeko tulạoem menet́kan, onako cinhạ em kate boloḱ se latar baṭon linmẽ.<br/>
+'histlegend' => "Farak bachao: oka nãwã aroeko tulạoem menet́kan, onako cinhạ em kate boloḱ se latar baṭon linmẽ.<br />
 Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:last}})''' = laha reaḱ nãwã aroe sãote tulạo, '''{{int:minoreditletter}}''' = huḍiń sompadon.",
 'history-fieldset-title' => 'Sendray jaṛ',
 'history-show-deleted' => 'khạli get giḍiyaḱ koge',
index 64ad9bb..ee0e3f7 100644 (file)
@@ -280,7 +280,6 @@ $messages = array(
 'qbbrowse' => 'Sfogghia',
 'qbedit' => 'Cancia',
 'qbpageoptions' => 'Opzioni pàggina',
-'qbpageinfo' => 'Nfurmazzioni supra la pàggina',
 'qbmyoptions' => 'Li mè pàggini',
 'qbspecialpages' => 'Pàggini spiciali',
 'faq' => 'Dumanni cumuni',
index 6ad83e2..4b08c9c 100644 (file)
@@ -159,7 +159,6 @@ $messages = array(
 'qbbrowse' => 'Brouse',
 'qbedit' => 'Edit',
 'qbpageoptions' => 'This page',
-'qbpageinfo' => 'Context',
 'qbmyoptions' => 'Ma pages',
 'qbspecialpages' => 'Byordinar pages',
 'faq' => 'ASQ',
index 41b4096..2037c5e 100644 (file)
@@ -230,7 +230,6 @@ $messages = array(
 'qbbrowse' => 'Iffuglia',
 'qbedit' => 'Mudifigga',
 'qbpageoptions' => 'Prifirenzi pàgina',
-'qbpageinfo' => "Infuimmazioni i' la pàgina",
 'qbmyoptions' => "Li me' pàgini",
 'qbspecialpages' => 'Pàgini ippiziari',
 'faq' => 'FAQ (infuimmazioni e aggiuddu)',
index b072a32..42e45b4 100644 (file)
@@ -206,7 +206,6 @@ $messages = array(
 'qbbrowse' => 'Bláđe',
 'qbedit' => 'Rievdat',
 'qbpageoptions' => 'Siidoásahusat',
-'qbpageinfo' => 'Siiddu dieđut',
 'qbmyoptions' => 'Ásahusat',
 'qbspecialpages' => 'Doaibmasiiddut',
 
index a18343b..c37b4e4 100644 (file)
@@ -352,7 +352,6 @@ $messages = array(
 'qbbrowse' => 'Prelistajte',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Opcije stranice',
-'qbpageinfo' => 'Informacije o stranici',
 'qbmyoptions' => 'Moje opcije',
 'qbspecialpages' => 'Posebne stranice',
 'faq' => 'ČPP',
index 2ac8d0f..936f8db 100644 (file)
@@ -339,7 +339,6 @@ $messages = array(
 'qbbrowse' => 'පිරික්සන්න',
 'qbedit' => 'සංස්කරණය',
 'qbpageoptions' => 'මෙම පිටුව',
-'qbpageinfo' => 'සන්දර්භය',
 'qbmyoptions' => 'මගේ පිටු',
 'qbspecialpages' => 'විශේෂ පිටු',
 'faq' => 'නිවිප්‍ර',
index 712c6c1..d4b6883 100644 (file)
@@ -426,7 +426,6 @@ $messages = array(
 'qbbrowse' => 'Prehliadať',
 'qbedit' => 'Upraviť',
 'qbpageoptions' => 'Táto stránka',
-'qbpageinfo' => 'Kontext',
 'qbmyoptions' => 'Moje stránky',
 'qbspecialpages' => 'Špeciálne stránky',
 'faq' => 'Často kladené otázky',
index 4faee60..29c7148 100644 (file)
@@ -329,7 +329,6 @@ $messages = array(
 'qbbrowse' => 'Prebrskaj',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Možnosti strani',
-'qbpageinfo' => 'Podatki o strani',
 'qbmyoptions' => 'Moje možnosti',
 'qbspecialpages' => 'Posebne strani',
 'faq' => 'Najpogostejša vprašanja',
@@ -1842,7 +1841,7 @@ Prosimo, ponovno preverite pravilnost URL-a in delovanje strani.',
 Prosimo, preverite delovanje strani, počakajte kratek čas in poskusite ponovno.
 Morda želite poskusiti ob času manjše zasedenosti.',
 
-'license' => 'Licenca:',
+'license' => 'Licenciranje:',
 'license-header' => 'Licenca',
 'nolicense' => 'Nobeno',
 'license-nopreview' => '(Predogled ni na voljo)',
@@ -1904,7 +1903,7 @@ Morda želite urediti njeno opisno stran na tamkajšnji [$2 opisni strani datote
 'shared-repo-from' => 'iz $1',
 'shared-repo' => 'skupno skladišče',
 'shared-repo-name-wikimediacommons' => 'Wikimedijina Zbirka',
-'upload-disallowed-here' => 'Slike žal ne morete prepisati.',
+'upload-disallowed-here' => 'Datoteke žal ne morete prepisati.',
 
 # File reversion
 'filerevert' => 'Vrni $1',
@@ -2244,7 +2243,7 @@ Morebitne spremembe te strani in pripadajoče pogovorne strani bodo navedene tuk
 'watchnochange' => 'V prikazanem časovnem obdobju ni nihče spremenil nadzorovanih strani.',
 'watchlist-details' => 'Spremljate $1 {{PLURAL:$1|stran|strani|strani|strani|strani}} (pogovorne strani niso vštete).',
 'wlheader-enotif' => '* Obveščanje po elektronski pošti je omogočeno.',
-'wlheader-showupdated' => "* Od vašega zadnjega ogleda spremenjene strani so prikazanje '''krepko'''.",
+'wlheader-showupdated' => "* Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
 'watchmethod-recent' => 'med nedavnimi urejanji iščem spremljane strani',
 'watchmethod-list' => 'med spremljanimi stranmi iščem nedavna urejanja',
 'watchlistcontains' => 'Spremljate $1 {{PLURAL:$1|stran|strani}}.',
@@ -2318,7 +2317,7 @@ Za zapise nedavnih brisanj glej $2.',
 'dellogpage' => 'Dnevnik brisanja',
 'dellogpagetext' => 'Spodaj je prikazan seznam nedavnih brisanj.',
 'deletionlog' => 'dnevnik brisanja',
-'reverted' => 'Vrnjeno na prejšnjo redakcijo.',
+'reverted' => 'Vrnjeno na prejšnje urejanje.',
 'deletecomment' => 'Razlog:',
 'deleteotherreason' => 'Drugi/dodatni razlogi:',
 'deletereasonotherlist' => 'Drug razlog',
index 2ebb2d0..55f3980 100644 (file)
@@ -160,7 +160,6 @@ $messages = array(
 'qbfind' => 'Fenda',
 'qbedit' => 'Ändern',
 'qbpageoptions' => 'Seytaoptiona',
-'qbpageinfo' => 'Seytadata',
 'qbmyoptions' => 'Menne Seyta',
 'qbspecialpages' => 'Spezialseyta',
 'faq' => 'FAQ',
index b590c8e..7aafdc9 100644 (file)
@@ -154,7 +154,6 @@ $messages = array(
 'qbbrowse' => 'Ka soo raadi',
 'qbedit' => 'Wax ka bedel',
 'qbpageoptions' => 'Boggaan',
-'qbpageinfo' => 'isku xiran',
 'qbmyoptions' => 'Boggageyga',
 'qbspecialpages' => 'Bogaga qaaska ah',
 'faq' => 'SIL',
index 56d5b82..efd1cb5 100644 (file)
@@ -360,7 +360,6 @@ $messages = array(
 'qbbrowse' => 'Shfletoni',
 'qbedit' => 'Redaktoni',
 'qbpageoptions' => 'Kjo faqe',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Faqet e mia',
 'qbspecialpages' => 'Faqet speciale',
 'faq' => 'Pyetje që bëhen shpesh',
index 873c7dd..98501b2 100644 (file)
@@ -541,7 +541,6 @@ $messages = array(
 'qbbrowse' => 'Потражи',
 'qbedit' => 'Уреди',
 'qbpageoptions' => 'Поставке странице',
-'qbpageinfo' => 'Садржај странице',
 'qbmyoptions' => 'Моје странице',
 'qbspecialpages' => 'Посебне странице',
 'faq' => 'НПП',
@@ -554,7 +553,7 @@ $messages = array(
 'vector-action-protect' => 'Заштити',
 'vector-action-undelete' => 'Врати',
 'vector-action-unprotect' => 'Промени заштиту',
-'vector-simplesearch-preference' => 'Ð\9fобоÑ\99Ñ\88ани Ð¿Ñ\80едлози Ð¿Ñ\80еÑ\82Ñ\80аге (само за тему „Векторско“)',
+'vector-simplesearch-preference' => 'УпÑ\80оÑ\88Ñ\9bено Ð¿Ð¾Ñ\99е Ð·Ð° Ð¿Ñ\80еÑ\82Ñ\80агÑ\83 (само за тему „Векторско“)',
 'vector-view-create' => 'Направи',
 'vector-view-edit' => 'Уреди',
 'vector-view-history' => 'Историја',
@@ -1190,6 +1189,15 @@ $2
 'edit-already-exists' => 'Не могу да направим страницу.
 Изгледа да она већ постоји.',
 'defaultmessagetext' => 'Подразумевани текст поруке',
+'content-failed-to-parse' => 'Не могу да рашчланим садржај типа $2 за модел $1: $3',
+'invalid-content-data' => 'Неисправни подаци садржаја',
+'content-not-allowed-here' => 'Садржај модела „$1“ није дозвољен на страници [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'викитекст',
+'content-model-text' => 'чист текст',
+'content-model-javascript' => 'јаваскрипт',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Упозорење:''' ова страница садржи превише позива за рашчлањивање.
@@ -2126,7 +2134,7 @@ $1',
 'shared-repo' => 'заједничко складиште',
 'shared-repo-name-wikimediacommons' => 'Викимедијина остава',
 'filepage.css' => '/* CSS који је постављен овде се налази на страницама за опис датотека, као и на страним викијима */',
-'upload-disallowed-here' => 'Ð\9dажалоÑ\81Ñ\82, Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ\82е Ð¾Ð²Ñ\83 Ñ\81лику.',
+'upload-disallowed-here' => 'Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ\82е Ð¾Ð²Ñ\83 Ð´Ð°Ñ\82оÑ\82еку.',
 
 # File reversion
 'filerevert' => 'Врати $1',
@@ -2683,7 +2691,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|Измена је враћена|$1 измене су враћене|$1 измена је враћено}}',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека|датотеке|датотека}} је враћено',
 'undeletedfiles' => '{{PLURAL:$1|Датотека је враћена|$1 датотеке су враћене|$1 датотека је враћено}}',
-'cannotundelete' => 'Неуспешно враћање. Неко други је то урадио пре вас.',
+'cannotundelete' => 'Враћање није успело:
+$1',
 'undeletedpage' => "'''Страница $1 је враћена'''
 
 Погледајте [[Special:Log/delete|историју брисања]] за записе о скорашњим брисањима и враћањима.",
@@ -2994,6 +3003,7 @@ $1',
 'immobile-target-namespace-iw' => 'Међувики веза није исправно одредиште за премештање странице.',
 'immobile-source-page' => 'Ова страница се не може преместити.',
 'immobile-target-page' => 'Не могу да преместим на жељени наслов.',
+'bad-target-model' => 'Жељено одредиште користи другачији модел садржаја. Не могу да претворим из $1 у $2.',
 'imagenocrossnamespace' => 'Датотека се не може преместити у именски простор који не припада датотекама.',
 'nonfile-cannot-move-to-file' => 'Не-датотеке не можете преместити у именски простор за датотеке',
 'imagetypemismatch' => 'Екстензија нове датотеке се не поклапа с њеном врстом',
@@ -3263,6 +3273,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Подаци о „$1“',
+'pageinfo-not-current' => 'Подаци могу бити приказани само за текућу измену.',
 'pageinfo-header-basic' => 'Основни подаци',
 'pageinfo-header-edits' => 'Историја измена',
 'pageinfo-header-restrictions' => 'Заштита странице',
@@ -3290,6 +3301,11 @@ $1',
 'pageinfo-magic-words' => '{{PLURAL:$1|Магична реч|Магичне речи}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Сакривена категорија|Сакривене категорије}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Укључени шаблон|Укључени шаблони}} ($1)',
+'pageinfo-toolboxlink' => 'Подаци о страници',
+'pageinfo-redirectsto' => 'Преусмерава на',
+'pageinfo-redirectsto-info' => 'подаци',
+'pageinfo-contentpage' => 'Рачуна се као страница са садржајем',
+'pageinfo-contentpage-yes' => 'Да',
 
 # Skin names
 'skinname-standard' => 'Класично',
@@ -3971,6 +3987,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Међувики укључивање шаблона је онемогућено]',
 'scarytranscludefailed' => '[Добављање шаблона за $1 није успело]',
+'scarytranscludefailed-httpstatus' => '[Не могу да преузмем шаблон $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL адреса је предугачка]',
 
 # Delete conflict
index d11560a..fd17f26 100644 (file)
@@ -450,7 +450,6 @@ $messages = array(
 'qbbrowse' => 'Potraži',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Postavke stranice',
-'qbpageinfo' => 'Sadržaj stranice',
 'qbmyoptions' => 'Moje stranice',
 'qbspecialpages' => 'Posebne stranice',
 'faq' => 'NPP',
@@ -463,7 +462,7 @@ $messages = array(
 'vector-action-protect' => 'Zaštiti',
 'vector-action-undelete' => 'Vrati',
 'vector-action-unprotect' => 'Promeni zaštitu',
-'vector-simplesearch-preference' => 'Poboljšani predlozi pretrage (samo za temu „Vektorsko“)',
+'vector-simplesearch-preference' => 'Uprošćeno polje za pretragu (samo za temu „Vektorsko“)',
 'vector-view-create' => 'Napravi',
 'vector-view-edit' => 'Uredi',
 'vector-view-history' => 'Istorija',
@@ -1099,6 +1098,15 @@ Izgleda da je obrisana.',
 'edit-already-exists' => 'Ne mogu da napravim stranicu.
 Izgleda da ona već postoji.',
 'defaultmessagetext' => 'Podrazumevani tekst poruke',
+'content-failed-to-parse' => 'Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3',
+'invalid-content-data' => 'Neispravni podaci sadržaja',
+'content-not-allowed-here' => 'Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'vikitekst',
+'content-model-text' => 'čist tekst',
+'content-model-javascript' => 'javaskript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Upozorenje:''' ova stranica sadrži previše poziva za raščlanjivanje.
@@ -2035,7 +2043,7 @@ Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 'shared-repo' => 'zajedničko skladište',
 'shared-repo-name-wikimediacommons' => 'Vikimedijina ostava',
 'filepage.css' => '/* CSS koji je postavljen ovde se nalazi na stranicama za opis datoteka, kao i na stranim vikijima */',
-'upload-disallowed-here' => 'Nažalost, ne možete da zamenite ovu sliku.',
+'upload-disallowed-here' => 'Ne možete da zamenite ovu datoteku.',
 
 # File reversion
 'filerevert' => 'Vrati $1',
@@ -2592,7 +2600,8 @@ Možda ste uneli pogrešnu vezu, ili je izmena vraćena ili uklonjena iz arhive.
 'undeletedrevisions' => '{{PLURAL:$1|Izmena je vraćena|$1 izmene su vraćene|$1 izmena je vraćeno}}',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka|datoteke|datoteka}} je vraćeno',
 'undeletedfiles' => '{{PLURAL:$1|Datoteka je vraćena|$1 datoteke su vraćene|$1 datoteka je vraćeno}}',
-'cannotundelete' => 'Neuspešno vraćanje. Neko drugi je to uradio pre vas.',
+'cannotundelete' => 'Vraćanje nije uspelo:
+$1',
 'undeletedpage' => "'''Stranica $1 je vraćena'''
 
 Pogledajte [[Special:Log/delete|istoriju brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
@@ -2903,6 +2912,7 @@ ne mogu da premestim stranicu preko same sebe.',
 'immobile-target-namespace-iw' => 'Međuviki veza nije ispravno odredište za premeštanje stranice.',
 'immobile-source-page' => 'Ova stranica se ne može premestiti.',
 'immobile-target-page' => 'Ne mogu da premestim na željeni naslov.',
+'bad-target-model' => 'Željeno odredište koristi drugačiji model sadržaja. Ne mogu da pretvorim iz $1 u $2.',
 'imagenocrossnamespace' => 'Datoteka se ne može premestiti u imenski prostor koji ne pripada datotekama.',
 'nonfile-cannot-move-to-file' => 'Ne-datoteke ne možete premestiti u imenski prostor za datoteke',
 'imagetypemismatch' => 'Ekstenzija nove datoteke se ne poklapa s njenom vrstom',
@@ -3172,6 +3182,7 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 
 # Info page
 'pageinfo-title' => 'Podaci o „$1“',
+'pageinfo-not-current' => 'Podaci mogu biti prikazani samo za tekuću izmenu.',
 'pageinfo-header-basic' => 'Osnovni podaci',
 'pageinfo-header-edits' => 'Istorija izmena',
 'pageinfo-header-restrictions' => 'Zaštita stranice',
@@ -3199,6 +3210,11 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-magic-words' => '{{PLURAL:$1|Magična reč|Magične reči}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)',
+'pageinfo-toolboxlink' => 'Podaci o stranici',
+'pageinfo-redirectsto' => 'Preusmerava na',
+'pageinfo-redirectsto-info' => 'podaci',
+'pageinfo-contentpage' => 'Računa se kao stranica sa sadržajem',
+'pageinfo-contentpage-yes' => 'Da',
 
 # Skin names
 'skinname-standard' => 'Klasično',
@@ -3880,6 +3896,7 @@ Ovaj potvrdni kod ističe $6 u $7.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Međuviki uključivanje šablona je onemogućeno]',
 'scarytranscludefailed' => '[Dobavljanje šablona za $1 nije uspelo]',
+'scarytranscludefailed-httpstatus' => '[Ne mogu da preuzmem šablon $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL adresa je predugačka]',
 
 # Delete conflict
index ad7a991..59d01a1 100644 (file)
@@ -189,7 +189,6 @@ $messages = array(
 'qbbrowse' => 'Bleederje',
 'qbedit' => 'Annerje',
 'qbpageoptions' => 'Disse Siede',
-'qbpageinfo' => 'Siedendoatäie',
 'qbmyoptions' => 'Mien Sieden',
 'qbspecialpages' => 'Spezialsieden',
 'faq' => 'Oafte stoalde Froagen',
index f847941..dd44a09 100644 (file)
@@ -274,7 +274,6 @@ $messages = array(
 'qbbrowse' => 'Sungsi',
 'qbedit' => 'Édit',
 'qbpageoptions' => 'Kaca ieu',
-'qbpageinfo' => 'Kontéks',
 'qbmyoptions' => 'Kaca kuring',
 'qbspecialpages' => 'Kaca husus',
 'faq' => 'NLD',
index 757211e..7a310a7 100644 (file)
@@ -465,7 +465,6 @@ $messages = array(
 'qbbrowse' => 'Bläddra igenom',
 'qbedit' => 'Redigera',
 'qbpageoptions' => 'Denna sida',
-'qbpageinfo' => 'Sidinformation',
 'qbmyoptions' => 'Mina inställningar',
 'qbspecialpages' => 'Specialsidor',
 'faq' => 'FAQ',
index df33d64..ee81d3a 100644 (file)
@@ -269,7 +269,6 @@ $messages = array(
 'qbbrowse' => 'Vinjari',
 'qbedit' => 'Hariri',
 'qbpageoptions' => 'Ukurasa huu',
-'qbpageinfo' => 'Muktadha',
 'qbmyoptions' => 'Kurasa zangu',
 'qbspecialpages' => 'Kurasa za pekee',
 'faq' => 'Maswali ya kawaida',
index 0fa1792..350ba98 100644 (file)
@@ -208,7 +208,6 @@ $messages = array(
 'qbbrowse' => 'Uoglůndańy',
 'qbedit' => 'Sprowjej',
 'qbpageoptions' => 'Ta zajta',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Moje zajty',
 'qbspecialpages' => 'Szpecyjalne zajty',
 'faq' => 'FAQ',
index 3c1efe7..daf40e2 100644 (file)
@@ -225,7 +225,6 @@ $messages = array(
 'qbbrowse' => 'உலவு',
 'qbedit' => 'தொகு',
 'qbpageoptions' => 'பக்க விருப்பத் தேர்வுகள்',
-'qbpageinfo' => 'பக்கத் தகவல்கள்',
 'qbmyoptions' => 'என் விருப்பத்தேர்வுகள்',
 'qbspecialpages' => 'சிறப்புப் பக்கங்கள்',
 'faq' => 'அடிக்கடி கேட்கப்படும் கேள்விகள்',
index d29825e..5bbccf2 100644 (file)
@@ -287,7 +287,6 @@ $messages = array(
 'qbbrowse' => 'విహరించు',
 'qbedit' => 'సవరించు',
 'qbpageoptions' => 'ఈ పేజీ',
-'qbpageinfo' => 'సందర్భం',
 'qbmyoptions' => 'నా పేజీలు',
 'qbspecialpages' => 'ప్రత్యేక పేజీలు',
 'faq' => 'తరచూ అడిగే ప్రశ్నలు',
index e582b50..0cd2c9b 100644 (file)
@@ -213,7 +213,6 @@ $messages = array(
 'qbbrowse' => 'Мурур',
 'qbedit' => 'Вироиш',
 'qbpageoptions' => 'Ин саҳифа',
-'qbpageinfo' => 'Бофт',
 'qbmyoptions' => 'Саҳифаҳои ман',
 'qbspecialpages' => 'Саҳифаҳои вижа',
 'faq' => 'Саволҳои тез-тез пурсидашуда',
index 5cf9a02..bf09f81 100644 (file)
@@ -155,7 +155,6 @@ $messages = array(
 'qbbrowse' => 'Murur',
 'qbedit' => 'Viroiş',
 'qbpageoptions' => 'In sahifa',
-'qbpageinfo' => 'Boft',
 'qbmyoptions' => 'Sahifahoi man',
 'qbspecialpages' => 'Sahifahoi viƶa',
 'faq' => 'Savolhoi tez-tez pursidaşuda',
index a5e7809..523fa4d 100644 (file)
@@ -328,7 +328,6 @@ $messages = array(
 'qbbrowse' => 'สืบค้น',
 'qbedit' => 'แก้ไข',
 'qbpageoptions' => 'หน้านี้',
-'qbpageinfo' => 'บริบท',
 'qbmyoptions' => 'หน้าของฉัน',
 'qbspecialpages' => 'หน้าพิเศษ',
 'faq' => 'คำถามถามบ่อย',
index 8a31a0b..1ed97e9 100644 (file)
@@ -182,7 +182,6 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
 'qbbrowse' => 'Göz aýla',
 'qbedit' => 'Redaktirle',
 'qbpageoptions' => 'Bu sahypa',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Meniň sahypalarym',
 'qbspecialpages' => 'Ýörite sahypalar',
 'faq' => 'KSS',
index 0d61625..f4d5e20 100644 (file)
@@ -295,7 +295,6 @@ $messages = array(
 'qbbrowse' => 'Basa-basahin',
 'qbedit' => 'Baguhin',
 'qbpageoptions' => 'Itong pahina',
-'qbpageinfo' => 'Konteksto',
 'qbmyoptions' => 'Mga pahina ko',
 'qbspecialpages' => 'Mga natatanging pahina',
 'faq' => "Mga karaniwang itinatanong (''FAQ'')",
index 9a0981e..8aac893 100644 (file)
@@ -468,7 +468,6 @@ $messages = array(
 'qbbrowse' => 'Tara',
 'qbedit' => 'Değiştir',
 'qbpageoptions' => 'Bu sayfa',
-'qbpageinfo' => 'Bağlam',
 'qbmyoptions' => 'Sayfalarım',
 'qbspecialpages' => 'Özel sayfalar',
 'faq' => 'SSS',
index b37c03d..9cd4547 100644 (file)
@@ -184,7 +184,6 @@ $messages = array(
 'qbbrowse' => 'كۆز يۈگۈرت',
 'qbedit' => 'تەھرىر',
 'qbpageoptions' => 'بۇ بەت',
-'qbpageinfo' => 'كونتېكست',
 'qbmyoptions' => 'بەتلەرىم',
 'qbspecialpages' => 'ئالاھىدە بەتلەر',
 'faq' => 'كۆپ كۆرۈلىدىغان مەسىلىلەر',
index 867e1de..0315ba6 100644 (file)
@@ -499,7 +499,6 @@ $messages = array(
 'qbbrowse' => 'Переглянути',
 'qbedit' => 'Редагувати',
 'qbpageoptions' => 'Налаштування сторінки',
-'qbpageinfo' => 'Інформація про сторінку',
 'qbmyoptions' => 'Мої налаштування',
 'qbspecialpages' => 'Спеціальні сторінки',
 'faq' => 'Часті питання',
index 86fbd08..e1f0178 100644 (file)
@@ -178,7 +178,6 @@ $messages = array(
 'qbbrowse' => "Ko'rish",
 'qbedit' => 'Tahrirlash',
 'qbpageoptions' => 'Ushbu sahifa',
-'qbpageinfo' => "Sahifa haqida ma'lumot",
 'qbmyoptions' => 'Mening sahifalarim',
 'qbspecialpages' => 'Maxsus sahifalar',
 'faq' => 'TSS',
index 1848d6f..607c442 100644 (file)
@@ -294,7 +294,6 @@ $messages = array(
 'qbbrowse' => 'Sfoja',
 'qbedit' => 'Canbia',
 'qbpageoptions' => 'Opsion pajina',
-'qbpageinfo' => 'Informasion so ła pajina',
 'qbmyoptions' => 'Łe me pajine',
 'qbspecialpages' => 'Pagine speciali',
 'faq' => 'Domande frequenti',
index 9a25185..362f233 100644 (file)
@@ -231,7 +231,6 @@ $messages = array(
 'qbbrowse' => 'Kacelta',
 'qbedit' => 'Redaktiruida',
 'qbpageoptions' => 'Necen lehtpolen järgendused',
-'qbpageinfo' => 'Andmused lehtpoles',
 'qbmyoptions' => 'Minun järgendused',
 'qbspecialpages' => 'Specialižed lehtpoled',
 'faq' => 'PPK',
index d44b51b..b3cd79d 100644 (file)
@@ -441,7 +441,6 @@ $messages = array(
 'qbbrowse' => 'Duyệt',
 'qbedit' => 'Sửa đổi',
 'qbpageoptions' => 'Trang này',
-'qbpageinfo' => 'Ngữ cảnh',
 'qbmyoptions' => 'Trang cá nhân',
 'qbspecialpages' => 'Trang đặc biệt',
 'faq' => 'Câu hỏi thường gặp',
@@ -3085,6 +3084,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 
 # Info page
 'pageinfo-title' => 'Thông tin về “$1”',
+'pageinfo-not-current' => 'Thông tin được hiển thị có thể chỉ có liên quan đến phiên bản hiện hành.',
 'pageinfo-header-basic' => 'Thông tin cơ bản',
 'pageinfo-header-edits' => 'Lịch sử sửa đổi',
 'pageinfo-header-restrictions' => 'Mức khóa trang',
index 1cb1e80..cb66929 100644 (file)
@@ -248,7 +248,6 @@ $messages = array(
 'qbbrowse' => 'Padön',
 'qbedit' => 'Redakön',
 'qbpageoptions' => 'Pad at',
-'qbpageinfo' => 'Yumed',
 'qbmyoptions' => 'Pads obik',
 'qbspecialpages' => 'Pads patik',
 'faq' => 'Säks suvo pasäköls',
index e607908..89fda5b 100644 (file)
@@ -423,7 +423,7 @@ Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taa
 # Groups
 'group-user' => 'Сäüttijäd',
 'group-sysop' => 'Praviťeľad',
-'group-all' => '{kõik)',
+'group-all' => '(kõik)',
 
 'group-user-member' => 'cäüttijä',
 
index 8eee3d9..d177635 100644 (file)
@@ -185,7 +185,6 @@ $messages = array(
 'qbbrowse' => 'Kaeq',
 'qbedit' => 'Toimõndaq',
 'qbpageoptions' => 'Leheküle säädmine',
-'qbpageinfo' => 'Leheküle teedüs',
 'qbmyoptions' => 'Mu säädmiseq',
 'qbspecialpages' => 'Tallitusleheküleq',
 'faq' => 'Sagõhõhe küsüdüq küsümiseq',
index 86cd086..9b1c150 100644 (file)
@@ -220,7 +220,6 @@ $messages = array(
 'qbbrowse' => 'Foyter',
 'qbedit' => 'Candjî',
 'qbpageoptions' => 'Cisse pådje ci',
-'qbpageinfo' => 'Contecse',
 'qbmyoptions' => 'Mes pådjes',
 'qbspecialpages' => 'Pådjes sipeciåles',
 
index e892cb2..74cc1a1 100644 (file)
@@ -209,7 +209,6 @@ $messages = array(
 'qbbrowse' => 'Igdalikyat',
 'qbedit' => 'Igliwat',
 'qbpageoptions' => 'Ini nga pakli',
-'qbpageinfo' => 'Kontexto',
 'qbmyoptions' => 'Akon mga pakli',
 'qbspecialpages' => 'Mga pinaurog nga pakli',
 'faq' => 'AGG',
@@ -291,6 +290,7 @@ Damo nga nagamit in gusto sinmulod hini nga pakli.
 Alayon paghulat makadali san-o ka inmutro pagsulod hin nga pakli utro.
 
 $1',
+'pool-timeout' => 'An pagpaundang-hin-oras in naghuhulat hin trangka',
 'pool-queuefull' => 'Puno an katitirok nga pila',
 'pool-errorunknown' => 'Waray kasabti nga kasaypanan',
 
@@ -440,6 +440,8 @@ Alayon pagutro kahuman hin pipira ka mga minuto.',
 'protectedpagetext' => 'Ini nga pakli in pinasaliporan para mapugngan an mga pagliwat.',
 'viewsourcetext' => 'Puydi ka kinmita ngan kinmopya han gintikangan han pakli:',
 'viewyourtext' => "Puydi nim makit-an ngan makopya an tinikangan han '''imo mga pagliwat''' ha dinhi nga pakli:",
+'protectedinterface' => 'Ini nga pakli in nahatag hin teksto hit interface para han software han hin nga wiki, ngan in pinasasaliporan para makalikay hit pag-abuso.
+Para makadugang o makaliwat hin mga paghubad para han tanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an kanan MediaWiki proyekto hin lokalisasyon.',
 'sqlhidden' => '(nakatago an SQL query)',
 'namespaceprotected' => "Diri ka gintutugutan pagliwat han mga pakli ha ngaran-lat'ang nga '''$1'''.",
 'customcssprotected' => 'Diri ka gintutugotan pagliwat hini nga CSS nga pakli, tungod nga nagsusulod ini hin kanan iba nga tawo personal nga karuyagon.',
@@ -528,13 +530,17 @@ Alayon pagutro pagbutang.',
 'newpassword' => 'Bag-o nga tigaman-pagsulod:',
 'retypenew' => 'Utroha pagbutang an bag-o nga tigaman-pagsulod:',
 'resetpass_forbidden' => 'Diri mababalyoan an mga tigaman-pagsulod',
+'resetpass-no-info' => 'Kinahanglan mo paglog-in para direkta ka makasakob dinhi nga pakli.',
 'resetpass-submit-loggedin' => 'Igbal-iw an tigaman-pagsulod',
 'resetpass-submit-cancel' => 'Pasagdi',
 'resetpass-temp-password' => 'Temporaryo nga tigaman-pagsakob:',
 
 # Special:PasswordReset
+'passwordreset' => 'igreset an tigaman-hit-pagsulod',
+'passwordreset-text' => 'Kompletoha ini nga porma para makakarawat hin email hin pahinumdom han detalye han akawnt.',
 'passwordreset-username' => 'Agnay hiton gumaramit:',
 'passwordreset-domain' => 'Dominyo:',
+'passwordreset-capture' => 'Kikitaon mo an resulta nga e-mail?',
 'passwordreset-email' => 'E-mail adres:',
 'passwordreset-emailtitle' => 'Mga detalye han akawnt ha {{SITENAME}}',
 'passwordreset-emailelement' => 'Agnay han gumaramit: $1
@@ -609,6 +615,7 @@ o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'note' => "'''Pahibaro:'''",
 'previewnote' => "'''Hinumdumi nga pahiuna-nga-paggawas pa la ini.'''
 ¡Waray pa katipig an imo mga ginbag-o!",
+'continue-editing' => 'Padayon pagliwat',
 'editing' => 'Ginliliwat an $1',
 'creating' => 'Ginhihimo an $1',
 'editingsection' => 'Ginliliwat an $1 (bahin)',
@@ -660,6 +667,7 @@ Ini nga mga argumento in ginlaktawan.",
 
 # History pages
 'viewpagelogs' => 'Kitaa an mga log para hini nga pakli',
+'nohistory' => 'Waray kaagi hin pagliwat hin nga pakli.',
 'currentrev' => 'Giurhii nga pagliwat',
 'currentrev-asof' => 'Giuurhii nga pagliwat han $1',
 'revisionasof' => 'Pagbabag-o han $1',
@@ -678,6 +686,7 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'history-show-deleted' => 'Ginpara la',
 'histfirst' => 'Giunhani',
 'histlast' => 'Giurhii',
+'historysize' => '({{PLURAL:$1|1 nga byte|$1 ka mga byte}})',
 'historyempty' => '(waray sulod)',
 
 # Revision feed
@@ -826,6 +835,7 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'timezoneregion-pacific' => 'Kalawdan Pasipiko',
 'prefs-searchoptions' => 'Pamilnga',
 'prefs-namespaces' => "Ngaran-lat'ang",
+'default' => 'aada-nga-daan',
 'prefs-files' => 'Mga paypay',
 'youremail' => 'E-mail:',
 'username' => 'Agnay hiton gumaramit:',
@@ -865,6 +875,8 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'userrights-user-editname' => 'Igbutang an agnay han gumaramit:',
 'editusergroup' => 'Igliwat han mga hugpo han gumaramit',
 'editinguser' => "Igliliwat an mga katungod han gumaramit han gumaramit '''[[Gumaramit:$1|$1]]''' $2",
+'userrights-editusergroup' => 'Igliwat an mga hugpo hin gumaramit',
+'saveusergroups' => 'Igtipig an mga hugpo han gumaramit',
 'userrights-groupsmember' => 'Api han:',
 'userrights-reason' => 'Katadungan:',
 'userrights-no-interwiki' => '
@@ -927,6 +939,9 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'action-createpage' => 'pahimo hin mga pakli',
 'action-minoredit' => 'butanga hin tigaman hinin nga pagliwat komo gutiay',
 'action-move' => 'balhina ini nga pakli',
+'action-movefile' => 'igbalhin ini nga paypay',
+'action-upload' => 'igkarga-pasaka ini nga paypay',
+'action-reupload' => 'igsapaw ini nga aanhi nga paypay',
 'action-delete' => 'paraa ini nga pakli',
 'action-deleterevision' => 'igpara ini nga pagbag-o',
 
@@ -975,9 +990,11 @@ Mga pakli ha [[Special:Watchlist|imo angay timan-an]] in naka-'''bold'''.",
 # Upload
 'upload' => 'Pagkarga hin file',
 'uploadbtn' => 'Igkarga an file',
+'uploadnologin' => 'Diri nakalog-in',
 'upload-recreate-warning' => "'''Pahimatngon:  An fayl nga may-ada hiton nga ngaran in ginpara o ginbalhin.'''
 
 An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para han imo kamurayaw:",
+'uploadlog' => 'Talaan hin ginkarga-pasaka',
 'uploadlogpage' => 'Talaan han mga ginkarga-paigbaw',
 'filename' => 'Ngaran han fayl',
 'filedesc' => 'Dalikyat nga pulong',
@@ -985,9 +1002,15 @@ An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para ha
 'filereuploadsummary' => 'Mga pagbal-iw ha fayl:',
 'filesource' => 'Tinikangan:',
 'ignorewarning' => 'Pabay-i an pahimatngon ngan igtipig la ngahaw',
+'filename-toolong' => 'Iton ngaran hin paypay in diri puyde na mas lapos pa ha 240 ka mga byte.',
+'badfilename' => 'An ngaran-han-paypay in ginliwat ngada ha "$1".',
 'filename-tooshort' => 'An ngaran han fayl in halipot hin duro.',
+'filetype-banned' => 'Ini nga klase nga paypay in gindidire.',
 'illegal-filename' => 'An ngaran han fayl in diri gintutugutan.',
 'unknown-error' => 'Nahitabo an waray kasasabti nga sayop.',
+'tmp-create-error' => 'Diri makakahimo hin temporaryo nga paypay.',
+'tmp-write-error' => 'Sayop ha pagsurat hin temporaryo nga paypay.',
+'largefileserver' => 'Ini nga paypay in durudako kaysa ha ginpapakarawat han serbidor.',
 'uploadwarning' => 'Pahimatngon han pagkarga paigbaw',
 'savefile' => 'Igtipig an paypay',
 'uploadedimage' => 'ginkarga-paigbaw "[[$1]]"',
index da7837b..a5daefc 100644 (file)
@@ -221,7 +221,6 @@ $messages = array(
 'qbbrowse' => 'Lemmi',
 'qbedit' => 'Soppi',
 'qbpageoptions' => 'Xëtuw tànneef',
-'qbpageinfo' => 'Xëtuw xibaar',
 'qbmyoptions' => 'Samay tànneef',
 'qbspecialpages' => 'Xëti jagleel',
 'faq' => 'Laaj yi ëpp',
index 6f5ba40..3989be2 100644 (file)
@@ -328,7 +328,6 @@ $messages = array(
 'qbbrowse' => 'בלעטערט',
 'qbedit' => 'ענדערן',
 'qbpageoptions' => 'דער בלאט',
-'qbpageinfo' => 'קאנטעקסט',
 'qbmyoptions' => 'מיינע בלעטער',
 'qbspecialpages' => 'ספעציעלע בלעטער',
 'faq' => 'מערסטע געפרעגטע פראגעס',
@@ -1609,6 +1608,8 @@ $1",
 'file-too-large' => 'די טעקע וואָס איר האט אײַנגעגעבן איז צו גרויס.',
 'filename-tooshort' => 'דער טעקענאמען איז צו קורץ',
 'filetype-banned' => 'דער טיפ טעקע איז געאַסרט',
+'verification-error' => 'די טעקע איז נישט אדורכגעגאנגען טעקע פרואוואונג.',
+'hookaborted' => 'די מאדיפיצירונג איר האט פרובירט קען נישט ווערן דורכגעפירט צוליב א פארברייטערונג.',
 'illegal-filename' => 'דער טעקע־נאָמען איז נישט ערלויבט',
 'overwrite' => 'מען טאָר נישט איבערשרײַבן אַן עקזיסטירנדע טעקע.',
 'unknown-error' => 'אַן אומבאַקאַנט טעות איז פֿארגעקומען.',
@@ -2628,6 +2629,8 @@ $1',
 'imageinvalidfilename' => 'דער ציל טעקע נאָמען איז נישט גילטיק.',
 'fix-double-redirects' => 'דערהײַנטיקן ווײַטערפֿירונגען צום ארגינעלן טיטל',
 'move-leave-redirect' => 'איבערלאזן א ווײַטערפֿירונג',
+'move-over-sharedrepo' => '== טעקע עקזיסטירט ==
+[[:$1]] עקזיסטירט אויף א געטיילטן רעפאזיטאריום. ווען מען באוועגט א טעקע צו דעם טיטל וועט דאס איבערשרייבן די געטיילטע טעקע.',
 'file-exists-sharedrepo' => "ס'איז שוין פאראן א טעקע מיטן געקליבענעם נאמען אויף א געמיינזאם רעפאזיטאריום.
 זייט אזוי גוט קלייבט אן אנדער נאמען.",
 
@@ -2698,6 +2701,7 @@ $1',
 'import-interwiki-templates' => 'איינשילסן אלע מוסטערן',
 'import-interwiki-submit' => 'אימפארט',
 'import-interwiki-namespace' => 'ציל נאמענטייל:',
+'import-interwiki-rootpage' => 'ציל שטאמבלאט (אפציאנאל):',
 'import-upload-filename' => 'טעקע נאמען:',
 'import-comment' => 'הערה:',
 'importtext' => 'ביטע עקספארטירט די טעקע פון דער מקור וויקי ניצנדיג דאס [[Special:Export|עקספארט הילפמיטל]], שפייכלט אײַן אויף אײַער קאמפיוטער און לאדט אַרויף דא.',
@@ -2733,6 +2737,8 @@ $1',
 'import-error-interwiki' => 'דעם בלאט "$1"  קען מען נישט אימפארטירן ווייל זיין נאמען איז רעזערווירט פאר דרויסנדיקער פארבינדונג (אינטערוויקי).',
 'import-error-special' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל ער געהערט צו א באזונדערן נאמענטייל וואס אנטהאלט נישט קיין בלעטער.',
 'import-error-invalid' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל זיין נאמען איז אומגילטיק.',
+'import-options-wrong' => '{{PLURAL:$2|פאלשער אויסקלייב|פאלשע אויסקלייבן}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'געגעבענער שטאמבלאט איז אן אומגילטיקער טיטל.',
 'import-rootpage-nosubpage' => 'נאמענטייל "$1" פונעם שטאמבלאט ערלויבט נישט קיין אונטערבלעטער.',
 
 # Import log
index d20de05..925b787 100644 (file)
@@ -197,7 +197,6 @@ $messages = array(
 'qbbrowse' => 'Ìṣíwò',
 'qbedit' => 'Àtúnṣe',
 'qbpageoptions' => 'Ojúewé yi',
-'qbpageinfo' => 'Àjọwípọ̀',
 'qbmyoptions' => 'Àwọn ojúewé mi',
 'qbspecialpages' => 'Àwọn ojúewé pàtàkì',
 'faq' => 'FAQ',
index 9f99887..528bbbe 100644 (file)
@@ -375,7 +375,6 @@ $messages = array(
 'qbbrowse' => '瀏覽',
 'qbedit' => '編輯',
 'qbpageoptions' => '呢一頁',
-'qbpageinfo' => '附近文字',
 'qbmyoptions' => '我嘅選項',
 'qbspecialpages' => '特別頁',
 'faq' => 'FAQ',
index a326277..580ffdd 100644 (file)
@@ -187,7 +187,6 @@ $messages = array(
 'qbbrowse' => 'Blaeren',
 'qbedit' => 'Bewerk',
 'qbpageoptions' => 'Paginaopties',
-'qbpageinfo' => 'Pagina-informaotie',
 'qbmyoptions' => 'Mien opties',
 'qbspecialpages' => 'Speciaole pahina’s',
 'faq' => 'FAQ (veehestelde vraehen)',
index 2136d18..024a446 100644 (file)
@@ -423,7 +423,6 @@ $messages = array(
 'qbbrowse' => '浏览',
 'qbedit' => '编辑',
 'qbpageoptions' => '页面选项',
-'qbpageinfo' => '页面信息',
 'qbmyoptions' => '我的选项',
 'qbspecialpages' => '特殊页面',
 'faq' => '常见问题',
@@ -1862,7 +1861,7 @@ $1',
 'shared-repo-from' => '出自$1',
 'shared-repo' => '一个共用文件库',
 'shared-repo-name-wikimediacommons' => '维基共享资源',
-'upload-disallowed-here' => '您不可以覆盖此图像',
+'upload-disallowed-here' => '您不可以覆盖此文件。',
 
 # File reversion
 'filerevert' => '恢复$1',
index f821d63..72c1825 100644 (file)
@@ -355,7 +355,6 @@ $messages = array(
 'qbbrowse' => '瀏覽',
 'qbedit' => '編輯',
 'qbpageoptions' => '頁面選項',
-'qbpageinfo' => '頁面訊息',
 'qbmyoptions' => '我的選項',
 'qbspecialpages' => '特殊頁面',
 'faq' => '常見問題解答',
@@ -1843,7 +1842,7 @@ $1',
 'shared-repo-from' => '出自$1',
 'shared-repo' => '一個共用檔案庫',
 'shared-repo-name-wikimediacommons' => '維基共享資源',
-'upload-disallowed-here' => '您不可以覆蓋此圖像。',
+'upload-disallowed-here' => '您不可以覆蓋此檔案。',
 
 # File reversion
 'filerevert' => '恢復$1',
@@ -2952,6 +2951,7 @@ $1被封禁的理由是“$2”',
 
 # Info page
 'pageinfo-title' => '“$1”的信息',
+'pageinfo-not-current' => '資訊可能只顯示在當前的修訂版本。',
 'pageinfo-header-basic' => '基本資料',
 'pageinfo-header-edits' => '編輯歷史',
 'pageinfo-header-restrictions' => '保護頁面',
@@ -2980,6 +2980,13 @@ $1被封禁的理由是“$2”',
 'pageinfo-hidden-categories' => '隱藏{{PLURAL:$1|分類|分類}} ( $1 )',
 'pageinfo-templates' => '被引用的{{PLURAL:$1|模版|模版}} ( $1 )',
 'pageinfo-toolboxlink' => '頁面資訊',
+'pageinfo-redirectsto' => '重定向到',
+'pageinfo-redirectsto-info' => '資訊',
+'pageinfo-contentpage' => '計算為內容頁',
+'pageinfo-contentpage-yes' => '是',
+'pageinfo-protect-cascading' => '從此開始連鎖保護',
+'pageinfo-protect-cascading-yes' => '是',
+'pageinfo-protect-cascading-from' => '從此連鎖保護',
 
 # Skin names
 'skinname-standard' => '標準',
index d6e7691..9f95f5d 100644 (file)
@@ -56,15 +56,15 @@ installations.
 
        importDump.php
        XML dump importer
-       
+
        importImages.php
        Import images into the wiki
-       
+
        importTextFile.php
        Import the contents of a text file into a wiki page
 
        moveBatch.php
-       Move a batch of pages 
+       Move a batch of pages
 
        namespaceDupes.php
        Check articles name to see if they conflict with new/existing namespaces
index 62baa2d..997b4a9 100644 (file)
@@ -1,4 +1,4 @@
 -- Adds a user,timestamp index to the archive table
 -- Used for browsing deleted contributions and renames
-ALTER TABLE /*$wgDBprefix*/archive 
+ALTER TABLE /*$wgDBprefix*/archive
        ADD INDEX usertext_timestamp ( ar_user_text , ar_timestamp );
index 5facd9e..22cc587 100644 (file)
@@ -1,10 +1,10 @@
--- 
+--
 -- patch-backlinkindexes.sql
--- 
+--
 -- Per bug 6440 / http://bugzilla.wikimedia.org/show_bug.cgi?id=6440
 --
 -- Improve performance of the "what links here"-type queries
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/pagelinks
    DROP INDEX pl_namespace,
@@ -13,7 +13,7 @@ ALTER TABLE /*$wgDBprefix*/pagelinks
 ALTER TABLE /*$wgDBprefix*/templatelinks
    DROP INDEX tl_namespace,
    ADD INDEX tl_namespace(tl_namespace, tl_title, tl_from);
-   
+
 ALTER TABLE /*$wgDBprefix*/imagelinks
    DROP INDEX il_to,
    ADD INDEX il_to(il_to, il_from);
index 416500c..97a5690 100644 (file)
@@ -8,7 +8,7 @@ CREATE TABLE /*$wgDBprefix*/category (
   cat_files int signed NOT NULL default 0,
 
   cat_hidden tinyint(1) unsigned NOT NULL default 0,
-  
+
   PRIMARY KEY (cat_id),
   UNIQUE KEY (cat_title),
 
index 02168d7..0af0cf9 100644 (file)
@@ -6,7 +6,7 @@
 CREATE TABLE /*$wgDBprefix*/categorylinks (
   -- Key to page_id of the page defined as a category member.
   cl_from int unsigned NOT NULL default '0',
-  
+
   -- Name of the category.
   -- This is also the page_title of the category's description page;
   -- all such pages are in namespace 14 (NS_CATEGORY).
@@ -17,20 +17,20 @@ CREATE TABLE /*$wgDBprefix*/categorylinks (
   -- isn't always ideal, but collations seem to be an exciting
   -- and dangerous new world in MySQL...
   --
-  -- Truncate so that the cl_sortkey key fits in 1000 bytes 
+  -- Truncate so that the cl_sortkey key fits in 1000 bytes
   -- (MyISAM 5 with server_character_set=utf8)
   cl_sortkey varchar(70) binary NOT NULL default '',
-  
+
   -- This isn't really used at present. Provided for an optional
   -- sorting method by approximate addition time.
   cl_timestamp timestamp NOT NULL,
-  
+
   UNIQUE KEY cl_from(cl_from,cl_to),
-  
+
   -- This key is trouble. It's incomplete, AND it's too big
   -- when collation is set to UTF-8. Bleeeacch!
   KEY cl_sortkey(cl_to,cl_sortkey),
-  
+
   -- Not really used?
   KEY cl_timestamp(cl_to,cl_timestamp)
 
index 8a9ff12..24ad84f 100644 (file)
@@ -1,10 +1,10 @@
--- 
+--
 -- patch-categorylinksindex.sql
--- 
+--
 -- Per bug 10280 / http://bugzilla.wikimedia.org/show_bug.cgi?id=10280
 --
 -- Improve enum continuation performance of the what pages belong to a category query
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/categorylinks
    DROP INDEX cl_sortkey,
index 0a4768c..fc5017d 100644 (file)
@@ -5,7 +5,7 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
   el_from int(8) unsigned NOT NULL default '0',
   el_to blob NOT NULL,
   el_index blob NOT NULL,
-  
+
   KEY (el_from, el_to(40)),
   KEY (el_to(60), el_from),
   KEY (el_index(60))
index 3483f8c..7ab6523 100644 (file)
@@ -1,3 +1,3 @@
 -- Adding fa_deleted field for additional content suppression
-ALTER TABLE /*$wgDBprefix*/filearchive 
+ALTER TABLE /*$wgDBprefix*/filearchive
   ADD fa_deleted tinyint unsigned NOT NULL default '0';
index c79000a..0d8c3ab 100644 (file)
@@ -1,5 +1,5 @@
 -- Adding index to sort by uploader
-ALTER TABLE /*$wgDBprefix*/filearchive 
+ALTER TABLE /*$wgDBprefix*/filearchive
   ADD INDEX fa_user_timestamp (fa_user_text,fa_timestamp),
   -- Remove useless, incomplete index
   DROP INDEX fa_deleted_user;
index 587a2ab..f75da8b 100644 (file)
@@ -4,30 +4,30 @@
 CREATE TABLE /*$wgDBprefix*/filearchive (
   -- Unique row id
   fa_id int not null auto_increment,
-  
+
   -- Original base filename; key to image.img_name, page.page_title, etc
   fa_name varchar(255) binary NOT NULL default '',
-  
+
   -- Filename of archived file, if an old revision
   fa_archive_name varchar(255) binary default '',
-  
+
   -- Which storage bin (directory tree or object store) the file data
   -- is stored in. Should be 'deleted' for files that have been deleted;
   -- any other bin is not yet in use.
   fa_storage_group varbinary(16),
-  
+
   -- SHA-1 of the file contents plus extension, used as a key for storage.
   -- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
   --
   -- If NULL, the file was missing at deletion time or has been purged
   -- from the archival storage.
   fa_storage_key varbinary(64) default '',
-  
+
   -- Deletion information, if this file is deleted.
   fa_deleted_user int,
   fa_deleted_timestamp binary(14) default '',
   fa_deleted_reason text,
-  
+
   -- Duped fields from image
   fa_size int unsigned default '0',
   fa_width int  default '0',
@@ -41,7 +41,7 @@ CREATE TABLE /*$wgDBprefix*/filearchive (
   fa_user int unsigned default '0',
   fa_user_text varchar(255) binary default '',
   fa_timestamp binary(14) default '',
-  
+
   PRIMARY KEY (fa_id),
   INDEX (fa_name, fa_timestamp),             -- pick out by image name
   INDEX (fa_storage_group, fa_storage_key),  -- pick out dupe files
index 50e56e0..c87c959 100644 (file)
@@ -1,5 +1,5 @@
 --
--- hitcounter table is used to buffer page hits before they are periodically 
+-- hitcounter table is used to buffer page hits before they are periodically
 -- counted and added to the cur_counter column in the cur table.
 -- December 2003
 --
index db56b22..a74d7bd 100644 (file)
@@ -1,8 +1,8 @@
--- 
+--
 -- image-user-index.sql
--- 
+--
 -- Add user/timestamp index to current image versions
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/image
    ADD INDEX img_usertext_timestamp (img_user_text,img_timestamp);
index 857eb98..87b8c2f 100644 (file)
@@ -4,11 +4,11 @@
 ALTER TABLE /*$wgDBprefix*/image ADD (
   -- Media type as defined by the MEDIATYPE_xxx constants
   img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
-  
+
   -- major part of a MIME media type as defined by IANA
   -- see http://www.iana.org/assignments/media-types/
   img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
-  
+
   -- minor part of a MIME media type as defined by IANA
   -- the minor parts are not required to adher to any standard
   -- but should be consistent throughout the database
index c56838f..c24d995 100644 (file)
@@ -1,8 +1,8 @@
--- 
+--
 -- patch-indexes.sql
--- 
+--
 -- Fix up table indexes; new to stable release in November 2003
--- 
+--
 
 ALTER TABLE IF EXISTS /*$wgDBprefix*/links
    DROP INDEX l_from,
index 321765b..57b7945 100644 (file)
@@ -5,16 +5,16 @@
 CREATE TABLE /*$wgDBprefix*/interwiki (
   -- The interwiki prefix, (e.g. "Meatball", or the language prefix "de")
   iw_prefix varchar(32) NOT NULL,
-  
+
   -- The URL of the wiki, with "$1" as a placeholder for an article name.
   -- Any spaces in the name will be transformed to underscores before
   -- insertion.
   iw_url blob NOT NULL,
-  
+
   -- A boolean value indicating whether the wiki is in this project
   -- (used, for example, to detect redirect loops)
   iw_local BOOL NOT NULL,
-  
+
   UNIQUE KEY iw_prefix (iw_prefix)
 
 ) /*$wgDBTableOptions*/;
index fcd257c..bb39c1d 100644 (file)
@@ -1,9 +1,9 @@
--- Add extra option fields to the ipblocks table, add some extra indexes, 
--- convert infinity values in ipb_expiry to something that sorts better, 
--- extend ipb_address and range fields, add a unique index for block conflict 
+-- Add extra option fields to the ipblocks table, add some extra indexes,
+-- convert infinity values in ipb_expiry to something that sorts better,
+-- extend ipb_address and range fields, add a unique index for block conflict
 -- detection.
 
--- Conflicts in the new unique index can be handled by creating a new 
+-- Conflicts in the new unique index can be handled by creating a new
 -- table and inserting into it instead of doing an ALTER TABLE.
 
 
@@ -22,7 +22,7 @@ CREATE TABLE /*$wgDBprefix*/ipblocks_newunique (
   ipb_expiry varbinary(14) NOT NULL default '',
   ipb_range_start tinyblob NOT NULL,
   ipb_range_end tinyblob NOT NULL,
-  
+
   PRIMARY KEY ipb_id (ipb_id),
   UNIQUE INDEX ipb_address_unique (ipb_address(255), ipb_user, ipb_auto),
   INDEX ipb_user (ipb_user),
@@ -32,8 +32,8 @@ CREATE TABLE /*$wgDBprefix*/ipblocks_newunique (
 
 ) /*$wgDBTableOptions*/;
 
-INSERT IGNORE INTO /*$wgDBprefix*/ipblocks_newunique 
-        (ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, ipb_anon_only, ipb_create_account) 
+INSERT IGNORE INTO /*$wgDBprefix*/ipblocks_newunique
+        (ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, ipb_anon_only, ipb_create_account)
   SELECT ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, 0            , ipb_user=0
   FROM /*$wgDBprefix*/ipblocks;
 
index c0b620d..e809d10 100644 (file)
@@ -4,7 +4,7 @@
 ALTER TABLE /*$wgDBprefix*/ipblocks
        ADD ipb_by_text varchar(255) binary NOT NULL default '';
 
-UPDATE /*$wgDBprefix*/ipblocks 
+UPDATE /*$wgDBprefix*/ipblocks
        JOIN /*$wgDBprefix*/user ON ipb_by = user_id
        SET ipb_by_text = user_name
        WHERE ipb_by != 0;
\ No newline at end of file
index fad9477..b12ddaa 100644 (file)
@@ -1,3 +1,3 @@
 -- Adding ipb_deleted field for hiding usernames
-ALTER TABLE /*$wgDBprefix*/ipblocks 
+ALTER TABLE /*$wgDBprefix*/ipblocks
   ADD ipb_deleted bool NOT NULL default 0;
index 64a906d..84cba8f 100644 (file)
@@ -1,5 +1,5 @@
 -- Add the range handling fields
-ALTER TABLE /*$wgDBprefix*/ipblocks 
+ALTER TABLE /*$wgDBprefix*/ipblocks
   ADD ipb_range_start tinyblob NOT NULL default '',
   ADD ipb_range_end tinyblob NOT NULL default '',
   ADD INDEX ipb_range (ipb_range_start(8), ipb_range_end(8));
@@ -7,15 +7,15 @@ ALTER TABLE /*$wgDBprefix*/ipblocks
 
 -- Initialise fields
 -- Only range blocks match ipb_address LIKE '%/%', this fact is used in the code already
-UPDATE /*$wgDBprefix*/ipblocks 
-  SET 
-    ipb_range_start = LPAD(HEX( 
+UPDATE /*$wgDBprefix*/ipblocks
+  SET
+    ipb_range_start = LPAD(HEX(
         (SUBSTRING_INDEX(ipb_address, '.', 1) << 24)
       + (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 2), '.', -1) << 16)
       + (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 3), '.', -1) << 24)
       + (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '/', 1), '.', -1)) ), 8, '0' ),
 
-    ipb_range_end = LPAD(HEX( 
+    ipb_range_end = LPAD(HEX(
         (SUBSTRING_INDEX(ipb_address, '.', 1) << 24)
       + (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 2), '.', -1) << 16)
       + (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 3), '.', -1) << 24)
index 89b34cb..b7bd3f1 100644 (file)
@@ -1,10 +1,10 @@
--- 
+--
 -- Track inline interwiki links
 --
 CREATE TABLE /*_*/iwlinks (
   -- page_id of the referring page
   iwl_from int unsigned NOT NULL default 0,
-  
+
   -- Interwiki prefix code of the target
   iwl_prefix varbinary(20) NOT NULL default '',
 
index c9199ef..662f5d2 100644 (file)
@@ -1,7 +1,7 @@
 -- Jobs performed by parallel apache threads or a command-line daemon
 CREATE TABLE /*_*/job (
   job_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  
+
   -- Command name
   -- Limited to 60 to prevent key length overflow
   job_cmd varbinary(60) NOT NULL default '',
diff --git a/maintenance/archives/patch-job_token.sql b/maintenance/archives/patch-job_token.sql
new file mode 100644 (file)
index 0000000..080fa97
--- /dev/null
@@ -0,0 +1,9 @@
+ALTER TABLE /*_*/job
+    ADD COLUMN job_random integer unsigned NOT NULL default 0,
+    ADD COLUMN job_token varbinary(32) NOT NULL default '',
+    ADD COLUMN job_token_timestamp varbinary(14) NULL default NULL,
+    ADD COLUMN job_sha1 varbinary(32) NOT NULL default '';
+
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
+
index ffff07c..5594acd 100644 (file)
@@ -1,7 +1,7 @@
 CREATE TABLE /*$wgDBprefix*/langlinks (
   -- page_id of the referring page
   ll_from int unsigned NOT NULL default '0',
-  
+
   -- Language code of the target
   ll_lang varbinary(20) NOT NULL default '',
 
index b15878c..d53d2ea 100644 (file)
@@ -6,13 +6,13 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/links;
 CREATE TABLE /*$wgDBprefix*/links (
   -- Key to the page_id of the page containing the link.
   l_from int unsigned NOT NULL default '0',
-  
+
   -- Key to the page_id of the link target.
   -- An unfortunate consequence of this is that rename
   -- operations require changing the links entries for
   -- all links to the moved page.
   l_to int unsigned NOT NULL default '0',
-  
+
   UNIQUE KEY l_from(l_from,l_to),
   KEY (l_to)
 
@@ -27,7 +27,7 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/brokenlinks;
 CREATE TABLE /*$wgDBprefix*/brokenlinks (
   -- Key to the page_id of the page containing the link.
   bl_from int unsigned NOT NULL default '0',
-  
+
   -- Text of the target page title ("namesapce:title").
   -- Unfortunately this doesn't split the namespace index
   -- key and therefore can't easily be joined to anything.
@@ -46,12 +46,12 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/imagelinks;
 CREATE TABLE /*$wgDBprefix*/imagelinks (
   -- Key to page_id of the page containing the image / media link.
   il_from int unsigned NOT NULL default '0',
-  
+
   -- Filename of target image.
   -- This is also the page_title of the file's description page;
   -- all such pages are in namespace 6 (NS_FILE).
   il_to varchar(255) binary NOT NULL default '',
-  
+
   UNIQUE KEY il_from(il_from,il_to),
   KEY (il_to)
 
index 41e051d..7e1113e 100644 (file)
@@ -1,7 +1,7 @@
 -- Rename the primary unique index from PRIMARY to ls_field_val
 -- This is for MySQL only and is necessary only for databases which were updated
 -- between MW 1.16 development revisions r50567 and r51465.
-ALTER TABLE /*_*/log_search 
-       DROP PRIMARY KEY, 
+ALTER TABLE /*_*/log_search
+       DROP PRIMARY KEY,
        ADD UNIQUE INDEX ls_field_val (ls_field,ls_value,ls_log_id);
 
index 9a783d8..12ca75e 100644 (file)
@@ -1,4 +1,4 @@
-ALTER TABLE /*$wgDBprefix*/logging 
+ALTER TABLE /*$wgDBprefix*/logging
        ADD log_user_text varchar(255) binary NOT NULL default '',
        ADD log_page int unsigned NULL,
        CHANGE log_type log_type varbinary(32) NOT NULL,
index e66ceec..5f24f5c 100644 (file)
@@ -1,8 +1,8 @@
--- 
+--
 -- patch-logging-times-index.sql
--- 
+--
 -- Add a very humble index on logging times
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/logging
    ADD INDEX times (log_timestamp);
index b5cfdf7..79df0dd 100644 (file)
@@ -7,21 +7,21 @@ CREATE TABLE /*$wgDBprefix*/logging (
   -- action field, but only the type controls categorization.
   log_type varbinary(10) NOT NULL default '',
   log_action varbinary(10) NOT NULL default '',
-  
+
   -- Timestamp. Duh.
   log_timestamp binary(14) NOT NULL default '19700101000000',
-  
+
   -- The user who performed this action; key to user_id
   log_user int unsigned NOT NULL default 0,
-  
+
   -- Key to the page affected. Where a user is the target,
   -- this will point to the user page.
   log_namespace int NOT NULL default 0,
   log_title varchar(255) binary NOT NULL default '',
-  
+
   -- Freeform text. Interpreted as edit history comments.
   log_comment varchar(255) NOT NULL default '',
-  
+
   -- LF separated list of miscellaneous parameters
   log_params blob NOT NULL,
 
index 8b63d1f..88dd64c 100644 (file)
@@ -3,8 +3,8 @@ ALTER TABLE /*_*/filearchive
 
 ALTER TABLE /*_*/image
   MODIFY COLUMN img_minor_mime varbinary(100) NOT NULL default "unknown";
-  
+
 ALTER TABLE /*_*/oldimage
   MODIFY COLUMN oi_minor_mime varbinary(100) NOT NULL default "unknown";
-  
+
 INSERT INTO /*_*/updatelog(ul_key) VALUES ('mime_minor_length');
index f4f3533..9fa05d2 100644 (file)
@@ -2,7 +2,7 @@
 CREATE TABLE /*_*/msg_resource (
   -- Resource name
   mr_resource varbinary(255) NOT NULL,
-  -- Language code 
+  -- Language code
   mr_lang varbinary(32) NOT NULL,
   -- JSON blob. This is an incomplete JSON object, i.e. without the wrapping {}
   mr_blob mediumblob NOT NULL,
index bc84887..df043c5 100644 (file)
@@ -1,10 +1,10 @@
--- 
+--
 -- patch-oi_metadata.sql
--- 
+--
 -- Add data to allow for direct reference to old images
 -- Some re-indexing here.
 -- Old images can be included into pages effeciently now.
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/oldimage
    DROP INDEX oi_name,
index 949625e..2c7f807 100644 (file)
@@ -1,8 +1,8 @@
--- 
+--
 -- oldimage-user-index.sql
--- 
+--
 -- Add user/timestamp index to old image versions
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/oldimage
    ADD INDEX oi_usertext_timestamp (oi_user_text,oi_timestamp);
index 118592f..cea89b5 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- Create the new pagelinks table to merge links and brokenlinks data,
 -- and populate it.
--- 
+--
 -- Unlike the old links and brokenlinks, these records will not need to be
 -- altered when target pages are created, deleted, or renamed. This should
 -- reduce the amount of severe database frustration that happens when widely-
 CREATE TABLE /*$wgDBprefix*/pagelinks (
   -- Key to the page_id of the page containing the link.
   pl_from int unsigned NOT NULL default '0',
-  
+
   -- Key to page_namespace/page_title of the target page.
   -- The target page may or may not exist, and due to renames
   -- and deletions may refer to different page records as time
   -- goes by.
   pl_namespace int NOT NULL default '0',
   pl_title varchar(255) binary NOT NULL default '',
-  
+
   UNIQUE KEY pl_from(pl_from,pl_namespace,pl_title),
   KEY (pl_namespace,pl_title)
 
index 395a81b..5fe241c 100644 (file)
@@ -1,5 +1,5 @@
 --
--- parsercache table, for cacheing complete parsed articles 
+-- parsercache table, for cacheing complete parsed articles
 -- before they are imbedded in the skin.
 --
 
index 186a203..a356670 100644 (file)
@@ -1,6 +1,6 @@
--- 
+--
 -- patch-pl-tl-il-unique-index.sql
--- 
+--
 -- Make reorderings of UNIQUE indices UNIQUE as well
 
 DROP INDEX /*i*/pl_namespace ON /*_*/pagelinks;
index e6da79c..8e1a518 100644 (file)
@@ -3,14 +3,14 @@
 CREATE TABLE /*$wgDBprefix*/querycache (
   -- A key name, generally the base name of of the special page.
   qc_type varbinary(32) NOT NULL,
-  
+
   -- Some sort of stored value. Sizes, counts...
   qc_value int unsigned NOT NULL default '0',
-  
+
   -- Target namespace+title
   qc_namespace int NOT NULL default '0',
   qc_title varchar(255) binary NOT NULL default '',
-  
+
   KEY (qc_type,qc_value)
 
 ) /*$wgDBTableOptions*/;
index 01623bc..7913131 100644 (file)
@@ -3,14 +3,14 @@
 CREATE TABLE /*$wgDBprefix*/querycachetwo (
   -- A key name, generally the base name of of the special page.
   qcc_type varbinary(32) NOT NULL,
-  
+
   -- Some sort of stored value. Sizes, counts...
   qcc_value int unsigned NOT NULL default '0',
-  
+
   -- Target namespace+title
   qcc_namespace int NOT NULL default '0',
   qcc_title varchar(255) binary NOT NULL default '',
-  
+
   -- Target namespace+title2
   qcc_namespacetwo int NOT NULL default '0',
   qcc_titletwo varchar(255) binary NOT NULL default '',
index 04ead97..f4bbd0f 100644 (file)
@@ -1,6 +1,6 @@
 -- Adding rc_deleted field for revisiondelete
 -- Add rc_logid to match log_id
-ALTER TABLE /*$wgDBprefix*/recentchanges 
+ALTER TABLE /*$wgDBprefix*/recentchanges
   ADD rc_deleted tinyint unsigned NOT NULL default '0',
   ADD rc_logid int unsigned NOT NULL default '0',
   ADD rc_log_type varbinary(255) NULL default NULL,
index 3b02375..28caee0 100644 (file)
@@ -1,6 +1,6 @@
 -- Primary key in recentchanges
 
-ALTER TABLE /*$wgDBprefix*/recentchanges 
+ALTER TABLE /*$wgDBprefix*/recentchanges
   ADD rc_id int NOT NULL auto_increment,
   ADD PRIMARY KEY rc_id (rc_id);
 
index 6b0b053..4d93300 100644 (file)
@@ -1,6 +1,6 @@
 -- Adding the rc_ip field for logging of IP addresses in recentchanges
 
-ALTER TABLE /*$wgDBprefix*/recentchanges 
+ALTER TABLE /*$wgDBprefix*/recentchanges
   ADD rc_ip varbinary(40) NOT NULL default '',
   ADD INDEX rc_ip (rc_ip);
 
index 5d7218b..d2957df 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- Create the new redirect table.
 -- For each redirect, this table contains exactly one row defining its target
--- 
+--
 CREATE TABLE /*$wgDBprefix*/redirect (
   -- Key to the page_id of the redirect page
   rd_from int unsigned NOT NULL default '0',
index 4b11b36..4a41003 100644 (file)
@@ -1,4 +1,4 @@
--- 
+--
 -- Recreates the iwl_prefix index for the iwlinks table
 --
 CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
index 7b63848..a5bc3e5 100644 (file)
@@ -38,7 +38,6 @@ CREATE TABLE /*$wgDBprefix*/revision (
   rev_minor_edit tinyint unsigned NOT NULL default '0',
   rev_deleted tinyint unsigned NOT NULL default '0',
 
-  
   PRIMARY KEY rev_page_id (rev_page, rev_id),
   UNIQUE INDEX rev_id (rev_id),
   INDEX rev_timestamp (rev_timestamp),
@@ -53,7 +52,7 @@ CREATE TABLE /*$wgDBprefix*/revision (
 --   old_id int(8) unsigned NOT NULL auto_increment,
 --   old_text mediumtext NOT NULL,
 --   old_flags tinyblob NOT NULL,
---   
+--
 --   PRIMARY KEY old_id (old_id)
 -- );
 
index 9b635a8..36507a2 100644 (file)
@@ -10,13 +10,13 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/searchindex;
 CREATE TABLE /*$wgDBprefix*/searchindex (
   -- Key to page_id
   si_page int unsigned NOT NULL,
-  
+
   -- Munged version of title
   si_title varchar(255) NOT NULL default '',
-  
+
   -- Munged version of body text
   si_text mediumtext NOT NULL,
-  
+
   UNIQUE KEY (si_page)
 
 ) ENGINE=MyISAM;
index a545b34..086b6a1 100644 (file)
@@ -4,16 +4,15 @@
 CREATE TABLE /*$wgDBprefix*/templatelinks (
   -- Key to the page_id of the page containing the link.
   tl_from int unsigned NOT NULL default '0',
-  
+
   -- Key to page_namespace/page_title of the target page.
   -- The target page may or may not exist, and due to renames
   -- and deletions may refer to different page records as time
   -- goes by.
   tl_namespace int NOT NULL default '0',
   tl_title varchar(255) binary NOT NULL default '',
-  
+
   UNIQUE KEY tl_from(tl_from,tl_namespace,tl_title),
   KEY (tl_namespace,tl_title)
-
 ) /*$wgDBTableOptions*/;
 
index 8591d81..6699b55 100644 (file)
@@ -12,13 +12,13 @@ drop table if exists /*$wgDBprefix*/testrun;
 
 create table /*$wgDBprefix*/testrun (
   tr_id int not null auto_increment,
-  
+
   tr_date char(14) binary,
   tr_mw_version blob,
   tr_php_version blob,
   tr_db_version blob,
   tr_uname blob,
-  
+
   primary key (tr_id)
 ) engine=InnoDB;
 
@@ -26,10 +26,10 @@ create table /*$wgDBprefix*/testitem (
   ti_run int not null,
   ti_name varchar(255),
   ti_success bool,
-  
+
   unique key (ti_run, ti_name),
   key (ti_run, ti_success),
-  
+
   foreign key (ti_run) references /*$wgDBprefix*/testrun(tr_id)
     on delete cascade
 ) engine=InnoDB;
index 2512076..556d6b2 100644 (file)
@@ -1,10 +1,10 @@
 --
--- Store information about newly uploaded files before they're 
+-- Store information about newly uploaded files before they're
 -- moved into the actual filestore
 --
 CREATE TABLE /*_*/uploadstash (
        us_id int unsigned NOT NULL PRIMARY KEY auto_increment,
-       
+
        -- the user who uploaded the file.
        us_user int unsigned NOT NULL,
 
@@ -14,16 +14,16 @@ CREATE TABLE /*_*/uploadstash (
 
        -- the original path
        us_orig_path varchar(255) NOT NULL,
-       
+
        -- the temporary path at which the file is actually stored
        us_path varchar(255) NOT NULL,
-       
+
        -- which type of upload the file came from (sometimes)
        us_source_type varchar(50),
-       
+
        -- the date/time on which the file was added
        us_timestamp varbinary(14) not null,
-       
+
        us_status varchar(50) not null,
 
        -- file properties from File::getPropsFromPath.  these may prove unnecessary.
@@ -38,7 +38,6 @@ CREATE TABLE /*_*/uploadstash (
        us_image_width int unsigned,
        us_image_height int unsigned,
        us_image_bits smallint unsigned
-       
 ) /*$wgDBTableOptions*/;
 
 -- sometimes there's a delete for all of a user's stuff.
index 96edaa4..de7cee7 100644 (file)
@@ -1,5 +1,5 @@
 -- Add a 'real name' field where users can specify the name they want
 -- used for author attribution or other places that real names matter.
 
-ALTER TABLE user 
+ALTER TABLE user
         ADD (user_real_name varchar(255) binary NOT NULL default '');
index ef56db0..591c753 100644 (file)
@@ -1,4 +1,4 @@
--- Stores the groups the user has once belonged to. 
+-- Stores the groups the user has once belonged to.
 -- The user may still belong these groups. Check user_groups.
 CREATE TABLE /*_*/user_former_groups (
   -- Key to user_id
index c374033..1683cf2 100644 (file)
@@ -9,7 +9,7 @@
 CREATE TABLE /*$wgDBprefix*/user_groups (
   -- Key to user_id
   ug_user int unsigned NOT NULL default '0',
-  
+
   -- Group names are short symbolic string keys.
   -- The set of group names is open-ended, though in practice
   -- only some predefined ones are likely to be used.
@@ -19,7 +19,7 @@ CREATE TABLE /*$wgDBprefix*/user_groups (
   -- permissions of any group they're explicitly in, plus
   -- the implicit '*' and 'user' groups.
   ug_group varbinary(16) NOT NULL default '',
-  
+
   PRIMARY KEY (ug_user,ug_group),
   KEY (ug_group)
 ) /*$wgDBTableOptions*/;
index e30e00d..85b0061 100644 (file)
 CREATE TABLE /*_*/user_properties(
   -- Foreign key to user.user_id
   up_user int not null,
-  
+
   -- Name of the option being saved. This is indexed for bulk lookup.
   up_property varbinary(32) not null,
-  
+
   -- Property value as a string.
   up_value blob
 ) /*$wgDBTableOptions*/;
index 9866654..4947cb1 100644 (file)
@@ -8,10 +8,10 @@
 CREATE TABLE /*$wgDBprefix*/user_rights (
   -- Key to user_id
   ur_user int unsigned NOT NULL,
-  
+
   -- Comma-separated list of permission keys
   ur_rights tinyblob NOT NULL,
-  
+
   UNIQUE KEY ur_user (ur_user)
 
 ) /*$wgDBTableOptions*/;
index 9b92215..1b96d1a 100644 (file)
@@ -8,18 +8,18 @@ Author: `Lindsey Simon <elsigh@google.com>`
 
 CSSJanus is CSS parser utility designed to aid the conversion of a website's
 layout from left-to-right(LTR) to right-to-left(RTL). The script was born out of
-a need to convert CSS for RTL languages when tables are not being used for layout (since tables will automatically reorder TD's in RTL). 
+a need to convert CSS for RTL languages when tables are not being used for layout (since tables will automatically reorder TD's in RTL).
 CSSJanus will change most of the obvious CSS property names and their values as
-well as some not-so-obvious ones (cursor, background-position %, etc...). 
-The script is designed to offer flexibility to account for cases when you do 
+well as some not-so-obvious ones (cursor, background-position %, etc...).
+The script is designed to offer flexibility to account for cases when you do
 not want to change certain rules which exist to account for bidirectional text
 display bugs, as well as situations where you may or may not want to flip annotations inside of the background url string.
-Note that you can disable CSSJanus from running on an entire class or any 
+Note that you can disable CSSJanus from running on an entire class or any
 rule within a class by prepending a /* @noflip */ comment before the rule(s)
 you want CSSJanus to ignore.
 
 CSSJanus itself is not always enough to make a website that works in a LTR
-language context work in a RTL language all the way, but it is a start. 
+language context work in a RTL language all the way, but it is a start.
 
 ==Getting the code==
 
@@ -31,7 +31,7 @@ Check out the latest development version anonymously with:
 
 {{{
   $ svn checkout http://cssjanus.googlecode.com/svn/trunk/ cssjanus
-}}} 
+}}}
 
 ==Using==
 
@@ -41,13 +41,13 @@ Flags:
   --swap_left_right_in_url: Fixes "left"/"right" string within urls.
   Ex: ./cssjanus.py --swap_left_right_in_url < file.css > file_rtl.css
   --swap_ltr_rtl_in_url: Fixes "ltr"/"rtl" string within urls.
-  Ex: ./cssjanus.py --swap_ltr_rtl_in_url < file.css > file_rtl.css  
-  
+  Ex: ./cssjanus.py --swap_ltr_rtl_in_url < file.css > file_rtl.css
+
 If you'd like to make use of the webapp version of cssjanus, you'll need to
 download the Google App Engine SDK
   http://code.google.com/appengine/downloads.html
 and also drop a "django" directory into this directory, with the latest svn
-from django. You should be good to go with that setup. Please let me know 
+from django. You should be good to go with that setup. Please let me know
 otherwise.
 
 ==Bugs, Patches==
@@ -76,13 +76,13 @@ Thanks to Jens Meiert for the German translation.
 
 {{{
   Copyright 2008 Google Inc. All Rights Reserved.
-  
+
   Licensed under the Apache License, Version 2.0 (the 'License');
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at
-  
+
       http://www.apache.org/licenses/LICENSE-2.0
-  
+
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an 'AS IS' BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
index 2fa70dc..13e3163 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/hphpi -f 
+#!/usr/bin/hphpi -f
 <?php
 
 define( 'MW_CONFIG_CALLBACK', 'MakeHipHop::noConfigNeeded' );
@@ -41,7 +41,7 @@ class MakeHipHop extends Maintenance {
                        unlink( "$buildDir/source" );
                }
 
-               # With the CentOS RPMs, you just get g++44, no g++, so we have to 
+               # With the CentOS RPMs, you just get g++44, no g++, so we have to
                # use the environment
                if ( isset( $_ENV['CXX'] ) ) {
                        $cxx = $_ENV['CXX'];
@@ -49,7 +49,7 @@ class MakeHipHop extends Maintenance {
                        $cxx = 'g++';
                }
 
-               # Create a function that provides the HipHop compiler version, and 
+               # Create a function that provides the HipHop compiler version, and
                # doesn't exist when MediaWiki is invoked in interpreter mode.
                $version = str_replace( PHP_EOL, ' ', trim( `hphp --version` ) );
                file_put_contents(
@@ -94,7 +94,7 @@ class MakeHipHop extends Maintenance {
                $this->checkVolatileClasses( $outDir );
 
                # Copy the generated C++ files into the source directory for cmake
-               $iter = new RecursiveIteratorIterator( 
+               $iter = new RecursiveIteratorIterator(
                        new RecursiveDirectoryIterator( $outDir ),
                        RecursiveIteratorIterator::SELF_FIRST );
                $sourceFiles = array();
@@ -148,14 +148,14 @@ class MakeHipHop extends Maintenance {
                }
 
                # Do our own version of $HPHP_HOME/bin/run.sh, which isn't so broken.
-               # HipHop's RELEASE mode seems to be stuck always on, so symbols get 
-               # stripped. Also we will try keeping the generated .o files instead of 
+               # HipHop's RELEASE mode seems to be stuck always on, so symbols get
+               # stripped. Also we will try keeping the generated .o files instead of
                # throwing away hours of CPU time every time you make a typo.
 
                chdir( $persistentDir );
 
                if ( $regenerateMakefile ) {
-                       copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt', 
+                       copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt',
                                "$persistentDir/CMakeLists.txt" );
 
                        if ( file_exists( "$persistentDir/CMakeCache.txt" ) ) {
@@ -165,7 +165,7 @@ class MakeHipHop extends Maintenance {
                        $cmd = 'cmake' .
                                " -D CMAKE_BUILD_TYPE:string=" . wfEscapeShellArg( $GLOBALS['wgHipHopBuildType'] ) .
                                ' -D PROGRAM_NAME:string=mediawiki-hphp';
-                       
+
                        if ( file_exists( '/usr/bin/ccache' ) ) {
                                $cmd .= ' -D CMAKE_CXX_COMPILER:string=ccache' .
                                        ' -D CMAKE_CXX_COMPILER_ARG1:string=' . wfEscapeShellArg( $cxx );
@@ -179,7 +179,7 @@ class MakeHipHop extends Maintenance {
                # Determine appropriate make concurrency
                # Compilation can take a lot of memory, let's assume that that is limiting.
                $procs = $this->getNumProcs();
-               
+
                # Run make. This is the slow step.
                passthru( 'make -j' . wfEscapeShellArg( $procs ) );
 
index 1c4b51f..1adfe29 100644 (file)
@@ -33,10 +33,10 @@ class RunHipHopServer extends Maintenance {
                        $sourceBase = realpath( "$IP/.." );
                }
 
-               passthru( 
+               passthru(
                        'cd ' . wfEscapeShellArg( $sourceBase ) . " && " .
                        'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' .
-                       wfEscapeShellArg( 
+                       wfEscapeShellArg(
                                "$buildDir/persistent/mediawiki-hphp",
                                '-c', "$thisDir/server.conf",
                                '-v', "Server.SourceRoot=$sourceBase",
index 312583a..568d5cd 100644 (file)
@@ -10,7 +10,7 @@ CREATE TABLE categorylinks (
   cl_from       BIGINT      NOT NULL  DEFAULT 0,
   -- REFERENCES page(page_id) ON DELETE CASCADE,
   cl_to         VARCHAR(255)         NOT NULL,
-  -- cl_sortkey has to be at least 86 wide 
+  -- cl_sortkey has to be at least 86 wide
   -- in order to be compatible with the old MySQL schema from MW 1.10
   --cl_sortkey    VARCHAR(86),
   cl_sortkey VARCHAR(230) FOR BIT DATA  NOT NULL ,
index 72dcd79..6798604 100644 (file)
@@ -1,10 +1,10 @@
 CREATE TABLE user_properties (
   -- Foreign key to user.user_id
   up_user BIGINT NOT NULL,
-  
+
   -- Name of the option being saved. This is indexed for bulk lookup.
   up_property VARCHAR(32) FOR BIT DATA NOT NULL,
-  
+
   -- Property value as a string.
   up_value CLOB(64K) INLINE LENGTH 4096
 );
index f5162c9..6fd7a83 100644 (file)
@@ -4,7 +4,7 @@
 -- This is read and executed by the install script; you should
 -- not have to run it by itself unless doing a manual install.
 
--- Notes: 
+-- Notes:
 --  * DB2 will convert all table and column names to all caps internally.
 --  * DB2 has a 32k limit on SQL filesize, so it may be necessary
 --     to split this into two files soon.
@@ -182,7 +182,7 @@ CREATE TABLE page_props (
   -- REFERENCES page (page_id) ON DELETE CASCADE,
   pp_propname  VARCHAR(255) NOT NULL,
   pp_value     CLOB(64K) INLINE LENGTH 4096 NOT NULL,
-  PRIMARY KEY (pp_page, pp_propname) 
+  PRIMARY KEY (pp_page, pp_propname)
 );
 CREATE INDEX page_props_propname
   ON page_props (pp_propname);
@@ -235,7 +235,7 @@ CREATE TABLE pagelinks (
   pl_namespace  SMALLINT NOT NULL,
   pl_title      VARCHAR(255) NOT NULL
 );
-CREATE UNIQUE INDEX pagelink_unique 
+CREATE UNIQUE INDEX pagelink_unique
   ON pagelinks (pl_from, pl_namespace, pl_title);
 
 
@@ -269,7 +269,7 @@ CREATE TABLE categorylinks (
   cl_from           BIGINT NOT NULL DEFAULT 0,
   -- REFERENCES page(page_id) ON DELETE CASCADE,
   cl_to             VARCHAR(255) NOT NULL,
-  -- cl_sortkey has to be at least 86 wide 
+  -- cl_sortkey has to be at least 86 wide
   -- in order to be compatible with the old MySQL schema from MW 1.10
   --cl_sortkey    VARCHAR(86),
   cl_sortkey        VARCHAR(230) FOR BIT DATA NOT NULL,
@@ -378,7 +378,7 @@ CREATE TABLE ipblocks (
 );
 CREATE INDEX ipb_address
   ON ipblocks (ipb_address);
-CREATE INDEX ipb_user 
+CREATE INDEX ipb_user
   ON ipblocks (ipb_user);
 CREATE INDEX ipb_range
   ON ipblocks (ipb_range_start, ipb_range_end);
@@ -507,7 +507,6 @@ CREATE TABLE recentchanges (
   rc_log_type        VARCHAR(255),
   rc_log_action      VARCHAR(255),
   rc_params          CLOB(64K) INLINE LENGTH 4096
-  
 );
 CREATE INDEX rc_timestamp
   ON recentchanges (rc_timestamp);
@@ -868,7 +867,7 @@ CREATE TABLE iwlinks
 
 
 --
--- Store information about newly uploaded files before they're 
+-- Store information about newly uploaded files before they're
 -- moved into the actual filestore
 --
 CREATE TABLE uploadstash (
@@ -920,7 +919,7 @@ CREATE INDEX us_timestamp
 
 
 
--- Stores the groups the user has once belonged to. 
+-- Stores the groups the user has once belonged to.
 -- The user may still belong these groups. Check user_groups.
 CREATE TABLE user_former_groups (
   ufg_user   BIGINT NOT NULL DEFAULT 0,
index 2980e66..60e0f30 100644 (file)
@@ -178,7 +178,6 @@ $wgMessageStructure = array(
                'qbbrowse',
                'qbedit',
                'qbpageoptions',
-               'qbpageinfo',
                'qbmyoptions',
                'qbspecialpages',
                'faq',
@@ -2704,6 +2703,13 @@ $wgMessageStructure = array(
                'pageinfo-templates',
                'pageinfo-footer',
                'pageinfo-toolboxlink',
+               'pageinfo-redirectsto',
+               'pageinfo-redirectsto-info',
+               'pageinfo-contentpage',
+               'pageinfo-contentpage-yes',
+               'pageinfo-protect-cascading',
+               'pageinfo-protect-cascading-yes',
+               'pageinfo-protect-cascading-from',
        ),
        'skin' => array(
                'skinname-standard',
index a0c3d17..ad99617 100644 (file)
@@ -76,10 +76,10 @@ CREATE TABLE /*$wgDBprefix*/user_newtalk (
 CREATE INDEX /*$wgDBprefix*/user_group_id ON /*$wgDBprefix*/user_newtalk([user_id]);
 CREATE INDEX /*$wgDBprefix*/user_ip       ON /*$wgDBprefix*/user_newtalk(user_ip);
 
--- 
+--
 -- User preferences and other fun stuff
 -- replaces old user.user_options BLOB
--- 
+--
 CREATE TABLE /*$wgDBprefix*/user_properties (
        up_user INT NOT NULL,
        up_property NVARCHAR(32) NOT NULL,
@@ -157,7 +157,7 @@ CREATE TABLE /*$wgDBprefix*/text (
 -- The fields generally correspond to the page, revision, and text
 -- fields, with several caveats.
 -- Cannot reasonably create views on this table, due to the presence of TEXT
--- columns. 
+-- columns.
 CREATE TABLE /*$wgDBprefix*/archive (
    ar_namespace SMALLINT NOT NULL DEFAULT 0,
    ar_title NVARCHAR(255) NOT NULL DEFAULT '',
@@ -234,7 +234,7 @@ CREATE INDEX /*$wgDBprefix*/cl_sortkey   ON /*$wgDBprefix*/categorylinks(cl_to,c
 CREATE INDEX /*$wgDBprefix*/cl_timestamp ON /*$wgDBprefix*/categorylinks(cl_to,cl_timestamp);
 --;
 
--- 
+--
 -- Track all existing categories.  Something is a category if 1) it has an en-
 -- try somewhere in categorylinks, or 2) it once did.  Categories might not
 -- have corresponding pages, so they need to be tracked separately.
@@ -279,16 +279,16 @@ CREATE TABLE /*$wgDBprefix*/valid_tag (
   vt_tag varchar(255) NOT NULL PRIMARY KEY
 );
 
--- 
+--
 -- Table for storing localisation data
--- 
+--
 CREATE TABLE /*$wgDBprefix*/l10n_cache (
        -- language code
        lc_lang NVARCHAR(32) NOT NULL,
-       
+
        -- cache key
        lc_key NVARCHAR(255) NOT NULL,
-       
+
        -- Value
        lc_value TEXT NOT NULL DEFAULT '',
 );
@@ -305,9 +305,9 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
 -- Maximum key length ON SQL Server is 900 bytes
 CREATE INDEX /*$wgDBprefix*/externallinks_index   ON /*$wgDBprefix*/externallinks(el_index);
 
--- 
+--
 -- Track external user accounts, if ExternalAuth is used
--- 
+--
 CREATE TABLE /*$wgDBprefix*/external_user (
        -- Foreign key to user_id
        eu_local_id INT NOT NULL PRIMARY KEY,
@@ -327,16 +327,16 @@ CREATE TABLE /*$wgDBprefix*/langlinks (
 );
 CREATE UNIQUE INDEX /*$wgDBprefix*/langlinks_reverse_key ON /*$wgDBprefix*/langlinks(ll_lang,ll_title);
 
--- 
+--
 -- Track inline interwiki links
--- 
+--
 CREATE TABLE /*$wgDBprefix*/iwlinks (
        -- page_id of the referring page
        iwl_from INT NOT NULL DEFAULT 0,
-       
+
        -- Interwiki prefix code of the target
        iwl_prefix NVARCHAR(20) NOT NULL DEFAULT '',
-       
+
        -- Title of the target, including namespace
        iwl_title NVARCHAR(255) NOT NULL DEFAULT '',
 );
@@ -728,7 +728,7 @@ CREATE TABLE /*$wgDBprefix*/updatelog (
   PRIMARY KEY (ul_key)
 );
 
--- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER 
+-- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER
 -- AND assign a password for the FDHOST process to run under
 -- Once you have assigned a password to that account, you need to run the following stored procedure
 -- replacing XXXXX with the password you used.
index 6e3e1b7..84facab 100644 (file)
@@ -25,7 +25,7 @@ BEFORE UPDATE FOR EACH ROW
 ON &mw_prefix.testrun
 BEGIN
   SELECT testrun_tr_id_seq.NEXTVAL into :NEW.tr_id FROM dual;
-END; 
+END;
 
 CREATE TABLE /*$wgDBprefix*/testitem (
   ti_run NUMBER NOT NULL REFERENCES &mw_prefix.testrun (tr_id) ON DELETE CASCADE,
index c15300b..a131b5d 100644 (file)
@@ -26,5 +26,5 @@ CREATE TABLE testitem (
   ti_run      INTEGER   NOT NULL REFERENCES testrun(tr_id) ON DELETE CASCADE,
   ti_name     TEXT      NOT NULL,
   ti_success  SMALLINT  NOT NULL
-);  
+);
 CREATE UNIQUE INDEX testitem_uniq ON testitem(ti_run, ti_name);
index 8c91f29..ec28716 100644 (file)
@@ -358,12 +358,14 @@ CREATE TABLE filearchive (
   fa_user               INTEGER          NULL  REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
   fa_user_text          TEXT         NOT NULL,
   fa_timestamp          TIMESTAMPTZ,
-  fa_deleted            SMALLINT     NOT NULL DEFAULT 0
+  fa_deleted            SMALLINT     NOT NULL DEFAULT 0,
+  fa_sha1               TEXT         NOT NULL DEFAULT ''
 );
 CREATE INDEX fa_name_time ON filearchive (fa_name, fa_timestamp);
 CREATE INDEX fa_dupe      ON filearchive (fa_storage_group, fa_storage_key);
 CREATE INDEX fa_notime    ON filearchive (fa_deleted_timestamp);
 CREATE INDEX fa_nouser    ON filearchive (fa_deleted_user);
+CREATE INDEX fa_sha1      ON filearchive (fa_sha1);
 
 CREATE SEQUENCE uploadstash_us_id_seq;
 CREATE TYPE media_type AS ENUM ('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE');
index e909bc0..80a2278 100644 (file)
@@ -52,6 +52,7 @@ class RunJobs extends Maintenance {
 
        public function execute() {
                global $wgTitle;
+
                if ( $this->hasOption( 'procs' ) ) {
                        $procs = intval( $this->getOption( 'procs' ) );
                        if ( $procs < 1 || $procs > 1000 ) {
@@ -70,26 +71,17 @@ class RunJobs extends Maintenance {
                $dbw = wfGetDB( DB_MASTER );
                $n = 0;
 
-               if ( $type === false ) {
-                       $conds = Job::defaultQueueConditions( );
-               } else {
-                       $conds = array( 'job_cmd' => $type );
-               }
-
-               while ( $dbw->selectField( 'job', 'job_id', $conds, 'runJobs.php' ) ) {
-                       $offset = 0;
-                       for ( ; ; ) {
-                               $job = !$type ? Job::pop( $offset ) : Job::pop_type( $type );
-
-                               if ( !$job ) {
-                                       break;
-                               }
-
-                               wfWaitForSlaves();
+               $group = JobQueueGroup::singleton();
+               do {
+                       $job = ( $type === false )
+                               ? $group->pop() // job from any queue
+                               : $group->get( $type )->pop(); // job from a single queue
+                       if ( $job ) { // found a job
+                               // Perform the job (logging success/failure and runtime)...
                                $t = microtime( true );
-                               $offset = $job->id;
                                $this->runJobsLog( $job->toString() . " STARTING" );
                                $status = $job->run();
+                               $group->ack( $job ); // done
                                $t = microtime( true ) - $t;
                                $timeMs = intval( $t * 1000 );
                                if ( !$status ) {
@@ -97,15 +89,17 @@ class RunJobs extends Maintenance {
                                } else {
                                        $this->runJobsLog( $job->toString() . " t=$timeMs good" );
                                }
-
-                               if ( $maxJobs && ++$n > $maxJobs ) {
+                               // Break out if we hit the job count or wall time limits...
+                               if ( $maxJobs && ++$n >= $maxJobs ) {
                                        break 2;
                                }
-                               if ( $maxTime && time() - $startTime > $maxTime ) {
+                               if ( $maxTime && ( time() - $startTime ) > $maxTime ) {
                                        break 2;
                                }
+                               // Don't let any slaves/backups fall behind...
+                               $group->get( $type )->waitForBackups();
                        }
-               }
+               } while ( $job ); // stop when there are no jobs
        }
 
        /**
diff --git a/maintenance/sqlite/archives/patch-job_token.sql b/maintenance/sqlite/archives/patch-job_token.sql
new file mode 100644 (file)
index 0000000..4e4d28f
--- /dev/null
@@ -0,0 +1,8 @@
+ALTER TABLE /*_*/job ADD COLUMN job_random integer unsigned NOT NULL default 0;
+ALTER TABLE /*_*/job ADD COLUMN job_token varbinary(32) NOT NULL default '';
+ALTER TABLE /*_*/job ADD COLUMN job_sha1 varbinary(32) NOT NULL default '';
+ALTER TABLE /*_*/job ADD COLUMN job_token_timestamp varbinary(14) NULL default NULL;
+
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
+
index 851a6b3..fd4c9ec 100644 (file)
@@ -1,4 +1,4 @@
--- 
+--
 -- Recreates the iwl_prefix for the iwlinks table
 --
 DROP INDEX IF EXISTS /*i*/iwl_prefix;
index 28554c0..2a37094 100644 (file)
@@ -1,7 +1,7 @@
 -- Patch that introduces fulltext search capabilities to SQLite schema
 -- Requires that SQLite must be compiled with FTS3 module (comes with core amalgamation).
 -- See http://sqlite.org/fts3.html for details of syntax.
--- Will fail if FTS3 is not present, 
+-- Will fail if FTS3 is not present,
 DROP TABLE IF EXISTS /*_*/searchindex;
 CREATE VIRTUAL TABLE /*_*/searchindex USING FTS3(
   -- Key to page_id
@@ -10,7 +10,7 @@ CREATE VIRTUAL TABLE /*_*/searchindex USING FTS3(
 
   -- Munged version of title
   si_title,
-  
+
   -- Munged version of body text
   si_text
 );
index bc014b3..16247ff 100644 (file)
@@ -17,7 +17,7 @@ CREATE TABLE /*_*/searchindex (
 
   -- Munged version of title
   si_title TEXT,
-  
+
   -- Munged version of body text
   si_text TEXT
 );
index 36cf9ce..16dcb67 100644 (file)
@@ -6,11 +6,9 @@ if [ -z $2 ];then
 fi
 if [ -z $3 ]; then
        table=blobs
-else 
+else
        table=$3
 fi
 
 echo "CREATE DATABASE $2" | mysql -u wikiadmin -p`wikiadmin_pass` -h $1 && \
 sed "s/blobs\>/$table/" blobs.sql | mysql -u wikiadmin -p`wikiadmin_pass` -h $1 $2
-       
-       
index a06c21c..197151b 100644 (file)
@@ -1289,9 +1289,23 @@ CREATE TABLE /*_*/job (
 
   -- Any other parameters to the command
   -- Stored as a PHP serialized array, or an empty string if there are no parameters
-  job_params blob NOT NULL
+  job_params blob NOT NULL,
+
+  -- Random, non-unique, number used for concurrent job acquisition
+  job_random integer unsigned NOT NULL default 0,
+
+  -- Field that conveys process locks on rows via process UUIDs
+  job_token varbinary(32) NOT NULL default '',
+
+  -- Timestamp when the job was locked
+  job_token_timestamp varbinary(14) NULL default NULL,
+
+  -- Base 36 SHA1 of the job parameters relevant to detecting duplicates
+  job_sha1 varbinary(32) NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
 CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title, job_params(128));
 CREATE INDEX /*i*/job_timestamp ON /*_*/job (job_timestamp);
 
index c906143..afa9bb2 100644 (file)
@@ -108,6 +108,7 @@ return array(
        'jquery' => array(
                'scripts' => 'resources/jquery/jquery.js',
                'debugRaw' => false,
+               'targets' => array( 'desktop', 'mobile' ),
        ),
 
        /* jQuery Plugins */
@@ -145,6 +146,7 @@ return array(
        ),
        'jquery.collapsibleTabs' => array(
                'scripts' => 'resources/jquery/jquery.collapsibleTabs.js',
+               'dependencies' => 'jquery.delayedBind',
        ),
        'jquery.color' => array(
                'scripts' => 'resources/jquery/jquery.color.js',
@@ -180,6 +182,7 @@ return array(
        ),
        'jquery.hidpi' => array(
                'scripts' => 'resources/jquery/jquery.hidpi.js',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.highlightText' => array(
                'scripts' => 'resources/jquery/jquery.highlightText.js',
@@ -549,6 +552,7 @@ return array(
                'scripts' => 'resources/mediawiki/mediawiki.js',
                'debugScripts' => 'resources/mediawiki/mediawiki.log.js',
                'debugRaw' => false,
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api' => array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.js',
@@ -629,6 +633,7 @@ return array(
                'dependencies' => array(
                        'jquery.hidpi',
                ),
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.htmlform' => array(
                'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',
index 04bb301..49a932a 100644 (file)
@@ -1,14 +1,15 @@
 /**
- * Plugin that automatically truncates the plain text contents of an element and adds an ellipsis
+ * Plugin that automatically truncates the plain text contents of an element
+ * and adds an ellipsis.
  */
 ( function ( $ ) {
 
 var
        // Cache ellipsed substrings for every string-width-position combination
-       cache = { },
+       cache = {},
 
        // Use a separate cache when match highlighting is enabled
-       matchTextCache = { };
+       matchTextCache = {};
 
 $.fn.autoEllipsis = function ( options ) {
        options = $.extend( {
@@ -18,30 +19,30 @@ $.fn.autoEllipsis = function ( options ) {
                hasSpan: false,
                matchText: null
        }, options );
-       $(this).each( function () {
-               var $container, $trimmableText,
+
+       return this.each( function () {
+               var $trimmableText,
                        text, trimmableText, w, pw,
                        l, r, i, side, m,
-                       $el = $(this);
+                       // container element - used for measuring against
+                       $container = $(this);
+
                if ( options.restoreText ) {
-                       if ( !$el.data( 'autoEllipsis.originalText' ) ) {
-                               $el.data( 'autoEllipsis.originalText', $el.text() );
+                       if ( !$container.data( 'autoEllipsis.originalText' ) ) {
+                               $container.data( 'autoEllipsis.originalText', $container.text() );
                        } else {
-                               $el.text( $el.data( 'autoEllipsis.originalText' ) );
+                               $container.text( $container.data( 'autoEllipsis.originalText' ) );
                        }
                }
 
-               // container element - used for measuring against
-               $container = $el;
-
                // trimmable text element - only the text within this element will be trimmed
                if ( options.hasSpan ) {
-                       $trimmableText = $el.children( options.selector );
+                       $trimmableText = $container.children( options.selector );
                } else {
                        $trimmableText = $( '<span>' )
                                .css( 'whiteSpace', 'nowrap' )
-                               .text( $el.text() );
-                       $el
+                               .text( $container.text() );
+                       $container
                                .empty()
                                .append( $trimmableText );
                }
index 0844da7..f720e07 100644 (file)
@@ -58,7 +58,7 @@
        };
 
        $.fn.highlightText = function ( matchString ) {
-               return $( this ).each( function () {
+               return this.each( function () {
                        var $el = $( this );
                        $el.data( 'highlightText', { originalText: $el.text() } );
                        $.highlightText.splitAndHighlight( this, matchString );
index 2940d6f..75dd2f1 100644 (file)
@@ -19,6 +19,9 @@
  * @example $( 'table' ).tablesorter();
  * @desc Create a simple tablesorter interface.
  *
+ * @example $( 'table' ).tablesorter( { sortList: [ { 0: 'desc' }, { 1: 'asc' } ] } );
+ * @desc Create a tablesorter interface initially sorting on the first and second column.
+ *
  * @option String cssHeader ( optional ) A string of the class name to be appended
  *         to sortable tr elements in the thead of the table. Default value:
  *         "header"
  *         tablesorter should cancel selection of the table headers text.
  *         Default value: true
  *
+ * @option Array sortList ( optional ) An array containing objects specifying sorting.
+ *         By passing more than one object, multi-sorting will be applied. Object structure:
+ *         { <Integer column index>: <String 'asc' or 'desc'> }
+ *         Default value: []
+ *
  * @option Boolean debug ( optional ) Boolean flag indicating if tablesorter
  *         should display debuging information usefull for development.
  *
+ * @event sortEnd.tablesorter: Triggered as soon as any sorting has been applied.
+ *
  * @type jQuery
  *
  * @name tablesorter
 
                }
                table.tBodies[0].appendChild( fragment );
+
+               $( table ).trigger( 'sortEnd.tablesorter' );
        }
 
        /**
        }
 
        function setHeadersCss( table, $headers, list, css, msg ) {
-               // Remove all header information
-               $headers.removeClass( css[0] ).removeClass( css[1] );
+               // Remove all header information and reset titles to default message
+               $headers.removeClass( css[0] ).removeClass( css[1] ).attr( 'title', msg[1] );
 
                var h = [];
                $headers.each( function ( offset ) {
                };
        }
 
+       /**
+        * Converts sort objects [ { Integer: String }, ... ] to the internally used nested array
+        * structure [ [ Integer , Integer ], ... ]
+        *
+        * @param sortObjects {Array} List of sort objects.
+        * @return {Array} List of internal sort definitions.
+        */
+
+       function convertSortList( sortObjects ) {
+               var sortList = [];
+               $.each( sortObjects, function( i, sortObject ) {
+                       $.each ( sortObject, function( columnIndex, order ) {
+                               var orderIndex = ( order === 'desc' ) ? 1 : 0;
+                               sortList.push( [columnIndex, orderIndex] );
+                       } );
+               } );
+               return sortList;
+       }
+
        /* Public scope */
 
        $.tablesorter = {
                                        // Declare and cache.
                                        var $document, $headers, cache, config, sortOrder,
                                                $table = $( table ),
-                                               shiftDown = 0,
-                                               firstTime = true;
+                                               shiftDown = 0;
 
                                        // Quit if no tbody
                                        if ( !table.tBodies ) {
                                        }
                                        $table.addClass( "jquery-tablesorter" );
 
+                                       // FIXME config should probably not be stored in the plain table node
                                        // New config object.
                                        table.config = {};
 
                                        config = $.extend( table.config, $.tablesorter.defaultOptions, settings );
 
                                        // Save the settings where they read
-                                       $.data( table, 'tablesorter', config );
+                                       $.data( table, 'tablesorter', { config: config } );
 
                                        // Get the CSS class names, could be done else where.
                                        var sortCSS = [ config.cssDesc, config.cssAsc ];
                                        // performance improvements in some browsers.
                                        cacheRegexs();
 
+                                       // Legacy fix of .sortbottoms
+                                       // Wrap them inside inside a tfoot (because that's what they actually want to be) &
+                                       // and put the <tfoot> at the end of the <table>
+                                       var $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
+                                       if ( $sortbottoms.length ) {
+                                               var $tfoot = $table.children( 'tfoot' );
+                                               if ( $tfoot.length ) {
+                                                       $tfoot.eq(0).prepend( $sortbottoms );
+                                               } else {
+                                                       $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
+                                               }
+                                       }
+
+                                       explodeRowspans( $table );
+
+                                       // try to auto detect column type, and store in tables config
+                                       table.config.parsers = buildParserCache( table, $headers );
+
+                                       // initially build the cache for the tbody cells (to be able to sort initially)
+                                       cache = buildCache( table );
+
                                        // Apply event handling to headers
                                        // this is too big, perhaps break it out?
-                                       $headers.click( function ( e ) {
+                                       $headers.filter( ':not(.unsortable)' ).click( function ( e ) {
                                                if ( e.target.nodeName.toLowerCase() === 'a' ) {
                                                        // The user clicked on a link inside a table header
                                                        // Do nothing and let the default link click action continue
                                                        return true;
                                                }
 
-                                               if ( firstTime ) {
-                                                       firstTime = false;
-
-                                                       // Legacy fix of .sortbottoms
-                                                       // Wrap them inside inside a tfoot (because that's what they actually want to be) &
-                                                       // and put the <tfoot> at the end of the <table>
-                                                       var $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
-                                                       if ( $sortbottoms.length ) {
-                                                               var $tfoot = $table.children( 'tfoot' );
-                                                               if ( $tfoot.length ) {
-                                                                       $tfoot.eq(0).prepend( $sortbottoms );
-                                                               } else {
-                                                                       $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
-                                                               }
-                                                       }
-
-                                                       explodeRowspans( $table );
-                                                       // try to auto detect column type, and store in tables config
-                                                       table.config.parsers = buildParserCache( table, $headers );
-                                               }
-
                                                // Build the cache for the tbody cells
                                                // to share between calculations for this sort action.
                                                // Re-calculated each time a sort action is performed due to possiblity
                                                        return false;
                                                }
                                        } );
+
+                                       /**
+                                        * Sorts the table. If no sorting is specified by passing a list of sort
+                                        * objects, the table is sorted according to the initial sorting order.
+                                        * Passing an empty array will reset sorting (basically just reset the headers
+                                        * making the table appear unsorted).
+                                        *
+                                        * @param sortList {Array} (optional) List of sort objects.
+                                        */
+                                       $table.data( 'tablesorter' ).sort = function( sortList ) {
+
+                                               if ( sortList === undefined ) {
+                                                       sortList = config.sortList;
+                                               } else if ( sortList.length > 0 ) {
+                                                       sortList = convertSortList( sortList );
+                                               }
+
+                                               // re-build the cache for the tbody cells
+                                               cache = buildCache( table );
+
+                                               // set css for headers
+                                               setHeadersCss( table, $headers, sortList, sortCSS, sortMsg );
+
+                                               // sort the table and append it to the dom
+                                               appendToTable( table, multisort( table, sortList, cache ) );
+                                       };
+
+                                       // sort initially
+                                       if ( config.sortList.length > 0 ) {
+                                               explodeRowspans( $table );
+                                               config.sortList = convertSortList( config.sortList );
+                                               $table.data( 'tablesorter' ).sort();
+                                       }
+
                                } );
                        },
 
index 42c839c..ca719ab 100644 (file)
@@ -85,7 +85,7 @@
                                        var jqXhr = $(this).data( 'request' );
                                        // If the delay setting has caused the fetch to have not even happened
                                        // yet, the jqXHR object will have never been set.
-                                       if ( jqXhr && $.isFunction ( jqXhr.abort ) ) {
+                                       if ( jqXhr && $.isFunction( jqXhr.abort ) ) {
                                                jqXhr.abort();
                                                $(this).removeData( 'request' );
                                        }
                                                        .append(
                                                                $( '<div>' )
                                                                        .addClass( 'special-label' )
-                                                                       .text( mw.msg( 'searchsuggest-containing' ) )
-                                                       )
-                                                       .append(
+                                                                       .text( mw.msg( 'searchsuggest-containing' ) ),
                                                                $( '<div>' )
                                                                        .addClass( 'special-query' )
                                                                        .text( query )
                                                        .show();
                                        } else {
                                                $el.find( '.special-query' )
-                                                       .empty()
                                                        .text( query )
                                                        .autoEllipsis();
                                        }
index 2928438..4e515bc 100644 (file)
                 * @return mixed Parameter value or null.
                 */
                getParamValue: function ( param, url ) {
-                       url = url || document.location.href;
+                       if ( url === undefined ) {
+                               url = document.location.href;
+                       }
                        // Get last match, stop at hash
                        var     re = new RegExp( '^[^#]*[&?]' + $.escapeRE( param ) + '=([^&#]*)' ),
                                m = re.exec( url );
index 984ca63..edf8695 100644 (file)
@@ -43,7 +43,7 @@ class SkinCologneBlue extends SkinTemplate {
                $out->addModuleStyles( 'mediawiki.legacy.oldshared' );
                $out->addModuleStyles( 'skins.cologneblue' );
        }
-       
+
        /**
         * Override langlink formatting behavior not to uppercase the language names.
         * See otherLanguages() in CologneBlueTemplate.
@@ -67,7 +67,6 @@ class CologneBlueTemplate extends BaseTemplate {
                echo "\n</body></html>";
                wfRestoreWarnings();
        }
-       
 
        /**
         * Language/charset variant links for classic-style skins
@@ -86,7 +85,7 @@ class CologneBlueTemplate extends BaseTemplate {
 
                return $this->getSkin()->getLanguage()->pipeList( $s );
        }
-       
+
        // @fixed
        function otherLanguages() {
                global $wgHideInterlanguageLinks;
@@ -115,11 +114,11 @@ class CologneBlueTemplate extends BaseTemplate {
        function pageTitleLinks() {
                $s = array();
                $footlinks = $this->getFooterLinks();
-               
+
                foreach ( $footlinks['places'] as $item ) {
                        $s[] = $this->data[$item];
                }
-               
+
                return $this->getSkin()->getLanguage()->pipeList( $s );
        }
 
@@ -393,10 +392,10 @@ class CologneBlueTemplate extends BaseTemplate {
 
                return $s;
        }
-       
+
        /**
         * @return string
-        * 
+        *
         * @fixed
         */
        function beforeContent() {
@@ -410,7 +409,6 @@ class CologneBlueTemplate extends BaseTemplate {
                        </a>
                </p>
                <p id="sitesub"><?php echo wfMessage( 'sitesubtitle' )->escaped() ?></p>
-               
                <div id="toplinks">
                        <p id="syslinks"><?php echo $this->sysLinks() ?></p>
                        <p id="variantlinks"><?php echo $this->variantLinks() ?></p>
@@ -441,13 +439,13 @@ class CologneBlueTemplate extends BaseTemplate {
 <?php
                $s = ob_get_contents();
                ob_end_clean();
-               
+
                return $s;
        }
 
        /**
         * @return string
-        * 
+        *
         * @fixed
         */
        function afterContent() {
@@ -459,7 +457,7 @@ class CologneBlueTemplate extends BaseTemplate {
                // Page-related links
                echo $this->bottomLinks();
                echo "\n<br />";
-               
+
                // Footer and second searchbox
                echo $this->getSkin()->getLanguage()->pipeList( array(
                        $this->getSkin()->mainPageLink(),
@@ -467,7 +465,7 @@ class CologneBlueTemplate extends BaseTemplate {
                        $this->searchForm( 'footer' )
                ) );
                echo "\n<br />";
-               
+
                // Standard footer info
                $footlinks = $this->getFooterLinks();
                if ( $footlinks['info'] ) {
@@ -488,7 +486,7 @@ class CologneBlueTemplate extends BaseTemplate {
 
        /**
         * @return string
-        * 
+        *
         * @fixed
         */
        function sysLinks() {
@@ -518,13 +516,10 @@ class CologneBlueTemplate extends BaseTemplate {
                return $this->getSkin()->getLanguage()->pipeList( $s );
        }
 
-
-
-       
        /**
         * @param $heading string
         * @return string
-        * 
+        *
         * @fixed
         */
        function menuHead( $heading ) {
@@ -536,35 +531,35 @@ class CologneBlueTemplate extends BaseTemplate {
         * @access private
         *
         * @return string
-        * 
+        *
         * @fixed
         */
        function quickBar(){
                $s = "\n<div id='quickbar'>";
 
                $sep = "<br />\n";
-               
+
                $plain_bar = $this->data['sidebar'];
                $bar = array();
-               
+
                // Massage the sidebar
                // We want to place SEARCH at the beginning and a lot of stuff before TOOLBOX (or at the end, if it's missing)
                $additions_done = false;
                while ( !$additions_done ) {
                        $bar = array(); // Empty it out
-                       
+
                        // Always display search on top
                        $bar['SEARCH'] = true;
-                               
+
                        foreach ( $plain_bar as $heading => $links ) {
                                if ( $heading == 'TOOLBOX' ) {
                                        if( $links !== NULL ) {
                                                // If this is not a toolbox prosthetic we inserted outselves, fill it out
                                                $plain_bar['TOOLBOX'] = $this->getToolbox();
                                        }
-                                       
+
                                        // And insert the stuff
-                                       
+
                                        // "This page" and "Edit" menus
                                        // We need to do some massaging here... we reuse all of the items, except for $...['views']['view'],
                                        // as $...['namespaces']['main'] and $...['namespaces']['talk'] together serve the same purpose.
@@ -589,36 +584,36 @@ class CologneBlueTemplate extends BaseTemplate {
                                        );
                                        $bar['qbedit'] = $qbedit;
                                        $bar['qbpageoptions'] = $qbpageoptions;
-                                       
+
                                        // Personal tools ("My pages")
                                        $bar['qbmyoptions'] = $this->getPersonalTools();
                                        foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
-                                               $bar['qbmyoptions'][$key] = false;
+                                               $bar['qbmyoptions'][$key] = null;
                                        }
-                                       
+
                                        $additions_done = true;
                                }
-                               
+
                                // Re-insert current heading, unless it's SEARCH
                                if ( $heading != 'SEARCH' ) {
                                        $bar[$heading] = $plain_bar[$heading];
                                }
                        }
-                       
+
                        // If TOOLBOX is missing, $additions_done is still false
                        if ( !$additions_done ) {
                                $plain_bar['TOOLBOX'] = false;
                        }
                }
-               
+
                foreach ( $bar as $heading => $links ) {
                        if ( $heading == 'SEARCH' ) {
                                $s .= $this->menuHead( wfMessage( 'qbfind' )->text() );
                                $s .= $this->searchForm( 'sidebar' );
                        } elseif ( $heading == 'LANGUAGES' ) {
                                // discard these; we display languages below page content
-                       } else {
-                               if ( $links ) {
+                       } elseif ( $links ) {
+                               if ( is_array( $links ) ) {
                                        // Use the navigation heading from standard sidebar as the "browse" section
                                        if ( $heading == 'navigation' ) {
                                                $heading = 'qbbrowse';
@@ -626,11 +621,11 @@ class CologneBlueTemplate extends BaseTemplate {
                                        if ( $heading == 'TOOLBOX' ) {
                                                $heading = 'toolbox';
                                        }
-                                       
+
                                        $headingMsg = wfMessage( $heading );
                                        $any_link = false;
                                        $t = $this->menuHead( $headingMsg->exists() ? $headingMsg->text() : $heading );
-                                       
+
                                        foreach ( $links as $key => $link ) {
                                                // Can be empty due to rampant sidebar massaging we're doing above
                                                if ( $link ) {
@@ -638,10 +633,13 @@ class CologneBlueTemplate extends BaseTemplate {
                                                        $t .= $this->makeListItem( $key, $link, array( 'tag' => 'span' ) ) . $sep;
                                                }
                                        }
-                                       
+
                                        if ( $any_link ) {
                                                $s .= $t;
                                        }
+                               } else {
+                                       // $links can be a HTML string
+                                       $s .= $links;
                                }
                        }
                }
@@ -653,7 +651,7 @@ class CologneBlueTemplate extends BaseTemplate {
        /**
         * @param $label string
         * @return string
-        * 
+        *
         * @fixed
         */
        function searchForm( $which ) {
@@ -672,7 +670,7 @@ class CologneBlueTemplate extends BaseTemplate {
                        . "<input type='submit' class=\"searchButton\" name=\"go\" value=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
 
                if( $wgUseTwoButtonsSearchForm ) {
-                       $s .= " <input type='submit' class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'search' )->escaped() . "\" />\n";
+                       $s .= " <input type='submit' class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'searchbutton' )->escaped() . "\" />\n";
                } else {
                        $s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
                }
index 6045ed6..7fbca41 100644 (file)
@@ -72,7 +72,7 @@ class SkinVector extends SkinTemplate {
 
        /**
         * Adds classes to the body element.
-        * 
+        *
         * @param $out OutputPage object
         * @param &$bodyAttrs Array of attributes that will be set on the body element
         */
index 0fe8489..20182b4 100644 (file)
@@ -1,6 +1,9 @@
-/*
-** MediaWiki style sheet for general styles on complex content
-*/
+/**
+ * MediaWiki style sheet for general styles on complex content
+ *
+ * Styles for complex things which are a standard part of page content
+ * (ie: the CSS classing built into the system), like the TOC.
+ */
 
 /* Table of Contents */
 #toc,
index 02fd29f..79911fe 100644 (file)
@@ -1,6 +1,9 @@
 /**
  * MediaWiki style sheet for general styles on basic content elements
- * This style sheet is used by the monobook and vector skins
+ *
+ * Styles for basic elements: links, lists, etc...
+ *
+ * This style sheet is used by the Monobook and Vector skins.
  */
 
 /* Links */
index 60d6436..af6665e 100644 (file)
@@ -1,6 +1,10 @@
-/*
-** MediaWiki style sheet for common core styles on interfaces
-*/
+/**
+ * MediaWiki style sheet for common core styles on interfaces
+ *
+ * Styles for the Monobook/Vector pattern of laying out common interfaces.
+ * These ids/classes are not built into the system,
+ * they are outputted by the actual MonoBook/Vector code by convention.
+ */
 
 /* Categories */
 .catlinks {
diff --git a/skins/common/images/icons/fileicon-psd.png b/skins/common/images/icons/fileicon-psd.png
new file mode 100644 (file)
index 0000000..5bd40cb
Binary files /dev/null and b/skins/common/images/icons/fileicon-psd.png differ
index 826df81..fa60b42 100644 (file)
@@ -71,6 +71,18 @@ Template:echo
 {{{1}}}
 !! endarticle
 
+!! article
+Template:echo_with_span
+!! text
+<span>{{{1}}}</span>
+!! endarticle
+
+!! article
+Template:echo_with_div
+!! text
+<div>{{{1}}}</div>
+!! endarticle
+
 !! article
 Template:attr_str
 !! text
@@ -4708,6 +4720,48 @@ Templates: Tables: 4f. Generating a single tag of a HTML table
 
 !!end
 
+!!test
+Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
+!!input
+{{echo|''a}}{{echo|b''c''d}}{{echo|''e}}
+!!result
+<p><i>ab</i>c<i>d</i>e
+</p>
+!!end
+
+!!test
+Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span)
+(PHP parser generates misnested html)
+!! options
+disabled
+!!input
+{{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}}
+!!result
+<p><span><i>a</i></span><i><span>b</span></i><span>c</span><i>d</i><span>e</span></p>
+!!end
+
+!!test
+Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div)
+(PHP parser generates misnested html)
+!! options
+disabled
+!!input
+{{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
+!!result
+<div><i>a</i></div>
+<div><i>b</i>c<i>d</i></div>
+<div>e</div>
+!!end
+
+!!test
+Templates: Ugly nesting: 4. Divs opened/closed across templates
+!!input
+a<div>b{{echo|c</div>d}}e
+!!result
+a<div>bc</div>de
+
+!!end
+
 !!test
 Parser Functions: 1. Simple example
 !!input
@@ -6968,9 +7022,9 @@ Parser hook: empty input
 <tag></tag>
 !! result
 <pre>
-string(0) ""
-array(0) {
-}
+''
+array (
+)
 </pre>
 
 !! end
@@ -6982,8 +7036,8 @@ Parser hook: empty input using terminated empty elements
 !! result
 <pre>
 NULL
-array(0) {
-}
+array (
+)
 </pre>
 
 !! end
@@ -6995,8 +7049,8 @@ Parser hook: empty input using terminated empty elements (space before)
 !! result
 <pre>
 NULL
-array(0) {
-}
+array (
+)
 </pre>
 
 !! end
@@ -7007,9 +7061,9 @@ Parser hook: basic input
 <tag>input</tag>
 !! result
 <pre>
-string(5) "input"
-array(0) {
-}
+'input'
+array (
+)
 </pre>
 
 !! end
@@ -7021,9 +7075,9 @@ Parser hook: case insensitive
 <TAG>input</TAG>
 !! result
 <pre>
-string(5) "input"
-array(0) {
-}
+'input'
+array (
+)
 </pre>
 
 !! end
@@ -7035,9 +7089,9 @@ Parser hook: case insensitive, redux
 <TaG>input</TAg>
 !! result
 <pre>
-string(5) "input"
-array(0) {
-}
+'input'
+array (
+)
 </pre>
 
 !! end
@@ -7050,9 +7104,9 @@ noxml
 <tag><tag></tag></tag>
 !! result
 <pre>
-string(5) "<tag>"
-array(0) {
-}
+'<tag>'
+array (
+)
 </pre>&lt;/tag&gt;
 
 !! end
@@ -7063,17 +7117,13 @@ Parser hook: basic arguments
 <tag width=200 height = "100" depth = '50' square></tag>
 !! result
 <pre>
-string(0) ""
-array(4) {
-  ["width"]=>
-  string(3) "200"
-  ["height"]=>
-  string(3) "100"
-  ["depth"]=>
-  string(2) "50"
-  ["square"]=>
-  string(6) "square"
-}
+''
+array (
+  'width' => '200',
+  'height' => '100',
+  'depth' => '50',
+  'square' => 'square',
+)
 </pre>
 
 !! end
@@ -7084,11 +7134,10 @@ Parser hook: argument containing a forward slash (bug 5344)
 <tag filename='/tmp/bla'></tag>
 !! result
 <pre>
-string(0) ""
-array(1) {
-  ["filename"]=>
-  string(8) "/tmp/bla"
-}
+''
+array (
+  'filename' => '/tmp/bla',
+)
 </pre>
 
 !! end
@@ -7100,10 +7149,9 @@ Parser hook: empty input using terminated empty elements (bug 2374)
 !! result
 <pre>
 NULL
-array(1) {
-  ["foo"]=>
-  string(3) "bar"
-}
+array (
+  'foo' => 'bar',
+)
 </pre>text
 
 !! end
@@ -7118,16 +7166,12 @@ other stuff
 !! result
 <pre>
 NULL
-array(4) {
-  ["width"]=>
-  string(3) "200"
-  ["height"]=>
-  string(3) "100"
-  ["depth"]=>
-  string(2) "50"
-  ["square"]=>
-  string(6) "square"
-}
+array (
+  'width' => '200',
+  'height' => '100',
+  'depth' => '50',
+  'square' => 'square',
+)
 </pre>
 <p>other stuff
 &lt;/tag&gt;
index 24d852c..f01665c 100644 (file)
@@ -34,14 +34,10 @@ class ParserTestParserHook {
        }
 
        static function dumpHook( $in, $argv ) {
-               ob_start();
-               var_dump(
-                       $in,
-                       $argv
-               );
-               $ret = ob_get_clean();
-
-               return "<pre>\n$ret</pre>";
+               return "<pre>\n" .
+                          var_export( $in, true ) . "\n" .
+                          var_export( $argv, true ) . "\n" .
+                          "</pre>";
        }
 
        static function staticTagHook( $in, $argv, $parser ) {
index 9c2fb69..5bc36ed 100644 (file)
@@ -684,4 +684,59 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                return true;
        }
+
+       /**
+        * Returns the ID of a namespace that defaults to Wikitext.
+        * Throws an MWException if there is none.
+        *
+        * @return int the ID of the wikitext Namespace
+        * @since 1.21
+        */
+       protected function getDefaultWikitextNS() {
+               global $wgNamespaceContentModels;
+
+               static $wikitextNS = null; // this is not going to change
+               if ( $wikitextNS !== null ) {
+                       return $wikitextNS;
+               }
+
+               // quickly short out on most common case:
+               if ( !isset( $wgNamespaceContentModels[NS_MAIN] ) ) {
+                       return NS_MAIN;
+               }
+
+               // NOTE: prefer content namespaces
+               $namespaces = array_unique( array_merge(
+                       MWNamespace::getContentNamespaces(),
+                       array( NS_MAIN, NS_HELP, NS_PROJECT ), // prefer these
+                       MWNamespace::getValidNamespaces()
+               ) );
+
+               $namespaces = array_diff( $namespaces, array(
+                       NS_FILE, NS_CATEGORY, NS_MEDIAWIKI, NS_USER // don't mess with magic namespaces
+               ));
+
+               $talk = array_filter( $namespaces, function ( $ns ) {
+                       return MWNamespace::isTalk( $ns );
+               } );
+
+               // prefer non-talk pages
+               $namespaces = array_diff( $namespaces, $talk );
+               $namespaces = array_merge( $namespaces, $talk );
+
+               // check default content model of each namespace
+               foreach ( $namespaces as $ns ) {
+                       if ( !isset( $wgNamespaceContentModels[$ns] ) ||
+                               $wgNamespaceContentModels[$ns] === CONTENT_MODEL_WIKITEXT ) {
+
+                               $wikitextNS = $ns;
+                               return $wikitextNS;
+                       }
+               }
+
+               // give up
+               // @todo: Inside a test, we could skip the test as incomplete.
+               //        But frequently, this is used in fixture setup.
+               throw new MWException( "No namespace defaults to wikitext!" );
+       }
 }
index 4f79dfc..b6e8d29 100644 (file)
@@ -15,8 +15,20 @@ class CssContentTest extends JavascriptContentTest {
 
        public function dataGetParserOutput() {
                return array(
-                       array("MediaWiki:Test.css", null, "hello <world>\n",
-                               "<pre class=\"mw-code mw-css\" dir=\"ltr\">\nhello &lt;world&gt;\n\n</pre>"),
+                       array(
+                               "MediaWiki:Test.css",
+                               null,
+                               "hello <world>\n",
+                               "<pre class=\"mw-code mw-css\" dir=\"ltr\">\nhello &lt;world&gt;\n\n</pre>" ),
+
+                       array(
+                               "MediaWiki:Test.css",
+                               null,
+                               "/* hello [[world]] */\n",
+                               "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n/* hello [[world]] */\n\n</pre>",
+                               array( 'Links' => array( // NOTE: assumes default settings for $wgTextModelsToParse
+                                       array( 'World' => 0 ) ) ) ),
+
                        // @todo: more...?
                );
        }
index 4d53d06..e8aabfd 100644 (file)
@@ -317,29 +317,28 @@ class GlobalTest extends MediaWikiTestCase {
                }
                
        }
-       
-       
+
+
        function testDebugFunctionTest() {
-       
+
                global $wgDebugLogFile, $wgDebugTimestamps;
-               
+
                $old_log_file = $wgDebugLogFile;
                $wgDebugLogFile = tempnam( wfTempDir(), 'mw-' );
-               # @todo FIXME: This setting should be tested
+               # @todo FIXME: $wgDebugTimestamps should be tested
+               $old_wgDebugTimestamps = $wgDebugTimestamps;
                $wgDebugTimestamps = false;
-               
-               
-               
+
+
                wfDebug( "This is a normal string" );
                $this->assertEquals( "This is a normal string", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
-               
-               
+
                wfDebug( "This is nöt an ASCII string" );
                $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 );
@@ -347,17 +346,16 @@ class GlobalTest extends MediaWikiTestCase {
                wfDebugMem();
                $this->assertGreaterThan( 5000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
                unlink( $wgDebugLogFile );
-               
+
                wfDebugMem(true);
                $this->assertGreaterThan( 5000000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
                unlink( $wgDebugLogFile );
-               
-               
-               
+
+
                $wgDebugLogFile = $old_log_file;
-               
+               $wgDebugTimestamps = $old_wgDebugTimestamps;
        }
-       
+
        function testClientAcceptsGzipTest() {
                
                $settings = array(
index b45caa2..d3810af 100644 (file)
@@ -15,8 +15,20 @@ class JavascriptContentTest extends TextContentTest {
 
        public function dataGetParserOutput() {
                return array(
-                       array("MediaWiki:Test.js", null, "hello <world>\n",
-                                       "<pre class=\"mw-code mw-js\" dir=\"ltr\">\nhello &lt;world&gt;\n\n</pre>"),
+                       array(
+                               "MediaWiki:Test.js",
+                               null,
+                               "hello <world>\n",
+                               "<pre class=\"mw-code mw-js\" dir=\"ltr\">\nhello &lt;world&gt;\n\n</pre>" ),
+
+                       array(
+                               "MediaWiki:Test.js",
+                               null,
+                               "hello(); // [[world]]\n",
+                               "<pre class=\"mw-code mw-js\" dir=\"ltr\">\nhello(); // [[world]]\n\n</pre>",
+                               array( 'Links' => array( // NOTE: assumes default settings for $wgTextModelsToParse
+                                                       array( 'World' => 0 ) ) ) ),
+
                        // @todo: more...?
                );
        }
@@ -89,6 +101,9 @@ class JavascriptContentTest extends TextContentTest {
                        array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
                                'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
                        ),
+                       array( " Foo \n ",
+                               " Foo",
+                       ),
                );
        }
 
index e06de7c..8d2a7bd 100644 (file)
@@ -83,8 +83,20 @@ class RevisionStorageTest extends MediaWikiTestCase {
        }
 
        protected function createPage( $page, $text, $model = null ) {
-               if ( is_string( $page ) ) $page = Title::newFromText( $page );
-               if ( $page instanceof Title ) $page = new WikiPage( $page );
+               if ( is_string( $page ) ) {
+                       if ( !preg_match( '/:/', $page ) &&
+                               ( $model === null || $model === CONTENT_MODEL_WIKITEXT ) ) {
+
+                               $ns = $this->getDefaultWikitextNS();
+                               $page = MWNamespace::getCanonicalName( $ns ) . ':' . $page;
+                       }
+
+                       $page = Title::newFromText( $page );
+               }
+
+               if ( $page instanceof Title ) {
+                       $page = new WikiPage( $page );
+               }
 
                if ( $page->exists() ) {
                        $page->doDeleteArticle( "done" );
@@ -223,8 +235,6 @@ class RevisionStorageTest extends MediaWikiTestCase {
                                                                'missing rev_content_model in list of fields');
                        $this->assertTrue( in_array( 'rev_content_format', $fields ),
                                                                'missing rev_content_format in list of fields');
-               } else {
-                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
                }
        }
 
@@ -440,11 +450,14 @@ class RevisionStorageTest extends MediaWikiTestCase {
                        $userB = \User::createNew( $userB->getName() );
                }
 
+               $ns = $this->getDefaultWikitextNS();
+
                $dbw = wfGetDB( DB_MASTER );
                $revisions = array();
 
                // create revisions -----------------------------
-               $page = WikiPage::factory( Title::newFromText( 'RevisionStorageTest_testUserWasLastToEdit' ) );
+               $page = WikiPage::factory( Title::newFromText(
+                       'RevisionStorageTest_testUserWasLastToEdit', $ns ) );
 
                # zero
                $revisions[0] = new Revision( array(
index 3dfaa8d..c372c3e 100644 (file)
@@ -43,8 +43,7 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
        /**
         * @covers Revision::selectFields
         */
-       public function testSelectFields()
-       {
+       public function testSelectFields() {
                $fields = Revision::selectFields();
 
                $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields');
@@ -59,26 +58,38 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
        /**
         * @covers Revision::getContentModel
         */
-       public function testGetContentModel()
-       {
-               $orig = $this->makeRevision( array( 'text' => 'hello hello.', 'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
-               $rev = Revision::newFromId( $orig->getId() );
-
-               //NOTE: database fields for the content_model are disabled, so the model name is not retained.
-               //      We expect to get the default here instead of what was suppleid when creating the revision.
-               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $rev->getContentModel() );
+       public function testGetContentModel() {
+               try {
+                       $this->makeRevision( array( 'text' => 'hello hello.',
+                                                   'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
+
+                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
+                               . "\$wgContentHandlerUseDB disabled" );
+               } catch ( MWException $ex ) {
+                       $this->assertTrue( true ); // ok
+               }
        }
 
 
        /**
         * @covers Revision::getContentFormat
         */
-       public function testGetContentFormat()
-       {
-               $orig = $this->makeRevision( array( 'text' => 'hello hello.', 'content_model' => CONTENT_MODEL_JAVASCRIPT, 'content_format' => 'text/javascript' ) );
-               $rev = Revision::newFromId( $orig->getId() );
-
-               $this->assertEquals( CONTENT_FORMAT_WIKITEXT, $rev->getContentFormat() );
+       public function testGetContentFormat() {
+               try {
+                       //@todo: change this to test failure on using a non-standard (but supported) format
+                       //       for a content model supported in the given location. As of 1.21, there are
+                       //       no alternative formats for any of the standard content models that could be
+                       //       used for this though.
+
+                       $this->makeRevision( array( 'text' => 'hello hello.',
+                                                   'content_model' => CONTENT_MODEL_JAVASCRIPT,
+                                                   'content_format' => 'text/javascript' ) );
+
+                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
+                               . "\$wgContentHandlerUseDB disabled" );
+               } catch ( MWException $ex ) {
+                       $this->assertTrue( true ); // ok
+               }
        }
 
 }
index ee17a75..10934b4 100644 (file)
@@ -27,7 +27,11 @@ class TextContentTest extends MediaWikiTestCase {
 
        public function dataGetParserOutput() {
                return array(
-                       array("TextContentTest_testGetParserOutput", CONTENT_MODEL_TEXT, "hello ''world'' & stuff\n", "hello ''world'' &amp; stuff"),
+                       array(
+                               "TextContentTest_testGetParserOutput",
+                               CONTENT_MODEL_TEXT,
+                               "hello ''world'' & [[stuff]]\n", "hello ''world'' &amp; [[stuff]]",
+                               array( 'Links' => array() ) ),
                        // @todo: more...?
                );
        }
@@ -35,7 +39,7 @@ class TextContentTest extends MediaWikiTestCase {
        /**
         * @dataProvider dataGetParserOutput
         */
-       public function testGetParserOutput( $title, $model, $text, $expectedHtml ) {
+       public function testGetParserOutput( $title, $model, $text, $expectedHtml, $expectedFields = null ) {
                $title = Title::newFromText( $title );
                $content = ContentHandler::makeContent( $text, $title, $model );
 
@@ -45,13 +49,32 @@ class TextContentTest extends MediaWikiTestCase {
                $html = preg_replace( '#<!--.*?-->#sm', '', $html ); // strip comments
 
                $this->assertEquals( $expectedHtml, trim( $html ) );
+
+               if ( $expectedFields ) {
+                       foreach ( $expectedFields as $field => $exp ) {
+                               $f = 'get' . ucfirst( $field );
+                               $v = call_user_func( array( $po, $f ) );
+
+                               if ( is_array( $exp ) ) {
+                                       $this->assertArrayEquals( $exp, $v );
+                               } else {
+                                       $this->assertEquals( $exp, $v );
+                               }
+                       }
+               }
+
                // @todo: assert more properties
        }
 
        public function dataPreSaveTransform() {
                return array(
-                       array( 'hello this is ~~~',
-                              "hello this is ~~~",
+                       array( #0: no signature resolution
+                               "hello this is ~~~",
+                               "hello this is ~~~",
+                       ),
+                       array( #1: rtrim
+                               " Foo \n ",
+                               " Foo",
                        ),
                );
        }
index f7387e1..55c5610 100644 (file)
@@ -36,7 +36,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        'wgNamespaceProtection' => array(
                                NS_MEDIAWIKI => 'editinterface',
                        ),
-                       'wgUser' => null,
                ) );
 
                $this->userName = 'Useruser';
@@ -84,8 +83,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
        }
 
        function setUser( $userName = null ) {
-               global $wgUser;
-
                if ( $userName === 'anon' ) {
                        $this->user = $this->anonUser;
                } elseif ( $userName === null || $userName === $this->userName ) {
@@ -93,8 +90,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                } else {
                        $this->user = $this->altUser;
                }
-
-               $wgUser = $this->user;
        }
 
        function testQuickPermissions() {
@@ -298,8 +293,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                                                                        array( array( 'badaccess-group0' ), array( 'protect-cantedit' ) ),
                                                                                        array( array( 'protect-cantedit' ) ), false ),
                                                '' => array( array( ), array( ), array( ), true ) );
-               global $wgUser;
-               $wgUser = $this->user;
+
                foreach ( array( "edit", "protect", "" ) as $action ) {
                        $this->setUserPerm( null );
                        $this->assertEquals( $check[$action][0],
@@ -319,9 +313,9 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                        $this->setUserPerm( $action );
                        $this->assertEquals( $check[$action][3],
-                               $this->title->userCan( $action, true ) );
+                               $this->title->userCan( $action, $this->user, true ) );
                        $this->assertEquals( $check[$action][3],
-                               $this->title->quickUserCan( $action ) );
+                               $this->title->quickUserCan( $action, $this->user ) );
 
                        # count( User::getGroupsWithPermissions( $action ) ) < 1
                }
@@ -397,13 +391,13 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( array( ),
                                                         $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
                $this->assertEquals( true,
-                                                        $this->title->userCan( 'bogus' ) );
+                                                        $this->title->userCan( 'bogus', $this->user ) );
 
                $this->setUserPerm( '' );
                $this->assertEquals( array( array( 'badaccess-group0' ) ),
                                                         $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'bogus' ) );
+                                                        $this->title->userCan( 'bogus', $this->user ) );
        }
 
        function testCssAndJavascriptPermissions() {
@@ -456,11 +450,10 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
        }
 
        function testPageRestrictions() {
-               global $wgUser, $wgContLang;
+               global $wgContLang;
 
                $prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
 
-               $wgUser = $this->user;
                $this->setTitle( NS_MAIN );
                $this->title->mRestrictionsLoaded = true;
                $this->setUserPerm( "edit" );
@@ -471,7 +464,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                                                                                                                         $this->user ) );
 
                $this->assertEquals( true,
-                                                        $this->title->quickUserCan( 'edit' ) );
+                                                        $this->title->quickUserCan( 'edit', $this->user ) );
                $this->title->mRestrictions = array( "edit" => array( 'bogus', "sysop", "protect", "" ),
                                                                                   "bogus" => array( 'bogus', "sysop", "protect", "" ) );
 
@@ -511,9 +504,9 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                                                                                                                         $this->user ) );
                $this->title->mCascadeRestriction = true;
                $this->assertEquals( false,
-                                                        $this->title->quickUserCan( 'bogus' ) );
+                                                        $this->title->quickUserCan( 'bogus', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->quickUserCan( 'edit' ) );
+                                                        $this->title->quickUserCan( 'edit', $this->user ) );
                $this->assertEquals( array( array( 'badaccess-group0' ),
                                                                        array( 'protectedpagetext', 'bogus' ),
                                                                        array( 'protectedpagetext', 'protect' ),
@@ -528,8 +521,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
        }
 
        function testCascadingSourcesRestrictions() {
-               global $wgUser;
-               $wgUser = $this->user;
                $this->setTitle( NS_MAIN, "test page" );
                $this->setUserPerm( array( "edit", "bogus" ) );
 
@@ -537,22 +528,19 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->title->mCascadingRestrictions = array( "bogus" => array( 'bogus', "sysop", "protect", "" ) );
 
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'bogus' ) );
+                                                        $this->title->userCan( 'bogus', $this->user ) );
                $this->assertEquals( array( array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ),
                                                                        array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ) ),
                                                         $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
 
                $this->assertEquals( true,
-                                                        $this->title->userCan( 'edit' ) );
+                                                        $this->title->userCan( 'edit', $this->user ) );
                $this->assertEquals( array( ),
                                                         $this->title->getUserPermissionsErrors( 'edit', $this->user ) );
 
        }
 
        function testActionPermissions() {
-               global $wgUser;
-               $wgUser = $this->user;
-
                $this->setUserPerm( array( "createpage" ) );
                $this->setTitle( NS_MAIN, "test page" );
                $this->title->mTitleProtection['pt_create_perm'] = '';
@@ -564,26 +552,26 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
                                                         $this->title->getUserPermissionsErrors( 'create', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'create' ) );
+                                                        $this->title->userCan( 'create', $this->user ) );
 
                $this->title->mTitleProtection['pt_create_perm'] = 'sysop';
                $this->setUserPerm( array( 'createpage', 'protect' ) );
                $this->assertEquals( array( ),
                                                         $this->title->getUserPermissionsErrors( 'create', $this->user ) );
                $this->assertEquals( true,
-                                                        $this->title->userCan( 'create' ) );
+                                                        $this->title->userCan( 'create', $this->user ) );
 
 
                $this->setUserPerm( array( 'createpage' ) );
                $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
                                                         $this->title->getUserPermissionsErrors( 'create', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'create' ) );
+                                                        $this->title->userCan( 'create', $this->user ) );
 
                $this->setTitle( NS_MEDIA, "test page" );
                $this->setUserPerm( array( "move" ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'move' ) );
+                                                        $this->title->userCan( 'move', $this->user ) );
                $this->assertEquals( array( array( 'immobile-source-namespace', 'Media' ) ),
                                                         $this->title->getUserPermissionsErrors( 'move', $this->user ) );
 
@@ -591,17 +579,17 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( array( ),
                                                         $this->title->getUserPermissionsErrors( 'move', $this->user ) );
                $this->assertEquals( true,
-                                                        $this->title->userCan( 'move' ) );
+                                                        $this->title->userCan( 'move', $this->user ) );
 
                $this->title->mInterwiki = "no";
                $this->assertEquals( array( array( 'immobile-source-page' ) ),
                                                         $this->title->getUserPermissionsErrors( 'move', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'move' ) );
+                                                        $this->title->userCan( 'move', $this->user ) );
 
                $this->setTitle( NS_MEDIA, "test page" );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'move-target' ) );
+                                                        $this->title->userCan( 'move-target', $this->user ) );
                $this->assertEquals( array( array( 'immobile-target-namespace', 'Media' ) ),
                                                         $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
 
@@ -609,21 +597,20 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( array( ),
                                                         $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
                $this->assertEquals( true,
-                                                        $this->title->userCan( 'move-target' ) );
+                                                        $this->title->userCan( 'move-target', $this->user ) );
 
                $this->title->mInterwiki = "no";
                $this->assertEquals( array( array( 'immobile-target-page' ) ),
                                                         $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'move-target' ) );
+                                                        $this->title->userCan( 'move-target', $this->user ) );
 
        }
 
        function testUserBlock() {
-               global $wgUser, $wgEmailConfirmToEdit, $wgEmailAuthentication;
+               global $wgEmailConfirmToEdit, $wgEmailAuthentication;
                $wgEmailConfirmToEdit = true;
                $wgEmailAuthentication = true;
-               $wgUser = $this->user;
 
                $this->setUserPerm( array( "createpage", "move" ) );
                $this->setTitle( NS_HELP, "test page" );
@@ -632,7 +619,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( array( array( 'confirmedittext' ) ),
                                                         $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
                $wgEmailConfirmToEdit = false;
-               $this->assertEquals( true, $this->title->userCan( 'move-target' ) );
+               $this->assertEquals( true, $this->title->userCan( 'move-target', $this->user ) );
 
                # $wgEmailConfirmToEdit && !$user->isEmailConfirmed() && $action != 'createaccount'
                $this->assertEquals( array( ),
@@ -653,9 +640,9 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->getUserPermissionsErrors( 'move-target',
                        $this->user ) );
 
-               $this->assertEquals( false, $this->title->userCan( 'move-target' ) );
+               $this->assertEquals( false, $this->title->userCan( 'move-target', $this->user ) );
                // quickUserCan should ignore user blocks
-               $this->assertEquals( true, $this->title->quickUserCan( 'move-target' ) );
+               $this->assertEquals( true, $this->title->quickUserCan( 'move-target', $this->user ) );
 
                global $wgLocalTZoffset;
                $wgLocalTZoffset = -60;
index 316e6f5..a788253 100644 (file)
@@ -162,4 +162,28 @@ class UserTest extends MediaWikiTestCase {
                        'Each user rights (core/extensions) has a corresponding right- message.'
                );
        }
+
+       /**
+        * Test User::editCount
+        */
+       public function testEditCount() {
+               $user = User::newFromName( 'UnitTestUser' );
+               $user->loadDefaults();
+               $user->addToDatabase();
+
+               // let the user have a few (10) edits
+               $page = WikiPage::factory( Title::newFromText( 'UserTest_EditCount' ) );
+               for( $i = 0; $i < 10; $i++ ) {
+                       $page->doEdit( (string) $i, 'test', 0, false, $user );
+               }
+
+               $user->clearInstanceCache();
+               $this->assertEquals( 10, $user->getEditCount(), 'After ten edits, the user edit count should be 10' );
+
+               // increase the edit count and clear the cache
+               $user->incEditCount();
+
+               $user->clearInstanceCache();
+               $this->assertEquals( 11, $user->getEditCount(), 'After increasing the edit count manually, the user edit count should be 11' );
+       }
 }
index cf9b96b..e98f5a7 100644 (file)
@@ -590,6 +590,29 @@ class WikiPageTest extends MediaWikiLangTestCase {
                return $po;
        }
 
+       public function testGetParserOutput_nonexisting( ) {
+               static $count = 0;
+               $count ++;
+
+               $page = new WikiPage( new Title( "WikiPageTest_testGetParserOutput_nonexisting_$count" ) );
+
+               $opt = new ParserOptions();
+               $po = $page->getParserOutput( $opt );
+
+               $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
+       }
+
+       public function testGetParserOutput_badrev( ) {
+               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT );
+
+               $opt = new ParserOptions();
+               $po = $page->getParserOutput( $opt, $page->getLatest() + 1234 );
+
+               //@todo: would be neat to also test deleted revision
+
+               $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
+       }
+
        static $sections =
 
                "Intro
index b2d3bdf..c1332a6 100644 (file)
@@ -21,12 +21,12 @@ class WikitextContentTest extends TextContentTest {
 
        public function dataGetSecondaryDataUpdates() {
                return array(
-                       array("WikitextContentTest_testGetSecondaryDataUpdates_1",
+                       array( "WikitextContentTest_testGetSecondaryDataUpdates_1",
                                CONTENT_MODEL_WIKITEXT, "hello ''world''\n",
                                array( 'LinksUpdate' => array(  'mRecursive' => true,
                                                                'mLinks' => array() ) )
                        ),
-                       array("WikitextContentTest_testGetSecondaryDataUpdates_2",
+                       array( "WikitextContentTest_testGetSecondaryDataUpdates_2",
                                CONTENT_MODEL_WIKITEXT, "hello [[world test 21344]]\n",
                                array( 'LinksUpdate' => array(  'mRecursive' => true,
                                                                'mLinks' => array( array( 'World_test_21344' => 0 ) ) ) )
@@ -174,6 +174,10 @@ just a test"
                        array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
                               'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
                        ),
+                       array( // rtrim
+                               " Foo \n ",
+                               " Foo",
+                       ),
                );
        }
 
index 8eca9a3..624cf49 100644 (file)
@@ -120,19 +120,80 @@ class ApiEditPageTest extends ApiTestCase {
                $this->assertEquals( $data, $page->getContent()->serialize() );
        }
 
-       function testEditAppend() {
-               $this->markTestIncomplete( "not yet implemented" );
+       static function provideEditAppend() {
+               return array(
+                       array( #0: append
+                               'foo', 'append', 'bar', "foobar"
+                       ),
+                       array( #1: prepend
+                               'foo', 'prepend', 'bar', "barfoo"
+                       ),
+                       array( #2: append to empty page
+                               '', 'append', 'foo', "foo"
+                       ),
+                       array( #3: prepend to empty page
+                               '', 'prepend', 'foo', "foo"
+                       ),
+                       array( #4: append to non-existing page
+                               null, 'append', 'foo', "foo"
+                       ),
+                       array( #5: prepend to non-existing page
+                               null, 'prepend', 'foo', "foo"
+                       ),
+               );
        }
 
-       function testEditSection() {
-               $this->markTestIncomplete( "not yet implemented" );
+       /**
+        * @dataProvider provideEditAppend
+        */
+       function testEditAppend( $text, $op, $append, $expected ) {
+               static $count = 0;
+               $count++;
+
+               // assume NS_HELP defaults to wikitext
+               $name = "Help:ApiEditPageTest_testEditAppend_$count";
+
+               // -- create page (or not) -----------------------------------------
+               if ( $text !== null ) {
+                       if ( $text === '' ) {
+                               // can't create an empty page, so create it with some content
+                               list( $re,, ) = $this->doApiRequestWithToken( array(
+                                       'action' => 'edit',
+                                       'title' => $name,
+                                       'text' => '(dummy)', ) );
+                       }
+
+                       list( $re,, ) = $this->doApiRequestWithToken( array(
+                               'action' => 'edit',
+                               'title' => $name,
+                               'text' => $text, ) );
+
+                       $this->assertEquals( 'Success', $re['edit']['result'] ); // sanity
+               }
+
+               // -- try append/prepend --------------------------------------------
+               list( $re,, ) = $this->doApiRequestWithToken( array(
+                       'action' => 'edit',
+                       'title' => $name,
+                       $op . 'text' => $append, ) );
+
+               $this->assertEquals( 'Success', $re['edit']['result'] );
+
+               // -- validate -----------------------------------------------------
+               $page = new WikiPage( Title::newFromText( $name ) );
+               $content = $page->getContent();
+               $this->assertNotNull( $content, 'Page should have been created' );
+
+               $text = $content->getNativeData();
+
+               $this->assertEquals( $expected, $text );
        }
 
-       function testUndo() {
+       function testEditSection() {
                $this->markTestIncomplete( "not yet implemented" );
        }
 
-       function testEditNonText() {
+       function testUndo() {
                $this->markTestIncomplete( "not yet implemented" );
        }
 }
index f159d5d..7201eec 100644 (file)
@@ -1113,6 +1113,32 @@ class FileBackendTest extends MediaWikiTestCase {
                return $cases;
        }
 
+       public function testGetLocalCopyAndReference404() {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestGetLocalCopyAndReference404();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestGetLocalCopyAndReference404();
+               $this->tearDownFiles();
+       }
+
+       public function doTestGetLocalCopyAndReference404() {
+               $backendName = $this->backendClass();
+
+               $base = self::baseStorePath();
+
+               $tmpFile = $this->backend->getLocalCopy( array(
+                       'src' => "$base/unittest-cont1/not-there" ) );
+               $this->assertEquals( null, $tmpFile, "Local copy of not existing file is null ($backendName)." );
+
+               $tmpFile = $this->backend->getLocalReference( array(
+                       'src' => "$base/unittest-cont1/not-there" ) );
+               $this->assertEquals( null, $tmpFile, "Local ref of not existing file is null ($backendName)." );
+       }
+
        /**
         * @dataProvider provider_testPrepareAndClean
         */
index c7a1934..bb8367f 100644 (file)
@@ -114,7 +114,7 @@ class SiteListTest extends MediaWikiTestCase {
         */
        public function testHasGlobalId( $sites ) {
                $this->assertFalse( $sites->hasSite( 'non-existing-global-id' ) );
-               $this->assertFalse( $sites->hasInternalId( 72010101010 ) );
+               $this->assertFalse( $sites->hasInternalId( 720101010 ) );
 
                if ( !$sites->isEmpty() ) {
                        /**
index 621c891..d8ec2e9 100644 (file)
@@ -36,7 +36,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                9.45,
                                array(),
-                               '9.5s',
+                               '9.5 s',
                                'formatTimePeriod() rounding (<10s)'
                        ),
                        array(
@@ -48,7 +48,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                9.95,
                                array(),
-                               '10s',
+                               '10 s',
                                'formatTimePeriod() rounding (<10s)'
                        ),
                        array(
@@ -60,7 +60,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                59.55,
                                array(),
-                               '1m 0s',
+                               '1 min 0 s',
                                'formatTimePeriod() rounding (<60s)'
                        ),
                        array(
@@ -72,7 +72,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                119.55,
                                array(),
-                               '2m 0s',
+                               '2 min 0 s',
                                'formatTimePeriod() rounding (<1h)'
                        ),
                        array(
@@ -84,7 +84,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                3599.55,
                                array(),
-                               '1h 0m 0s',
+                               '1 h 0 min 0 s',
                                'formatTimePeriod() rounding (<1h)'
                        ),
                        array(
@@ -96,7 +96,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                7199.55,
                                array(),
-                               '2h 0m 0s',
+                               '2 h 0 min 0 s',
                                'formatTimePeriod() rounding (>=1h)'
                        ),
                        array(
@@ -108,7 +108,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                7199.55,
                                'avoidseconds',
-                               '2h 0m',
+                               '2 h 0 min',
                                'formatTimePeriod() rounding (>=1h), avoidseconds'
                        ),
                        array(
@@ -120,7 +120,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                7199.55,
                                'avoidminutes',
-                               '2h 0m',
+                               '2 h 0 min',
                                'formatTimePeriod() rounding (>=1h), avoidminutes'
                        ),
                        array(
@@ -132,7 +132,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                172799.55,
                                'avoidseconds',
-                               '48h 0m',
+                               '48 h 0 min',
                                'formatTimePeriod() rounding (=48h), avoidseconds'
                        ),
                        array(
@@ -144,7 +144,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                259199.55,
                                'avoidminutes',
-                               '3d 0h',
+                               '3 d 0 h',
                                'formatTimePeriod() rounding (>48h), avoidminutes'
                        ),
                        array(
@@ -156,7 +156,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                176399.55,
                                'avoidseconds',
-                               '2d 1h 0m',
+                               '2 d 1 h 0 min',
                                'formatTimePeriod() rounding (>48h), avoidseconds'
                        ),
                        array(
@@ -168,7 +168,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                176399.55,
                                'avoidminutes',
-                               '2d 1h',
+                               '2 d 1 h',
                                'formatTimePeriod() rounding (>48h), avoidminutes'
                        ),
                        array(
@@ -180,7 +180,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                259199.55,
                                'avoidseconds',
-                               '3d 0h 0m',
+                               '3 d 0 h 0 min',
                                'formatTimePeriod() rounding (>48h), avoidseconds'
                        ),
                        array(
@@ -192,7 +192,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                172801.55,
                                'avoidseconds',
-                               '2d 0h 0m',
+                               '2 d 0 h 0 min',
                                'formatTimePeriod() rounding, (>48h), avoidseconds'
                        ),
                        array(
@@ -204,7 +204,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                176460.55,
                                array(),
-                               '2d 1h 1m 1s',
+                               '2 d 1 h 1 min 1 s',
                                'formatTimePeriod() rounding, recursion, (>48h)'
                        ),
                        array(
index 7072299..2ebb351 100644 (file)
@@ -26,16 +26,18 @@ class TextPassDumperTest extends DumpTestCase {
                $this->tablesUsed[] = 'revision';
                $this->tablesUsed[] = 'text';
 
+               $ns = $this->getDefaultWikitextNS();
+
                try {
                        // Simple page
-                       $title = Title::newFromText( 'BackupDumperTestP1' );
+                       $title = Title::newFromText( 'BackupDumperTestP1', $ns );
                        $page = WikiPage::factory( $title );
                        list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
                        $this->pageId1 = $page->getId();
 
                        // Page with more than one revision
-                       $title = Title::newFromText( 'BackupDumperTestP2' );
+                       $title = Title::newFromText( 'BackupDumperTestP2', $ns );
                        $page = WikiPage::factory( $title );
                        list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
@@ -49,7 +51,7 @@ class TextPassDumperTest extends DumpTestCase {
                        $this->pageId2 = $page->getId();
 
                        // Deleted page.
-                       $title = Title::newFromText( 'BackupDumperTestP3' );
+                       $title = Title::newFromText( 'BackupDumperTestP3', $ns );
                        $page = WikiPage::factory( $title );
                        list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
@@ -59,6 +61,13 @@ class TextPassDumperTest extends DumpTestCase {
                        $page->doDeleteArticle( "Testing ;)" );
 
                        // Page from non-default namespace
+
+                       if ( $ns === NS_TALK ) {
+                               //@todo: work around this.
+                               throw new MWException( "The default wikitext namespace is the talk namespace. "
+                                       . " We can't currently deal with that.");
+                       }
+
                        $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
                        $page = WikiPage::factory( $title );
                        list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
index 64374f8..149845e 100644 (file)
@@ -10,11 +10,13 @@ class BackupDumperPageTest extends DumpTestCase {
        // We'll add several pages, revision and texts. The following variables hold the
        // corresponding ids.
        private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
+       private $pageTitle1, $pageTitle2, $pageTitle3, $pageTitle4, $pageTitle5;
        private $revId1_1, $textId1_1;
        private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
        private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
        private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
        private $revId4_1, $textId4_1;
+       private $namespace, $talk_namespace;
 
        function addDBData() {
                $this->tablesUsed[] = 'page';
@@ -22,14 +24,23 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->tablesUsed[] = 'text';
 
                try {
-                       $title = Title::newFromText( 'BackupDumperTestP1' );
-                       $page = WikiPage::factory( $title );
+                       $this->namespace = $this->getDefaultWikitextNS();
+                       $this->talk_namespace = NS_TALK;
+
+                       if ( $this->namespace === $this->talk_namespace ) {
+                               //@todo: work around this.
+                               throw new MWException( "The default wikitext namespace is the talk namespace. "
+                                       . " We can't currently deal with that.");
+                       }
+
+                       $this->pageTitle1 = Title::newFromText( 'BackupDumperTestP1', $this->namespace );
+                       $page = WikiPage::factory( $this->pageTitle1 );
                        list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
                        $this->pageId1 = $page->getId();
 
-                       $title = Title::newFromText( 'BackupDumperTestP2' );
-                       $page = WikiPage::factory( $title );
+                       $this->pageTitle2 = Title::newFromText( 'BackupDumperTestP2', $this->namespace );
+                       $page = WikiPage::factory( $this->pageTitle2 );
                        list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
                        list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
@@ -41,8 +52,8 @@ class BackupDumperPageTest extends DumpTestCase {
                                "BackupDumperTestP2Summary4 extra " );
                        $this->pageId2 = $page->getId();
 
-                       $title = Title::newFromText( 'BackupDumperTestP3' );
-                       $page = WikiPage::factory( $title );
+                       $this->pageTitle3 = Title::newFromText( 'BackupDumperTestP3', $this->namespace );
+                       $page = WikiPage::factory( $this->pageTitle3 );
                        list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
                        list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
@@ -50,8 +61,8 @@ class BackupDumperPageTest extends DumpTestCase {
                        $this->pageId3 = $page->getId();
                        $page->doDeleteArticle( "Testing ;)" );
 
-                       $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
-                       $page = WikiPage::factory( $title );
+                       $this->pageTitle4 = Title::newFromText( 'BackupDumperTestP1', $this->talk_namespace );
+                       $page = WikiPage::factory( $this->pageTitle4 );
                        list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
                                "Talk about BackupDumperTestP1 Text1",
                                "Talk BackupDumperTestP1 Summary1" );
@@ -95,14 +106,14 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fname );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
                        "BackupDumperTestP1Text1" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
                        $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2",
                        "BackupDumperTestP2Text1" );
@@ -121,7 +132,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe",
                        "Talk about BackupDumperTestP1 Text1" );
@@ -146,13 +157,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fname );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
                        $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
                $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
@@ -167,7 +178,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -191,13 +202,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fname );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
                        $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
                $this->assertPageEnd();
@@ -206,7 +217,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -231,13 +242,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fname );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
                        $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
                $this->assertPageEnd();
@@ -246,7 +257,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -300,13 +311,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fnameMetaHistory );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
                        $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
                $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
@@ -321,7 +332,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -334,13 +345,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fnameMetaCurrent );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
                        $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
                $this->assertPageEnd();
@@ -349,7 +360,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -362,13 +373,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fnameArticles );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
                        $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
                $this->assertPageEnd();
@@ -377,7 +388,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               // -> Page is not in NS_MAIN. Hence not visible
+               // -> Page is not in $this->namespace. Hence not visible
 
                $this->assertDumpEnd();
 
index fd6db0a..8041e35 100644 (file)
@@ -129,12 +129,14 @@ class FetchTextTest extends MediaWikiTestCase {
                $this->tablesUsed[] = 'revision';
                $this->tablesUsed[] = 'text';
 
+               $wikitextNamespace = $this->getDefaultWikitextNS();
+
                try {
-                       $title = Title::newFromText( 'FetchTextTestPage1' );
+                       $title = Title::newFromText( 'FetchTextTestPage1', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
                        $this->textId1 = $this->addRevision( $page, "FetchTextTestPage1Text1", "FetchTextTestPage1Summary1" );
 
-                       $title = Title::newFromText( 'FetchTextTestPage2' );
+                       $title = Title::newFromText( 'FetchTextTestPage2', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
                        $this->textId2 = $this->addRevision( $page, "FetchTextTestPage2Text1", "FetchTextTestPage2Summary1" );
                        $this->textId3 = $this->addRevision( $page, "FetchTextTestPage2Text2", "FetchTextTestPage2Summary2" );
index 16d8170..291c6b8 100644 (file)
@@ -107,6 +107,24 @@ var planets         = [mercury, venus, earth, mars, jupiter, saturn];
 var ascendingName   = [earth, jupiter, mars, mercury, saturn, venus];
 var ascendingRadius = [mercury, mars, venus, earth, saturn, jupiter];
 
+tableTest(
+       'Basic planet table: sorting initially - ascending by name',
+       header,
+       planets,
+       ascendingName,
+       function ( $table ) {
+               $table.tablesorter( { sortList: [ { 0: 'asc' } ] } );
+       }
+);
+tableTest(
+       'Basic planet table: sorting initially - descending by radius',
+       header,
+       planets,
+       reversed(ascendingRadius),
+       function ( $table ) {
+               $table.tablesorter( { sortList: [ { 1: 'desc' } ] } );
+       }
+);
 tableTest(
        'Basic planet table: ascending by name',
        header,
@@ -158,6 +176,81 @@ tableTest(
        }
 );
 
+// Sample data set to test multiple column sorting
+var header  = [ 'column1' , 'column2'],
+       a1 = [ 'A', '1' ],
+       a2 = [ 'A', '2' ],
+       a3 = [ 'A', '3' ],
+       b1 = [ 'B', '1' ],
+       b2 = [ 'B', '2' ],
+       b3 = [ 'B', '3' ];
+var initial = [a2, b3, a1, a3, b2, b1];
+var asc = [a1, a2, a3, b1, b2, b3];
+var descasc = [b1, b2, b3, a1, a2, a3];
+
+tableTest(
+       'Sorting multiple columns by passing sort list',
+       header,
+       initial,
+       asc,
+       function ( $table ) {
+               $table.tablesorter(
+                       { sortList: [ { 0: 'asc' }, { 1: 'asc' } ] }
+               );
+       }
+);
+tableTest(
+       'Sorting multiple columns by programmatically triggering sort()',
+       header,
+       initial,
+       descasc,
+       function ( $table ) {
+               $table.tablesorter();
+               $table.data( 'tablesorter' ).sort(
+                       [ { 0: 'desc' }, { 1: 'asc' } ]
+               );
+       }
+);
+tableTest(
+       'Reset to initial sorting by triggering sort() without any parameters',
+       header,
+       initial,
+       asc,
+       function ( $table ) {
+               $table.tablesorter(
+                       { sortList: [ { 0: 'asc' }, { 1: 'asc' } ] }
+               );
+               $table.data( 'tablesorter' ).sort(
+                       [ { 0: 'desc' }, { 1: 'asc' } ]
+               );
+               $table.data( 'tablesorter' ).sort();
+       }
+);
+QUnit.test( 'Reset sorting making table appear unsorted', 3, function ( assert ) {
+       var $table = tableCreate( header, initial );
+       $table.tablesorter(
+               { sortList: [ { 0: 'desc' }, { 1: 'asc' } ] }
+       );
+       $table.data( 'tablesorter' ).sort( [] );
+
+       assert.equal(
+               $table.find( 'th.headerSortUp' ).length + $table.find( 'th.headerSortDown' ).length,
+               0,
+               'No sort specific sort classes addign to header cells'
+       );
+
+       assert.equal(
+               $table.find( 'th' ).first().attr( 'title' ),
+               mw.msg( 'sort-ascending' ),
+               'First header cell has default title'
+       );
+
+       assert.equal(
+               $table.find( 'th' ).first().attr( 'title' ),
+               $table.find( 'th' ).last().attr( 'title' ),
+               'Both header cells\' titles match'
+       );
+} );
 
 // Regression tests!
 tableTest(
@@ -306,7 +399,7 @@ tableTest(
        planets,
        planetsRowspan,
        function ( $table ) {
-               // Modify the table to have a multiuple-row-spanning cell:
+               // Modify the table to have a multiple-row-spanning cell:
                // - Remove 2nd cell of 4th row, and, 2nd cell or 5th row.
                $table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
                // - Set rowspan for 2nd cell of 3rd row to 3.
@@ -317,13 +410,29 @@ tableTest(
                $table.find( '.headerSort:eq(0)' ).click();
        }
 );
+tableTest(
+       'Basic planet table: same value for multiple rows via rowspan (sorting initially)',
+       header,
+       planets,
+       planetsRowspan,
+       function ( $table ) {
+               // Modify the table to have a multiple-row-spanning cell:
+               // - Remove 2nd cell of 4th row, and, 2nd cell or 5th row.
+               $table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
+               // - Set rowspan for 2nd cell of 3rd row to 3.
+               //   This covers the removed cell in the 4th and 5th row.
+               $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
+
+               $table.tablesorter( { sortList: [ { 0: 'asc' } ] } );
+       }
+);
 tableTest(
        'Basic planet table: Same value for multiple rows via rowspan II',
        header,
        planets,
        planetsRowspanII,
        function ( $table ) {
-               // Modify the table to have a multiuple-row-spanning cell:
+               // Modify the table to have a multiple-row-spanning cell:
                // - Remove 1st cell of 4th row, and, 1st cell or 5th row.
                $table.find( 'tr:eq(3) td:eq(0), tr:eq(4) td:eq(0)' ).remove();
                // - Set rowspan for 1st cell of 3rd row to 3.
@@ -414,6 +523,24 @@ tableTest(
        }
 );
 
+QUnit.test( 'Test detection routine', function ( assert ) {
+       var $table;
+       $table = $(
+               '<table class="sortable">' +
+               '<caption>CAPTION</caption>' +
+               '<tr><th>THEAD</th></tr>' +
+               '<tr><td>1</td></tr>' +
+               '<tr class="sortbottom"><td>text</td></tr>' +
+               '</table>'
+       );
+       $table.tablesorter();
+
+       assert.equal(
+               $table.data( 'tablesorter' ).config.parsers[0].id,
+               'number',
+               'Correctly detected column content skipping sortbottom'
+       );
+} );
 
 /** FIXME: the diff output is not very readeable. */
 QUnit.test( 'bug 32047 - caption must be before thead', function ( assert ) {