Merge "Add batch lookup for user groups on Special:ListUsers"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sat, 20 Dec 2014 09:42:35 +0000 (09:42 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sat, 20 Dec 2014 09:42:35 +0000 (09:42 +0000)
282 files changed:
HISTORY
RELEASE-NOTES-1.25
api.php
autoload.php
composer.json
docs/hooks.txt
docs/skin.txt
includes/AutoLoader.php
includes/DefaultSettings.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Html.php
includes/HtmlFormatter.php
includes/Import.php
includes/Linker.php
includes/MWTimestamp.php
includes/OutputPage.php
includes/Preferences.php
includes/StubObject.php
includes/User.php
includes/WikiMap.php
includes/actions/InfoAction.php
includes/api/ApiMain.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryLogEvents.php
includes/api/i18n/ar.json
includes/api/i18n/be-tarask.json
includes/api/i18n/bs.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/ia.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/mg.json
includes/api/i18n/mk.json
includes/api/i18n/nl.json
includes/api/i18n/pl.json
includes/api/i18n/pt.json
includes/api/i18n/si.json
includes/api/i18n/sv.json
includes/api/i18n/zh-hans.json
includes/content/JsonContent.php
includes/db/Database.php
includes/db/IORMTable.php
includes/db/ORMTable.php
includes/debug/logger/Logger.php
includes/debug/logger/legacy/Logger.php
includes/debug/logger/monolog/LegacyFormatter.php
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/filebackend/FileBackendStore.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLFormFieldCloner.php
includes/installer/DatabaseUpdater.php
includes/installer/i18n/bs.json
includes/installer/i18n/diq.json
includes/installer/i18n/ko.json
includes/jobqueue/JobQueueDB.php
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/libs/MultiHttpClient.php
includes/libs/RunningStat.php
includes/libs/ScopedCallback.php
includes/libs/UDPTransport.php [new file with mode: 0644]
includes/libs/virtualrest/VirtualRESTServiceClient.php
includes/media/SVGMetadataExtractor.php
includes/normal/README
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/profiler/ProfilerStub.php
includes/profiler/ProfilerXhprof.php
includes/profiler/SectionProfiler.php
includes/rcfeed/UDPRCFeedEngine.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderLanguageNamesModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserDefaultsModule.php
includes/revisiondelete/RevisionDeleter.php
includes/site/SiteListFileCache.php
includes/specialpage/QueryPage.php
includes/specials/SpecialBlock.php
includes/specials/SpecialImport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialMostimages.php
includes/specials/SpecialSearch.php
includes/utils/AutoloadGenerator.php
languages/i18n/ar.json
languages/i18n/be-tarask.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/egl.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/lrc.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/nap.json
languages/i18n/nds-nl.json
languages/i18n/nl.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/sl.json
languages/i18n/sv.json
languages/i18n/uk.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/Maintenance.php
maintenance/fetchText.php
maintenance/populateParentId.php
maintenance/resources/update-oojs-ui.sh
maintenance/storage/recompressTracked.php
maintenance/tables.sql
resources/Resources.php
resources/assets/file-type-icons/COPYING
resources/lib/jquery/jquery.js
resources/lib/oojs-ui/i18n/nds-nl.json
resources/lib/oojs-ui/i18n/sl.json
resources/lib/oojs-ui/i18n/uk.json
resources/lib/oojs-ui/oojs-ui-apex.css [deleted file]
resources/lib/oojs-ui/oojs-ui-apex.js [deleted file]
resources/lib/oojs-ui/oojs-ui-apex.svg.css [deleted file]
resources/lib/oojs-ui/oojs-ui-mediawiki.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/themes/apex/images/icons/add.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/add.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/advanced.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/advanced.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/alert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/alert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/check.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/check.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/clear.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/clear.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/close.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/close.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/code.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/code.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/collapse.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/collapse.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/comment.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/comment.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/expand.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/expand.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/help.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/help.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/info.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/info.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/link.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/link.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/menu.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/menu.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/picture.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/picture.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/remove.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/remove.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/search.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/search.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/settings.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/settings.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/tag.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/tag.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/window.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/window.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/alert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/alert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/required.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/indicators/required.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/textures/pending.gif [deleted file]
resources/lib/oojs-ui/themes/apex/images/textures/transparency.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/textures/transparency.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png [deleted file]
resources/src/jquery.tipsy/jquery.tipsy.js
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.tablesorter.js
resources/src/mediawiki.action/mediawiki.action.edit.js
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.toolbar/toolbar.js
resources/src/mediawiki/mediawiki.content.json.css
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.notification.js
tests/parser/parserTests.txt
tests/phpunit/LessFileCompilationTest.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/includes/ArrayUtilsTest.php [deleted file]
tests/phpunit/includes/ArticleTablesTest.php [deleted file]
tests/phpunit/includes/ArticleTest.php [deleted file]
tests/phpunit/includes/ExternalStoreTest.php [deleted file]
tests/phpunit/includes/HtmlFormatterTest.php
tests/phpunit/includes/ImagePage404Test.php [deleted file]
tests/phpunit/includes/ImagePageTest.php [deleted file]
tests/phpunit/includes/LinksUpdateTest.php [deleted file]
tests/phpunit/includes/LocalFileTest.php [deleted file]
tests/phpunit/includes/MWFunctionTest.php [deleted file]
tests/phpunit/includes/MWTimestampTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PasswordTest.php [deleted file]
tests/phpunit/includes/RequestContextTest.php [deleted file]
tests/phpunit/includes/SpecialPageTest.php [deleted file]
tests/phpunit/includes/WikiPageTest.php [deleted file]
tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php [deleted file]
tests/phpunit/includes/XmlTypeCheckTest.php [deleted file]
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/format/ApiFormatWddxTest.php
tests/phpunit/includes/content/JsonContentTest.php
tests/phpunit/includes/context/RequestContextTest.php [new file with mode: 0644]
tests/phpunit/includes/deferred/LinksUpdateTest.php [new file with mode: 0644]
tests/phpunit/includes/deferred/SearchUpdateTest.php [new file with mode: 0644]
tests/phpunit/includes/exception/MWExceptionHandlerTest.php
tests/phpunit/includes/externalstore/ExternalStoreTest.php [new file with mode: 0644]
tests/phpunit/includes/filerepo/file/LocalFileTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/ArrayUtilsTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/XmlTypeCheckTest.php [new file with mode: 0644]
tests/phpunit/includes/page/ArticleTablesTest.php [new file with mode: 0644]
tests/phpunit/includes/page/ArticleTest.php [new file with mode: 0644]
tests/phpunit/includes/page/ImagePage404Test.php [new file with mode: 0644]
tests/phpunit/includes/page/ImagePageTest.php [new file with mode: 0644]
tests/phpunit/includes/page/WikiPageTest.php [new file with mode: 0644]
tests/phpunit/includes/page/WikiPageTestContentHandlerUseDB.php [new file with mode: 0644]
tests/phpunit/includes/password/PasswordTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/search/SearchUpdateTest.php [deleted file]
tests/phpunit/includes/specialpage/SpecialPageTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/SpecialBooksourcesTest.php
tests/phpunit/includes/specials/SpecialMIMESearchTest.php
tests/phpunit/includes/utils/MWFunctionTest.php [new file with mode: 0644]
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/suite.xml
tests/qunit/data/testrunner.js
tests/testHelpers.inc
thumb.php

diff --git a/HISTORY b/HISTORY
index 4343c5d..e5864fd 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -809,7 +809,7 @@ of files that are no longer available follows.
 * HTMLForm 'select', 'selectandother', 'selectorother', 'multiselect', and
   'radio' fields can now use message keys as labels via the 'options-messages'
   parameter, which overrides the 'options' parameter.
-* Admins can expire users users passwords manually, or on a schedule using the
+* Admins can expire users passwords manually, or on a schedule using the
   $wgPasswordExpirationDays configuration setting.
 * Add new hook SendWatchlistEmailNotification, this will be used to determine
   whether to send a watchlist email notification.
@@ -1899,7 +1899,7 @@ This is a maintenance release of the MediaWiki 1.21 branch.
 
 === New features in 1.21 ===
 * (bug 38110) Schema changes (adding or dropping tables, indices and
-  fields) can be now be done separately from from other changes that
+  fields) can be now be done separately from other changes that
   update.php makes.  This is useful in environments that use database
   permissions to restrict schema changes but allow the DB user that
   MediaWiki normally runs as to perform other changes that update.php
@@ -4300,7 +4300,7 @@ Selected changes since MediaWiki 1.16 that may be of interest:
 * (bug 20186) Allow filtering Special:Contributions for RevisionDeleted edits.
 * ajaxwatch now uses the API and JQuery, and can be used to animate arbitrary
   watch links, not just to watch the page the link is on.
-* (bug 20976) "searchmenu-new-nocreate" message now displayed when when there
+* (bug 20976) "searchmenu-new-nocreate" message now displayed when there
   is no title match in search and the user has no rights to create pages.
 * (bug 23429) Added new hook WatchlistEditorBuildRemoveLine.
 * (bug 22844) Added support for WinCache object caching (for IIS).
@@ -5270,7 +5270,7 @@ comment from another wiki.
 ** Note that this change will break some extensions which have not been adapted
    for it.
 * (bug 17020) Adding fallback encodings for Traditional and Simplified Chinese
-  languages while the the text is typed as URLs.
+  languages while the text is typed as URLs.
 * (bug 17614) Prev / Next links are not shown if all results are shown
 * (bug 18207) Strange spacing before [[irc:...]] links
 * Removed float from the user login form in RTL interface - caused display
@@ -5441,7 +5441,7 @@ comment from another wiki.
   enabled
 * (bug 19857) maintenance/deleteRevision.php on last revision no longer breaks
   target page
-* (bug 20365) Page name with with c/g/h/j/s/u + x are now correctly handled in
+* (bug 20365) Page name with c/g/h/j/s/u + x are now correctly handled in
   Special:MovePage with Esperanto as content language
 * (bug 20364) Fixed regression in GIF metadata loading
 * (bug 20299) MediaWiki:Move-subpages and MediaWiki:Move-talk-subpages can now
@@ -5451,7 +5451,7 @@ comment from another wiki.
 * (bug 19966) MediaWiki:License-header is now used for the licensing header in
   the file description page instead of MediaWiki:License
 * (bug 20380) Links to history/deleted edits at the top of
-  Special:RevisionDelete are no more displayed when when doing log suppression
+  Special:RevisionDelete are no more displayed when doing log suppression
 * (bug 8143) Localised parser function names are now correctly case insensitive
   if they contain non-ASCII characters
 * (bug 19055) maintenance/rebuildrecentchanges.php now purges
@@ -6236,7 +6236,7 @@ The following extensions are migrated into MediaWiki 1.14:
 * Extensions can use the SkinBuildSidebar hook to modify the content of the
   sidebar and add custom portlets to it
 * Added 'MakeGlobalVariablesScript' hook for extensions to be able to add vari-
-  ables into into the output of Skin::makeVariablesScript
+  ables into the output of Skin::makeVariablesScript
 * (bug 13846) Added $wgAddGroups and $wgRemoveGroups display on
   Special:ListGroupRights
 * (bug 14377) Add a date selector to history pages
@@ -9840,7 +9840,7 @@ they will be run along with the main tests by maintenance/parserTests.php
 * Fix formatting of titles on Special:Undelete
 * (bug 7026) Fix action=raw&templates=expand
 * (bug 6976) Add namespace and direction classes to classic skins
-* (bug 7144) Don't "return to main" from OutputPage::loginToUse() if the the user can't
+* (bug 7144) Don't "return to main" from OutputPage::loginToUse() if the user can't
   read the main page in the first place
 * (bug 7188) Fix minor borkage in HTMLForm
 * (bug 6675) Replaced message 'watchthis' with new message 'watchthisupload in Special:Upload
index d98d7bb..1956eb6 100644 (file)
@@ -12,6 +12,7 @@ production.
 * $wgPageShowWatchingUsers was removed.
 * $wgLocalVirtualHosts has been added to replace $wgConf->localVHosts.
 * $wgAntiLockFlags was removed.
+* $wgJavaScriptTestConfig was removed.
 * Edit tokens returned from User::getEditToken may change on every call. Token
   validity must be checked by passing the user-supplied token to
   User::matchEditToken rather than by testing for equality with a
@@ -61,6 +62,7 @@ production.
 * The debug logging internals have been overhauled, and are now using the
   PSR-3 interfaces.
 * Update CSSJanus to v1.1.1.
+* Update lessphp to v0.5.0.
 * Added a hook, "ApiOpenSearchSuggest", to allow extensions to provide extracts
   and images for ApiOpenSearch output. The semantics are identical to the
   "OpenSearchXml" hook provided by the OpenSearchXml extension.
@@ -68,31 +70,33 @@ production.
   this allows for pagination of prefix results. Extensions using this hook
   should implement supporting behavior. Not doing so can result in undefined
   behavior from API clients trying to continue through prefix results.
+* Update jQuery from v1.11.1 to v1.11.2.
 
 ==== External libraries ====
 * MediaWiki now requires certain external libraries to be installed. In the past
-  these were bundled inside the git repository of MediaWiki core, but now they
+  these were bundled inside the Git repository of MediaWiki core, but now they
   need to be installed separately. For users using the tarball, this will be taken
-  care of and no action will be required. Users using git will either need to use
+  care of and no action will be required. Users using Git will either need to use
   composer to fetch dependencies or use the mediawiki/vendor repository which includes
   all dependencies for MediaWiki core and ones used in Wikimedia deployment. Detailed
-  instructions can be found at <https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries>.
+  instructions can be found at:
+  https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries
 * The following libraries are now required:
-** psr/log 1.0.0
-*** This library provides the interfaces set by the PSR-3 standard (<http://www.php-fig.org/psr/psr-3/>)
-    which are used by MediaWiki interally by the MWLogger class.
-*** See the structured logging RfC (<https://www.mediawiki.org/wiki/Requests_for_comment/Structured_logging>)
-    for more background information.
-** cssjanus/cssjanus 1.1.1
-*** This library was formerly bundled with MediaWiki core and has now been removed. It automatically
-    flips CSS for RTL support.
-** leafo/lessphp 0.5.0
-*** This library was formerly bundled with MediaWiki core and has now been removed. It compiles LESS
-    files into CSS.
-** cdb/cdb 1.0.0
-*** This library was formerly a part of MediaWiki core, and has now been split out into a separate library.
-    It provides CDB functions which are used in the Interwiki and Localization caches. More information
-    about the library can be found at <https://www.mediawiki.org/wiki/CDB>.
+** psr/log
+   This library provides the interfaces set by the PSR-3 standard (http://www.php-fig.org/psr/psr-3/)
+   which are used by MediaWiki interally by the MWLogger class.
+   See the structured logging RfC (https://www.mediawiki.org/wiki/Requests_for_comment/Structured_logging)
+   for more background information.
+** cssjanus/cssjanus
+   This library was formerly bundled with MediaWiki core and has been removed.
+   It automatically flips CSS for RTL support.
+** leafo/lessphp
+   This library was formerly bundled with MediaWiki core and has been removed.
+   It compiles LESS files into CSS.
+** wikimedia/cdb
+   This library was formerly a part of MediaWiki core, and has been moved into a separate library.
+   It provides CDB functions which are used in the Interwiki and Localization caches.
+   More information about the library can be found at https://www.mediawiki.org/wiki/CDB.
 
 === Bug fixes in 1.25 ===
 * (T73003) No additional code will be generated to try to load CSS-embedded
@@ -109,6 +113,8 @@ production.
 ** Title::moveTo() was deprecated. Use the MovePage class instead.
 ** Title::isValidMoveOperation() broken down into MovePage::isValidMove()
    and MovePage::checkPermissions().
+* The Special:WhatLinksHere page linked from 'Number of redirects to this page'
+  on action=info about a file page does not list file links anymore.
 
 === Action API changes in 1.25 ===
 * (T67403) XML tag highlighting is now only performed for formats
@@ -243,8 +249,8 @@ changes to languages because of Bugzilla reports.
 * BREAKING CHANGE: In the XML dump format used by Special:Export and
   dumpBackup.php, the <model> and <format> tags now apprear before the <text>
   tag, instead of after the <text> and <sha1> tags.
-  The new schema version is 0.10, the new schema URI is
-  <https://www.mediawiki.org/xml/export-0.10.xsd>.
+  The new schema version is 0.10, the new schema URI is:
+  https://www.mediawiki.org/xml/export-0.10.xsd
 * MWFunction::call() and MWFunction::callArray() were removed, having being
   deprecated in 1.22.
 * Deprecated the getInternalLinkAttributes, getInternalLinkAttributesObj,
diff --git a/api.php b/api.php
index cc589b0..92e6704 100644 (file)
--- a/api.php
+++ b/api.php
@@ -122,7 +122,7 @@ if ( $wgAPIRequestLog ) {
        } else {
                $items[] = "failed in ApiBeforeMain";
        }
-       wfErrorLog( implode( ',', $items ) . "\n", $wgAPIRequestLog );
+       MWLoggerLegacyLogger::emit( implode( ',', $items ) . "\n", $wgAPIRequestLog );
        wfDebug( "Logged API request to $wgAPIRequestLog\n" );
 }
 
index 107ab81..d4a152a 100644 (file)
@@ -1018,6 +1018,7 @@ $wgAutoloadLocalClasses = array(
        'SearchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php',
        'SearchSqlite' => __DIR__ . '/includes/search/SearchSqlite.php',
        'SearchUpdate' => __DIR__ . '/includes/deferred/SearchUpdate.php',
+       'SectionProfileCallback' => __DIR__ . '/includes/profiler/SectionProfiler.php',
        'SectionProfiler' => __DIR__ . '/includes/profiler/SectionProfiler.php',
        'SevenZipStream' => __DIR__ . '/maintenance/7zip.inc',
        'ShiConverter' => __DIR__ . '/languages/classes/LanguageShi.php',
@@ -1182,6 +1183,7 @@ $wgAutoloadLocalClasses = array(
        'TransformTooBigImageAreaError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
        'TransformationalImageHandler' => __DIR__ . '/includes/media/TransformationalImageHandler.php',
        'UDPRCFeedEngine' => __DIR__ . '/includes/rcfeed/UDPRCFeedEngine.php',
+       'UDPTransport' => __DIR__ . '/includes/libs/UDPTransport.php',
        'UIDGenerator' => __DIR__ . '/includes/utils/UIDGenerator.php',
        'UcdXmlReader' => __DIR__ . '/maintenance/language/generateCollationData.php',
        'UncategorizedCategoriesPage' => __DIR__ . '/includes/specials/SpecialUncategorizedcategories.php',
index d7a7f04..8aeb792 100644 (file)
@@ -21,7 +21,7 @@
                "psr/log": "1.0.0",
                "cssjanus/cssjanus": "1.1.1",
                "wikimedia/cdb": "1.0.1",
-               "oojs/oojs-ui": "0.5.0"
+               "oojs/oojs-ui": "0.6.0"
        },
        "require-dev": {
                "phpunit/phpunit": "*"
index 369ad9f..f83a6c3 100644 (file)
@@ -1461,7 +1461,7 @@ $page: ImagePage object
 'ImgAuthBeforeStream': executed before file is streamed to user, but only when
 using img_auth.php.
 &$title: the Title object of the file as it would appear for the upload page
-&$path: the original file and path name when img_auth was invoked by the the web
+&$path: the original file and path name when img_auth was invoked by the web
   server
 &$name: the name only component of the file
 &$result: The location to pass back results of the hook routine (only used if
index e998ebd..a3c8c33 100644 (file)
@@ -7,7 +7,7 @@ MediaWiki includes four core skins:
   Monobook.
 
 * Monobook: Named after the black-and-white photo of a book in the page
-  background. Introduced in the 2004 release of 1.3, it had been been the
+  background. Introduced in the 2004 release of 1.3, it had been the
   default skin since then, before being replaced by Vector.
 
 * Modern: An attractive blue/grey theme with sidebar and top bar. Derived from
index 9c6f1f0..6344c27 100644 (file)
@@ -24,7 +24,6 @@
  * Locations of core classes
  * Extension classes are specified with $wgAutoloadClasses
  * This array is a global instead of a static member of AutoLoader to work around a bug in APC
- * This array is now generated by maintenance/generateLocalAutoload.php
  */
 require_once __DIR__ . '/../autoload.php';
 
index 4a6aa0b..4261c68 100644 (file)
@@ -5481,25 +5481,6 @@ $wgParserTestFiles = array(
  */
 $wgEnableJavaScriptTest = false;
 
-/**
- * Configuration for javascript testing.
- */
-$wgJavaScriptTestConfig = array(
-       'qunit' => array(
-               // Page where documentation can be found relevant to the QUnit test suite being ran.
-               // Used in the intro paragraph on [[Special:JavaScriptTest/qunit]] for the
-               // documentation link in the "javascripttest-qunit-intro" message.
-               'documentation' => '//www.mediawiki.org/wiki/Manual:JavaScript_unit_testing',
-               // If you are submitting the QUnit test suite to a TestSwarm instance,
-               // point this to the "inject.js" script of that instance. This is was registers
-               // the QUnit hooks to extract the test results and push them back up into the
-               // TestSwarm database.
-               // @example 'http://localhost/testswarm/js/inject.js'
-               // @example '//integration.mediawiki.org/testswarm/js/inject.js'
-               'testswarm-injectjs' => false,
-       ),
-);
-
 /**
  * Overwrite the caching key prefix with custom value.
  * @since 1.19
index 2155c1b..7f5a9c0 100644 (file)
@@ -1928,11 +1928,15 @@ class EditPage {
                        && $content->isRedirect()
                        && $content->getRedirectTarget()->equals( $this->getTitle() )
                ) {
-                       $this->selfRedirect = true;
-                       $status->fatal( 'selfredirect' );
-                       $status->value = self::AS_SELF_REDIRECT;
-                       wfProfileOut( __METHOD__ );
-                       return $status;
+                       // If the page already redirects to itself, don't warn.
+                       $currentTarget = $this->getCurrentContent()->getRedirectTarget();
+                       if ( !$currentTarget || !$currentTarget->equals( $this->getTitle() ) ) {
+                               $this->selfRedirect = true;
+                               $status->fatal( 'selfredirect' );
+                               $status->value = self::AS_SELF_REDIRECT;
+                               wfProfileOut( __METHOD__ );
+                               return $status;
+                       }
                }
 
                // Check for length errors again now that the section is merged in
@@ -2114,11 +2118,19 @@ class EditPage {
                $wgOut->addModules( 'mediawiki.action.edit' );
                $wgOut->addModuleStyles( 'mediawiki.action.edit.styles' );
 
-               if ( $wgUser->getOption( 'uselivepreview', false ) ) {
+               if ( $wgUser->getOption( 'showtoolbar' ) ) {
+                       // The addition of default buttons is handled by getEditToolbar() which
+                       // has its own dependency on this module. The call here ensures the module
+                       // is loaded in time (it has position "top") for other modules to register
+                       // buttons (e.g. extensions, gadgets, user scripts).
+                       $wgOut->addModules( 'mediawiki.toolbar' );
+               }
+
+               if ( $wgUser->getOption( 'uselivepreview' ) ) {
                        $wgOut->addModules( 'mediawiki.action.edit.preview' );
                }
 
-               if ( $wgUser->getOption( 'useeditwarning', false ) ) {
+               if ( $wgUser->getOption( 'useeditwarning' ) ) {
                        $wgOut->addModules( 'mediawiki.action.edit.editWarning' );
                }
 
@@ -3743,7 +3755,11 @@ HTML
                                $tool['id'],
                        );
 
-                       $script .= Xml::encodeJsCall( 'mw.toolbar.addButton', $params );
+                       $script .= Xml::encodeJsCall(
+                               'mw.toolbar.addButton',
+                               $params,
+                               ResourceLoader::inDebugMode()
+                       );
                }
 
                $script .= '});';
index 859b421..403566e 100644 (file)
@@ -1067,14 +1067,18 @@ function wfDebugMem( $exact = false ) {
 }
 
 /**
- * Send a line to a supplementary debug log file, if configured, or main debug log if not.
- * To configure a supplementary log file, set $wgDebugLogGroups[$logGroup] to a string
- * filename or an associative array mapping 'destination' to the desired filename. The
- * associative array may also contain a 'sample' key with an integer value, specifying
- * a sampling factor.
+ * Send a line to a supplementary debug log file, if configured, or main debug
+ * log if not.
+ *
+ * To configure a supplementary log file, set $wgDebugLogGroups[$logGroup] to
+ * a string filename or an associative array mapping 'destination' to the
+ * desired filename. The associative array may also contain a 'sample' key
+ * with an integer value, specifying a sampling factor. Sampled log events
+ * will be emitted with a 1 in N random chance.
  *
  * @since 1.23 support for sampling log messages via $wgDebugLogGroups.
  * @since 1.25 support for additional context data
+ * @since 1.25 sample behavior dependent on configured $wgMWLoggerDefaultSpi
  *
  * @param string $logGroup
  * @param string $text
@@ -1106,7 +1110,7 @@ function wfDebugLog(
 
        $logger = MWLogger::getInstance( $logGroup );
        $context['private'] = ( $dest === 'private' );
-       $logger->debug( $text, $context );
+       $logger->info( $text, $context );
 }
 
 /**
@@ -1177,8 +1181,10 @@ function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
  * @param string $file Filename
  * @param array $context Additional logging context data
  * @throws MWException
+ * @deprecated since 1.25 Use MWLoggerLegacyLogger::emit or UDPTransport
  */
 function wfErrorLog( $text, $file, array $context = array() ) {
+       wfDeprecated( __METHOD__, '1.25' );
        $logger = MWLogger::getInstance( 'wfErrorLog' );
        $context['destination'] = $file;
        $logger->info( trim( $text ), $context );
@@ -3891,7 +3897,7 @@ function wfBCP47( $code ) {
 /**
  * Get a cache object.
  *
- * @param int $inputType Cache type, one the the CACHE_* constants.
+ * @param int $inputType Cache type, one of the CACHE_* constants.
  * @return BagOStuff
  */
 function wfGetCache( $inputType ) {
index b3437d3..e033746 100644 (file)
@@ -893,7 +893,7 @@ class Html {
                                continue;
                        }
                        if ( $nsId === NS_MAIN ) {
-                               // For other namespaces use use the namespace prefix as label, but for
+                               // For other namespaces use the namespace prefix as label, but for
                                // main we don't use "" but the user message describing it (e.g. "(Main)" or "(Article)")
                                $nsName = wfMessage( 'blanknamespace' )->text();
                        } elseif ( is_int( $nsId ) ) {
index ccbfba8..e5efb5b 100644 (file)
@@ -178,7 +178,7 @@ class HtmlFormatter {
 
                // CSS Classes
                $domElemsToRemove = array();
-               $xpath = new DOMXpath( $doc );
+               $xpath = new DOMXPath( $doc );
                foreach ( $removals['CLASS'] as $classToRemove ) {
                        $elements = $xpath->query( '//*[contains(@class, "' . $classToRemove . '")]' );
 
index 6f93351..5b86fec 100644 (file)
@@ -424,11 +424,11 @@ class WikiImporter {
                $buffer = "";
                while ( $this->reader->read() ) {
                        switch ( $this->reader->nodeType ) {
-                       case XmlReader::TEXT:
-                       case XmlReader::SIGNIFICANT_WHITESPACE:
+                       case XMLReader::TEXT:
+                       case XMLReader::SIGNIFICANT_WHITESPACE:
                                $buffer .= $this->reader->value;
                                break;
-                       case XmlReader::END_ELEMENT:
+                       case XMLReader::END_ELEMENT:
                                return $buffer;
                        }
                }
@@ -466,7 +466,7 @@ class WikiImporter {
 
                        if ( !Hooks::run( 'ImportHandleToplevelXMLTag', array( $this ) ) ) {
                                // Do nothing
-                       } elseif ( $tag == 'mediawiki' && $type == XmlReader::END_ELEMENT ) {
+                       } elseif ( $tag == 'mediawiki' && $type == XMLReader::END_ELEMENT ) {
                                break;
                        } elseif ( $tag == 'siteinfo' ) {
                                $this->handleSiteInfo();
@@ -516,7 +516,7 @@ class WikiImporter {
                                        'logtitle', 'params' );
 
                while ( $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
                                        $this->reader->name == 'logitem' ) {
                                break;
                        }
@@ -580,7 +580,7 @@ class WikiImporter {
                $badTitle = false;
 
                while ( $skip ? $this->reader->next() : $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
                                        $this->reader->name == 'page' ) {
                                break;
                        }
@@ -645,7 +645,7 @@ class WikiImporter {
                $skip = false;
 
                while ( $skip ? $this->reader->next() : $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
                                        $this->reader->name == 'revision' ) {
                                break;
                        }
@@ -737,7 +737,7 @@ class WikiImporter {
                $skip = false;
 
                while ( $skip ? $this->reader->next() : $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
                                        $this->reader->name == 'upload' ) {
                                break;
                        }
@@ -835,7 +835,7 @@ class WikiImporter {
                $info = array();
 
                while ( $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
                                        $this->reader->name == 'contributor' ) {
                                break;
                        }
index a55eee9..ac4bb99 100644 (file)
@@ -1179,7 +1179,7 @@ class Linker {
                Hooks::run( 'UserToolLinksEdit', array( $userId, $userText, &$items ) );
 
                if ( $items ) {
-                       return wfMessage( 'word-separator' )->plain()
+                       return wfMessage( 'word-separator' )->escaped()
                                . '<span class="mw-usertoollinks">'
                                . wfMessage( 'parentheses' )->rawParams( $wgLang->pipeList( $items ) )->escaped()
                                . '</span>';
@@ -1266,7 +1266,7 @@ class Linker {
                        $userId = $rev->getUser( Revision::FOR_THIS_USER );
                        $userText = $rev->getUserText( Revision::FOR_THIS_USER );
                        $link = self::userLink( $userId, $userText )
-                               . wfMessage( 'word-separator' )->plain()
+                               . wfMessage( 'word-separator' )->escaped()
                                . self::userToolLinks( $userId, $userText );
                } else {
                        $link = wfMessage( 'rev-deleted-user' )->escaped();
@@ -1812,7 +1812,7 @@ class Linker {
                $inner = self::buildRollbackLink( $rev, $context, $editCount );
 
                if ( !in_array( 'noBrackets', $options ) ) {
-                       $inner = $context->msg( 'brackets' )->rawParams( $inner )->plain();
+                       $inner = $context->msg( 'brackets' )->rawParams( $inner )->escaped();
                }
 
                return '<span class="mw-rollback-link">' . $inner . '</span>';
index 4b3d36a..ea91470 100644 (file)
@@ -182,6 +182,11 @@ class MWTimestamp {
                        $output .= ' GMT';
                }
 
+               if ( $style == TS_MW && strlen( $output ) !== 14 ) {
+                       throw new TimestampException( __METHOD__ . ': The timestamp cannot be represented in ' .
+                               'the specified format' );
+               }
+
                return $output;
        }
 
index 24b9e46..411bb2e 100644 (file)
@@ -1075,7 +1075,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Set the page as printable, i.e. it'll be displayed with with all
+        * Set the page as printable, i.e. it'll be displayed with all
         * print styles included
         */
        public function setPrintable() {
index 44995ac..aca6dcb 100644 (file)
@@ -130,8 +130,7 @@ class Preferences {
                        if ( $disable && !in_array( $name, self::$saveBlacklist ) ) {
                                $info['disabled'] = 'disabled';
                        }
-                       $field = HTMLForm::loadInputFromParameters( $name, $info ); // For validation
-                       $field->mParent = $dummyForm;
+                       $field = HTMLForm::loadInputFromParameters( $name, $info, $dummyForm ); // For validation
                        $defaultOptions = User::getDefaultOptions();
                        $globalDefault = isset( $defaultOptions[$name] )
                                ? $defaultOptions[$name]
index 7f12c16..adca862 100644 (file)
@@ -182,6 +182,24 @@ class StubUserLang extends StubObject {
                return $this->_call( $name, $args );
        }
 
+       /**
+        * Call Language::findVariantLink after unstubbing $wgLang.
+        *
+        * This method is implemented with a full signature rather than relying on
+        * __call so that the pass-by-reference signature of the proxied method is
+        * honored.
+        *
+        * @param string &$link The name of the link
+        * @param Title &$nt The title object of the link
+        * @param bool $ignoreOtherCond To disable other conditions when
+        *   we need to transclude a template or update a category's link
+        */
+       public function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
+               global $wgLang;
+               $this->_unstub( 'findVariantLink', 3 );
+               return $wgLang->findVariantLink( $link, $nt, $ignoreOtherCond );
+       }
+
        /**
         * @return Language
         */
index bda825f..34af4c5 100644 (file)
@@ -2489,7 +2489,7 @@ class User implements IDBAccessObject {
                        $type = $oldaddr != '' ? 'changed' : 'set';
                        $result = $this->sendConfirmationMail( $type );
                        if ( $result->isGood() ) {
-                               // Say the the caller that a confirmation mail has been sent
+                               // Say to the caller that a confirmation mail has been sent
                                $result->value = 'eauth';
                        }
                } else {
index 34cd48d..f16f5aa 100644 (file)
@@ -161,7 +161,7 @@ class WikiReference {
        }
 
        /**
-        * Get the the URL in a way to de displayed to the user
+        * Get the URL in a way to be displayed to the user
         * More or less Wikimedia specific
         *
         * @return string
index de51843..686f63d 100644 (file)
@@ -338,7 +338,11 @@ class InfoAction extends FormlessAction {
                                $whatLinksHere,
                                $this->msg( 'pageinfo-redirects-name' )->escaped(),
                                array(),
-                               array( 'hidelinks' => 1, 'hidetrans' => 1 )
+                               array(
+                                       'hidelinks' => 1,
+                                       'hidetrans' => 1,
+                                       'hideimages' => $title->getNamespace() == NS_FILE
+                               )
                        ),
                        $this->msg( 'pageinfo-redirects-value' )
                                ->numParams( count( $title->getRedirectsHere() ) )
index 81353f6..c03e513 100644 (file)
@@ -575,7 +575,7 @@ class ApiMain extends ApiBase {
                        $wildcard
                );
 
-               return "/https?:\/\/$wildcard/";
+               return "/^https?:\/\/$wildcard$/";
        }
 
        protected function sendCacheHeaders() {
index a85c9c9..e243593 100644 (file)
@@ -168,9 +168,23 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        $this->addTables( 'langlinks' );
                        $this->addWhere( 'page_id=ll_from' );
                        $this->addOption( 'STRAIGHT_JOIN' );
-                       // We have to GROUP BY all selected fields to stop
-                       // PostgreSQL from whining
-                       $this->addOption( 'GROUP BY', $selectFields );
+
+                       // MySQL filesorts if we use a GROUP BY that works with the rules
+                       // in the 1992 SQL standard (it doesn't like having the
+                       // constant-in-WHERE page_namespace column in there). Using the
+                       // 1999 rules works fine, but that breaks other DBs. Sigh.
+                       /// @todo Once we drop support for 1992-rule DBs, we can simplify this.
+                       $dbType = $db->getType();
+                       if ( $dbType === 'mysql' || $dbType === 'sqlite' ||
+                               $dbType === 'postgres' && $db->getServerVersion() >= 9.1
+                       ) {
+                               // 1999 rules, or screw-the-rules
+                               $this->addOption( 'GROUP BY', array( 'page_title', 'page_id' ) );
+                       } else {
+                               // 1992 rules
+                               $this->addOption( 'GROUP BY', $selectFields );
+                       }
+
                        $forceNameTitleIndex = false;
                }
 
index 5f9fae4..7d79680 100644 (file)
@@ -36,7 +36,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        private $fld_ids = false, $fld_title = false, $fld_type = false,
-               $fld_action = false, $fld_user = false, $fld_userid = false,
+               $fld_user = false, $fld_userid = false,
                $fld_timestamp = false, $fld_comment = false, $fld_parsedcomment = false,
                $fld_details = false, $fld_tags = false;
 
@@ -50,7 +50,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $this->fld_ids = isset( $prop['ids'] );
                $this->fld_title = isset( $prop['title'] );
                $this->fld_type = isset( $prop['type'] );
-               $this->fld_action = isset( $prop['action'] );
                $this->fld_user = isset( $prop['user'] );
                $this->fld_userid = isset( $prop['userid'] );
                $this->fld_timestamp = isset( $prop['timestamp'] );
@@ -200,8 +199,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                }
 
                // Paranoia: avoid brute force searches (bug 17342)
-               $hideActions = $params['namespace'] !== null || !is_null( $title ) || !is_null( $params['action'] );
-               if ( $hideActions || !is_null( $user ) ) {
+               if ( $params['namespace'] !== null || !is_null( $title ) || !is_null( $user ) ) {
                        if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                $titleBits = LogPage::DELETED_ACTION;
                                $userBits = LogPage::DELETED_USER;
@@ -212,7 +210,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                $titleBits = 0;
                                $userBits = 0;
                        }
-                       if ( $hideActions && $titleBits ) {
+                       if ( ( $params['namespace'] !== null || !is_null( $title ) ) && $titleBits ) {
                                $this->addWhere( $db->bitAnd( 'log_deleted', $titleBits ) . " != $titleBits" );
                        }
                        if ( !is_null( $user ) && $userBits ) {
@@ -373,18 +371,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $title = Title::makeTitle( $row->log_namespace, $row->log_title );
                }
 
-               if ( $this->fld_title || $this->fld_ids || $this->fld_type
-                       || $this->fld_details && $row->log_params !== ''
-               ) {
+               if ( $this->fld_title || $this->fld_ids || $this->fld_details && $row->log_params !== '' ) {
                        if ( LogEventsList::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
                                $vals['actionhidden'] = '';
                                $anyHidden = true;
                        }
                        if ( LogEventsList::userCan( $row, LogPage::DELETED_ACTION, $user ) ) {
-
-                               if ( $this->fld_type ) {
-                                       $vals['action'] = $row->log_action;
-                               }
                                if ( $this->fld_title ) {
                                        ApiQueryBase::addTitleInfo( $vals, $title );
                                }
@@ -408,6 +400,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
                if ( $this->fld_type ) {
                        $vals['type'] = $row->log_type;
+                       $vals['action'] = $row->log_action;
                }
 
                if ( $this->fld_user || $this->fld_userid ) {
index d82b0d8..ce0943c 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Meno25",
-                       "أحمد المحمودي"
+                       "أحمد المحمودي",
+                       "Khaled"
                ]
        },
        "apihelp-main-param-format": "صيغة الخرج.",
@@ -19,5 +20,6 @@
        "apihelp-delete-description": "حذف صفحة.",
        "apihelp-delete-param-unwatch": "أزل الصفحة من قائمة مراقبتك.",
        "apihelp-edit-description": "إنشاء وتعديل الصفحات.",
+       "apihelp-emailuser-description": "مراسلة المستخدم",
        "apihelp-query+prefixsearch-param-offset": "عدد النتائج المراد تخطيها."
 }
index ef58bd5..bd4ab4c 100644 (file)
@@ -4,7 +4,7 @@
                        "Red Winged Duck"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Дакумэнтацыя]\n* [https://www.mediawiki.org/wiki/API:FAQ Частыя пытаньні]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Сьпіс рассылкі]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-аб’явы]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Памылкі і запыты]\n</div>\n<strong>Статус:</strong> усе магчымасьці на гэтай старонцы павінны працаваць, але API знаходзіцца ў актыўнай распрацоўцы і можа зьмяняцца ў любы момант. Падпісвайцеся на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ рассылку mediawiki-api-announce] дзеля паведамленьняў пра абнаўленьні.\n\n<strong>Памылковыя запыты:</strong> калі да API дасылаюцца памылковыя запыты, HTTP-загаловак будзе дасланы з ключом «MediaWiki-API-Error», а потым і значэньне загалоўка і код памылкі будуць выстаўленыя на аднолькавае значэньне. Дзеля дадатковай інфармацыі глядзіце https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Дакумэнтацыя]\n* [https://www.mediawiki.org/wiki/API:FAQ Частыя пытаньні]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Сьпіс рассылкі]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-аб’явы]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Памылкі і запыты]\n</div>\n<strong>Статус:</strong> усе магчымасьці на гэтай старонцы павінны працаваць, але API знаходзіцца ў актыўнай распрацоўцы і можа зьмяняцца ў любы момант. Падпісвайцеся на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ рассылку mediawiki-api-announce] дзеля паведамленьняў пра абнаўленьні.\n\n<strong>Памылковыя запыты:</strong> калі да API дасылаюцца памылковыя запыты, HTTP-загаловак будзе дасланы з ключом «MediaWiki-API-Error», а потым і значэньне загалоўка і код памылкі будуць выстаўленыя на аднолькавае значэньне. Дзеля дадатковай інфармацыі глядзіце https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Дзеяньне для выкананьня.",
        "apihelp-main-param-format": "Фармат вываду.",
        "apihelp-main-param-maxlag": "Максымальная затрымка можа ўжывацца, калі MediaWiki ўсталяваная ў клястэр з рэплікаванай базай зьвестак. Дзеля захаваньня дзеяньняў, якія выклікаюць затрымку рэплікацыі, гэты парамэтар можа прымусіць кліента чакаць, пакуль затрымка рэплікацыі меншая за яго значэньне. У выпадку доўгай затрымкі, вяртаецца код памылкі «maxlag» з паведамленьнем кшталту «Чаканьне $host: $lag сэкундаў затрымкі».<br />Глядзіце https://www.mediawiki.org/wiki/Manual:Maxlag_parameter дзеля дадатковай інфармацыі.",
@@ -27,5 +27,7 @@
        "apihelp-block-param-hidename": "Схаваць імя ўдзельніка з журналу блякаваньняў (патрабуе права «hideuser»).",
        "apihelp-block-param-allowusertalk": "Дазволіць удзельніку рэдагаваць уласную старонку гутарак (залежыць ад $wgBlockAllowsUTEdit).",
        "apihelp-block-param-reblock": "Калі ўдзельнік ужо заблякаваны, перапісаць дзейнае блякаваньне.",
-       "apihelp-block-param-watchuser": "Назіраць за старонкай удзельніка або старонкай IP-адрасу, а таксама старонкай гутарак."
+       "apihelp-block-param-watchuser": "Назіраць за старонкай удзельніка або старонкай IP-адрасу, а таксама старонкай гутарак.",
+       "apihelp-block-example-ip-simple": "Заблякаваць IP-адрас 192.0.2.5 на тры дні з прычынай «First strike»",
+       "apihelp-block-example-user-complex": "Заблякаваць удзельніка Vandal назаўсёды з прычынай «Vandalism», а таксама забараніць стварэньне новых рахункаў і адсылку лістоў электроннай поштай"
 }
index c8df203..420e6ac 100644 (file)
@@ -4,8 +4,13 @@
                        "Palapa"
                ]
        },
+       "apihelp-main-param-action": "Koju akciju izvesti.",
+       "apihelp-main-param-format": "Format izlaza.",
        "apihelp-block-description": "Blokiraj korisnika",
        "apihelp-block-param-reason": "Razlog za blokadu",
+       "apihelp-block-example-ip-simple": "Blokiraj IP 192.0.2.5 na tri dana sa razlogom \"Prvi napad\"",
+       "apihelp-compare-param-fromtitle": "Prvi naslov za poređenje.",
        "apihelp-delete-description": "Obriši stranicu.",
+       "apihelp-edit-param-text": "Sadržaj stranice.",
        "apihelp-edit-param-minor": "Mala izmjena."
 }
index 976b6d8..57b450a 100644 (file)
@@ -5,7 +5,7 @@
                        "YjM"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page Dokumentace]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete na stránce https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page Dokumentace]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete na stránce https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Jaká akce se má provést.",
        "apihelp-main-param-format": "Formát výstupu.",
        "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „maxlag“ s hlášením typu „Waiting for $host: $lag seconds lagged“.<br />Více informací najdete v [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Maxlag_parameter příručce].",
        "api-help-permissions-granted-to": "Uděleno {{PLURAL:$1|skupině|skupinám}}: $2",
        "api-help-right-apihighlimits": "Používání vyšších limitů v API dotazech (pomalé dotazy: $1, rychlé dotazy: $2). Limity pro pomalé dotazy se vztahují i na vícehodnotové parametry.",
        "api-credits-header": "Zásluhy",
-       "api-credits": "Vývojáři API:\n* Roan Kattouw (hlavní vývojář září 2007–2009)\n* Viktor Vasiljev\n* Bryan Tong Minh\n* Sam Reed\n* Jurij Astrachan (tvůrce, hlavní vývojář září 2006–září 2007)\n* Brad Jorsch (hlavní vývojář od 2013)\n\nSvé komentáře, návrhy či dotazy posílejte na mediawiki-api@lists.wikimedia.org\nnebo založte chybové hlášení na https://bugzilla.wikimedia.org/."
+       "api-credits": "Vývojáři API:\n* Roan Kattouw (hlavní vývojář září 2007–2009)\n* Viktor Vasiljev\n* Bryan Tong Minh\n* Sam Reed\n* Jurij Astrachan (tvůrce, hlavní vývojář září 2006–září 2007)\n* Brad Jorsch (hlavní vývojář od 2013)\n\nSvé komentáře, návrhy či dotazy posílejte na mediawiki-api@lists.wikimedia.org\nnebo založte chybové hlášení na https://phabricator.wikimedia.org/."
 }
index 4c9fef4..70484a7 100644 (file)
@@ -7,7 +7,7 @@
                        "Inkowik"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page/de Dokumentation]\n* [https://www.mediawiki.org/wiki/API:FAQ/de Häufig gestellte Fragen]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, aber die API ist noch in aktiver Entwicklung und könnte sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste] für Mitteilungen über Aktualisierungen.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ versandt. Die zurückgesandten Werte des Headers und des Fehlercodes werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page/de Dokumentation]\n* [https://www.mediawiki.org/wiki/API:FAQ/de Häufig gestellte Fragen]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, aber die API ist noch in aktiver Entwicklung und könnte sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste] für Mitteilungen über Aktualisierungen.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ versandt. Die zurückgesandten Werte des Headers und des Fehlercodes werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Welche Aktion ausgeführt werden soll.",
        "apihelp-main-param-format": "Das Format der Ausgabe.",
        "apihelp-main-param-maxlag": "Maximale Verzögerung kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um Aktionen zu speichern, die Websitereplikationsverzögerungen verursachen, kann dieser Parameter den Client warten lassen, bis die Replikationsverzögerung weniger als dem angegebenen Wert entspricht. Im Fall einer übermäßigen Verzögerung wird der Fehlercode „maxlag“ zurückgegeben mit einer Nachricht wie „Waiting for $host: $lag seconds lagged“.<br />Siehe https://www.mediawiki.org/wiki/Manual:Maxlag_parameter für weitere Informationen.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Gewährt an}}: $2",
        "api-help-right-apihighlimits": "Höhere Beschränkungen in API-Anfragen verwenden (langsame Anfragen: $1; schnelle Anfragen: $2). Die Beschränkungen für langsame Anfragen werden auch auf Mehrwertparameter angewandt.",
        "api-credits-header": "Danksagungen",
-       "api-credits": "API-Entwickler:\n* Roan Kattouw (Hauptentwickler von September 2007 bis 2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (Autor, Hauptentwickler von September 2006 bis September 2007)\n* Brad Jorsch (Hauptentwickler seit 2013)\n\nBitte sende deine Kommentare, Vorschläge und Fragen an mediawiki-api@lists.wikimedia.org\noder reiche einen Fehlerbericht auf https://bugzilla.wikimedia.org/ ein."
+       "api-credits": "API-Entwickler:\n* Roan Kattouw (Hauptentwickler von September 2007 bis 2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (Autor, Hauptentwickler von September 2006 bis September 2007)\n* Brad Jorsch (Hauptentwickler seit 2013)\n\nBitte sende deine Kommentare, Vorschläge und Fragen an mediawiki-api@lists.wikimedia.org\noder reiche einen Fehlerbericht auf https://phabricator.wikimedia.org/ ein."
 }
index 21b546c..d0eb230 100644 (file)
@@ -5,7 +5,7 @@
                ]
        },
 
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, a HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, a HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Which action to perform.",
        "apihelp-main-param-format": "The format of the output.",
        "apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code \"maxlag\" is returned with a message like \"Waiting for $host: $lag seconds lagged\".<br />See https://www.mediawiki.org/wiki/Manual:Maxlag_parameter for more information.",
        "apihelp-query+revisions-example-last5": "Get last 5 revisions of the \"Main Page\"",
        "apihelp-query+revisions-example-first5": "Get first 5 revisions of the \"Main Page\"",
        "apihelp-query+revisions-example-first5-after": "Get first 5 revisions of the \"Main Page\" made after 2006-05-01",
-       "apihelp-query+revisions-example-first5-not-localhost": "Get first 5 revisions of the \"Main Page\" that were not made made by anonymous user \"127.0.0.1\"",
+       "apihelp-query+revisions-example-first5-not-localhost": "Get first 5 revisions of the \"Main Page\" that were not made by anonymous user \"127.0.0.1\"",
        "apihelp-query+revisions-example-first5-user": "Get first 5 revisions of the \"Main Page\" that were made by the user \"MediaWiki default\"",
 
        "apihelp-query+revisions+base-param-prop": "Which properties to get for each revision:\n;ids:The ID of the revision.\n;flags:Revision flags (minor).\n;timestamp:The timestamp of the revision.\n;user:User that made the revision.\n;userid:User ID of the revision creator.\n;size:Length (bytes) of the revision.\n;sha1:SHA-1 (base 16) of the revision.\n;contentmodel:Content model ID of the revision.\n;comment:Comment by the user for the revision.\n;parsedcomment:Parsed comment by the user for the revision.\n;content:Text of the revision.\n;tags:Tags for the revision.",
        "api-help-right-apihighlimits": "Use higher limits in API queries (slow queries: $1; fast queries: $2). The limits for slow queries also apply to multivalue parameters.",
 
        "api-credits-header": "Credits",
-       "api-credits": "API developers:\n* Roan Kattouw (lead developer Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creator, lead developer Sep 2006–Sep 2007)\n* Brad Jorsch (lead developer 2013–present)\n\nPlease send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org\nor file a bug report at https://bugzilla.wikimedia.org/."
+       "api-credits": "API developers:\n* Roan Kattouw (lead developer Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creator, lead developer Sep 2006–Sep 2007)\n* Brad Jorsch (lead developer 2013–present)\n\nPlease send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org\nor file a bug report at https://phabricator.wikimedia.org/."
 }
index 2274371..b40c532 100644 (file)
@@ -6,7 +6,7 @@
                        "Orlodrim"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Quelle action effectuer.",
        "apihelp-main-param-format": "Le format de sortie.",
        "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur « maxlag » est renvoyé avec un message tel que « Attente de $host : $lag secondes de délai ».<br />Voyez https://www.mediawiki.org/wiki/Manual:Maxlag_parameter pour plus d’information.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Accordé à}} : $2",
        "api-help-right-apihighlimits": "Utiliser des valeurs plus hautes dans les requêtes de l’API (requêtes lentes : $1 ; requêtes rapides : $2). Les limites pour les requêtes lentes s’appliquent aussi aux paramètres multivalués.",
        "api-credits-header": "Remerciements",
-       "api-credits": "Développeurs de l’API :\n* Roan Kattouw (développeur en chef Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (créateur, développeur en chef Sept. 2006–Sept. 2007)\n* Brad Jorsch (développeur en chef depuis 2013)\n\nVeuillez envoyer vos commentaires, suggestions et questions à mediawiki-api@lists.wikimedia.org\nou remplir un rapport de bogue sur https://bugzilla.wikimedia.org/."
+       "api-credits": "Développeurs de l’API :\n* Roan Kattouw (développeur en chef Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (créateur, développeur en chef Sept. 2006–Sept. 2007)\n* Brad Jorsch (développeur en chef depuis 2013)\n\nVeuillez envoyer vos commentaires, suggestions et questions à mediawiki-api@lists.wikimedia.org\nou remplir un rapport de bogue sur https://phabricator.wikimedia.org/."
 }
index c029a62..f840d47 100644 (file)
@@ -4,7 +4,7 @@
                        "Elisardojm"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentación]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentación]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Que acción se realizará.",
        "apihelp-main-param-format": "O formato de saída.",
        "apihelp-main-param-curtimestamp": "Incluir a marca de tempo actual no resultado.",
index f377056..ad52295 100644 (file)
@@ -14,5 +14,7 @@
        "apihelp-main-param-servedby": "Includer in le resultato le nomine del host que ha servite le requesta.",
        "apihelp-main-param-curtimestamp": "Includer le data e hora actual in le resultato.",
        "apihelp-block-description": "Blocar un usator.",
-       "apihelp-block-param-user": "Nomine de usator, adresse IP o intervallo IP que tu vole blocar."
+       "apihelp-block-param-user": "Nomine de usator, adresse IP o intervallo IP que tu vole blocar.",
+       "apihelp-query+revisions-example-first5-not-localhost": "Obtener le prime 5 versiones del \"Pagina principal\" que non ha essite facite per le usator anonyme \"127.0.0.1\"",
+       "api-credits": "Programmatores del API:\n* Roan Kattouw (programmator dirigente Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creator, programmator dirigente Sept. 2006–Sept. 2007)\n* Brad Jorsch (programmator dirigente 2013–presente)\n\nInvia tu commentos, suggestiones e questiones a mediawiki-api@lists.wikimedia.org\no insere un reportage de bug a https://phabricator.wikimedia.org/."
 }
index a06db94..3c89c79 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Shirayuki",
-                       "2nd-player"
+                       "2nd-player",
+                       "Los688"
                ]
        },
        "apihelp-main-param-action": "実行する操作です。",
        "apihelp-main-param-curtimestamp": "現在のタイムスタンプを結果に含めます。",
        "apihelp-main-param-uselang": "メッセージの翻訳に使用する言語です。コードの一覧は [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] に siprop=languages を付けることで取得できます。\"user\" を指定することで現在の利用者の個人設定の言語を、\"content\" を指定することでこのウィキの本文の言語を使用することもできます。",
        "apihelp-block-description": "利用者をブロックします。",
+       "apihelp-block-param-reason": "ブロックの理由:",
        "apihelp-block-param-nocreate": "アカウントの作成を禁止します。",
        "apihelp-createaccount-description": "新しい利用者アカウントを作成します。",
+       "apihelp-createaccount-param-name": "利用者名:",
        "apihelp-createaccount-param-password": "パスワード ($1mailpassword が設定されると無視されます)。",
        "apihelp-createaccount-param-token": "最初のリクエストで得られたアカウント作成用トークンです。",
        "apihelp-createaccount-param-email": "利用者の電子メールアドレス (任意)。",
        "apihelp-edit-param-title": "編集するページ名です。$1pageid とは同時に使用できません。",
        "apihelp-edit-param-pageid": "編集するページIDです。$1title とは同時に使用できません。",
        "apihelp-edit-param-text": "ページの本文。",
+       "apihelp-edit-param-minor": "細部の編集",
        "apihelp-edit-param-createonly": "すでにそのページが存在する場合は編集を行いません。",
        "apihelp-edit-param-nocreate": "そのページが存在しない場合にエラーを返します。",
        "apihelp-edit-param-watch": "そのページをウォッチリストに追加します。",
        "apihelp-edit-param-unwatch": "そのページをウォッチリストから除去します。",
        "apihelp-edit-param-token": "このトークンは常に最後のパラメーターとして、または少なくとも $1text パラメーターより後に送信されるべきです。",
+       "apihelp-edit-example-edit": "ページを編集",
        "apihelp-emailuser-description": "利用者に電子メールを送信します。",
        "apihelp-emailuser-param-target": "送信先の利用者名。",
        "apihelp-emailuser-param-text": "電子メールの本文。",
@@ -53,6 +58,7 @@
        "apihelp-help-example-query": "2つの下位モジュールのヘルプ",
        "apihelp-login-param-name": "利用者名。",
        "apihelp-login-param-password": "パスワード。",
+       "apihelp-login-example-login": "ログイン",
        "apihelp-move-description": "ページを移動します。",
        "apihelp-move-param-from": "移動するページのページ名です。 $1fromid とは同時に使用できません。",
        "apihelp-move-param-fromid": "移動するページのページIDです。 $1from とは同時に使用できません。",
        "api-help-permissions": "{{PLURAL:$1|権限}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|権限を持つグループ}}: $2",
        "api-credits-header": "クレジット",
-       "api-credits": "API の開発者:\n* Roan Kattouw (2007年9月-2009年の主任開発者)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (作成者、2006年9月-2007年9月の主任開発者)\n* Brad Jorsch (2013年-現在の主任開発者)\n\nコメント、提案、質問は mediawiki-api@lists.wikimedia.org にお送りください。\nバグはこちらへご報告ください: https://bugzilla.wikimedia.org/"
+       "api-credits": "API の開発者:\n* Roan Kattouw (2007年9月-2009年の主任開発者)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (作成者、2006年9月-2007年9月の主任開発者)\n* Brad Jorsch (2013年-現在の主任開発者)\n\nコメント、提案、質問は mediawiki-api@lists.wikimedia.org にお送りください。\nバグはこちらへご報告ください: https://phabricator.wikimedia.org/"
 }
index a417e47..3fcc0ca 100644 (file)
@@ -4,7 +4,7 @@
                        "Kwj2772"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\"> * [https://www.mediawiki.org/wiki/API:Main_page 설명문서] * [https://www.mediawiki.org/wiki/API:FAQ FAQ] * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트] * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 공지 사항] * [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts 버그 및 요청] </div>\n<strong>상태:</strong> 이 페이지에 표시된 모든 기능은 정상 작동할 것이지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 바뀔 수 있습니다. 업데이트 정보를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n<strong>잘못된 요청:</strong> API에 잘못된 요청이 전송되면 HTTP 헤더에서 \"MediaWiki-API-Error\" 키를 보내고, 헤더 값과 오류 코드가 같게 설정됩니다. 자세한 정보에 대해서는 https://www.mediawiki.org/wiki/API:Errors_and_warnings 를 참고하십시오.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\"> * [https://www.mediawiki.org/wiki/API:Main_page 설명문서] * [https://www.mediawiki.org/wiki/API:FAQ FAQ] * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트] * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 공지 사항] * [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청] </div>\n<strong>상태:</strong> 이 페이지에 표시된 모든 기능은 정상 작동할 것이지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 바뀔 수 있습니다. 업데이트 정보를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n<strong>잘못된 요청:</strong> API에 잘못된 요청이 전송되면 HTTP 헤더에서 \"MediaWiki-API-Error\" 키를 보내고, 헤더 값과 오류 코드가 같게 설정됩니다. 자세한 정보에 대해서는 https://www.mediawiki.org/wiki/API:Errors_and_warnings 를 참고하십시오.",
        "apihelp-main-param-action": "수행할 동작",
        "apihelp-main-param-format": "출력값의 형식."
 }
index 3126a28..8e2a8b5 100644 (file)
@@ -4,7 +4,7 @@
                        "Jagwar"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Torohevitra be kokoa]\n* [https://www.mediawiki.org/wiki/API:FAQ Fanontaniana miverina matetika]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lisitry ny mailaka manaraka]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Filazana API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Baogy & hataka]\n</div>\n<strong>Status:</strong> \nTokony mandeha avokoa ny fitaovana aseho eto amin'ity pehy ity, na dia izany aza mbola am-panamboarana ny API ary mety hiova na oviana na oviana. Araho amin'ny alalan'ny fisoratana ny mailakao ao amin'ny [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce lisitra fampielezana] ny fiovana.\n\n<strong>Hataka diso:</strong> \nRehefa alefa ao amin'i API ny hata, ho alefa miaraka amin'ny lakile \"MediaWiki-API-Error\" ny header HTTP ary samy homen-tsanda mitovy ny header ary ny kaodin-kadisoana. Ho an'ny torohay fanampiny dia jereo https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Torohevitra be kokoa]\n* [https://www.mediawiki.org/wiki/API:FAQ Fanontaniana miverina matetika]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lisitry ny mailaka manaraka]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Filazana API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Baogy & hataka]\n</div>\n<strong>Status:</strong> \nTokony mandeha avokoa ny fitaovana aseho eto amin'ity pehy ity, na dia izany aza mbola am-panamboarana ny API ary mety hiova na oviana na oviana. Araho amin'ny alalan'ny fisoratana ny mailakao ao amin'ny [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce lisitra fampielezana] ny fiovana.\n\n<strong>Hataka diso:</strong> \nRehefa alefa ao amin'i API ny hata, ho alefa miaraka amin'ny lakile \"MediaWiki-API-Error\" ny header HTTP ary samy homen-tsanda mitovy ny header ary ny kaodin-kadisoana. Ho an'ny torohay fanampiny dia jereo https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Inona ny zavatra ho atao.",
        "apihelp-main-param-format": "Format mivoaka",
        "apihelp-createaccount-param-name": "Anaram-pikambana."
index 99d6ccd..686dab3 100644 (file)
@@ -4,7 +4,7 @@
                        "Bjankuloski06"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Документација]\n* [https://www.mediawiki.org/wiki/API:FAQ ЧПП]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Поштенски список]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Соопштенија за Извршникот]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Грешки и барања]\n</div>\n<strong>Статус:</strong> Сите ставки на страницава би требало да работат, но Извршникот сепак е во активна разработка, што значи дека може да се смени во секое време. Објавите за измени можете да ги дознавате ако се пријавите на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ поштенскиот список „the mediawiki-api-announce“].\n\n<strong>Погрешни барања:</strong> Кога Извршникот ќе добие погрешни барања, ќе се испрати HTTP-заглавие со клучот „MediaWiki-API-Error“ и потоа на вредностите на заглавието и шифрата на грешката што ќе се појават ќе им биде зададена истата вредност. ПОвеќе информации ќе најдете на https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Документација]\n* [https://www.mediawiki.org/wiki/API:FAQ ЧПП]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Поштенски список]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Соопштенија за Извршникот]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Грешки и барања]\n</div>\n<strong>Статус:</strong> Сите ставки на страницава би требало да работат, но Извршникот сепак е во активна разработка, што значи дека може да се смени во секое време. Објавите за измени можете да ги дознавате ако се пријавите на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ поштенскиот список „the mediawiki-api-announce“].\n\n<strong>Погрешни барања:</strong> Кога Извршникот ќе добие погрешни барања, ќе се испрати HTTP-заглавие со клучот „MediaWiki-API-Error“ и потоа на вредностите на заглавието и шифрата на грешката што ќе се појават ќе им биде зададена истата вредност. ПОвеќе информации ќе најдете на https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Кое дејство да се изврши.",
        "apihelp-main-param-format": "Формат на изводот.",
        "apihelp-main-param-maxlag": "Максималниот заостаток може да се користи кога МедијаВики е воспоставен на грозд умножен од базата. За да спречите дополнителни заостатоци од дејства, овој параметар му наложува на клиентот да почека додека заостатокот не се намали под укажаната вредност. Во случај на преголем заостаток, системт ја дава грешката со код „maxlag“ со порака од обликот „Го чекам $host: има заостаток од $lag секунди“.<br />Погл. https://www.mediawiki.org/wiki/Manual:Maxlag_parameter за повеќе информации.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Доделена на}: $2",
        "api-help-right-apihighlimits": "Уоптреба на повисоки ограничувања за приложни барања (бавни барања: $1; брзи барања: $2). Ограничувањата за бавни барања важат и за повеќевредносни параметри.",
        "api-credits-header": "Признанија",
-       "api-credits": "Разработувачи на Извршникот:\n* Роан Катау (главен резработувач од септември 2007 до 2009 г.)\n* Виктор Василев\n* Брајан Тонг Мињ\n* Сем Рид\n* Јуриј Астрахан (создавач, главен разработувач од септември 2006 до септември 2007 г.)\n* Brad Jorsch (главен разработувач од 2013 г. до денес)\n\nВашите коментари, предлози и прашања испраќајте ги на mediawiki-api@lists.wikimedia.org\nа грешките пријавувајте ги на https://bugzilla.wikimedia.org/."
+       "api-credits": "Разработувачи на Извршникот:\n* Роан Катау (главен резработувач од септември 2007 до 2009 г.)\n* Виктор Василев\n* Брајан Тонг Мињ\n* Сем Рид\n* Јуриј Астрахан (создавач, главен разработувач од септември 2006 до септември 2007 г.)\n* Brad Jorsch (главен разработувач од 2013 г. до денес)\n\nВашите коментари, предлози и прашања испраќајте ги на mediawiki-api@lists.wikimedia.org\nа грешките пријавувајте ги на https://phabricator.wikimedia.org/."
 }
index 450c641..9a42ed3 100644 (file)
@@ -8,7 +8,7 @@
                        "Valhallasw"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentatie]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie https://www.mediawiki.org/wiki/API:Errors_and_warnings voor meer informatie.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentatie]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie https://www.mediawiki.org/wiki/API:Errors_and_warnings voor meer informatie.",
        "apihelp-main-param-action": "Welke handeling uit te voeren.",
        "apihelp-main-param-format": "De opmaak van de uitvoer.",
        "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode \"maxlag\" teruggegeven met een bericht als \"Waiting for $host: $lag seconds lagged\".<br />Zie https://www.mediawiki.org/wiki/Manual:Maxlag_parameter voor mee informatie.",
@@ -36,5 +36,5 @@
        "api-help-param-deprecated": "Verouderd.",
        "api-help-param-default": "Standaard: $1",
        "api-credits-header": "Vermeldingen",
-       "api-credits": "API-ontwikkelaars:\n* Roan Kattouw (hoofdontwikkelaar september 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (oorspronkelijke ontwikkelaar, hoofdontwikkelaar september 2006 – september 2007)\n* Brad Jorsch (hoofdontwikkelaar 2013 – heden)\n\nStuur uw opmerkingen, suggesties en vragen naar mediawiki-api@lists.wikimedia.org\nof maak een melding aan op https://bugzilla.wikimedia.org/."
+       "api-credits": "API-ontwikkelaars:\n* Roan Kattouw (hoofdontwikkelaar september 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (oorspronkelijke ontwikkelaar, hoofdontwikkelaar september 2006 – september 2007)\n* Brad Jorsch (hoofdontwikkelaar 2013 – heden)\n\nStuur uw opmerkingen, suggesties en vragen naar mediawiki-api@lists.wikimedia.org\nof maak een melding aan op https://phabricator.wikimedia.org/."
 }
index f61f215..2f85059 100644 (file)
@@ -86,5 +86,5 @@
        "api-help-permissions": "{{PLURAL:$2|Uprawnienie|Uprawnienia}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Przydzielone dla}}: $2",
        "api-credits-header": "Twórcy",
-       "api-credits": "Deweloperzy API:\n* Roan Kattouw (główny programista wrzesień 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (twórca, główny programista wrzesień 2006–wrzesień 2007)\n* Brad Jorsch (główny programista 2013–obecnie)\n\nProsimy wysyłać komentarze, sugestie i pytania do mediawiki-api@lists.wikimedia.org\nlub zgłoś błąd na https://bugzilla.wikimedia.org/."
+       "api-credits": "Deweloperzy API:\n* Roan Kattouw (główny programista wrzesień 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (twórca, główny programista wrzesień 2006–wrzesień 2007)\n* Brad Jorsch (główny programista 2013–obecnie)\n\nProsimy wysyłać komentarze, sugestie i pytania do mediawiki-api@lists.wikimedia.org\nlub zgłoś błąd na https://phabricator.wikimedia.org/."
 }
index 4dc23e5..f6c9a61 100644 (file)
@@ -5,7 +5,7 @@
                        "Fúlvio"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentação]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Erros e solicitações]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página deveriam estar a funcionar, mas a API ainda está em activo desenvolvimento, e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das actualizações.\n\n<strong>Solicitações erradas:</strong> Quando solicitações erradas são enviadas à API, um cabeçalho em HTTP será enviado com a chave \"MediaWiki-API-Error\" e, em seguida, tanto o valor do cabeçalho quanto o código de erro retornado serão definidos com o mesmo valor. Para mais informação, consulte https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentação]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitações]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página deveriam estar a funcionar, mas a API ainda está em activo desenvolvimento, e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das actualizações.\n\n<strong>Solicitações erradas:</strong> Quando solicitações erradas são enviadas à API, um cabeçalho em HTTP será enviado com a chave \"MediaWiki-API-Error\" e, em seguida, tanto o valor do cabeçalho quanto o código de erro retornado serão definidos com o mesmo valor. Para mais informação, consulte https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Qual acção a executar.",
        "apihelp-main-param-format": "O formato de saída.",
        "apihelp-block-description": "Bloquear um utilizador.",
@@ -87,5 +87,5 @@
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(sem descrição)</span>",
        "api-help-examples": "{{PLURAL:$1|Exemplo|Exemplos}}:",
        "api-credits-header": "Créditos",
-       "api-credits": "Programadores API:\n* Roan Kattouw (programador principal Set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (criador, programador-líder Set 2006–Set 2007)\n* Brad Jorsch (programador-líder 2013–presente)\n\nPor favor, envie os seus comentários, sugestões e perguntas para mediawiki-api@lists.wikimedia.org ou reporte um erro técnico em https://bugzilla.wikimedia.org/."
+       "api-credits": "Programadores API:\n* Roan Kattouw (programador principal Set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (criador, programador-líder Set 2006–Set 2007)\n* Brad Jorsch (programador-líder 2013–presente)\n\nPor favor, envie os seus comentários, sugestões e perguntas para mediawiki-api@lists.wikimedia.org ou reporte um erro técnico em https://phabricator.wikimedia.org/."
 }
index 14e0015..a075a49 100644 (file)
@@ -66,5 +66,5 @@
        "api-help-permissions": "{{PLURAL:$1|අවසරය|අවසරයන්}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|\tප්‍රදානලාභියාට}}: $2",
        "api-credits-header": "ස්තුතිය",
-       "api-credits": "API වැඩිදියුණු කරන්නන්:\n* Roan Kattouw (ප්‍රධානියා 2007 සැප්. –2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (නිර්මාපකයා, ප්‍රධානියා 2006 සැප්. – 2007 සැප්.)\n* Brad Jorsch (ප්‍රධානියා 2013–මේ දක්වා)\n\nඔබගේ අදහස්, යෝජනා හා ගැටළු mediawiki-api@lists.wikimedia.org වෙත යොමු කරන්න, පින්තූර හෝ ගොනු හරහා ගැටළු ඉදිරිපත් කිරීමට  https://bugzilla.wikimedia.org/ වෙත පිවිසෙන්න."
+       "api-credits": "API වැඩිදියුණු කරන්නන්:\n* Roan Kattouw (ප්‍රධානියා 2007 සැප්. –2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (නිර්මාපකයා, ප්‍රධානියා 2006 සැප්. – 2007 සැප්.)\n* Brad Jorsch (ප්‍රධානියා 2013–මේ දක්වා)\n\nඔබගේ අදහස්, යෝජනා හා ගැටළු mediawiki-api@lists.wikimedia.org වෙත යොමු කරන්න, පින්තූර හෝ ගොනු හරහා ගැටළු ඉදිරිපත් කිරීමට  https://phabricator.wikimedia.org/ වෙත පිවිසෙන්න."
 }
index 1475a84..30b25c4 100644 (file)
@@ -5,21 +5,37 @@
                        "Lokal Profil",
                        "WikiPhoenix",
                        "Victorsa",
-                       "Albinomamba"
+                       "Albinomamba",
+                       "Peki01",
+                       "Stens51"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Dokumentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-postlist]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aviseringar]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Buggar & förslag]\n</div>\n<strong>Status:</strong> Alla funktioner som visas på denna sida borde fungera. API:et är dock fortfarande under aktiv utveckling och kan ändras när som helst. Prenumerera på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce e-postlistan] för att få aviseringar om uppdateringar.\n\n<strong>Felaktiga förfrågningar:</strong> När felaktiga förfrågningar skickas till API:et skickas en HTTP-header med nyckeln \"MediaWiki-API-Error\" och sedan sätts både värdet på headern och den felkoden som returneras till samma värde. För mer information läs https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-action": "Vilken åtgärd som ska utföras.",
        "apihelp-main-param-format": "Formatet för utdata.",
+       "apihelp-main-param-assert": "Bekräftar att användaren är inloggad om satt till \"user\", eller har bot-användarrättigheter om satt till \"bot\".",
+       "apihelp-main-param-requestid": "Alla värde som anges här kommer att inkluderas i svaret. Kan användas för att särskilja förfrågningar.",
+       "apihelp-main-param-servedby": "Inkludera det värdnamn som besvarade förfrågan i resultatet.",
        "apihelp-main-param-curtimestamp": "Inkludera den aktuella tidsstämpeln i resultatet.",
+       "apihelp-main-param-origin": "När API:et används genom en cross-domain AJAX-begäran (CORS), ange detta till den ursprungliga domänen. Detta måste inkluderas i alla pre-flight-begäran, och mpste därför vara en del av den begärda URI:n (inte i POST-datat). Detta måste överensstämma med en av källorna i Origin:-headern exakt, så den måste sättas till något i stil med http://en.wikipedia.org eller https://meta.wikimedia.org. Om denna parameter inte överensstämmer med Origin:-headern, returneras ett 403-svar. Om denna parameter överensstämmer med Origin:-headern och källan är vitlistad, sätts en Access-Control-Allow-Origin-header.",
+       "apihelp-main-param-uselang": "Språk som ska användas för meddelandeöversättningar. En lista med koder kan hämtas från [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] med siprop=languages, eller ange \"user\" för att använda den aktuella användarens språkpreferenser, eller ange \"content\" för att använda innehållsspråket.",
        "apihelp-block-description": "Blockera en användare.",
        "apihelp-block-param-user": "Användare, IP-adress eller IP-intervall du vill blockera.",
+       "apihelp-block-param-expiry": "Förfallotid. Kan vara Kan vara relativt (t.ex. \"5 months\" eller \"2 weeks\") eller absolut (t.ex. 2014-09-18T12:34:56Z\"). Om satt till \"infinite\", \"indefinite\" eller \"never\", kommer blockeringen aldrig att löpa ut.",
        "apihelp-block-param-reason": "Orsak till blockering.",
        "apihelp-block-param-anononly": "Blockera endast anonyma användare (t.ex. inaktivera anonyma redigeringar för denna IP-adress).",
        "apihelp-block-param-nocreate": "Förhindra registrering av användarkonton.",
+       "apihelp-block-param-autoblock": "Blockera automatiskt den senast använda IP-adressen, och alla efterföljande IP-adresser de försöker logga in från.",
+       "apihelp-block-param-noemail": "Hindra användaren från att skicka e-post via wikin. (Kräver \"blockemail\"-rättigheten).",
        "apihelp-block-param-hidename": "Döljer användarnamnet från blockeringsloggen. (Kräver rättigheten \"hideuser\").",
        "apihelp-block-param-allowusertalk": "Låt användaren redigera sin egen diskussionssida (beror på $wgBlockAllowsUTEdit).",
        "apihelp-block-param-reblock": "Skriv över befintlig blockering om användaren redan är blockerad.",
        "apihelp-block-param-watchuser": "Bevaka användarens eller IP-adressens användarsida och diskussionssida",
+       "apihelp-block-example-ip-simple": "Blockera IP-adressen 192.0.2.5 i tre dagar med motivationen \"First strike\"",
+       "apihelp-block-example-user-complex": "Blockera användare Vandal på obegränsad tid med motivationen \"Vandalism\", och förhindra kontoskapande och e-post.",
+       "apihelp-clearhasmsg-description": "Rensa hasmsg-flaggan för den aktuella användaren.",
+       "apihelp-clearhasmsg-example-1": "Rensa hasmsg-flaggan för den aktuella användaren",
+       "apihelp-compare-description": "Hämta skillnaden mellan två sidor.\n\nDu behöver skicka ett versionsnummer, en sidtitel, eller ett sid-Id för både \"from\" och \"to\".",
        "apihelp-compare-param-fromtitle": "Första titeln att jämföra.",
        "apihelp-compare-param-fromid": "Första sid-ID att jämföra.",
        "apihelp-compare-param-fromrev": "Första version att jämföra.",
        "apihelp-createaccount-param-name": "Användarnamn.",
        "apihelp-createaccount-param-password": "Lösenord (ignoreras om $1mailpassword angetts).",
        "apihelp-createaccount-param-domain": "Domän för extern autentisering (frivillig).",
+       "apihelp-createaccount-param-token": "Nyckel för kontoskapande erhölls i första begäran.",
        "apihelp-createaccount-param-email": "Användarens e-postadress (valfritt).",
        "apihelp-createaccount-param-realname": "Användarens riktiga namn (valfritt).",
+       "apihelp-createaccount-param-mailpassword": "Om satt till ett värde, skickas ett slumpmässigt lösenord till användaren via e-post.",
+       "apihelp-createaccount-param-reason": "Valfri anledning för att skapa kontot för att läggas till i loggarna.",
+       "apihelp-createaccount-param-language": "Språkkod att använda som standard för användaren (valfri, standardvärdet är innehållsspråket).",
        "apihelp-createaccount-example-pass": "Skapa användaren \"testuser\" med lösenordet \"test123\"",
+       "apihelp-createaccount-example-mail": "Skapa användaren \"testmailuser\" och skicka ett slumpgenererat lösenord via e-post",
        "apihelp-delete-description": "Radera en sida.",
+       "apihelp-delete-param-title": "Titel på sidan du vill radera. Kan inte användas tillsammans med $1pageid.",
+       "apihelp-delete-param-pageid": "Sid-ID för sidan du vill radera. Kan inte användas tillsammans med $1titel.",
        "apihelp-delete-param-reason": "Orsak till radering. Om orsak inte ges kommer en orsak att automatiskt genereras och användas.",
        "apihelp-delete-param-watch": "Lägg till sidan i din bevakningslista.",
        "apihelp-delete-param-unwatch": "Ta bort sidan från din bevakningslista.",
        "apihelp-delete-example-reason": "Raderar huvudsidan med orsaken \"Förbereder flyttning\"",
        "apihelp-disabled-description": "Denna modul har inaktiverats.",
        "apihelp-edit-description": "Skapa och redigera sidor.",
+       "apihelp-edit-param-title": "Titel på sidan du vill redigera. Kan inte användas tillsammans med $1pageid.",
+       "apihelp-edit-param-pageid": "Sid-ID för sidan du vill redigera. Kan inte användas tillsammans med $1titel.",
+       "apihelp-edit-param-section": "Avsnittsnummer. 0 för det översta avsnittet, \"new\" för ett nytt avsnitt.",
        "apihelp-edit-param-sectiontitle": "Rubriken för ett nytt avsnitt.",
        "apihelp-edit-param-text": "Sidans innehåll.",
        "apihelp-edit-param-summary": "Redigeringssammanfattning. Även avsnittets rubrik när $1section=new och $1sectiontitle inte anges.",
        "apihelp-edit-param-minor": "Mindre redigering.",
+       "apihelp-edit-param-notminor": "Icke-mindre redigering.",
        "apihelp-edit-param-bot": "Markera denna redigering som robotredigering.",
+       "apihelp-edit-param-basetimestamp": "Tidsstämpel för grundversionen, används för att upptäcka redigeringskonflikter. Kan erhållas genom [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "Tidsstämpel för när du började redigeringsprocessen, används för att upptäcka redigeringskonflikter. Ett lämpligt värde kan erhållas via  [[Special:ApiHelp/main|curtimestamp]] när redigeringsprocessen startas (t.ex. när sidans innehåll laddas för redigering).",
        "apihelp-edit-param-createonly": "Redigera inte sidan om den redan finns.",
        "apihelp-edit-param-nocreate": "Kasta ett fel om sidan inte finns.",
        "apihelp-edit-param-watch": "Lägg till sidan i din bevakningslista.",
        "apihelp-edit-param-unwatch": "Ta bort sidan från din bevakningslista.",
+       "apihelp-edit-param-md5": "MD5-hash för $1text-parametern, eller $1prependtext- och $1appendtext-parametrarna sammanfogade.",
+       "apihelp-edit-param-prependtext": "Lägg till denna text i början på sidan. Ersätter $1text.",
+       "apihelp-edit-param-appendtext": "Lägg till denna text i slutet på sidan. Ersätter $1text.\n\nAnvänd $1section=new för att lägga till en ny sektion, hellre än denna parameter.",
        "apihelp-edit-param-redirect": "Åtgärda automatiskt omdirigeringar.",
+       "apihelp-edit-param-token": "Token ska alltid skickas som sista parameter, eller åtminstone efter $1text-parametern",
        "apihelp-edit-example-edit": "Redigera en sida",
        "apihelp-emailuser-description": "Skicka e-post till en användare.",
        "apihelp-emailuser-param-target": "Användare att skicka e-post till.",
+       "apihelp-emailuser-param-subject": "Ämnesrubrik.",
        "apihelp-emailuser-param-text": "E-postmeddelandets innehåll.",
        "apihelp-emailuser-param-ccme": "Skicka en kopia av detta e-postmeddelande till mig.",
        "apihelp-emailuser-example-email": "Skicka ett e-postmeddelande till användaren \"WikiSysop\" med texten \"Content\"",
+       "apihelp-expandtemplates-description": "Expanderar alla mallar i wikitext.",
        "apihelp-expandtemplates-param-title": "Sidans rubrik.",
        "apihelp-expandtemplates-param-text": "Wikitext att konvertera.",
+       "apihelp-expandtemplates-param-revid": "Revision ID, för <nowiki>{{REVISIONID}}</nowiki> och liknande variabler.",
+       "apihelp-expandtemplates-example-simple": "Expandera wikitexten \"<nowiki>{{Projekt:Sandbox}}</nowiki>\"",
        "apihelp-feedcontributions-param-year": "Från år (och tidigare).",
        "apihelp-feedcontributions-param-month": "Från månad (och tidigare).",
+       "apihelp-feedcontributions-param-tagfilter": "Filtrera bidrag som har dessa taggar.",
+       "apihelp-feedcontributions-param-deletedonly": "Visa bara borttagna bidrag.",
+       "apihelp-feedcontributions-param-toponly": "Visa endast ändringar som är senaste revideringen.",
+       "apihelp-feedcontributions-param-newonly": "Visa endast redigeringar där sidor skapas.",
+       "apihelp-feedcontributions-param-showsizediff": "Visa skillnaden i storlek mellan revisioner.",
        "apihelp-feedcontributions-example-simple": "Returnera bidrag för [[User:Example]]",
        "apihelp-feedrecentchanges-param-days": "Dagar att begränsa resultaten till.",
        "apihelp-feedrecentchanges-param-limit": "Maximalt antal resultat att returnera.",
+       "apihelp-feedrecentchanges-param-from": "Visa förändringar sedan dess.",
        "apihelp-feedrecentchanges-param-hideminor": "Dölj mindre ändringar.",
        "apihelp-feedrecentchanges-param-hidebots": "Dölj robotändringar.",
        "apihelp-feedrecentchanges-param-hideanons": "Dölj ändringar av oinloggade användare.",
        "apihelp-feedrecentchanges-param-hidemyself": "Dölj mina ändringar.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrera efter tagg.",
        "apihelp-feedrecentchanges-param-target": "Visa endast ändringarna av sidor som den här sidan länkar till.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Visa ändringarna på sidor som är länkade till den valda sidan i stället.",
        "apihelp-feedrecentchanges-example-simple": "Visa senaste ändringar",
        "apihelp-feedrecentchanges-example-30days": "Visa senaste ändringar för 30 dygn",
+       "apihelp-feedwatchlist-param-hours": "Lista sidor ändrade inom så här många timmar från nu.",
+       "apihelp-feedwatchlist-param-linktosections": "Länka direkt till ändrade avsnitt om möjligt.",
        "apihelp-filerevert-description": "Återställ en fil till en äldre version.",
        "apihelp-filerevert-param-comment": "Ladda upp kommentar.",
        "apihelp-filerevert-example-revert": "Återställ Wiki.png till versionen från 2011-03-05T15:27:40Z",
        "apihelp-patrol-example-revid": "Patrullera en sidversion",
        "apihelp-protect-description": "Ändra skyddsnivån för en sida.",
        "apihelp-protect-example-protect": "Skydda en sida",
+       "apihelp-query-param-list": "Vilka listor att hämta.",
+       "apihelp-query-param-meta": "Vilka metadata att hämta.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kan endast användas med $3user.",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Kan inte användas med $3user.",
        "apihelp-query+allfileusages-example-unique": "Lista unika filtitlar",
        "apihelp-query+allmessages-example-ipb": "Visa meddelanden som börjar med \"ipb-\"",
        "apihelp-query+allmessages-example-de": "Visa meddelandena \"august\" och \"mainpage\" på tyska",
        "apihelp-query+allpages-param-filterredir": "Vilka sidor att lista.",
+       "apihelp-query+revisions-example-first5-not-localhost": "Hämta första 5 revideringarna av \"huvudsidan\" och som inte gjorts av anonym användare \"127.0.0.1\"",
        "apihelp-query+stashimageinfo-description": "Returnerar filinformation för temporära filer.",
        "apihelp-query+stashimageinfo-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
        "apihelp-query+stashimageinfo-example-simple": "Returnerar information för en temporär fil",
index fe8d76c..8d0b79b 100644 (file)
@@ -9,10 +9,14 @@
                        "Shizhao"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page/zh 文档]\n* [https://www.mediawiki.org/wiki/API:FAQ/zh 常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong> 本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong> 当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅 https://www.mediawiki.org/wiki/API:Errors_and_warnings 。",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page/zh 文档]\n* [https://www.mediawiki.org/wiki/API:FAQ/zh 常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong> 本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong> 当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅 https://www.mediawiki.org/wiki/API:Errors_and_warnings 。",
        "apihelp-main-param-action": "要执行的操作。",
        "apihelp-main-param-format": "输出的格式。",
+       "apihelp-main-param-maxlag": "最大延迟可被用于MediaWiki安装于数据库复制集中。要保存导致更多网站复制延迟的操作,此参数可使客户端等待直到复制延迟少于指定值时。万一发生过多延迟,错误代码“maxlag”会返回消息,例如“等待$host中:延迟$lag秒”。<br />参见https://www.mediawiki.org/wiki/Manual:Maxlag_parameter以获取更多信息。",
+       "apihelp-main-param-smaxage": "设置s-maxage页顶至这些秒。错误不会缓存。",
+       "apihelp-main-param-maxage": "设置max-age页顶至这些秒。错误不会缓存。",
        "apihelp-main-param-assert": "如果设置为“user”就验证用户是否登录,或如果设置为“bot”就验证是否有机器人用户权限。",
+       "apihelp-main-param-requestid": "任何在此提供的值将包含在响应中。可能可以用以区别请求。",
        "apihelp-main-param-servedby": "包含保存结果请求的主机名。",
        "apihelp-main-param-curtimestamp": "在结果中包括当前时间戳。",
        "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。这必须匹配Origin中的一个起点:从头到底,因此它已经设置为像http://zh.wikipedia.org或https://meta.wikimedia.org的东西。如果此参数不匹配Origin: header,就返回403错误响应。如果此参数匹配Origin: header并且起点被白名单,将设置一个Access-Control-Allow-Origin开头。",
        "apihelp-block-param-reason": "封禁的原因",
        "apihelp-block-param-anononly": "只封禁匿名用户(也就是说禁止此IP的匿名编辑)。",
        "apihelp-block-param-nocreate": "防止创建帐户。",
+       "apihelp-block-param-autoblock": "自动封禁最近使用的IP地址,以及以后他们尝试登陆使用的IP地址。",
        "apihelp-block-param-noemail": "阻止用户通过 wiki发送电子邮件。(要求\"blockemail\"权限)。",
        "apihelp-block-param-hidename": "从封禁日志中隐藏用户名。(需要“隐藏用户”权限)。",
        "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页 (取决于 $wgBlockAllowsUTEdit)。",
        "apihelp-block-param-reblock": "如果该用户已被封禁,则覆盖已有的封禁。",
        "apihelp-block-param-watchuser": "监视该用户或该 IP 的用户页和讨论页。",
-       "apihelp-block-example-ip-simple": "封禁IP地址192.0.2.5三天,原因“首次罢工”",
+       "apihelp-block-example-ip-simple": "封禁IP地址192.0.2.5三天,原因“首次处理”",
+       "apihelp-block-example-user-complex": "无限期封禁破坏用户,原因“纯破坏用户”,并阻止新账户创建和电子邮件",
        "apihelp-clearhasmsg-description": "清除当前用户的 hasmsg 标志。",
        "apihelp-clearhasmsg-example-1": "清除当前用户的 hasmsg 标志",
        "apihelp-compare-description": "获取2个页面之间的差别。\n\n您必须为\"from\"和\"to\"传递特定的修订版本号、 页面标题或页面ID。",
        "apihelp-delete-param-pageid": "你所希望删除的页面的页面ID。不能与$1title一起使用。",
        "apihelp-delete-param-reason": "删除原因。如果未设置,将使用一个自动生成的原因。",
        "apihelp-delete-param-watch": "将该页面加入您的监视列表。",
+       "apihelp-delete-param-watchlist": "无条件地将页面加入至您的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-delete-param-unwatch": "将该页面从您的监视列表删除。",
+       "apihelp-delete-param-oldimage": "由[[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]]提供的要删除的旧图片名称。",
        "apihelp-delete-example-simple": "删除首页",
        "apihelp-delete-example-reason": "删除首页,原因“准备移动”",
        "apihelp-disabled-description": "此模块已禁用。",
        "apihelp-edit-description": "创建和编辑页面。",
        "apihelp-edit-param-title": "您希望编辑的页面标题。不能与$1pageid一起使用。",
        "apihelp-edit-param-pageid": "您希望编辑的页面ID。不能与$1title一起使用。",
+       "apihelp-edit-param-section": "段落数。0用于首段,“new”用于新的段落。",
        "apihelp-edit-param-sectiontitle": "新小节的标题。",
        "apihelp-edit-param-text": "页面内容。",
        "apihelp-edit-param-summary": "编辑摘要。当$1section=new且未设置$1sectiontitle时,还包括小节标题。",
        "apihelp-edit-param-minor": "小编辑。",
        "apihelp-edit-param-notminor": "不是小编辑。",
        "apihelp-edit-param-bot": "标记此编辑为机器人编辑。",
+       "apihelp-edit-param-basetimestamp": "基础修订的时间戳,用于检测编辑冲突。也许可以通过[[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]得到。",
+       "apihelp-edit-param-starttimestamp": "您开始编辑过程的时间戳,用于检测编辑冲突。当开始编辑过程时(例如当加载要编辑的页面时)使用[[Special:ApiHelp/main|curtimestamp]]可能取得一个适当的值。",
+       "apihelp-edit-param-recreate": "覆盖有关同时删除的条目的任何错误。",
        "apihelp-edit-param-createonly": "不要编辑页面,如果已经存在。",
        "apihelp-edit-param-nocreate": "如果该页面不存在,则抛出一个错误。",
        "apihelp-edit-param-watch": "将页面加入您的监视列表。",
        "apihelp-edit-param-unwatch": "将页面从您的监视列表移除。",
+       "apihelp-edit-param-watchlist": "无条件地将页面加入至您的监视列表或将其移除,使用设置或不更改监视。",
+       "apihelp-edit-param-md5": "$1text参数或$1prependtext和$1appendtext级联参数的MD5哈希值。如果设置,除非哈希值正确否则编辑无法完成。",
        "apihelp-edit-param-prependtext": "将该文本添加到该页面的开始。覆盖$1text。",
        "apihelp-edit-param-appendtext": "将该文本添加到该页面的结尾。覆盖$1text。\n\n采用$1section=new来添加一个新的章节,而不是这个参数。",
        "apihelp-edit-param-undo": "撤销此次修订。覆盖$1text、$1prependtext和$1appendtext。",
+       "apihelp-edit-param-undoafter": "撤销从$1undo至此的所有修订。如果不设置就撤销一次修订。",
        "apihelp-edit-param-redirect": "自动解析重定向。",
        "apihelp-edit-param-contentformat": "用于输入文本的内容串行化格式。",
        "apihelp-edit-param-contentmodel": "新内容的内容模型。",
+       "apihelp-edit-param-token": "令牌应总是发送为最后参数,或至少在$1text参数之后。",
        "apihelp-edit-example-edit": "编辑一个页面",
        "apihelp-edit-example-prepend": "页面中预置_&#95;NOTOC_&#95;",
        "apihelp-edit-example-undo": "通过13585撤销修订版本13579并自动填写编辑摘要",
        "apihelp-expandtemplates-param-title": "页面标题。",
        "apihelp-expandtemplates-param-text": "要转换的wiki文本。",
        "apihelp-expandtemplates-param-revid": "修订版本ID,用于<nowiki>{{REVISIONID}}</nowiki>和类似变体。",
+       "apihelp-expandtemplates-param-prop": "要获取的那条信息:\n;wikitext:展开的wiki文本。\n;categories:任何在不代表wiki文本输出的输入框出现的分类。\n;volatile:Whether the output is volatile and should not be reused elsewhere within the page.\n;ttl:The maximum time after which caches of the result should be invalidated.\n;parsetree:The XML parse tree of the input.",
        "apihelp-expandtemplates-example-simple": "展开wiki文本“<nowiki>{{Project:Sandbox}}</nowiki>”",
        "apihelp-feedcontributions-description": "返回用户贡献纲要。",
        "apihelp-feedcontributions-param-feedformat": "纲要的格式。",
        "apihelp-imagerotate-example-generator": "将[[:Category:Flip]]之中的所有图像旋转180度",
        "apihelp-import-param-summary": "导入摘要。",
        "apihelp-import-param-xml": "上传的XML文件。",
+       "apihelp-import-param-interwikisource": "用于跨wiki导入:导入的来源wiki。",
        "apihelp-import-param-interwikipage": "用于跨wiki导入:导入的页面。",
+       "apihelp-import-param-fullhistory": "用于跨wiki导入:完整导入历史,而不只是最新版本。",
+       "apihelp-import-param-templates": "用于跨wiki导入:连带导入所有包含的模板。",
+       "apihelp-import-param-namespace": "用于跨wiki导入:导入到此名字空间。",
        "apihelp-import-param-rootpage": "导入作为此页面的子页面。",
        "apihelp-import-example-import": "将页面[[meta:Help:Parserfunctions]]连带完整历史导入至100名字空间。",
        "apihelp-login-param-name": "用户名。",
        "api-help-permissions": "{{PLURAL:$1|权限}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2",
        "api-credits-header": "制作人员",
-       "api-credits": "API 开发人员:\n* Roan Kattouw(2007年9月~2009年的开发组领导)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan(创建者,2006年9月~2007年9月的开发组领导)\n* Brad Jorsch(2013年至今的开发组领导)\n\n请将您的评论、建议和问题发送至mediawiki-api@lists.wikimedia.org,或提交错误请求在https://bugzilla.wikimedia.org/。"
+       "api-credits": "API 开发人员:\n* Roan Kattouw(2007年9月~2009年的开发组领导)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan(创建者,2006年9月~2007年9月的开发组领导)\n* Brad Jorsch(2013年至今的开发组领导)\n\n请将您的评论、建议和问题发送至mediawiki-api@lists.wikimedia.org,或提交错误请求在https://phabricator.wikimedia.org/。"
 }
index b36827c..ff3b25b 100644 (file)
@@ -2,6 +2,8 @@
 /**
  * JSON Content Model
  *
+ * This class requires the root structure to be an object (not primitives or arrays).
+ *
  * @file
  *
  * @author Ori Livneh <ori@wikimedia.org>
  */
 class JsonContent extends TextContent {
 
-       public function __construct( $text, $modelId = CONTENT_MODEL_JSON ) {
-               parent::__construct( $text, $modelId );
+       /**
+        * @since 1.25
+        * @var Status
+        */
+       protected $jsonParse;
+
+       /**
+        * @param string $text JSON
+        */
+       public function __construct( $text ) {
+               parent::__construct( $text, CONTENT_MODEL_JSON );
        }
 
        /**
         * Decodes the JSON into a PHP associative array.
-        * @return array
+        *
+        * @deprecated since 1.25 Use getData instead.
+        * @return array|null
         */
        public function getJsonData() {
+               wfDeprecated( __METHOD__, '1.25' );
                return FormatJson::decode( $this->getNativeData(), true );
        }
 
        /**
-        * @return bool Whether content is valid JSON.
+        * Decodes the JSON string into a PHP object.
+        *
+        * @return Status
+        */
+       public function getData() {
+               if ( $this->jsonParse === null ) {
+                       $this->jsonParse = FormatJson::parse( $this->getNativeData() );
+               }
+               return $this->jsonParse;
+       }
+
+       /**
+        * @return bool Whether content is valid.
         */
        public function isValid() {
-               return $this->getJsonData() !== null;
+               return $this->getData()->isGood() && is_object( $this->getData()->getValue() );
        }
 
        /**
-        * Pretty-print JSON
+        * Pretty-print JSON.
+        *
+        * If called before validation, it may return JSON "null".
         *
-        * @return bool|null|string
+        * @return string
         */
        public function beautifyJSON() {
-               $decoded = FormatJson::decode( $this->getNativeData(), true );
-               if ( !is_array( $decoded ) ) {
-                       return null;
-               }
-               return FormatJson::encode( $decoded, true );
-
+               return FormatJson::encode( $this->getData()->getValue(), true );
        }
 
        /**
         * Beautifies JSON prior to save.
+        *
         * @param Title $title Title
         * @param User $user User
         * @param ParserOptions $popts
         * @return JsonContent
         */
        public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+               // FIXME: WikiPage::doEditContent invokes PST before validation. As such, native data
+               // may be invalid (though PST result is discarded later in that case).
+               if ( !$this->isValid() ) {
+                       return $this;
+               }
+
                return new static( $this->beautifyJSON() );
        }
 
        /**
-        * Set the HTML and add the appropriate styles
-        *
+        * Set the HTML and add the appropriate styles.
         *
         * @param Title $title
         * @param int $revId
@@ -71,50 +100,112 @@ class JsonContent extends TextContent {
        protected function fillParserOutput( Title $title, $revId,
                ParserOptions $options, $generateHtml, ParserOutput &$output
        ) {
-               if ( $generateHtml ) {
-                       $output->setText( $this->objectTable( $this->getJsonData() ) );
+               // FIXME: WikiPage::doEditContent generates parser output before validation.
+               // As such, native data may be invalid (though output is discarded later in that case).
+               if ( $generateHtml && $this->isValid() ) {
+                       $output->setText( $this->objectTable( $this->getData()->getValue() ) );
                        $output->addModuleStyles( 'mediawiki.content.json' );
                } else {
                        $output->setText( '' );
                }
        }
+
        /**
-        * Constructs an HTML representation of a JSON object.
-        * @param array $mapping
+        * Construct an HTML representation of a JSON object.
+        *
+        * Called recursively via valueCell().
+        *
+        * @param stdClass $mapping
         * @return string HTML
         */
        protected function objectTable( $mapping ) {
                $rows = array();
+               $empty = true;
 
                foreach ( $mapping as $key => $val ) {
                        $rows[] = $this->objectRow( $key, $val );
+                       $empty = false;
                }
-               return Xml::tags( 'table', array( 'class' => 'mw-json' ),
-                       Xml::tags( 'tbody', array(), join( "\n", $rows ) )
+               if ( $empty ) {
+                       $rows[] = Html::rawElement( 'tr', array(),
+                               Html::element( 'td', array( 'class' => 'mw-json-empty' ),
+                                       wfMessage( 'content-json-empty-object' )->text()
+                               )
+                       );
+               }
+               return Html::rawElement( 'table', array( 'class' => 'mw-json' ),
+                       Html::rawElement( 'tbody', array(), join( "\n", $rows ) )
                );
        }
 
        /**
-        * Constructs HTML representation of a single key-value pair.
+        * Construct HTML representation of a single key-value pair.
         * @param string $key
         * @param mixed $val
         * @return string HTML.
         */
        protected function objectRow( $key, $val ) {
                $th = Xml::elementClean( 'th', array(), $key );
-               if ( is_array( $val ) ) {
-                       $td = Xml::tags( 'td', array(), self::objectTable( $val ) );
-               } else {
-                       if ( is_string( $val ) ) {
-                               $val = '"' . $val . '"';
-                       } else {
-                               $val = FormatJson::encode( $val );
-                       }
+               $td = self::valueCell( $val );
+               return Html::rawElement( 'tr', array(), $th . $td );
+       }
+
+       /**
+        * Constructs an HTML representation of a JSON array.
+        *
+        * Called recursively via valueCell().
+        *
+        * @param array $mapping
+        * @return string HTML
+        */
+       protected function arrayTable( $mapping ) {
+               $rows = array();
+               $empty = true;
 
-                       $td = Xml::elementClean( 'td', array( 'class' => 'value' ), $val );
+               foreach ( $mapping as $val ) {
+                       $rows[] = $this->arrayRow( $val );
+                       $empty = false;
                }
+               if ( $empty ) {
+                       $rows[] = Html::rawElement( 'tr', array(),
+                               Html::element( 'td', array( 'class' => 'mw-json-empty' ),
+                                       wfMessage( 'content-json-empty-array' )->text()
+                               )
+                       );
+               }
+               return Html::rawElement( 'table', array( 'class' => 'mw-json' ),
+                       Html::rawElement( 'tbody', array(), join( "\n", $rows ) )
+               );
+       }
 
-               return Xml::tags( 'tr', array(), $th . $td );
+       /**
+        * Construct HTML representation of a single array value.
+        * @param mixed $val
+        * @return string HTML.
+        */
+       protected function arrayRow( $val ) {
+               $td = self::valueCell( $val );
+               return Html::rawElement( 'tr', array(), $td );
        }
 
+       /**
+        * Construct HTML representation of a single value.
+        * @param mixed $val
+        * @return string HTML.
+        */
+       protected function valueCell( $val ) {
+               if ( is_object( $val ) ) {
+                       return Html::rawElement( 'td', array(), self::objectTable( $val ) );
+               }
+               if ( is_array( $val ) ) {
+                       return Html::rawElement( 'td', array(), self::arrayTable( $val ) );
+               }
+               if ( is_string( $val ) ) {
+                       $val = '"' . $val . '"';
+               } else {
+                       $val = FormatJson::encode( $val );
+               }
+
+               return Xml::elementClean( 'td', array( 'class' => 'value' ), $val );
+       }
 }
index 6d27d86..33c5cfb 100644 (file)
@@ -1205,7 +1205,8 @@ abstract class DatabaseBase implements IDatabase {
                        $n = $this->affectedRows();
                        if ( $isWriteQuery && $n > self::LOG_WRITE_THRESHOLD && PHP_SAPI !== 'cli' ) {
                                wfDebugLog( 'DBPerformance',
-                                       "Query affected $n rows:\n$sql\n" . wfBacktrace( true ) );
+                                       "Query affected $n rows:\n" .
+                                       DatabaseBase::generalizeSQL( $sql ) . "\n" . wfBacktrace( true ) );
                        }
                }
 
index 6e262e8..b2527f9 100644 (file)
@@ -94,7 +94,7 @@ interface IORMTable {
        public function getSummaryFields();
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as DBDataObject. Field names get prefixed.
         *
         * @see DatabaseBase::select()
@@ -113,7 +113,7 @@ interface IORMTable {
                array $options = array(), $functionName = null );
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as DBDataObject. Field names get prefixed.
         *
         * @since 1.20
@@ -145,7 +145,7 @@ interface IORMTable {
                array $options = array(), $functionName = null );
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as associative arrays.
         * Provided field names get prefixed.
         * Returned field names will not have a prefix.
@@ -170,7 +170,7 @@ interface IORMTable {
                array $options = array(), $collapse = true, $functionName = null );
 
        /**
-        * Selects the the specified fields of the first matching record.
+        * Selects the specified fields of the first matching record.
         * Field names get prefixed.
         *
         * @since 1.20
@@ -186,7 +186,7 @@ interface IORMTable {
                array $options = array(), $functionName = null );
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions. Field names do NOT get prefixed.
         *
         * @since 1.20
@@ -202,7 +202,7 @@ interface IORMTable {
                array $options = array(), $functionName = null );
 
        /**
-        * Selects the the specified fields of the first record matching the provided
+        * Selects the specified fields of the first record matching the provided
         * conditions and returns it as an associative array, or false when nothing matches.
         * This method makes use of selectFields and expects the same parameters and
         * returns the same results (if there are any, if there are none, this method returns false).
index b22df39..cada298 100644 (file)
@@ -190,7 +190,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as DBDataObject. Field names get prefixed.
         *
         * @since 1.20
@@ -211,7 +211,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as DBDataObject. Field names get prefixed.
         *
         * @since 1.20
@@ -296,7 +296,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions and returns them as associative arrays.
         * Provided field names get prefixed.
         * Returned field names will not have a prefix.
@@ -346,7 +346,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the first matching record.
+        * Selects the specified fields of the first matching record.
         * Field names get prefixed.
         *
         * @since 1.20
@@ -369,7 +369,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the records matching the provided
+        * Selects the specified fields of the records matching the provided
         * conditions. Field names do NOT get prefixed.
         *
         * @since 1.20
@@ -400,7 +400,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Selects the the specified fields of the first record matching the provided
+        * Selects the specified fields of the first record matching the provided
         * conditions and returns it as an associative array, or false when nothing matches.
         * This method makes use of selectFields and expects the same parameters and
         * returns the same results (if there are any, if there are none, this method returns false).
index 7417c6b..c54d241 100644 (file)
@@ -44,9 +44,8 @@ TXT;
  * change the service provider. If MWLogger::getInstance() is called before
  * any service provider has been registered, it will attempt to use the
  * $wgMWLoggerDefaultSpi global to bootstrap MWLoggerSpi registration.
- * $wgMWLoggerDefaultSpi can either be the name of a class implementing the
- * MWLoggerSpi interface with a zero argument constructor or a callable that
- * will return an MWLoggerSpi instance.
+ * $wgMWLoggerDefaultSpi is expected to be an array usable by
+ * ObjectFactory::getObjectFromSpec() to create a class.
  *
  * @see MWLoggerSpi
  * @since 1.25
index e7c69b8..a682504 100644 (file)
@@ -107,7 +107,7 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
                        // and no explicit wgDebugLogGroups configuration.
                        $shouldEmit = false;
                } else {
-                       // Default return value is the the same as the historic wfDebug
+                       // Default return value is the same as the historic wfDebug
                        // method: emit if $wgDebugLogFile has been set.
                        $shouldEmit = $wgDebugLogFile != '';
                }
@@ -324,48 +324,8 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
        */
        public static function emit( $text, $file ) {
                if ( substr( $file, 0, 4 ) == 'udp:' ) {
-                       # Needs the sockets extension
-                       if ( preg_match( '!^udp:(?://)?\[([0-9a-fA-F:]+)\]:(\d+)(?:/(.*))?$!', $file, $m ) ) {
-                               // IPv6 bracketed host
-                               $host = $m[1];
-                               $port = intval( $m[2] );
-                               $prefix = isset( $m[3] ) ? $m[3] : false;
-                               $domain = AF_INET6;
-                       } elseif ( preg_match( '!^udp:(?://)?([a-zA-Z0-9.-]+):(\d+)(?:/(.*))?$!', $file, $m ) ) {
-                               $host = $m[1];
-                               if ( !IP::isIPv4( $host ) ) {
-                                       $host = gethostbyname( $host );
-                               }
-                               $port = intval( $m[2] );
-                               $prefix = isset( $m[3] ) ? $m[3] : false;
-                               $domain = AF_INET;
-                       } else {
-                               throw new MWException( __METHOD__ . ': Invalid UDP specification' );
-                       }
-
-                       // Clean it up for the multiplexer
-                       if ( strval( $prefix ) !== '' ) {
-                               $text = preg_replace( '/^/m', $prefix . ' ', $text );
-
-                               // Limit to 64KB
-                               if ( strlen( $text ) > 65506 ) {
-                                       $text = substr( $text, 0, 65506 );
-                               }
-
-                               if ( substr( $text, -1 ) != "\n" ) {
-                                       $text .= "\n";
-                               }
-                       } elseif ( strlen( $text ) > 65507 ) {
-                               $text = substr( $text, 0, 65507 );
-                       }
-
-                       $sock = socket_create( $domain, SOCK_DGRAM, SOL_UDP );
-                       if ( !$sock ) {
-                               return;
-                       }
-
-                       socket_sendto( $sock, $text, strlen( $text ), 0, $host, $port );
-                       socket_close( $sock );
+                       $transport = UDPTransport::newFromString( $file );
+                       $transport->emit( $text );
                } else {
                        wfSuppressWarnings();
                        $exists = file_exists( $file );
index c9545fa..67acf57 100644 (file)
@@ -21,7 +21,7 @@
 /**
  * Log message formatter that mimics the legacy log message formatting of
  * `wfDebug`, `wfDebugLog`, `wfLogDBError` and `wfErrorLog` global functions by
- * deligating the formatting to MWLoggerLegacyLogger.
+ * delegating the formatting to MWLoggerLegacyLogger.
  *
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
index a4c0168..30534f0 100644 (file)
@@ -189,7 +189,7 @@ class DiffOpChange extends DiffOp {
  * More ideas are taken from:
  *     http://www.ics.uci.edu/~eppstein/161/960229.html
  *
- * Some ideas are (and a bit of code) are from from analyze.c, from GNU
+ * Some ideas (and a bit of code) are from analyze.c, from GNU
  * diffutils-2.7, which can be found at:
  *     ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz
  *
index c887193..a458831 100644 (file)
@@ -1062,7 +1062,7 @@ class DifferenceEngine extends ContextSource {
                        $key = $title->quickUserCan( 'edit', $user ) ? 'editold' : 'viewsourceold';
                        $msg = $this->msg( $key )->escaped();
                        $editLink = $this->msg( 'parentheses' )->rawParams(
-                               Linker::linkKnown( $title, $msg, array( ), $editQuery ) )->plain();
+                               Linker::linkKnown( $title, $msg, array( ), $editQuery ) )->escaped();
                        $header .= ' ' . Html::rawElement(
                                'span',
                                array( 'class' => 'mw-diff-edit' ),
index 495ac3c..06fb2c6 100644 (file)
@@ -1372,7 +1372,7 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * Check if a container name is valid.
-        * This checks for for length and illegal characters.
+        * This checks for length and illegal characters.
         *
         * @param string $container
         * @return bool
index 62345b8..dc73522 100644 (file)
@@ -246,10 +246,7 @@ class HTMLForm extends ContextSource {
                                $this->mUseMultipart = true;
                        }
 
-                       $field = self::loadInputFromParameters( $fieldname, $info );
-                       // FIXME During field's construct, the parent form isn't available!
-                       // could add a 'parent' name-value to $info, could add a third parameter.
-                       $field->mParent = $this;
+                       $field = self::loadInputFromParameters( $fieldname, $info, $this );
 
                        // vform gets too much space if empty labels generate HTML.
                        if ( $this->isVForm() ) {
@@ -359,14 +356,18 @@ class HTMLForm extends ContextSource {
         *
         * @param string $fieldname Name of the field
         * @param array $descriptor Input Descriptor, as described above
+        * @param HTMLForm|null $parent Parent instance of HTMLForm
         *
         * @throws MWException
         * @return HTMLFormField Instance of a subclass of HTMLFormField
         */
-       public static function loadInputFromParameters( $fieldname, $descriptor ) {
+       public static function loadInputFromParameters( $fieldname, $descriptor, HTMLForm $parent = null ) {
                $class = self::getClassFromDescriptor( $fieldname, $descriptor );
 
                $descriptor['fieldname'] = $fieldname;
+               if ( $parent ) {
+                       $descriptor['parent'] = $parent;
+               }
 
                # @todo This will throw a fatal error whenever someone try to use
                # 'class' to feed a CSS class instead of 'cssclass'. Would be
@@ -1014,7 +1015,7 @@ class HTMLForm extends ContextSource {
         *
         * @return string HTML, a "<ul>" list of errors
         */
-       public static function formatErrors( $errors ) {
+       public function formatErrors( $errors ) {
                $errorstr = '';
 
                foreach ( $errors as $error ) {
@@ -1028,7 +1029,7 @@ class HTMLForm extends ContextSource {
                        $errorstr .= Html::rawElement(
                                'li',
                                array(),
-                               wfMessage( $msg, $error )->parse()
+                               $this->msg( $msg, $error )->parse()
                        );
                }
 
index 4cf2394..861ae4c 100644 (file)
@@ -343,6 +343,10 @@ abstract class HTMLFormField {
        function __construct( $params ) {
                $this->mParams = $params;
 
+               if ( isset( $params['parent'] ) && $params['parent'] instanceof HTMLForm ) {
+                       $this->mParent = $params['parent'];
+               }
+
                # Generate the label from a message, if possible
                if ( isset( $params['label-message'] ) ) {
                        $msgInfo = $params['label-message'];
@@ -354,7 +358,7 @@ abstract class HTMLFormField {
                                $msgInfo = array();
                        }
 
-                       $this->mLabel = wfMessage( $msg, $msgInfo )->parse();
+                       $this->mLabel = $this->msg( $msg, $msgInfo )->parse();
                } elseif ( isset( $params['label'] ) ) {
                        if ( $params['label'] === '&#160;' ) {
                                // Apparently some things set &nbsp directly and in an odd format
index 5dadaf8..d1b7746 100644 (file)
@@ -96,8 +96,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        } else {
                                $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--$fieldname" );
                        }
-                       $field = HTMLForm::loadInputFromParameters( $name, $info );
-                       $field->mParent = $this->mParent;
+                       $field = HTMLForm::loadInputFromParameters( $name, $info, $this->mParent );
                        $fields[$fieldname] = $field;
                }
                return $fields;
@@ -310,8 +309,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                                'id' => Sanitizer::escapeId( "{$this->mID}--$key--delete" ),
                                'cssclass' => 'mw-htmlform-cloner-delete-button',
                                'default' => $this->msg( $label )->text(),
-                       ) );
-                       $field->mParent = $this->mParent;
+                       ), $this->mParent );
                        $v = $field->getDefault();
 
                        if ( $displayFormat === 'table' ) {
@@ -383,8 +381,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        'id' => Sanitizer::escapeId( "{$this->mID}--create" ),
                        'cssclass' => 'mw-htmlform-cloner-create-button',
                        'default' => $this->msg( $label )->text(),
-               ) );
-               $field->mParent = $this->mParent;
+               ), $this->mParent );
                $html .= $field->getInputHTML( $field->getDefault() );
 
                return $html;
index ea1213c..b676f45 100644 (file)
@@ -612,7 +612,7 @@ abstract class DatabaseUpdater {
         * Append a line to the open filehandle.  The line is assumed to
         * be a complete SQL statement.
         *
-        * This is used as a callback for for sourceLine().
+        * This is used as a callback for sourceLine().
         *
         * @param string $line Text to append to the file
         * @return bool False to skip actually executing the file
index 28b14fa..668fbff 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "CERminator"
+                       "CERminator",
+                       "Palapa"
                ]
        },
        "config-desc": "Instalacija za MediaWiki",
@@ -9,6 +10,7 @@
        "config-information": "Informacija",
        "config-localsettings-upgrade": "Otkrivena je datoteka <code>LocalSettings.php</code>.\nDa biste unaprijedili vaš softver, molimo vas upišite vrijednost od <code>$wgUpgradeKey</code> u okvir ispod.\nNaći ćete ga u <code>LocalSettings.php</code>.",
        "config-localsettings-key": "Ključ za nadgradnju:",
+       "config-localsettings-badkey": "Ključ koji ste dali je pogrešan.",
        "config-session-error": "Greška pri pokretanju sesije: $1",
        "config-no-session": "Vaši podaci sesije su izgubljeni!\nProvjerite vaš php.ini i provjerite da li je <code>session.save_path</code> postavljen na pravilni direktorijum.",
        "config-your-language": "Vaš jezik:",
        "config-page-releasenotes": "Bilješke izdanja",
        "config-page-copying": "Kopiram",
        "config-page-upgradedoc": "Nadograđujem",
+       "config-page-existingwiki": "Postojeća wiki",
        "config-help-restart": "Da li želite očistiti sve spremljene podatke koje ste unijeli i da započnete ponovo proces instalacije?",
        "config-restart": "Da, pokreni ponovo",
        "config-sidebar": "* [//www.mediawiki.org MediaWiki Početna strana]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodič za korisnike]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodič za administratore]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ NPP]\n----\n* <doclink href=Readme>Pročitaj me</doclink>\n* <doclink href=ReleaseNotes>Napomene izdanja</doclink>\n* <doclink href=Copying>Kopiranje</doclink>\n* <doclink href=UpgradeDoc>Poboljšavanje</doclink>",
        "config-env-good": "Okruženje je provjereno.\nMožete instalirati MediaWiki.",
        "config-env-php": "PHP $1 je instaliran.",
-       "config-no-db": "Nije mogao biti pronađen pogodan driver za bazu podataka! Morate instalirati driver baze podataka za PHP.\nSlijedeće vrste baza podataka su podržane: $1.\n\nAko se na dijeljenom serveru, tražite od vašeg pružaoca usluga da instalira pogodan driver za bazu podataka.\nAko se sami kompajlirali PHP, podesite ga sa omogućenim klijentom baze podataka, koristeći naprimjer <code>./configure --with-mysql</code>.\nAko ste instalirali PHP iz Debian ili Ubuntu paketa, možda morate instalirati i modul php5-mysql.",
+       "config-env-hhvm": "HHVM $1 je instaliran.",
+       "config-no-db": "Nije mogao biti pronađen pogodan driver za bazu podataka! Morate instalirati driver baze podataka za PHP.\nSljedeće vrste baza podataka su podržane: $1.\n\nAko se sami kompajlirali PHP, podesite ga sa omogućenim klijentom baze podataka, koristeći naprimjer, <code>./configure --with-mysqli</code>.\nAko ste instalirali PHP iz Debian ili Ubuntu paketa, tada morate instalirati, naprimjer, i paket <code>php5-mysql</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] je instaliran",
        "config-apc": "[http://www.php.net/apc APC] je instaliran",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] je instaliran",
        "config-db-wiki-settings": "Identificiraj ovu wiki",
        "config-db-name": "Naziv baze podataka:",
        "config-db-name-oracle": "Šema baze podataka:",
+       "config-db-username": "Korisničko ime baze podataka:",
+       "config-db-password": "Pasvord baze podataka:",
+       "config-db-port": "Port baze podataka:",
        "config-header-mysql": "Postavke MySQL",
        "config-header-postgres": "Postavke PostgreSQL",
        "config-header-sqlite": "Postavke SQLite",
        "config-header-oracle": "Postavke Oracle",
+       "config-header-mssql": "Postavke za Microsoft SQL Server",
        "config-invalid-db-type": "Nevaljana vrsta baze podataka",
+       "config-missing-db-name": "Morate unijeti vrijednost za \"{{int:config-db-name}}\".",
        "config-upgrade-done": "Nadogradnja završena.\n\nSada možete [$1 početi koristiti vašu wiki].\n\nAko želite regenerisati vašu datoteku <code>LocalSettings.php</code>, kliknite na dugme ispod.\nOvo '''nije preporučeno''' osim ako nemate problema s vašom wiki.",
-       "config-admin-name": "Vaše ime:",
+       "config-mysql-innodb": "InnoDB",
+       "config-mysql-myisam": "MyISAM",
+       "config-mysql-binary": "Binarni",
+       "config-site-name": "Ime wiki:",
+       "config-ns-other-default": "MyWiki",
+       "config-admin-name": "Vaše korisničko ime:",
        "config-admin-password": "Šifra:",
+       "config-admin-password-confirm": "Ponovno unesite pasvord:",
+       "config-admin-email": "E-mail adresa:",
+       "config-profile-wiki": "Otvori wiki",
+       "config-profile-private": "Privatna wiki",
+       "config-license-pd": "Javno vlasništvo",
+       "config-logo": "Logo URL:",
+       "config-cc-again": "Odaberi ponovno...",
+       "config-install-step-done": "završeno",
+       "config-install-step-failed": "neuspješno",
+       "config-install-extensions": "Uključujući ekstenzije",
+       "config-install-tables": "Kreiranje tabela",
+       "config-help": "pomoć",
+       "config-help-tooltip": "klikni za proširenje",
        "mainpagetext": "'''MediaViki softver is uspješno instaliran.'''",
        "mainpagedocfooter": "Kontaktirajte [//meta.wikimedia.org/wiki/Help:Contents uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista postavki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]"
 }
index 843fe2f..2cc85ce 100644 (file)
@@ -42,7 +42,7 @@
        "config-ns-other": "Zewbi (keyfiyo)",
        "config-ns-other-default": "MyWiki",
        "config-admin-box": "Hesabê Administratori",
-       "config-admin-name": "Namey  karberdé to:",
+       "config-admin-name": "Nameyê şımayê karberi:",
        "config-admin-password": "Parola:",
        "config-admin-password-confirm": "Fına parola:",
        "config-admin-email": "Adresa e-postey:",
index ecba5dc..5fe2e81 100644 (file)
        "config-db-schema-help": "보통 이 스키마는 문제가 없습니다.\n필요한 경우에만 바꾸세요.",
        "config-pg-test-error": "'''$1''' 데이터베이스에 연결할 수 없습니다: $2",
        "config-sqlite-dir": "SQLite 데이터 디렉터리:",
-       "config-sqlite-dir-help": "SQLite는 하나의 파일에 모든 데이터를 저장합니다.\n\n입력한 디렉토리는 설치하는 동안 웹 서버가 쓸 수 있어야 합니다.\n\n이 디렉토리는 웹을 통해 접근할 수 '''없어야''' 하는데, PHP 파일이 있는 곳에 넣을 수 없는 것은 이 때문입니다.\n\n설치 프로그램은 <code>.htaccess</code> 파일을 작성하지만, 이것이 실패하면 누군가가 원본 데이터베이스에 접근할 수 있습니다.\n데이터베이스는 원본 사용자 데이터(이메일 주소, 해시한 비밀번호)뿐만 아니라 삭제된 판과 위키의 다른 제한된 데이터를 포함합니다.\n\n예를 들어 <code>/var/lib/mediawiki/yourwiki</code>와 같이 다른 곳에 데이터베이스를 넣는 것이 좋습니다.",
+       "config-sqlite-dir-help": "SQLite는 하나의 파일에 모든 데이터를 저장합니다.\n\n입력한 디렉토리는 설치하는 동안 웹 서버가 쓸 수 있어야 합니다.\n\n이 디렉토리는 웹을 통해 접근할 수 <strong>없어야</strong> 합니다. PHP 파일이 있는 곳에 넣을 수 없는 것은 이 때문입니다.\n\n설치 관리자는 <code>.htaccess</code> 파일을 작성하지만, 이것이 실패하면 누군가가 원본 데이터베이스에 접근할 수 있습니다.\n데이터베이스는 원본 사용자 데이터(이메일 주소, 해시한 비밀번호)뿐만 아니라 삭제된 판과 위키의 다른 제한된 데이터를 포함합니다.\n\n예를 들어 <code>/var/lib/mediawiki/yourwiki</code>와 같이 다른 곳에 데이터베이스를 넣는 것이 좋습니다.",
        "config-oracle-def-ts": "기본 테이블공간:",
        "config-oracle-temp-ts": "임시 테이블공간:",
        "config-type-mysql": "MySQL (또는 호환되는 데이터베이스 시스템)",
        "config-postgres-old": "PostgreSQL $1 이상이 필요하나 $2(이)가 있습니다.",
        "config-mssql-old": "Microsoft SQL 서버 $1 이상의 버전이 필요합니다. 현재 버전은 $2입니다.",
        "config-sqlite-name-help": "위키를 식별하기 위한 이름을 선택하세요.\n공백이나 하이픈을 사용하지 마십시오.\nSQLite 데이터 파일 이름에 사용됩니다.",
-       "config-sqlite-parent-unwritable-group": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버는 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 프로그램은 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버가 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-       "config-sqlite-parent-unwritable-nogroup": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버가 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 프로그램은 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버(와 그 외 서버!)가 전역으로 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-parent-unwritable-group": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버는 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 관리자는 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버가 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며, 이는 웹 서버가 상위 디렉토리인 <code><nowiki>$2</nowiki></code>에 쓸 수 없기 때문입니다.\n\n설치 관리자는 웹 서버로 실행 중인 사용자를 지정할 수 없습니다.\n계속하려면 웹 서버(와 그 외 서버!)가 전역으로 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.\n유닉스/리눅스 시스템에서의 수행:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-sqlite-mkdir-error": "\"$1\" 데이터 디렉터리를 만드는 도중 오류가 발생했습니다.\n경로를 확인하고 다시 시도하세요.",
        "config-sqlite-dir-unwritable": "\"$1\" 디렉토리에 쓸 수 없습니다.\n웹 서버를 쓸 수 있도록 권한을 바꾸고 다시 시도하세요.",
        "config-sqlite-connection-error": "$1.\n\n호스트, 계정 이름과 비밀번호를 확인하고 다시 시도하세요.",
        "config-install-mainpage": "기본 내용으로 대문을 만드는 중",
        "config-install-extension-tables": "활성화된 확장 기능을 위한 테이블을 만드는 중",
        "config-install-mainpage-failed": "대문을 삽입할 수 없습니다: $1",
-       "config-install-done": "'''축하합니다!'''\n미디어위키가 성공적으로 설치되었습니다.\n\n설치 프로그램이 <code>LocalSettings.php</code> 파일을 만들었습니다.\n모든 설정이 포함되어 있습니다.\n\n파일을 다운로드하여 위키 설치의 거점에 넣어야 합니다. (index.php와 같은 디렉터리) 다운로드가 자동으로 시작됩니다.\n\n다운로드가 제공되지 않을 경우나 그것을 취소한 경우에는 아래의 링크를 클릭하여 다운로드를 다시 시작할 수 있습니다:\n\n$3\n\n'''참고:''' 이 생성한 설정 파일을 다운로드하지 않고 설치를 끝내면 이 파일은 나중에 사용할 수 없습니다.\n\n완료되었으면 '''[$2 위키에 들어갈 수 있습니다]'''.",
+       "config-install-done": "<strong>축하합니다!</strong>\n미디어위키가 성공적으로 설치되었습니다.\n\n설치 관리자가 <code>LocalSettings.php</code> 파일을 만들었습니다.\n모든 설정이 포함되어 있습니다.\n\n파일을 다운로드하여 위키 설치의 거점에 넣어야 합니다. (index.php와 같은 디렉터리) 다운로드가 자동으로 시작됩니다.\n\n다운로드가 제공되지 않을 경우나 그것을 취소한 경우에는 아래의 링크를 클릭하여 다운로드를 다시 시작할 수 있습니다:\n\n$3\n\n<strong>참고:</strong> 이 생성한 설정 파일을 다운로드하지 않고 설치를 끝내면 이 파일은 나중에 사용할 수 없습니다.\n\n완료되었으면 <strong>[$2 위키에 들어갈 수 있습니다]</strong>.",
        "config-download-localsettings": "<code>LocalSettings.php</code> 다운로드",
        "config-help": "도움말",
        "config-help-tooltip": "확장하려면 클릭",
index 056e5a8..5e8399c 100644 (file)
@@ -221,7 +221,7 @@ class JobQueueDB extends JobQueue {
                }
 
                $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
-               $rowList = array(); // list of jobs for jobs that are are not de-duplicated
+               $rowList = array(); // list of jobs for jobs that are not de-duplicated
                foreach ( $jobs as $job ) {
                        $row = $this->insertFields( $job );
                        if ( $job->ignoreDuplicates() ) {
index 4d1e72c..b4ddd11 100644 (file)
@@ -26,9 +26,9 @@
  *
  * This job comes in a few variants:
  *   - a) Recursive jobs to purge caches for backlink pages for a given title.
- *        These jobs have have (recursive:true,table:<table>) set.
+ *        These jobs have (recursive:true,table:<table>) set.
  *   - b) Jobs to purge caches for a set of titles (the job title is ignored).
- *           These jobs have have (pages:(<page ID>:(<namespace>,<title>),...) set.
+ *           These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
  *
  * @ingroup JobQueue
  */
@@ -67,7 +67,7 @@ class HTMLCacheUpdateJob extends Job {
                                array( 'params' => $this->getRootJobParams() )
                        );
                        JobQueueGroup::singleton()->push( $jobs );
-               // Job to purge pages for for a set of titles
+               // Job to purge pages for a set of titles
                } elseif ( isset( $this->params['pages'] ) ) {
                        $this->invalidateTitles( $this->params['pages'] );
                // B/C for job to purge a range of backlink pages for a given page
index f82af27..5d95792 100644 (file)
@@ -26,9 +26,9 @@
  *
  * This job comes in a few variants:
  *   - a) Recursive jobs to update links for backlink pages for a given title.
- *        These jobs have have (recursive:true,table:<table>) set.
+ *        These jobs have (recursive:true,table:<table>) set.
  *   - b) Jobs to update links for a set of pages (the job title is ignored).
- *           These jobs have have (pages:(<page ID>:(<namespace>,<title>),...) set.
+ *           These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
  *   - c) Jobs to update links for a single page (the job title)
  *        These jobs need no extra fields set.
  *
@@ -86,7 +86,7 @@ class RefreshLinksJob extends Job {
                                array( 'params' => $extraParams )
                        );
                        JobQueueGroup::singleton()->push( $jobs );
-               // Job to update link tables for for a set of titles
+               // Job to update link tables for a set of titles
                } elseif ( isset( $this->params['pages'] ) ) {
                        foreach ( $this->params['pages'] as $pageId => $nsAndKey ) {
                                list( $ns, $dbKey ) = $nsAndKey;
@@ -157,7 +157,7 @@ class RefreshLinksJob extends Job {
                        $ellapsed = microtime( true ) - $start;
                        // If it took a long time to render, then save this back to the cache to avoid
                        // wasted CPU by other apaches or job runners. We don't want to always save to
-                       // cache as this cause cause high cache I/O and LRU churn when a template changes.
+                       // cache as this can cause high cache I/O and LRU churn when a template changes.
                        if ( $ellapsed >= self::PARSE_THRESHOLD_SEC
                                && $page->isParserCacheUsed( $parserOptions, $revision->getId() )
                                && $parserOutput->isCacheable()
index 8c982c4..8ed9ee4 100644 (file)
@@ -83,7 +83,7 @@ class MultiHttpClient {
         *   - reason  : HTTP response reason (empty if there was a serious cURL error)
         *   - headers : <header name/value associative array>
         *   - body    : HTTP response body or resource (if "stream" was set)
-        *   - err     : Any cURL error string
+        *   - error     : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
         *      <code>
         *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $http->run( $req );
@@ -107,7 +107,7 @@ class MultiHttpClient {
         *   - reason  : HTTP response reason (empty if there was a serious cURL error)
         *   - headers : <header name/value associative array>
         *   - body    : HTTP response body or resource (if "stream" was set)
-        *   - err     : Any cURL error string
+        *   - error   : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
         *      <code>
         *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req['response'];
index f09d101..8bd4656 100644 (file)
@@ -60,10 +60,10 @@ class RunningStat implements Countable {
        /** @var float The second central moment (or variance). **/
        public $m2 = 0.0;
 
-       /** @var float The least value in the the set. **/
+       /** @var float The least value in the set. **/
        public $min = INF;
 
-       /** @var float The most value in the set. **/
+       /** @var float The greatest value in the set. **/
        public $max = NEGATIVE_INF;
 
        /**
@@ -129,7 +129,7 @@ class RunningStat implements Countable {
         * Get the estimated standard deviation.
         *
         * The standard deviation of a statistical population is the square root of
-        * its variance. It shows shows how much variation from the mean exists. In
+        * its variance. It shows how much variation from the mean exists. In
         * addition to expressing the variability of a population, the standard
         * deviation is commonly used to measure confidence in statistical conclusions.
         *
index 629c269..1ec9eaa 100644 (file)
@@ -32,12 +32,12 @@ class ScopedCallback {
        protected $params;
 
        /**
-        * @param callable $callback
+        * @param callable|null $callback
         * @param array $params Callback arguments (since 1.25)
         * @throws Exception
         */
        public function __construct( $callback, array $params = array() ) {
-               if ( !is_callable( $callback ) ) {
+               if ( $callback !== null && !is_callable( $callback ) ) {
                        throw new InvalidArgumentException( "Provided callback is not valid." );
                }
                $this->callback = $callback;
diff --git a/includes/libs/UDPTransport.php b/includes/libs/UDPTransport.php
new file mode 100644 (file)
index 0000000..7fad882
--- /dev/null
@@ -0,0 +1,102 @@
+<?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
+ *
+ * @file
+ */
+
+/**
+ * A generic class to send a message over UDP
+ *
+ * If a message prefix is provided to the constructor or via
+ * UDPTransport::newFromString(), the payload of the UDP datagrams emitted
+ * will be formatted with the prefix and a single space at the start of each
+ * line. This is the payload format expected by the udp2log service.
+ *
+ * @since 1.25
+ */
+class UDPTransport {
+       private $host, $port, $prefix, $domain;
+
+       /**
+        * @param string $host IP address to send to
+        * @param int $port port number
+        * @param int $domain AF_INET or AF_INET6 constant
+        * @param string|bool $prefix Prefix to use, false for no prefix
+        */
+       public function __construct( $host, $port, $domain, $prefix = false ) {
+               $this->host = $host;
+               $this->port = $port;
+               $this->domain = $domain;
+               $this->prefix = $prefix;
+       }
+
+       /**
+        * @param string $info In the format of "udp://host:port/prefix"
+        * @return UDPTransport
+        * @throws InvalidArgumentException
+        */
+       public static function newFromString( $info ) {
+               if ( preg_match( '!^udp:(?://)?\[([0-9a-fA-F:]+)\]:(\d+)(?:/(.*))?$!', $info, $m ) ) {
+                       // IPv6 bracketed host
+                       $host = $m[1];
+                       $port = intval( $m[2] );
+                       $prefix = isset( $m[3] ) ? $m[3] : false;
+                       $domain = AF_INET6;
+               } elseif ( preg_match( '!^udp:(?://)?([a-zA-Z0-9.-]+):(\d+)(?:/(.*))?$!', $info, $m ) ) {
+                       $host = $m[1];
+                       if ( !IP::isIPv4( $host ) ) {
+                               $host = gethostbyname( $host );
+                       }
+                       $port = intval( $m[2] );
+                       $prefix = isset( $m[3] ) ? $m[3] : false;
+                       $domain = AF_INET;
+               } else {
+                       throw new InvalidArgumentException( __METHOD__ . ': Invalid UDP specification' );
+               }
+
+               return new self( $host, $port, $domain, $prefix );
+       }
+
+       /**
+        * @param string $text
+        */
+       public function emit( $text ) {
+               // Clean it up for the multiplexer
+               if ( $this->prefix !== false ) {
+                       $text = preg_replace( '/^/m', $this->prefix . ' ', $text );
+
+                       // Limit to 64KB
+                       if ( strlen( $text ) > 65506 ) {
+                               $text = substr( $text, 0, 65506 );
+                       }
+
+                       if ( substr( $text, -1 ) != "\n" ) {
+                               $text .= "\n";
+                       }
+               } elseif ( strlen( $text ) > 65507 ) {
+                       $text = substr( $text, 0, 65507 );
+               }
+
+               $sock = socket_create( $this->domain, SOCK_DGRAM, SOL_UDP );
+               if ( !$sock ) { // @todo should this throw an exception?
+                       return;
+               }
+
+               socket_sendto( $sock, $text, strlen( $text ), 0, $this->host, $this->port );
+               socket_close( $sock );
+       }
+}
index 2d21d3c..6f416f1 100644 (file)
@@ -125,17 +125,17 @@ class VirtualRESTServiceClient {
         *   - reason  : HTTP response reason (empty if there was a serious cURL error)
         *   - headers : <header name/value associative array>
         *   - body    : HTTP response body or resource (if "stream" was set)
-        *   - err     : Any cURL error string
+        *   - error   : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
         *      <code>
         *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $client->run( $req );
         *  </code>
-        * @param array $req Virtual HTTP request array
+        * @param array $req Virtual HTTP request maps
         * @return array Response array for request
         */
        public function run( array $req ) {
-               $req = $this->runMulti( array( $req ) );
-               return $req[0]['response'];
+               $responses = $this->runMulti( array( $req ) );
+               return $responses[0];
        }
 
        /**
@@ -146,13 +146,13 @@ class VirtualRESTServiceClient {
         *   - reason  : HTTP response reason (empty if there was a serious cURL error)
         *   - headers : <header name/value associative array>
         *   - body    : HTTP response body or resource (if "stream" was set)
-        *   - err     : Any cURL error string
+        *   - error   : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
         *      <code>
         *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $responses[0];
         *  </code>
         *
-        * @param array $req Map of Virtual HTTP request arrays
+        * @param array $reqs Map of Virtual HTTP request maps
         * @return array $reqs Map of corresponding response values with the same keys/order
         */
        public function runMulti( array $reqs ) {
index 2a1091d..2037c33 100644 (file)
@@ -138,7 +138,7 @@ class SVGReader {
                $keepReading = $this->reader->read();
 
                /* Skip until first element */
-               while ( $keepReading && $this->reader->nodeType != XmlReader::ELEMENT ) {
+               while ( $keepReading && $this->reader->nodeType != XMLReader::ELEMENT ) {
                        $keepReading = $this->reader->read();
                }
 
@@ -158,7 +158,7 @@ class SVGReader {
 
                        $this->debug( "$tag" );
 
-                       if ( $isSVG && $tag == 'svg' && $type == XmlReader::END_ELEMENT
+                       if ( $isSVG && $tag == 'svg' && $type == XMLReader::END_ELEMENT
                                && $this->reader->depth <= $exitDepth
                        ) {
                                break;
@@ -166,7 +166,7 @@ class SVGReader {
                                $this->readField( $tag, 'title' );
                        } elseif ( $isSVG && $tag == 'desc' ) {
                                $this->readField( $tag, 'description' );
-                       } elseif ( $isSVG && $tag == 'metadata' && $type == XmlReader::ELEMENT ) {
+                       } elseif ( $isSVG && $tag == 'metadata' && $type == XMLReader::ELEMENT ) {
                                $this->readXml( $tag, 'metadata' );
                        } elseif ( $isSVG && $tag == 'script' ) {
                                // We normally do not allow scripted svgs.
@@ -199,17 +199,17 @@ class SVGReader {
         */
        private function readField( $name, $metafield = null ) {
                $this->debug( "Read field $metafield" );
-               if ( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+               if ( !$metafield || $this->reader->nodeType != XMLReader::ELEMENT ) {
                        return;
                }
                $keepReading = $this->reader->read();
                while ( $keepReading ) {
                        if ( $this->reader->localName == $name
                                && $this->reader->namespaceURI == self::NS_SVG
-                               && $this->reader->nodeType == XmlReader::END_ELEMENT
+                               && $this->reader->nodeType == XMLReader::END_ELEMENT
                        ) {
                                break;
-                       } elseif ( $this->reader->nodeType == XmlReader::TEXT ) {
+                       } elseif ( $this->reader->nodeType == XMLReader::TEXT ) {
                                $this->metadata[$metafield] = trim( $this->reader->value );
                        }
                        $keepReading = $this->reader->read();
@@ -224,7 +224,7 @@ class SVGReader {
         */
        private function readXml( $metafield = null ) {
                $this->debug( "Read top level metadata" );
-               if ( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+               if ( !$metafield || $this->reader->nodeType != XMLReader::ELEMENT ) {
                        return;
                }
                // @todo Find and store type of xml snippet. metadata['metadataType'] = "rdf"
@@ -246,7 +246,7 @@ class SVGReader {
         */
        private function animateFilterAndLang( $name ) {
                $this->debug( "animate filter for tag $name" );
-               if ( $this->reader->nodeType != XmlReader::ELEMENT ) {
+               if ( $this->reader->nodeType != XMLReader::ELEMENT ) {
                        return;
                }
                if ( $this->reader->isEmptyElement ) {
@@ -256,11 +256,11 @@ class SVGReader {
                $keepReading = $this->reader->read();
                while ( $keepReading ) {
                        if ( $this->reader->localName == $name && $this->reader->depth <= $exitDepth
-                               && $this->reader->nodeType == XmlReader::END_ELEMENT
+                               && $this->reader->nodeType == XMLReader::END_ELEMENT
                        ) {
                                break;
                        } elseif ( $this->reader->namespaceURI == self::NS_SVG
-                               && $this->reader->nodeType == XmlReader::ELEMENT
+                               && $this->reader->nodeType == XMLReader::ELEMENT
                        ) {
 
                                $sysLang = $this->reader->getAttribute( 'systemLanguage' );
index 0f718d2..fa70c63 100644 (file)
@@ -29,7 +29,7 @@ have been changed or you remove it.
 == Testing ==
 
 'make test' will run the conformance test (UtfNormalTest.php), fetching the
-data from from the net if necessary. If it reports failure, something is
+data from the net if necessary. If it reports failure, something is
 going wrong!
 
 You may have to set up PHPUnit first.
index 0318f65..a4996df 100644 (file)
@@ -1559,7 +1559,8 @@ class Article implements Page {
                # This code desperately needs to be totally rewritten
 
                $title = $this->getTitle();
-               $user = $this->getContext()->getUser();
+               $context = $this->getContext();
+               $user = $context->getUser();
 
                # Check permissions
                $permissionErrors = $title->getUserPermissionsErrors( 'delete', $user );
@@ -1576,8 +1577,8 @@ class Article implements Page {
                $this->mPage->loadPageData( 'fromdbmaster' );
                if ( !$this->mPage->exists() ) {
                        $deleteLogPage = new LogPage( 'delete' );
-                       $outputPage = $this->getContext()->getOutput();
-                       $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
+                       $outputPage = $context->getOutput();
+                       $outputPage->setPageTitle( $context->msg( 'cannotdelete-title', $title->getPrefixedText() ) );
                        $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
                                        array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
                                );
@@ -1593,7 +1594,7 @@ class Article implements Page {
                        return;
                }
 
-               $request = $this->getContext()->getRequest();
+               $request = $context->getRequest();
                $deleteReasonList = $request->getText( 'wpDeleteReasonList', 'other' );
                $deleteReason = $request->getText( 'wpReason' );
 
@@ -1651,11 +1652,11 @@ class Article implements Page {
                        );
 
                        // @todo FIXME: i18n issue/patchwork message
-                       $this->getContext()->getOutput()->addHTML(
+                       $context->getOutput()->addHTML(
                                '<strong class="mw-delete-warning-revisions">' .
-                               wfMessage( 'historywarning' )->numParams( $revisions )->parse() .
-                               wfMessage( 'word-separator' )->plain() . Linker::linkKnown( $title,
-                                       wfMessage( 'history' )->escaped(),
+                               $context->msg( 'historywarning' )->numParams( $revisions )->parse() .
+                               $context->msg( 'word-separator' )->escaped() . Linker::linkKnown( $title,
+                                       $context->msg( 'history' )->escaped(),
                                        array( 'rel' => 'archives' ),
                                        array( 'action' => 'history' ) ) .
                                '</strong>'
@@ -1663,10 +1664,10 @@ class Article implements Page {
 
                        if ( $title->isBigDeletion() ) {
                                global $wgDeleteRevisionsLimit;
-                               $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
+                               $context->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
                                        array(
                                                'delete-warning-toobig',
-                                               $this->getContext()->getLanguage()->formatNum( $wgDeleteRevisionsLimit )
+                                               $context->getLanguage()->formatNum( $wgDeleteRevisionsLimit )
                                        )
                                );
                        }
index b9f99c8..b4409c3 100644 (file)
@@ -175,7 +175,7 @@ class ImagePage extends Article {
 
                # Show shared description, if needed
                if ( $this->mExtraDescription ) {
-                       $fol = wfMessage( 'shareddescriptionfollows' );
+                       $fol = $this->getContext()->msg( 'shareddescriptionfollows' );
                        if ( !$fol->isDisabled() ) {
                                $out->addWikiText( $fol->plain() );
                        }
@@ -188,7 +188,7 @@ class ImagePage extends Article {
 
                $out->addHTML( Xml::element( 'h2',
                        array( 'id' => 'filelinks' ),
-                       wfMessage( 'imagelinks' )->text() ) . "\n" );
+                               $this->getContext()->msg( 'imagelinks' )->text() ) . "\n" );
                $this->imageDupes();
                # @todo FIXME: For some freaky reason, we can't redirect to foreign images.
                # Yet we return metadata about the target. Definitely an issue in the FileRepo
@@ -205,7 +205,7 @@ class ImagePage extends Article {
                        $out->addHTML( Xml::element(
                                'h2',
                                array( 'id' => 'metadata' ),
-                               wfMessage( 'metadata' )->text() ) . "\n" );
+                                       $this->getContext()->msg( 'metadata' )->text() ) . "\n" );
                        $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
                        $out->addModules( array( 'mediawiki.action.view.metadata' ) );
                }
@@ -237,12 +237,12 @@ class ImagePage extends Article {
         */
        protected function showTOC( $metadata ) {
                $r = array(
-                       '<li><a href="#file">' . wfMessage( 'file-anchor-link' )->escaped() . '</a></li>',
-                       '<li><a href="#filehistory">' . wfMessage( 'filehist' )->escaped() . '</a></li>',
-                       '<li><a href="#filelinks">' . wfMessage( 'imagelinks' )->escaped() . '</a></li>',
+                       '<li><a href="#file">' . $this->getContext()->msg( 'file-anchor-link' )->escaped() . '</a></li>',
+                       '<li><a href="#filehistory">' . $this->getContext()->msg( 'filehist' )->escaped() . '</a></li>',
+                       '<li><a href="#filelinks">' . $this->getContext()->msg( 'imagelinks' )->escaped() . '</a></li>',
                );
                if ( $metadata ) {
-                       $r[] = '<li><a href="#metadata">' . wfMessage( 'metadata' )->escaped() . '</a></li>';
+                       $r[] = '<li><a href="#metadata">' . $this->getContext()->msg( 'metadata' )->escaped() . '</a></li>';
                }
 
                Hooks::run( 'ImagePageShowTOC', array( $this, &$r ) );
@@ -260,7 +260,7 @@ class ImagePage extends Article {
         */
        protected function makeMetadataTable( $metadata ) {
                $r = "<div class=\"mw-imagepage-section-metadata\">";
-               $r .= wfMessage( 'metadata-help' )->plain();
+               $r .= $this->getContext()->msg( 'metadata-help' )->plain();
                $r .= "<table id=\"mw_metadata\" class=\"mw_metadata\">\n";
                foreach ( $metadata as $type => $stuff ) {
                        foreach ( $stuff as $v ) {
@@ -341,14 +341,14 @@ class ImagePage extends Article {
                        if ( $this->displayImg->allowInlineDisplay() ) {
                                # image
                                # "Download high res version" link below the image
-                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig,
+                               # $msgsize = $this->getContext()->msg( 'file-info-size', $width_orig, $height_orig,
                                #   Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
                                # We'll show a thumbnail of this image
                                if ( $width > $maxWidth || $height > $maxHeight || $this->displayImg->isVectorized() ) {
                                        list( $width, $height ) = $this->getDisplayWidthHeight(
                                                $maxWidth, $maxHeight, $width, $height
                                        );
-                                       $linktext = wfMessage( 'show-big-image' )->escaped();
+                                       $linktext = $this->getContext()->msg( 'show-big-image' )->escaped();
 
                                        $thumbSizes = $this->getThumbSizes( $width, $height, $width_orig, $height_orig );
                                        # Generate thumbnails or thumbnail links as needed...
@@ -377,14 +377,14 @@ class ImagePage extends Article {
                                        $msgsmall = '';
                                        $sizeLinkBigImagePreview = $this->makeSizeLink( $params, $width, $height );
                                        if ( $sizeLinkBigImagePreview ) {
-                                               $msgsmall .= wfMessage( 'show-big-image-preview' )->
+                                               $msgsmall .= $this->getContext()->msg( 'show-big-image-preview' )->
                                                        rawParams( $sizeLinkBigImagePreview )->
                                                        parse();
                                        }
                                        if ( count( $otherSizes ) ) {
                                                $msgsmall .= ' ' .
                                                Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
-                                                       wfMessage( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
+                                                       $this->getContext()->msg( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
                                                        params( count( $otherSizes ) )->parse()
                                                );
                                        }
@@ -394,7 +394,7 @@ class ImagePage extends Article {
                                        $msgsmall = '';
                                } else {
                                        # Image is small enough to show full size on image page
-                                       $msgsmall = wfMessage( 'file-nohires' )->parse();
+                                       $msgsmall = $this->getContext()->msg( 'file-nohires' )->parse();
                                }
 
                                $params['width'] = $width;
@@ -428,7 +428,7 @@ class ImagePage extends Article {
                                        $count = $this->displayImg->pageCount();
 
                                        if ( $page > 1 ) {
-                                               $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
+                                               $label = $out->parse( $this->getContext()->msg( 'imgmultipageprev' )->text(), false );
                                                // on the client side, this link is generated in ajaxifyPageNavigation()
                                                // in the mediawiki.page.image.pagination module
                                                $link = Linker::linkKnown(
@@ -450,7 +450,7 @@ class ImagePage extends Article {
                                        }
 
                                        if ( $page < $count ) {
-                                               $label = wfMessage( 'imgmultipagenext' )->text();
+                                               $label = $this->getContext()->msg( 'imgmultipagenext' )->text();
                                                $link = Linker::linkKnown(
                                                        $this->getTitle(),
                                                        $label,
@@ -487,8 +487,8 @@ class ImagePage extends Article {
                                                '</td><td><div class="multipageimagenavbox">' .
                                                Xml::openElement( 'form', $formParams ) .
                                                Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-                                                       wfMessage( 'imgmultigoto' )->rawParams( $select )->parse() .
-                                               Xml::submitButton( wfMessage( 'imgmultigo' )->text() ) .
+                                               $this->getContext()->msg( 'imgmultigoto' )->rawParams( $select )->parse() .
+                                               Xml::submitButton( $this->getContext()->msg( 'imgmultigo' )->text() ) .
                                                Xml::closeElement( 'form' ) .
                                                "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
                                        );
@@ -502,12 +502,12 @@ class ImagePage extends Article {
                                        "</div>\n" );
                        }
 
-                       $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
+                       $longDesc = $this->getContext()->msg( 'parentheses', $this->displayImg->getLongDesc() )->text();
 
                        $medialink = "[[Media:$filename|$linktext]]";
 
                        if ( !$this->displayImg->isSafeFile() ) {
-                               $warning = wfMessage( 'mediawarning' )->plain();
+                               $warning = $this->getContext()->msg( 'mediawarning' )->plain();
                                // dirmark is needed here to separate the file name, which
                                // most likely ends in Latin characters, from the description,
                                // which may begin with the file type. In RTL environment
@@ -619,7 +619,7 @@ EOT
                        return Html::rawElement( 'a', array(
                                'href' => $thumbnail->getUrl(),
                                'class' => 'mw-thumbnail-link'
-                               ), wfMessage( 'show-big-image-size' )->numParams(
+                               ), $this->getContext()->msg( 'show-big-image-size' )->numParams(
                                        $thumbnail->getWidth(), $thumbnail->getHeight()
                                )->parse() );
                } else {
@@ -645,9 +645,9 @@ EOT
                $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
                $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
 
-               if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-' ) {
+               if ( $descUrl && $descText && $this->getContext()->msg( 'sharedupload-desc-here' )->plain() !== '-' ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
-               } elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
+               } elseif ( $descUrl && $this->getContext()->msg( 'sharedupload-desc-there' )->plain() !== '-' ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
                } else {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
@@ -694,7 +694,7 @@ EOT
                ) {
                        $ulink = Linker::makeExternalLink(
                                $this->getUploadUrl(),
-                               wfMessage( 'uploadnewversion-linktext' )->text()
+                               $this->getContext()->msg( 'uploadnewversion-linktext' )->text()
                        );
                        $out->addHTML( "<li id=\"mw-imagepage-reupload-link\">"
                                . "<div class=\"plainlinks\">{$ulink}</div></li>\n" );
@@ -832,7 +832,7 @@ EOT
                                $liContents = $link;
                        } elseif ( count( $redirects[$element->page_title] ) === 0 ) {
                                # Redirect without usages
-                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
+                               $liContents = $this->getContext()->msg( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
                        } else {
                                # Redirect with usages
                                $li = '';
@@ -855,7 +855,7 @@ EOT
                                        array( 'class' => 'mw-imagepage-redirectstofile' ),
                                        $li
                                        ) . "\n";
-                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
+                               $liContents = $this->getContext()->msg( 'linkstoimage-redirect' )->rawParams(
                                        $link, $ul )->parse();
                        }
                        $out->addHTML( Html::rawElement(
@@ -901,7 +901,7 @@ EOT
                        } else {
                                $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
                                        $file->getTitle()->getPrefixedText() );
-                               $fromSrc = wfMessage( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
+                               $fromSrc = $this->getContext()->msg( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
                        }
                        $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
                }
@@ -930,7 +930,7 @@ EOT
         */
        function showError( $description ) {
                $out = $this->getContext()->getOutput();
-               $out->setPageTitle( wfMessage( 'internalerror' ) );
+               $out->setPageTitle( $this->getContext()->msg( 'internalerror' ) );
                $out->setRobotPolicy( 'noindex,nofollow' );
                $out->setArticleRelated( false );
                $out->enableClientCache( false );
@@ -1008,7 +1008,7 @@ EOT
                        $code = wfBCP47( $lang );
                        $name = Language::fetchLanguageName( $code, $this->getContext()->getLanguage()->getCode() );
                        if ( $name !== '' ) {
-                               $display = wfMessage( 'img-lang-opt', $code, $name )->text();
+                               $display = $this->getContext()->msg( 'img-lang-opt', $code, $name )->text();
                        } else {
                                $display = $code;
                        }
@@ -1024,7 +1024,7 @@ EOT
                        // Its hard to know if the content is really in the default language, or
                        // if its just unmarked content that could be in any language.
                        $opts = Xml::option(
-                               wfMessage( 'img-lang-default' )->text(),
+                                       $this->getContext()->msg( 'img-lang-default' )->text(),
                                $defaultLang,
                                $defaultLang === $curLang
                        ) . $opts;
@@ -1032,7 +1032,7 @@ EOT
                if ( !$haveCurrentLang && $defaultLang !== $curLang ) {
                        $name = Language::fetchLanguageName( $curLang, $this->getContext()->getLanguage()->getCode() );
                        if ( $name !== '' ) {
-                               $display = wfMessage( 'img-lang-opt', $curLang, $name )->text();
+                               $display = $this->getContext()->msg( 'img-lang-opt', $curLang, $name )->text();
                        } else {
                                $display = $curLang;
                        }
@@ -1044,9 +1044,9 @@ EOT
                        array( 'id' => 'mw-imglangselector', 'name' => 'lang' ),
                        $opts
                );
-               $submit = Xml::submitButton( wfMessage( 'img-lang-go' )->text() );
+               $submit = Xml::submitButton( $this->getContext()->msg( 'img-lang-go' )->text() );
 
-               $formContents = wfMessage( 'img-lang-info' )->rawParams( $select, $submit )->parse()
+               $formContents = $this->getContext()->msg( 'img-lang-info' )->rawParams( $select, $submit )->parse()
                        . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
 
                $langSelectLine = Html::rawElement( 'div', array( 'id' => 'mw-imglangselector-line' ),
index b9f7eda..2825064 100644 (file)
@@ -50,7 +50,7 @@ class WikiPage implements Page, IDBAccessObject {
        public $mLatest = false;             // !< Integer (false means "not loaded")
        /**@}}*/
 
-       /** @var stdclass Map of cache fields (text, parser output, ect) for a proposed/new edit */
+       /** @var stdClass Map of cache fields (text, parser output, ect) for a proposed/new edit */
        public $mPreparedEdit = false;
 
        /**
@@ -395,7 +395,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string|int $from One of the following:
         *        - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
         *        - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
-        *        - "forupdate"  or WikiPage::READ_LOCKING if the data comes from from
+        *        - "forupdate"  or WikiPage::READ_LOCKING if the data comes from
         *          the master DB using SELECT FOR UPDATE
         */
        public function loadFromRow( $data, $from ) {
@@ -975,7 +975,7 @@ class WikiPage implements Page, IDBAccessObject {
                                $source = $this->mTitle->getFullURL( 'redirect=no' );
                                return $rt->getFullURL( array( 'rdfrom' => $source ) );
                        } else {
-                               // External pages pages without "local" bit set are not valid
+                               // External pages without "local" bit set are not valid
                                // redirect targets
                                return false;
                        }
@@ -2050,7 +2050,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Prepare text which is about to be saved.
-        * Returns a stdclass with source, pst and output members
+        * Returns a stdClass with source, pst and output members
         *
         * @deprecated since 1.21: use prepareContentForEdit instead.
         * @return object
@@ -2063,7 +2063,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Prepare content which is about to be saved.
-        * Returns a stdclass with source, pst and output members
+        * Returns a stdClass with source, pst and output members
         *
         * @param Content $content
         * @param int|null $revid
index 6f19a23..a95bbfe 100644 (file)
@@ -111,7 +111,7 @@ class CoreParserFunctions {
 
                $pref = $parser->getOptions()->getDateFormat();
 
-               // Specify a different default date format other than the the normal default
+               // Specify a different default date format other than the normal default
                // if the user has 'default' for their setting
                if ( $pref == 'default' && $defaultPref ) {
                        $pref = $defaultPref;
@@ -953,13 +953,6 @@ class CoreParserFunctions {
                        $inner = null;
                }
 
-               $stripList = $parser->getStripList();
-               if ( !in_array( $tagName, $stripList ) ) {
-                       return '<span class="error">' .
-                               wfMessage( 'unknown_extension_tag', $tagName )->inContentLanguage()->text() .
-                               '</span>';
-               }
-
                $attributes = array();
                foreach ( $args as $arg ) {
                        $bits = $arg->splitArg();
@@ -973,6 +966,19 @@ class CoreParserFunctions {
                        }
                }
 
+               $stripList = $parser->getStripList();
+               if ( !in_array( $tagName, $stripList ) ) {
+                       // we can't handle this tag (at least not now), so just re-emit it as an ordinary tag
+                       $attrText = '';
+                       foreach ( $attributes as $name => $value ) {
+                               $attrText .= ' ' . htmlspecialchars( $name ) . '="' . htmlspecialchars( $value ) . '"';
+                       }
+                       if ( $inner === null ) {
+                               return "<$tagName$attrText/>";
+                       }
+                       return "<$tagName$attrText>$inner</$tagName>";
+               }
+
                $params = array(
                        'name' => $tagName,
                        'inner' => $inner,
index 7b53776..ed4db38 100644 (file)
@@ -131,12 +131,12 @@ class MWTidy {
                $wrappedtext = $wrapper->getWrapped( $text );
 
                $retVal = null;
-               list( $correctedtext, $errors ) = self::clean( $wrappedtext, $retVal );
+               $correctedtext = self::clean( $wrappedtext, false, $retVal );
 
                if ( $retVal < 0 ) {
                        wfDebug( "Possible tidy configuration error!\n" );
                        return $text . "\n<!-- Tidy was unable to run -->\n";
-               } elseif ( $correctedtext === '' && $text !== '' ) {
+               } elseif ( is_null( $correctedtext ) ) {
                        wfDebug( "Tidy error detected!\n" );
                        return $text . "\n<!-- Tidy found serious XHTML errors -->\n";
                }
@@ -155,23 +155,31 @@ class MWTidy {
         */
        public static function checkErrors( $text, &$errorStr = null ) {
                $retval = 0;
-               list( $outputStr, $errorStr ) = self::clean( $text, $retval );
+               $errorStr = self::clean( $text, true, $retval );
                return ( $retval < 0 && $errorStr == '' ) || $retval == 0;
        }
 
        /**
         * Perform a clean/repair operation
         * @param string $text HTML to check
+        * @param bool $stderr Whether to read result from STDERR rather than STDOUT
         * @param int &$retval Exit code (-1 on internal error)
         * @return string|null
         */
-       private static function clean( $text, &$retval = null ) {
+       private static function clean( $text, $stderr = false, &$retval = null ) {
                global $wgTidyInternal;
 
                if ( $wgTidyInternal ) {
-                       return self::internalClean( $text, $retval );
+                       if ( wfIsHHVM() ) {
+                               if ( $stderr ) {
+                                       throw new MWException( __METHOD__ . ": error text return from HHVM tidy is not supported" );
+                               }
+                               return self::hhvmClean( $text, $retval );
+                       } else {
+                               return self::phpClean( $text, $stderr, $retval );
+                       }
                } else {
-                       return self::externalClean( $text, $retval );
+                       return self::externalClean( $text, $stderr, $retval );
                }
        }
 
@@ -180,23 +188,32 @@ class MWTidy {
         * Also called in OutputHandler.php for full page validation
         *
         * @param string $text HTML to check
+        * @param bool $stderr Whether to read result from STDERR rather than STDOUT
         * @param int &$retval Exit code (-1 on internal error)
         * @return string|null
         */
-       private static function externalClean( $text, &$retval = null ) {
+       private static function externalClean( $text, $stderr = false, &$retval = null ) {
                global $wgTidyConf, $wgTidyBin, $wgTidyOpts;
                wfProfileIn( __METHOD__ );
 
+               $cleansource = '';
                $opts = ' -utf8';
 
-               $descriptorspec = array(
-                       0 => array( 'pipe', 'r' ),
-                       1 => array( 'pipe', 'w' ),
-                       2 => array( 'pipe', 'w' ),
-               );
+               if ( $stderr ) {
+                       $descriptorspec = array(
+                               0 => array( 'pipe', 'r' ),
+                               1 => array( 'file', wfGetNull(), 'a' ),
+                               2 => array( 'pipe', 'w' )
+                       );
+               } else {
+                       $descriptorspec = array(
+                               0 => array( 'pipe', 'r' ),
+                               1 => array( 'pipe', 'w' ),
+                               2 => array( 'file', wfGetNull(), 'a' )
+                       );
+               }
 
-               $outputBuffer = '';
-               $errorBuffer = '';
+               $readpipe = $stderr ? 2 : 1;
                $pipes = array();
 
                $process = proc_open(
@@ -213,25 +230,24 @@ class MWTidy {
                        // for tidyParseStdin and tidySaveStdout in console/tidy.c
                        fwrite( $pipes[0], $text );
                        fclose( $pipes[0] );
-
-                       while ( !feof( $pipes[1] ) ) {
-                               $outputBuffer .= fgets( $pipes[1], 1024 );
+                       while ( !feof( $pipes[$readpipe] ) ) {
+                               $cleansource .= fgets( $pipes[$readpipe], 1024 );
                        }
-                       fclose( $pipes[1] );
-
-                       while ( !feof( $pipes[2] ) ) {
-                               $errorBuffer .= fgets( $pipes[2], 1024 );
-                       }
-                       fclose( $pipes[2] );
-
+                       fclose( $pipes[$readpipe] );
                        $retval = proc_close( $process );
                } else {
                        wfWarn( "Unable to start external tidy process" );
                        $retval = -1;
                }
 
+               if ( !$stderr && $cleansource == '' && $text != '' ) {
+                       // Some kind of error happened, so we couldn't get the corrected text.
+                       // Just give up; we'll use the source text and append a warning.
+                       $cleansource = null;
+               }
+
                wfProfileOut( __METHOD__ );
-               return array( $outputBuffer, $errorBuffer );
+               return $cleansource;
        }
 
        /**
@@ -239,10 +255,11 @@ class MWTidy {
         * saving the overhead of spawning a new process.
         *
         * @param string $text HTML to check
+        * @param bool $stderr Whether to read result from error status instead of output
         * @param int &$retval Exit code (-1 on internal error)
         * @return string|null
         */
-       private static function internalClean( $text, &$retval = null ) {
+       private static function phpClean( $text, $stderr = false, &$retval = null ) {
                global $wgTidyConf, $wgDebugTidy;
                wfProfileIn( __METHOD__ );
 
@@ -256,36 +273,57 @@ class MWTidy {
                        return null;
                }
 
-               $outputBuffer = '';
-               $errorBuffer = '';
-
-               if ( wfIsHHVM() ) {
-                       // Use the tidy extension for HHVM from
-                       // https://github.com/wikimedia/mediawiki-php-tidy
-                       //
-                       // This currently does not support the object-oriented interface, but
-                       // tidy_repair_string() can be used for the most common tasks.
-                       $result = tidy_repair_string( $text, $wgTidyConf, 'utf8' );
-                       $outputBuffer .= $result;
-                       $retval = $result === false ? -1 : 0;
-               } else {
-                       $tidy = new tidy;
-                       $tidy->parseString( $text, $wgTidyConf, 'utf8' );
-                       $tidy->cleanRepair();
+               $tidy = new tidy;
+               $tidy->parseString( $text, $wgTidyConf, 'utf8' );
+
+               if ( $stderr ) {
                        $retval = $tidy->getStatus();
-                       $outputBuffer .= tidy_get_output( $tidy );
-                       if ( $retval > 0 ) {
-                               $errorBuffer .= $tidy->errorBuffer;
-                       }
+
+                       wfProfileOut( __METHOD__ );
+                       return $tidy->errorBuffer;
                }
 
-               if ( $wgDebugTidy && $errorBuffer && $retval > 0 ) {
-                       $outputBuffer .= "<!--\nTidy reports:\n" .
-                               str_replace( '-->', '--&gt;', $tidy->errorBuffer ) .
-                               "\n-->";
+               $tidy->cleanRepair();
+               $retval = $tidy->getStatus();
+               if ( $retval == 2 ) {
+                       // 2 is magic number for fatal error
+                       // http://www.php.net/manual/en/function.tidy-get-status.php
+                       $cleansource = null;
+               } else {
+                       $cleansource = tidy_get_output( $tidy );
+                       if ( $wgDebugTidy && $retval > 0 ) {
+                               $cleansource .= "<!--\nTidy reports:\n" .
+                                       str_replace( '-->', '--&gt;', $tidy->errorBuffer ) .
+                                       "\n-->";
+                       }
                }
 
                wfProfileOut( __METHOD__ );
-               return array( $outputBuffer, $errorBuffer );
+               return $cleansource;
+       }
+
+       /**
+        * Use the tidy extension for HHVM from
+        * https://github.com/wikimedia/mediawiki-php-tidy
+        *
+        * This currently does not support the object-oriented interface, but
+        * tidy_repair_string() can be used for the most common tasks.
+        *
+        * @param string $text HTML to check
+        * @param int &$retval Exit code (-1 on internal error)
+        * @return string|null
+        */
+       private static function hhvmClean( $text, &$retval ) {
+               global $wgTidyConf;
+               wfProfileIn( __METHOD__ );
+               $cleansource = tidy_repair_string( $text, $wgTidyConf, 'utf8' );
+               if ( $cleansource === false ) {
+                       $cleansource = null;
+                       $retval = -1;
+               } else {
+                       $retval = 0;
+               }
+               wfProfileOut( __METHOD__ );
+               return $cleansource;
        }
 }
index 5c8253a..ecb14ed 100644 (file)
@@ -1484,7 +1484,20 @@ class Parser {
                        $sep .= ')';
                }
 
-               $numSepChars = strspn( strrev( $url ), $sep );
+               $urlRev = strrev( $url );
+               $numSepChars = strspn( $urlRev, $sep );
+               # Don't break a trailing HTML entity by moving the ; into $trail
+               # This is in hot code, so use substr_compare to avoid having to
+               # create a new string object for the comparison
+               if ( $numSepChars && substr_compare( $url, ";", -$numSepChars, 1 ) === 0) {
+                       # more optimization: instead of running preg_match with a $
+                       # anchor, which can be slow, do the match on the reversed
+                       # string starting at the desired offset.
+                       # un-reversed regexp is: /&([a-z]+|#x[\da-f]+|#\d+)$/i
+                       if ( preg_match( '/\G([a-z]+|[\da-f]+x#|\d+#)&/i', $urlRev, $m2, 0, $numSepChars ) ) {
+                               $numSepChars--;
+                       }
+               }
                if ( $numSepChars ) {
                        $trail = substr( $url, -$numSepChars ) . $trail;
                        $url = substr( $url, 0, -$numSepChars );
@@ -4862,6 +4875,7 @@ class Parser {
 
                $pairs = array(
                        "\r\n" => "\n",
+                       "\r" => "\n",
                );
                $text = str_replace( array_keys( $pairs ), array_values( $pairs ), $text );
                if ( $options->getPreSaveTransform() ) {
index 428e7b2..1a2be5f 100644 (file)
@@ -861,7 +861,7 @@ class ParserOutput extends CacheTime {
        }
 
        /**
-        * Save space for for serialization by removing useless values
+        * Save space for serialization by removing useless values
         * @return array
         */
        public function __sleep() {
index 9a7ec8c..1d77cc0 100644 (file)
@@ -34,9 +34,7 @@ class ProfilerStub extends Profiler {
        }
 
        public function scopedProfileIn( $section ) {
-               return new ScopedCallback( function () {
-                       // no-op
-               } );
+               return new ScopedCallback( null ); // no-op
        }
 
        public function getFunctionStats() {
index a40c44a..624433b 100644 (file)
@@ -139,8 +139,13 @@ class ProfilerXhprof extends Profiler {
 
                // Merge in all of the custom profile sections
                foreach ( $this->sprofiler->getFunctionStats() as $stats ) {
+                       if ( $stats['name'] === '-total' ) {
+                               // Discard section profiler running totals
+                               continue;
+                       }
+
                        // @note: getFunctionStats() values already in ms
-                       $stats['%real'] = $stats['real'] / $main['real'];
+                       $stats['%real'] = $main['real'] ? $stats['real'] / $main['real'] * 100 : 0;
                        $stats['%cpu'] = $main['cpu'] ? $stats['cpu'] / $main['cpu'] * 100 : 0;
                        $stats['%memory'] = $main['memory'] ? $stats['memory'] / $main['memory'] * 100 : 0;
                        $profile[] = $stats; // assume no section names collide with $metrics
index 2c36b68..d5da928 100644 (file)
@@ -67,8 +67,7 @@ class SectionProfiler {
        public function scopedProfileIn( $section ) {
                $this->profileInInternal( $section );
 
-               $that = $this;
-               return new ScopedCallback( $this->profileOutCallback, array( $that, $section ) );
+               return new SectionProfileCallback( $this, $section );
        }
 
        /**
@@ -502,3 +501,29 @@ class SectionProfiler {
                }
        }
 }
+
+/**
+ * Subclass ScopedCallback to avoid call_user_func_array(), which is slow
+ *
+ * This class should not be used outside of SectionProfiler
+ */
+class SectionProfileCallback extends ScopedCallback {
+       /** @var SectionProfiler */
+       protected $profiler;
+       /** @var string */
+       protected $section;
+
+       /**
+        * @param SectionProfiler $profiler
+        * @param string $section
+        */
+       public function __construct( SectionProfiler $profiler, $section ) {
+               parent::__construct( null );
+               $this->profiler = $profiler;
+               $this->section = $section;
+       }
+
+       function __destruct() {
+               $this->profiler->profileOutInternal( $this->section );
+       }
+}
index 8554670..9afae66 100644 (file)
@@ -29,6 +29,7 @@ class UDPRCFeedEngine implements RCFeedEngine {
         * @see RCFeedEngine::send
         */
        public function send( array $feed, $line ) {
-               wfErrorLog( $line, $feed['uri'] );
+               $transport = UDPTransport::newFromString( $feed['uri'] );
+               $transport->emit( $line );
        }
 }
index 09d90d6..1239453 100644 (file)
@@ -52,10 +52,14 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
         * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
-               return Xml::encodeJsCall( 'mw.language.setData', array(
-                       $context->getLanguage(),
-                       $this->getData( $context )
-               ) );
+               return Xml::encodeJsCall(
+                       'mw.language.setData',
+                       array(
+                               $context->getLanguage(),
+                               $this->getData( $context )
+                       ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        /**
index fe0c845..55b1f4b 100644 (file)
@@ -49,11 +49,15 @@ class ResourceLoaderLanguageNamesModule extends ResourceLoaderModule {
         * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
-               return Xml::encodeJsCall( 'mw.language.setData', array(
-                       $context->getLanguage(),
-                       'languageNames',
-                       $this->getData( $context )
-               ) );
+               return Xml::encodeJsCall(
+                       'mw.language.setData',
+                       array(
+                               $context->getLanguage(),
+                               'languageNames',
+                               $this->getData( $context )
+                       ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        public function getDependencies() {
index a0764de..3818305 100644 (file)
@@ -293,7 +293,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        }
 
        /**
-        * Base modules required for the the base environment of ResourceLoader
+        * Base modules required for the base environment of ResourceLoader
         *
         * @return array
         */
@@ -356,7 +356,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        );
                        $mwConfigSetJsCall = Xml::encodeJsCall(
                                'mw.config.set',
-                               array( $configuration )
+                               array( $configuration ),
+                               ResourceLoader::inDebugMode()
                        );
 
                        $out .= "var startUp = function () {\n" .
@@ -370,7 +371,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        $scriptTag = Html::linkedScript( self::getStartupModulesUrl( $context ) );
                        $out .= "if ( isCompatible() ) {\n" .
                                "\t" . Xml::encodeJsCall( 'document.write', array( $scriptTag ) ) .
-                               "}";
+                               "\n}";
                }
 
                return $out;
@@ -409,8 +410,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // ATTENTION!: Because of the line below, this is not going to cause
                // infinite recursion - think carefully before making changes to this
                // code!
-               // Pre-populate modifiedTime with something because the the loop over
-               // all modules below includes the the startup module (this module).
+               // Pre-populate modifiedTime with something because the loop over
+               // all modules below includes the startup module (this module).
                $this->modifiedTime[$hash] = 1;
 
                foreach ( $loader->getModuleNames() as $name ) {
index d78fa9d..5f4bc16 100644 (file)
@@ -53,6 +53,10 @@ class ResourceLoaderUserDefaultsModule extends ResourceLoaderModule {
         * @return string
         */
        public function getScript( ResourceLoaderContext $context ) {
-               return Xml::encodeJsCall( 'mw.user.options.set', array( User::getDefaultOptions() ) );
+               return Xml::encodeJsCall(
+                       'mw.user.options.set',
+                       array( User::getDefaultOptions() ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 }
index d4f8167..b9f2024 100644 (file)
@@ -115,7 +115,7 @@ class RevisionDeleter {
         * "revdelete-restricted", "revdelete-unrestricted" indicating (un)suppression
         * or null to indicate nothing in particular.
         * You can turn the keys in $arr[0] and $arr[1] into message keys by
-        * appending -hid and and -unhid to the keys respectively.
+        * appending -hid and -unhid to the keys respectively.
         *
         * @param int $n The new bitfield.
         * @param int $o The old bitfield.
index f2a95a8..e48a187 100644 (file)
@@ -1,5 +1,4 @@
 <?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
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
- * @since 1.25
- *
  * @file
  *
  * @license GNU GPL v2+
  */
+
+/**
+ * Provides a file-based cache of a SiteStore, stored as a json file.
+ * The cache can be built with the rebuildSitesCache.php maintenance script,
+ * and a MediaWiki instance can be setup to use this by setting the
+ * 'wgSitesCacheFile' configuration to the cache file location.
+ *
+ * @since 1.25
+ */
 class SiteListFileCache {
 
        /**
@@ -55,7 +61,11 @@ class SiteListFileCache {
        }
 
        /**
+        * @param string $globalId
+        *
         * @since 1.25
+        *
+        * @return Site|null
         */
        public function getSite( $globalId ) {
                $sites = $this->getSites();
index dd21af4..1ff7e3f 100644 (file)
@@ -81,7 +81,7 @@ abstract class QueryPage extends SpecialPage {
                                array( 'MostimagesPage', 'Mostimages' ),
                                array( 'MostinterwikisPage', 'Mostinterwikis' ),
                                array( 'MostlinkedCategoriesPage', 'Mostlinkedcategories' ),
-                               array( 'MostlinkedtemplatesPage', 'Mostlinkedtemplates' ),
+                               array( 'MostlinkedTemplatesPage', 'Mostlinkedtemplates' ),
                                array( 'MostlinkedPage', 'Mostlinked' ),
                                array( 'MostrevisionsPage', 'Mostrevisions' ),
                                array( 'FewestrevisionsPage', 'Fewestrevisions' ),
@@ -96,7 +96,7 @@ abstract class QueryPage extends SpecialPage {
                                array( 'WantedFilesPage', 'Wantedfiles' ),
                                array( 'WantedPagesPage', 'Wantedpages' ),
                                array( 'WantedTemplatesPage', 'Wantedtemplates' ),
-                               array( 'UnwatchedPagesPage', 'Unwatchedpages' ),
+                               array( 'UnwatchedpagesPage', 'Unwatchedpages' ),
                                array( 'UnusedtemplatesPage', 'Unusedtemplates' ),
                                array( 'WithoutInterwikiPage', 'Withoutinterwiki' ),
                        );
index 14d97eb..1d4a860 100644 (file)
@@ -105,7 +105,7 @@ class SpecialBlock extends FormSpecialPage {
 
                # Don't need to do anything if the form has been posted
                if ( !$this->getRequest()->wasPosted() && $this->preErrors ) {
-                       $s = HTMLForm::formatErrors( $this->preErrors );
+                       $s = $form->formatErrors( $this->preErrors );
                        if ( $s ) {
                                $form->addHeaderText( Html::rawElement(
                                        'div',
@@ -829,7 +829,7 @@ class SpecialBlock extends FormSpecialPage {
                        }
 
                        list( $show, $value ) = explode( ':', $option );
-                       $a[htmlspecialchars( $show )] = htmlspecialchars( $value );
+                       $a[$show] = $value;
                }
 
                return $a;
index da2df2d..c6ebaed 100644 (file)
@@ -47,7 +47,6 @@ class SpecialImport extends SpecialPage {
         */
        public function __construct() {
                parent::__construct( 'Import', 'import' );
-               $this->namespace = $this->getConfig()->get( 'ImportTargetNamespace' );
        }
 
        /**
@@ -58,6 +57,8 @@ class SpecialImport extends SpecialPage {
                $this->setHeaders();
                $this->outputHeader();
 
+               $this->namespace = $this->getConfig()->get( 'ImportTargetNamespace' );
+
                $this->getOutput()->addModules( 'mediawiki.special.import' );
 
                $user = $this->getUser();
index a61a673..65ddb31 100644 (file)
@@ -135,14 +135,13 @@ class SpecialJavaScriptTest extends SpecialPage {
         */
        private function initQUnitTesting() {
                $out = $this->getOutput();
-               $testConfig = $this->getConfig()->get( 'JavaScriptTestConfig' );
 
                $out->addModules( 'test.mediawiki.qunit.testrunner' );
                $qunitTestModules = $out->getResourceLoader()->getTestModuleNames( 'qunit' );
                $out->addModules( $qunitTestModules );
 
                $summary = $this->msg( 'javascripttest-qunit-intro' )
-                       ->params( $testConfig['qunit']['documentation'] )
+                       ->params( 'https://www.mediawiki.org/wiki/Manual:JavaScript_unit_testing' )
                        ->parseAsBlock();
                $header = $this->msg( 'javascripttest-qunit-heading' )->escaped();
                $userDir = $this->getLanguage()->getDir();
@@ -160,16 +159,9 @@ HTML;
                $out->addHtml( $this->wrapSummaryHtml( $summary, 'frameworkfound' ) . $baseHtml );
 
                // This special page is disabled by default ($wgEnableJavaScriptTest), and contains
-               // no sensitive data. In order to allow TestSwarm to embed it into a test client window,
+               // no sensitive data. In order to allow test frameworks to embed it into a test client window,
                // we need to allow iframing of this page.
                $out->allowClickjacking();
-
-               // Used in ./tests/qunit/data/testrunner.js, see also documentation of
-               // $wgJavaScriptTestConfig in DefaultSettings.php
-               $out->addJsConfigVars(
-                       'QUnitTestSwarmInjectJSPath',
-                       $testConfig['qunit']['testswarm-injectjs']
-               );
        }
 
        /**
index 98d8da3..3666964 100644 (file)
@@ -25,7 +25,7 @@
  */
 
 /**
- * A special page page that list most used images
+ * A special page that lists most used images
  *
  * @ingroup SpecialPage
  */
index c77c786..a7dea88 100644 (file)
@@ -330,9 +330,9 @@ class SpecialSearch extends SpecialPage {
                        Xml::openElement( 'div', array( 'id' => 'mw-search-top-table' ) ) .
                        $this->shortDialog( $term, $num, $totalRes ) .
                        Xml::closeElement( 'div' ) .
+                       $this->searchProfileTabs( $term ) .
                        Xml::closeElement( 'form' ) .
-                       $this->didYouMeanHtml .
-                       $this->searchProfileTabs( $term )
+                       $this->didYouMeanHtml
                );
 
                $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
index 4e65e11..6149a23 100644 (file)
@@ -50,13 +50,24 @@ class AutoloadGenerator {
                if ( !is_array( $flags ) ) {
                        $flags = array( $flags );
                }
-               $this->basepath = realpath( $basepath );
+               $this->basepath = self::platformAgnosticRealpath( $basepath );
                $this->collector = new ClassCollector;
                if ( in_array( 'local', $flags ) ) {
                        $this->variableName = 'wgAutoloadLocalClasses';
                }
        }
 
+       /**
+        * Wrapper for realpath() that returns the same results (using forward
+        * slashes) on both Windows and *nix.
+        *
+        * @param string $path Parameter to realpath()
+        * @return string
+        */
+       protected static function platformAgnosticRealpath( $path ) {
+               return str_replace( '\\', '/', realpath( $path ) );
+       }
+
        /**
         * Force a class to be autoloaded from a specific path, regardless of where
         * or if it was detected.
@@ -65,7 +76,7 @@ class AutoloadGenerator {
         * @param string $inputPath Full path to the file containing the class
         */
        public function forceClassPath( $fqcn, $inputPath ) {
-               $path = realpath( $inputPath );
+               $path = self::platformAgnosticRealpath( $inputPath );
                if ( !$path ) {
                        throw new \Exception( "Invalid path: $inputPath" );
                }
@@ -78,9 +89,10 @@ class AutoloadGenerator {
        }
 
        /**
-        * @var string $inputPath Path to a php file to find classes within
+        * @param string $inputPath Path to a php file to find classes within
         */
        public function readFile( $inputPath ) {
+               $inputPath = self::platformAgnosticRealpath( $inputPath );
                $len = strlen( $this->basepath );
                if ( substr( $inputPath, 0, $len ) !== $this->basepath ) {
                        throw new \Exception( "Path is not within basepath: $inputPath" );
@@ -99,7 +111,8 @@ class AutoloadGenerator {
         *  for php files with either .php or .inc extensions
         */
        public function readDir( $dir ) {
-               $it = new RecursiveDirectoryIterator( realpath( $dir ) );
+               $it = new RecursiveDirectoryIterator(
+                       self::platformAgnosticRealpath( $dir ) );
                $it = new RecursiveIteratorIterator( $it );
 
                foreach ( $it as $path => $file ) {
index 7a907fc..aa7b33d 100644 (file)
@@ -47,7 +47,8 @@
                        "Kuwaity26",
                        "Calak",
                        "Omda4wady",
-                       "Bibas"
+                       "Bibas",
+                       "Khaled"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "history-feed-empty": "الصفحة المطلوبة غير موجودة.\nمن المحتمل أن تكون هذه الصفحة قد حذفت من الويكي، أو نقلت.\nحاول [[Special:Search|البحث في الويكي]] عن صفحات جديدة ذات صلة.",
        "rev-deleted-comment": "(أزيل ملخص التعديل)",
        "rev-deleted-user": "(اسم المستخدم تمت إزالته)",
-       "rev-deleted-event": "(Ù\81عÙ\84 Ø§Ù\84سجÙ\84 ØªÙ\85ت Ø¥Ø²Ø§Ù\84تÙ\87)",
+       "rev-deleted-event": "(Ù\85Ø­Ù\8aت ØªÙ\81اصÙ\8aÙ\84 Ø§Ù\84سجÙ\84)",
        "rev-deleted-user-contribs": "[اسم المستخدم أو عنوان الأيبي تمت إزالته - التعديل مخفي من المساهمات]",
        "rev-deleted-text-permission": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "rev-suppressed-text-permission": "هذه النسخة قد <strong>أخفيت</strong> ([{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} تفاصيل].)",
        "revdelete-legend": "وضع ضوابط رؤية",
        "revdelete-hide-text": "نص المراجعة",
        "revdelete-hide-image": "أخف محتوى الملف",
-       "revdelete-hide-name": "أخÙ\81 Ø§Ù\84Ù\81عÙ\84 Ù\88اÙ\84Ù\87دÙ\81",
+       "revdelete-hide-name": "أخÙ\81 Ø§Ù\84Ù\87دÙ\81 Ù\88اÙ\84Ù\85عÙ\8aار",
        "revdelete-hide-comment": "ملخص التعديل",
        "revdelete-hide-user": "اسم المستخدم/عنوان الآيبي",
        "revdelete-hide-restricted": "أخف البيانات عن الإداريين إضافة إلى الآخرين",
        "right-browsearchive": "البحث في الصفحات المحذوفة",
        "right-undelete": "استرجاع صفحة",
        "right-suppressrevision": "مراجعة واسترجاع المراجعات المخفية عن مديري النظام",
+       "right-viewsuppressed": "أعرض المراجعات المخفية بواسطة أي مستخدم",
        "right-suppressionlog": "رؤية السجلات السرية",
        "right-block": "منع المستخدمين الآخرين من التعديل",
        "right-blockemail": "منع مستخدم من إرسال بريد إلكتروني",
        "right-protect": "تغيير مستويات الحماية وتعديل الصفحات المحمية",
        "right-editprotected": "تعديل الصفحات التي حمايتها \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "تعديل الصفحات التي حمايتها \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "عدل طريقة محتوى صفحة",
        "right-editinterface": "تعديل واجهة المستخدم",
        "right-editusercssjs": "تعديل ملفات CSS و JS للمستخدمين الآخرين",
        "right-editusercss": "تعديل ملفات CSS للمستخدمين الآخرين",
        "action-viewmywatchlist": "مشاهدة قائمة مراقبتك",
        "action-viewmyprivateinfo": "مشاهدة معلوماتك الخاصة",
        "action-editmyprivateinfo": "تعديل معلوماتك الخاصة",
+       "action-editcontentmodel": "عدل عدل طريقة محتوى صفحة",
        "nchanges": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|منذ الزيارة الأخيرة}}",
        "enhancedrc-history": "تاريخ",
        "thumbnail-temp-create": "تعذر إنشاء ملف الصورة المصغرة المؤقت",
        "thumbnail-dest-create": "تعذر حفظ الصورة المصغرة للوجهة",
        "thumbnail_invalid_params": "محددات التصغير غير صحيحة",
+       "thumbnail_toobigimagearea": "ملف أبعداه أكبر من $1",
        "thumbnail_dest_directory": "غير قادر على إنشاء المجلد الهدف",
        "thumbnail_image-type": "نوع الصورة غير مدعوم",
        "thumbnail_gd-library": "ضبط مكتبة GD غير مكتمل: دالة مفقودة $1",
        "tooltip-pt-mycontris": "قائمة مساهماتك",
        "tooltip-pt-login": "يفضل أن تسجل الدخول، لكنه ليس إلزاميا.",
        "tooltip-pt-logout": "تسجيل الخروج",
+       "tooltip-pt-createaccount": "نشجعك على عمل حساب وتسجيل دخولك; لكنه غير ضروري على اي حال",
        "tooltip-ca-talk": "نقاش عن صفحة المحتوى",
        "tooltip-ca-edit": "يمكنك تعديل هذه الصفحة.\nمن فضلك استخدم زر العرض المسبق قبل الحفظ.",
        "tooltip-ca-addsection": "ابدأ قسما جديدا",
        "hebrew-calendar-m12-gen": "أيلول",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|نقاش]])",
        "timezone-utc": "ت ع م",
-       "unknown_extension_tag": "وسم امتداد غير معروف \"$1\"",
        "duplicate-defaultsort": "'''تحذير:''' مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
+       "duplicate-displaytitle": "<strong>تحذير:</strong> أعرض عنوان \"$2\" تجاهل العنوان المعروض سابقا \"$1\".",
        "version": "نسخة",
        "version-extensions": "الامتدادات المثبتة",
        "version-skins": "الواجهات المنصبة",
        "api-error-stashfailed": "خطأ داخلي: فشل الملقم في تخزين الملفات المؤقتة.",
        "api-error-publishfailed": "خطأ داخلي: لم ينجح الخادوم في نشر ملف مؤقت",
        "api-error-stasherror": "حدث خطأ أثناء رفع الملف لتخزينه.",
+       "api-error-stashnotloggedin": "يجب عليك تسجيل الدخول لحفظ الملفات في مرفوعاتك.",
+       "api-error-stashwrongowner": "الملف الذي كنت تحاول الوصول اليه في مخبوائتك ليس لك.",
+       "api-error-stashnosuchfilekey": "الملف الذي كنت تحاول الوصول اليه في مخبوائتك غير موجود.",
        "api-error-timeout": "لم يستجب الملقم في الوقت المتوقع.",
        "api-error-unclassified": "حدث خطأ غير معروف",
        "api-error-unknown-code": "خطأ غير معروف : \" $1 \"",
        "right-pagelang": "تغيير لغة الصفحة",
        "action-pagelang": "تغيير لغة الصفحة",
        "log-name-pagelang": "تغيير سجل الصفحة",
+       "log-description-pagelang": "هذا سجل تغيرات في صفحة اللغات.",
        "logentry-pagelang-pagelang": " {{GENDER:$2|غيّر|غيّرت}} $1 لغة الصفحة «$3» من $4 إلى $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (مفعل)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''معطل''')",
        "mediastatistics-table-totalbytes": "الحجم المدمج",
        "mediastatistics-header-unknown": "غير معروف",
        "mediastatistics-header-bitmap": "صور Bitmap",
+       "mediastatistics-header-drawing": "رسم (صور متجهية)",
        "mediastatistics-header-audio": "صوت",
        "mediastatistics-header-video": "مقاطع الفيديو",
        "mediastatistics-header-multimedia": "ريتش ميديا",
        "mediastatistics-header-text": "نصي",
        "mediastatistics-header-executable": "تنفيذية",
        "mediastatistics-header-archive": "صيغ مضغوطة",
-       "json-error-syntax": "خطأ صياغة"
+       "json-error-syntax": "خطأ صياغة",
+       "json-error-unsupported-type": "نمط قيمة لا يمكن تشفيره قد أعطي"
 }
index 1b350c0..60f170d 100644 (file)
        "anoneditwarning": "<strong>Папярэджаньне</strong>: вы не ўвайшлі ў сыстэму. Ваш IP-адрас будзе бачны ўсім, калі вы адрэдагуеце старонку. Калі вы <strong>[$1 ўвойдзеце]</strong> або <strong>[$2 створыце рахунак]</strong>, вашыя рэдагаваньні будуць зьвязаныя з вашым імем карыстальніка, а таксама вам будуць даступныя дадатковыя перавагі.",
        "anonpreviewwarning": "''Вы не ўвайшлі ў сыстэму. Падчас захаваньня Ваш IP-адрас будзе дададзены ў гісторыю рэдагаваньняў старонкі.''",
        "missingsummary": "'''Напамін:''' Вы не пазначылі кароткае апісаньне зьменаў.\nКалі Вы націсьніце кнопку «Запісаць» яшчэ раз, Вашае рэдагаваньне будзе запісанае без апісаньня.",
-       "selfredirect": "<strong>Папярэджаньне:</strong> вы ствараеце перанакіраваньне на гэты самы артыкул.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, перанакіраваньне будзе створанае.",
+       "selfredirect": "<strong>Папярэджаньне:</strong> вы перанакіроўваеце старонку саму на сябе.\nМагчыма, вы пазначылі няслушную старонку для перанакіраваньня або вы рэдагуеце ня тую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, перанакіраваньне будзе створанае.",
        "missingcommenttext": "Калі ласка, увядзіце камэнтар ніжэй.",
        "missingcommentheader": "'''Напамін:''' Вы не пазначылі загаловак камэнтара.\nКалі Вы націсьніце кнопку «{{int:savearticle}}» яшчэ раз, Ваш камэнтар захаваецца бяз тэмы.",
        "summary-preview": "Папярэдні прагляд апісаньня:",
        "content-model-text": "просты тэкст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Пусты аб’ект",
+       "content-json-empty-array": "Пусты масіў",
        "duplicate-args-category": "Старонкі, на якіх у шаблёнах выкарыстоўваюцца парамэтры-дублікаты",
        "duplicate-args-category-desc": "Старонкі, якія ўтрымліваюць шаблёны з парамэтрамі-дублікатамі, напрыклад, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Папярэджаньне: гэтая старонка ўтрымлівае зашмат працаёмістых зваротаў да функцыяў парсэра.\n\nПавінна быць ня болей за $2 {{PLURAL:$2|зварот|звароты|зваротаў}}, а цяпер ўтрымліваецца {{PLURAL:$1|$1 зварот|$1 звароты|$1 зваротаў}}.",
        "history-feed-empty": "Запатрабаванай старонкі не існуе.\nМагчыма, яна была выдаленая альбо яе перанесьлі.\nПаспрабуйце [[Special:Search|пашукаць]] падобныя старонкі.",
        "rev-deleted-comment": "(апісаньне зьменаў выдаленае)",
        "rev-deleted-user": "(імя ўдзельніка выдаленае)",
-       "rev-deleted-event": "(запÑ\96Ñ\81 Ð· Ð¶Ñ\83Ñ\80нала Ð¿Ð°Ð´Ð·ÐµÑ\8fÑ\9e Ð²Ñ\8bдаленÑ\8b)",
+       "rev-deleted-event": "(падÑ\80абÑ\8fзнаÑ\81Ñ\8cÑ\86Ñ\96 Ð²Ñ\8bдаленÑ\8bÑ\8f Ð· Ð¶Ñ\83Ñ\80нала Ð¿Ð°Ð´Ð·ÐµÑ\8fÑ\9e)",
        "rev-deleted-user-contribs": "[імя ўдзельніка альбо IP-адрас выдалены — рэдагаваньне схаванае з унёску]",
        "rev-deleted-text-permission": "Гэтая вэрсія старонкі была '''выдаленая'''.\nМагчыма, падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
        "rev-suppressed-text-permission": "Гэтая вэрсія старонкі была <strong>схаваная</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
        "revdelete-legend": "Усталяваць абмежаваньні бачнасьці",
        "revdelete-hide-text": "Тэкст вэрсіі",
        "revdelete-hide-image": "Схаваць зьмест файла",
-       "revdelete-hide-name": "СÑ\85аваÑ\86Ñ\8c Ð´Ð·ÐµÑ\8fнÑ\8cне Ñ\96 Ð¼Ñ\8dÑ\82Ñ\83",
+       "revdelete-hide-name": "СÑ\85аваÑ\86Ñ\8c Ð¼Ñ\8dÑ\82Ñ\83 Ñ\96 Ð¿Ð°Ñ\80амÑ\8dÑ\82Ñ\80Ñ\8b",
        "revdelete-hide-comment": "Апісаньне зьменаў",
        "revdelete-hide-user": "Імя ўдзельніка/IP-адрас",
        "revdelete-hide-restricted": "Ужываць гэтыя абмежаваньні таксама і для адміністратараў",
        "thumbnail-temp-create": "Немагчыма стварыць часовы файл мініятуры",
        "thumbnail-dest-create": "Немагчыма захаваць мініятуру ў месцы прызначэньня",
        "thumbnail_invalid_params": "Няслушныя парамэтры мініятуры",
+       "thumbnail_toobigimagearea": "Файл з памерамі большымі, чым $1",
        "thumbnail_dest_directory": "Немагчыма стварыць мэтавую дырэкторыю",
        "thumbnail_image-type": "Тып выявы не падтрымліваецца",
        "thumbnail_gd-library": "Няпоўная канфігурацыя бібліятэкі GD: няма функцыі $1",
        "watchlisttools-raw": "Рэдагаваць як тэкст",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|гутаркі]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Невядомы тэг пашырэньня «$1»",
        "duplicate-defaultsort": "Папярэджаньне: Ключ сартыроўкі па змоўчваньні «$2» замяняе папярэдні ключ сартыроўкі па змоўчваньні «$1».",
        "duplicate-displaytitle": "<strong>Папярэджаньне:</strong> назва для адлюстраваньня «$2» перапісвае ранейшую назву для адлюстраваньня «$1».",
        "invalid-indicator-name": "<strong>Памылка:</strong> атрыбут <code>name</code> індыкатараў статусу старонкі ня мусіць быць пустым.",
index 2ef4cd7..e9011cf 100644 (file)
        "content-model-text": "সাধারণ লেখা",
        "content-model-javascript": "জাভাস্ক্রিপ্ট",
        "content-model-css": "সিএসএস",
+       "content-json-empty-object": "খালি অবজেক্ট",
+       "content-json-empty-array": "খালি অ্যারে",
        "duplicate-args-category": "টেমপ্লেট আহ্বানে সদৃশ আর্গুমেন্ট ব্যবহার করা পাতা",
        "duplicate-args-category-desc": "এই পাতায় টেমপ্লেট আহ্বান উপস্থিত রয়েছে যা সদৃশ আর্গুমেন্ট ব্যবহার করেছে, যেমন <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> বা <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>।",
        "expensive-parserfunction-warning": "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।\n\nএটি $2-এর চেয়ে কম পরিমাণ {{PLURAL:$2|কল|কল}} থাকা উচিত, যেখানে মোট কলের সংখ্যা {{PLURAL:$1|বর্তমানে $1|বর্তমানে $1}}।",
        "history-feed-empty": "অনুরোধকৃত পাতাটির কোন অস্তিত্ব নেই।\nহয়ত পাতাটি উইকি থেকে মুছে ফেলা হয়েছে, কিংবা নতুন নামকরণ করা হয়েছে।\nপ্রাসঙ্গিক নতুন পাতাগুলির জন্য [[Special:Search|উইকি অনুসন্ধানের]] চেষ্টা করুন।",
        "rev-deleted-comment": "(সম্পাদনা সারাংশ অপসারিত)",
        "rev-deleted-user": "(ব্যবহারকারীর নাম সরিয়ে নেওয়া হয়েছে)",
-       "rev-deleted-event": "(লà¦\97 à¦\85à§\8dযাà¦\95শন সরানো হয়েছে)",
+       "rev-deleted-event": "(লà¦\97 à¦¤à¦¥à§\8dয সরানো হয়েছে)",
        "rev-deleted-user-contribs": "ব্যবহারকারীর নাম অথবা আইপি ঠিকানা অপসারিত হয়েছে - অবদান থেকে সম্পাদনা আড়াল করা হয়েছে",
        "rev-deleted-text-permission": "পাতার এই সংস্করণটি '''অপসারিত''' হয়েছে।\nবিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।",
        "rev-suppressed-text-permission": "পাতার সংশোধনটি <strong>গোপন</strong> করা হয়েছে।\nবিস্তারিত বিবরণ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} গোপনকার্যের লগে] থাকতে পারে।",
        "hebrew-calendar-m12": "এলুল",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|আলাপ]])",
        "timezone-utc": "ইউটিসি",
-       "unknown_extension_tag": "অজানা এক্সটেনশন ট্যাগ \"$1\"",
        "duplicate-defaultsort": "' ' ' সাবধান: ' ' '  ডিফল্ট সাজানোর কীঃ \"$2\" পূর্বে ডিফল্ট সাজানোর কীঃ \"$1\" কে অগ্রাহ্য করে।",
        "version": "সংস্করণ",
        "version-extensions": "ইন্সটলকৃত এক্সটেনশনসমূহ",
index 7f11733..f329f9b 100644 (file)
        "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
        "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
        "directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
+       "directoryreadonlyerror": "Direktorij \"$1\" je samo za čitanje.",
        "directorynotreadableerror": "Direktorij \"$1\" nije čitljiv.",
        "filenotfound": "Ne može se naći datoteka \"$1\".",
        "unexpected": "Neočekivana vrijednost: \"$1\"=\"$2\".",
        "viewsourcetext": "Možete vidjeti i kopirati izvorni tekst ove stranice:",
        "viewyourtext": "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
        "protectedinterface": "Ova stranica sadrži tekst korisničkog okruženja za softver na ovom wikiju i zaštićena je radi sprečavanja zloupotrebe.\nDa biste dodali ili izmjenili prijevode svih wikija, posjetite [//translatewiki.net/  translatewiki.net], projekat za lokalizaciju Mediawikija.",
-       "editinginterface": "'''Upozorenje:''' Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda svih wikija, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
+       "editinginterface": "<strong>Upozorenje:</strong> Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda za sve wikije, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
+       "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
        "cascadeprotected": "Uređivanje ove stranice je zabranjeno jer sadrži {{PLURAL:$1|stranicu zaštićenu|stranice zaštićene}} od uređivanja iz razloga:\n$2",
        "namespaceprotected": "Vi nemate dozvulu da mijenjate stranicu '''$1'''.",
        "customcssprotected": "Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "badretype": "Šifre koje ste unijeli se ne poklapaju.",
        "userexists": "Korisničko ime koje ste unijeli je već u upotrebi.\nMolimo Vas da izaberete drugo ime.",
        "loginerror": "Greška pri prijavljivanju",
+       "createacct-error": "Došlo je do greške pri otvaranju naloga",
        "createaccounterror": "Ne može se napraviti račun: $1",
        "nocookiesnew": "Korisnički nalog je napravljen, ali niste prijavljeni. {{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.  Vi ste onemogućili kolačiće na Vašem računaru. Molimo Vas da ih omogućite, a onda se prijavite sa svojim novim korisničkim imenom i šifrom.",
        "nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.  Vi ste onemogućili kolačiće na Vašem kompjuteru.  Molimo Vas da ih omogućite i da pokušate ponovo sa prijavom.",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez navedene e-mail adrese.",
        "user-mail-no-body": "Pokušano slanje e-poruke s praznim ili nerazumno kratkim sadržajem.",
        "changepassword": "Promijeni lozinku",
-       "resetpass_announce": "Prijavili ste se sa privremenim kodom koji ste dobili na e-mail.\nDa biste završili prijavu, morate unijeti novu šifru ovdje:",
+       "resetpass_announce": "Da biste završili prijavu, morate postaviti novu šifru.",
        "resetpass_text": "<!-- Unesi tekst ovdje -->",
        "resetpass_header": "Obnovi šifru za račun",
        "oldpassword": "Stara šifra:",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Tvoja šifra/lozinka za {{SITENAME}}:",
        "changeemail-submit": "Promijeni e-mail",
+       "changeemail-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
+       "resettokens": "Resetovanje žetona",
+       "resettokens-no-tokens": "Nema žetona za resetovanje.",
+       "resettokens-legend": "Resetovanje žetona",
+       "resettokens-tokens": "Žetoni:",
        "resettokens-token-label": "$1 (trenutna vrijednost: $2)",
+       "resettokens-done": "Žetoni su resetovani",
+       "resettokens-resetbutton": "Resetuj izabrane žetone",
        "bold_sample": "Podebljan tekst",
        "bold_tip": "Podebljan tekst",
        "italic_sample": "Kurzivan tekst",
        "preview": "Pregled stranice",
        "showpreview": "Prikaži izgled",
        "showdiff": "Prikaži izmjene",
-       "anoneditwarning": "'''Upozorenje:''' Niste prijavljeni. \nVaša IP adresa će biti zabilježena u historiji ove stranice.",
+       "anoneditwarning": "<strong>Upozorenje:</strong> Niste prijavljeni. \nVaša IP adresa će biti javno vidljiva ako napravite neku izmjenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 napravite račun]</strong>, vaše izmjene će biti pripisane vašem korisničkom imenu, zajedno sa drugim pogodnostima.",
        "anonpreviewwarning": "''Niste prijavljeni. Nakon spremanja izmjena vaša IP adresa će biti zapisana u historiji uređivanja ove stranice.''",
        "missingsummary": "'''Napomena:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj, Vaša izmjena će biti sačuvana bez sažetka.",
        "missingcommenttext": "Molimo unesite komentar ispod.",
        "parser-template-recursion-depth-warning": "Dubina uključivanja šablona prekoračena ($1)",
        "language-converter-depth-warning": "Prekoračena granica dubine jezičkog pretvarača ($1)",
        "node-count-exceeded-category": "Stranice sa prekoračenim brojem čvorova",
-       "node-count-exceeded-warning": "Stranice koje imaju prevelik broj čvorova",
+       "node-count-exceeded-warning": "Stranice koje su prekoračile broj čvorova",
        "expansion-depth-exceeded-category": "Stranice koje su prekoračile dubinu proširenja",
        "expansion-depth-exceeded-warning": "Stranice koje su prekoračile dubinu proširenja",
        "parser-unstrip-loop-warning": "Pronađena petlja",
        "currentrev": "Trenutna revizija",
        "currentrev-asof": "Trenutna revizija na dan $1",
        "revisionasof": "Revizija od $1",
-       "revision-info": "Izmjena od $1 korisnika $2",
+       "revision-info": "Izmjena od $1 od {{GENDER:$6|$2}}$7",
        "previousrevision": "←Starije izmjene",
        "nextrevision": "Novija izmjena →",
        "currentrevisionlink": "Trenutna verzija",
        "revdelete-show-file-submit": "Da",
        "logdelete-selected": "{{PLURAL:$1|Označena stavka zapisa|Označene stavke zapisa}}:",
        "revdelete-confirm": "Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
-       "revdelete-suppress-text": "Ograničenja bi trebala biti korištena '''samo''' u slijedećim slučajevima:\n* Osjetljive korisničke informacije\n*: ''kućne adrese, brojevi telefona, brojevi bankovnih kartica itd.''",
+       "revdelete-suppress-text": "Ograničenja bi trebala biti korištena <strong>samo</strong> u sijedećim slučajevima:\n* Potencijalni klevetnički podaci\n* Osjetljive korisničke informacije\n*: <em>kućne adrese, brojevi telefona, brojevi bankovnih kartica itd.</em>",
        "revdelete-legend": "Postavi ograničenja vidljivosti",
        "revdelete-hide-text": "Tekst revizije",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
-       "revdelete-hide-name": "Sakrij akciju i cilj",
+       "revdelete-hide-name": "Sakrij cilj i parametre",
        "revdelete-hide-comment": "Uredi sažetak",
        "revdelete-hide-user": "Korisničko ime urednika/IP",
        "revdelete-hide-restricted": "Ograniči podatke za administratore kao i za druge korisnike",
        "search-redirect": "(preusmjeravanje $1)",
        "search-section": "(sekcija $1)",
        "search-category": "(kategorija $1)",
+       "search-file-match": "(podudara se sadržaj datoteke)",
        "search-suggest": "Da li ste mislili: $1",
        "search-interwiki-caption": "Srodni projekti",
        "search-interwiki-default": "$1 rezultati:",
        "prefs-email": "E-mail opcije",
        "prefs-rendering": "Izgled",
        "saveprefs": "Sačuvaj",
-       "restoreprefs": "Vrati sve pretpostavljene postavke",
+       "restoreprefs": "Vrati sve pretpostavljene postavke (u svim sekcijama)",
        "prefs-editing": "Veličine tekstualnog polja",
        "rows": "Redova",
        "columns": "Kolona",
        "gender-unknown": "Ne previše detaljno",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
-       "prefs-help-gender": "Optionalno: koristi se za ispravke gramatičkog roda u porukama softvera. Ova informacija će biti javna.",
+       "prefs-help-gender": "Postavljanje ovih podešavanja je optionalno: Softver koristi ove vrijednosti za vaše naslovljanje i ispravke gramatičkog roda u porukama softvera. Ova informacija bit će javna.",
        "email": "E-mail",
-       "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
+       "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje vašem radu.",
        "prefs-help-email": "E-mail adresa je opcionalna, ali je potrebna jer omogućava da Vam se pošalje nova šifra u slučaju da je izgubite ili zaboravite.",
        "prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
        "prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
        "prefs-advancedwatchlist": "Napredne opcije",
        "prefs-displayrc": "Postavke izgleda",
        "prefs-displaywatchlist": "Postavke izgleda",
+       "prefs-tokenwatchlist": "Žeton",
        "prefs-diffs": "Razlike",
        "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sljedećoj prijavi.",
        "email-address-validity-valid": "Izgleda valjano",
        "right-move": "Preusmjeravanje stranica",
        "right-move-subpages": "Preusmjeravanje stranica sa svim podstranicama",
        "right-move-rootuserpages": "Premještanje stranica osnovnih korisnika",
+       "right-move-categorypages": "Pomakni stranice kategorije",
        "right-movefile": "Premještanje datoteka",
        "right-suppressredirect": "Ne pravi preusmjeravanje sa starog imena pri preusmjeravanju stranica",
        "right-upload": "Postavljanje datoteka",
        "right-reupload-shared": "Postavljanje novih lokalnih verzija datoteka identičnih onima u zajedničkoj ostavi",
        "right-upload_by_url": "Postavljanje datoteke sa URL adrese",
        "right-purge": "Osvježavanje keša za stranice bez konfirmacije",
-       "right-autoconfirmed": "Uređivanje poluzaštićenih stranica",
+       "right-autoconfirmed": "Bez ograničavanja stavki za IP adrese",
        "right-bot": "Postavljen kao automatski proces",
        "right-nominornewtalk": "Male izmjene na stranici za razgovor ne uzrokuju prikazivanje oznake ''nova poruka'' na stranici za razgovor",
        "right-apihighlimits": "Korištenje viših ograničenja u API upitima",
        "right-deletedtext": "Pregled obrisanog teksta i izmjena između obrisanih revizija",
        "right-browsearchive": "Pretraživanje obrisanih stranica",
        "right-undelete": "Vraćanje obrisanih stranica",
-       "right-suppressrevision": "Pregled i povratak revizija sakrivenih od administratora",
+       "right-suppressrevision": "Pregled, sakrivanje i povratak određenih revizija stranice od svih korisnika",
        "right-suppressionlog": "Gledanje privatnih zapisa",
        "right-block": "Blokiranje uređivanja drugih korisnika",
        "right-blockemail": "Blokiranje korisnika da šalje e-mail",
        "action-move": "pomjerite ovu stranicu",
        "action-move-subpages": "pomjerite ovu stranicu, i njene podstranice",
        "action-move-rootuserpages": "pomjerite stranice osnovnog korisnika",
+       "action-move-categorypages": "pomakni stranice kategorije",
        "action-movefile": "pomjeri ovu datoteku",
        "action-upload": "postavljate ovu datoteku",
        "action-reupload": "stavite novu verziju postojeće datoteke",
        "action-block": "blokirate uređivanje ovog korisnika",
        "action-protect": "promijeniti nivo zaštite za ovu stranicu",
        "action-rollback": "brzo vraćanje izmjena zadnjeg korisnika koji je uređivao određenu stranicu",
-       "action-import": "uvozite ovu stranicu iz druge wiki",
-       "action-importupload": "uvezete ovu stranicu putem postavljanja datoteke",
+       "action-import": "uvozite stranice iz druge wiki",
+       "action-importupload": "uvoz stranica putem postavljanja datoteke",
        "action-patrol": "označite izmjene drugih kao patrolirane",
        "action-autopatrol": "da Vaše izmjene budu označene kao patrolirane",
        "action-unwatchedpages": "pregledate spisak nepraćenih stranica",
        "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
-       "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
+       "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove izmjene počev od $3 $2",
        "rcshowhideminor": "$1 male izmjene",
        "rcshowhideminor-show": "Pokaži",
        "largefileserver": "Ova datoteka je veća nego što server dopušta.",
        "emptyfile": "Datoteka koju ste poslali je prazna. Ovo je moguće zbog greške u imenu datoteke. Molimo Vas da provjerite da li stvarno želite da pošaljete ovu datoteku.",
        "windows-nonascii-filename": "Ova wiki ne podržava imena datoteka sa posebnim znacima.",
-       "fileexists": "Datoteka sa ovim imenom već postoji.\nMolimo Vas da provjerite <strong>[[:$1]]</strong> ako niste sigurni da li želite da je promjenite.\n[[$1|thumb]]",
+       "fileexists": "Datoteka sa ovim imenom već postoji, molimo Vas provjerite <strong>[[:$1]]</strong> ako {{GENDER:|niste}} sigurni da je želite promjeniti.\n[[$1|thumb]]",
        "filepageexists": "Opis stranice za ovu datoteku je već napravljen ovdje <strong>[[:$1]]</strong>, ali datoteka sa ovim nazivom trenutno ne postoji.\nSažetak koji ste naveli neće se pojaviti na stranici opisa.\nDa bi se Vaš opis ovdje našao, potrebno je da ga ručno uredite.\n[[$1|thumb]]",
-       "fileexists-extension": "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]\n* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nMolimo Vas da izaberete drugačiji naziv.",
+       "fileexists-extension": "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]\n* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nDa li možda želite koristiti drugačiji naziv?",
        "fileexists-thumbnail-yes": "Izgleda da je datoteka slika smanjene veličine ''(\"thumbnail\")''. [[$1|thumb]]\nMolimo provjerite datoteku <strong>[[:$1]]</strong>.\nAko je provjerena datoteka ista slika originalne veličine, nije potrebno postavljati dodatnu sliku.",
        "file-thumbnail-no": "Naziv datoteke počinje sa <strong>$1</strong>.\nIzgleda da se radi o smanjenoj slici ''(\"thumbnail\")''.\nAko imate ovu sliku u punoj rezoluciji, postavite nju; ili promijenite naslov ove datoteke.",
        "fileexists-forbidden": "Datoteka s ovim imenom već postoji i ne može biti prepisana.\nAko i dalje želite postaviti ovu datoteku, molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
        "license-header": "Licenciranje",
        "nolicense": "Ništa nije odabrano",
        "license-nopreview": "(Pregled nije dostupan)",
-       "upload_source_url": " (validni, javno dostupni URL)",
-       "upload_source_file": " (datoteka na Vašem računaru)",
+       "upload_source_url": "(vaša izabrana datoteka od validnih, javno dostupnih URL-a)",
+       "upload_source_file": "(vaša odabrana datoteka sa Vašeg računara)",
        "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve postavljene datoteke.",
        "listfiles_search_for": "Traži medije po imenu:",
        "filedelete-maintenance": "Brisanje i povratak datoteka je privremeno onemogućen tokom održavanja.",
        "filedelete-maintenance-title": "Ne mogu da obrišem datoteku",
        "mimesearch": "MIME pretraga",
-       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.\nUlazni podaci: vrstasadržaja/subvrsta, npr. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.\nUlazni podaci: vrstasadržaja/subvrsta ili vrstasadržaja/*, npr. <code>image/jpeg</code>.",
        "mimetype": "MIME tip:",
        "download": "učitaj",
        "unwatchedpages": "Nepraćene stranice",
        "randompage": "Slučajna stranica",
        "randompage-nopages": "Nema stranica u {{PLURAL:$2|slijedećem imenskom prostoru|slijedećim imenskim prostorima}}: \"$1\".",
        "randomincategory": "Slučajna stranica u kategoriji",
+       "randomincategory-invalidcategory": "\"$1\" nije valjano ime kategorije.",
        "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
        "randomincategory-category": "Kategorija:",
        "randomincategory-legend": "Slučajna stranica u kategoriji",
        "pageswithprop-submit": "Idi",
        "doubleredirects": "Dvostruka preusmjerenja",
        "doubleredirectstext": "Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.\nSvaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju teksta drugog preusmjerenja, što obično daje \"pravi\" ciljni članak, na koji bi prvo preusmjerenje i trebalo da pokazuje.\n<del>Precrtane</del> stavke su riješene.",
-       "double-redirect-fixed-move": "[[$1]] je premješten, sada je preusmjerenje na [[$2]]",
-       "double-redirect-fixed-maintenance": "Ispravljanje dvostrukih preusmjerenja sa [[$1]] na [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] je premješten.\nAutomatski je ažuriran i sada preusmjerava na [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatsko ospravljanje dvostrukih preusmjerenja sa [[$1]] na [[$2]] je posao održavanja.",
        "double-redirect-fixer": "Popravljač preusmjerenja",
        "brokenredirects": "Pokvarena preusmjerenja",
        "brokenredirectstext": "Slijedeća preusmjerenja vode na nepostojeće stranice:",
        "wantedtemplates": "Potrebni šabloni",
        "mostlinked": "Članci sa najviše linkova",
        "mostlinkedcategories": "Kategorije sa najviše linkova",
-       "mostlinkedtemplates": "Najviše upotrebljavani šabloni",
+       "mostlinkedtemplates": "Najviše uključene stranice",
        "mostcategories": "Članci sa najviše kategorija",
        "mostimages": "Najviše linkovane slike",
        "mostrevisions": "Članci sa najviše izmjena",
        "protectedpages-cascade": "Samo prenosive zaštite",
        "protectedpages-noredirect": "Sakrij preusmjerenja",
        "protectedpagesempty": "Trenutno nijedna stranica nije zaštićena ovim parametrima.",
+       "protectedpages-timestamp": "Vremenska oznaka",
        "protectedpages-page": "Stranica",
        "protectedpages-expiry": "Istječe",
+       "protectedpages-performer": "Zaštita korisnika",
+       "protectedpages-params": "Parametri zaštite",
        "protectedpages-reason": "Razlog",
        "protectedpages-unknown-timestamp": "Nepoznato",
        "protectedpages-unknown-performer": "Nepoznati korisnik",
        "protectedtitles": "Zaštićeni naslovi",
+       "protectedtitles-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih naslova. Za spisak trenutno zaštićenih stranica vidi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Nijedan naslov članka trenutno nije zaštićen ovim parametrima.",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Pokaži samo korisnike koji su uređivali",
        "listusers-creationsort": "Sortiraj po datumu pravljenja",
+       "listusers-desc": "Sortiraj u opadajućem redoslijedu",
        "usereditcount": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "usercreated": "{{GENDER:$3|Napravio|Napravila}} dana $1 u $2",
        "newpages": "Nove stranice",
        "pager-older-n": "{{PLURAL:$1|starija 1|starije $1}}",
        "suppress": "Nazdor",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
+       "apihelp": "API pomoć",
+       "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
        "booksources": "Štampani izvori",
        "booksources-search-legend": "Traži književne izvore",
        "booksources-search": "Traži",
        "listgrouprights-removegroup-self": "Može ukloniti {{PLURAL:$2|grupu|grupe|grupa}} sa svog računa: $1",
        "listgrouprights-addgroup-self-all": "Može dodati sve grupe na svoj račun",
        "listgrouprights-removegroup-self-all": "Može ukloniti sve grupe sa svog računa",
+       "listgrouprights-namespaceprotection-header": "Ograničenja imenskog prostora",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
+       "listgrouprights-namespaceprotection-restrictedto": "Prava kojima se dozvoljava korisniku da uređuje",
+       "trackingcategories": "Praćenje kategorija",
+       "trackingcategories-msg": "Praćenje kategorije",
        "trackingcategories-name": "Ime poruke",
+       "trackingcategories-desc": "Kriterij uključenja kategorije",
        "trackingcategories-nodesc": "Opis nije dostupan.",
+       "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]\nda biste slali e-poštu drugim korisnicima.",
        "emailuser": "Pošalji e-poštu ovom korisniku",
        "mywatchlist": "Praćeni članci",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
-       "watchlistanontext": "Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.",
+       "watchlistanontext": "Molimo logujte se da vidite ili uredite stavke na Vašem spisku praćenja.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak praćenja",
        "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovde.",
        "unwatchthispage": "Ukinite praćenje",
        "notanarticle": "Nije članak",
        "notvisiblerev": "Revizija je obrisana",
-       "watchlist-details": "{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući stranice za razgovor.",
+       "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica }} na vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "wlheader-enotif": "Obavještavanje e-poštom je omogućeno.",
        "wlheader-showupdated": "Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
-       "wlnote": "Ispod je {{PLURAL:$1|najskorija izmjena|'''$1''' najskorije izmjene|'''$1''' najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih '''$2''' sata|u posljednjih '''$2''' sati}}, od $3, $4.",
+       "wlnote": "Ispod {{PLURAL:$1|je najskorija izmjena|su <strong>$1</strong> najskorije izmjene|<strong>$1</strong> najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-options": "Opcije spiska praćenja",
        "watching": "Pratim...",
        "enotif_lastvisited": "Pogledajte $1 za sve izmjene od vaše posljednje posjete.",
        "enotif_lastdiff": "Vidi $1 da pregledate ovu promjenu.",
        "enotif_anon_editor": "anonimni korisnik $1",
-       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osima ako posjetite stranicu. Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\nVaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki e-mail obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
+       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osim ako prijavljeni ponovno posjetite stranicu. Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\nVaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki email obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
        "created": "napravljena",
        "changed": "promijenjena",
        "deletepage": "Obrišite stranicu",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
        "delete-confirm": "Brisanje \"$1\"",
        "delete-legend": "Obriši",
-       "historywarning": "'''Upozorenje''':  Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
+       "historywarning": "<strong>Upozorenje</strong>: Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
        "confirmdeletetext": "Brisanjem ćete obrisati stranicu ili sliku zajedno sa historijom iz baze podataka, ali će se iste moći vratiti kasnije.\nMolim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu sa [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Akcija završena",
        "actionfailed": "Akcija nije uspjela",
        "deletecomment": "Razlog:",
        "deleteotherreason": "Ostali/dodatni razlozi:",
        "deletereasonotherlist": "Ostali razlozi",
-       "deletereason-dropdown": "*Uobičajeni razlozi brisanja\n** Zahtjev autora\n** Kršenje autorskih prava\n** Vandalizam",
+       "deletereason-dropdown": "*Uobičajeni razlozi brisanja\n** Spam\n** Vandalizam\n** Kršenje autorskih prava\n** Zahtjev autora\n** Pokvareno preusmjerenje",
        "delete-edit-reasonlist": "Uredi razloge brisanja",
        "delete-toobig": "Ova stranica ima veliku historiju promjena, preko $1 {{PLURAL:$1|revizije|revizija}}.\nBrisanje takvih stranica nije dopušteno da bi se spriječilo slučajno preopterećenje servera na kojem je {{SITENAME}}.",
        "delete-warning-toobig": "Ova stranica ima veliku historiju izmjena, preko $1 {{PLURAL:$1|izmjene|izmjena}}.\nNjeno brisanje može dovesti do opterećenja operacione baze na {{SITENAME}};\nnastavite s oprezom.",
        "protect-locked-blocked": "Ne možete promijeniti nivo zaštite dok ste blokirani.\nOvo su trenutne postavke za stranicu '''$1''':",
        "protect-locked-dblock": "Nivoi zaštite se ne mogu mijenjati jer je aktivna baza podataka zaključana.\nTrenutna postavka za stranicu '''$1''' je:",
        "protect-locked-access": "Nemate ovlasti za mijenjanje stepena zaštite.\nSlijede trenutne postavke stranice '''$1''':",
-       "protect-cascadeon": "Ova stranica je tenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu zaštitu.\nMožete promijeniti stepen zaštite ove stranice, ali to neće uticati na prenosnu zaštitu.",
+       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu zaštitu.\nPromijene stepena zaštite ove stranice neće uticati na prenosnu zaštitu.",
        "protect-default": "Dopusti svim korisnicima",
        "protect-fallback": "Dozvolite samo korisnicima sa \"$1\" ovlastima/privilegijama",
        "protect-level-autoconfirmed": "Dopustite samo automatski potvrđenim korisnicima",
        "ipb-unblock-addr": "Deblokiraj $1",
        "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu",
        "ipb-blocklist": "Vidi postojeće blokade",
-       "ipb-blocklist-contribs": "Doprinosi za $1",
+       "ipb-blocklist-contribs": "Doprinosi za {{GENDER:$1|$1}}",
        "unblockip": "Odblokiraj korisnika",
        "unblockiptext": "Upotrebite donji upitnik da bi ste vratili\npravo pisanja ranije blokiranoj IP adresi\nili korisničkom imenu.",
        "ipusubmit": "Ukloni ovu blokadu",
        "range_block_disabled": "Administratorska mogućnost da blokira grupe je isključena.",
        "ipb_expiry_invalid": "Pogrešno vrijeme trajanja.",
        "ipb_expiry_temp": "Sakrivene blokade korisničkih imena moraju biti stalne.",
-       "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; možda ima isuviše izmjena.",
+       "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; on ima više od {{PLURAL:$1|jedne izmjene|$1 izmjena}}.",
        "ipb_already_blocked": "\"$1\" je već blokiran",
        "ipb-needreblock": "$1 je već blokiran. Da li želite promijeniti postavke?",
        "ipb-otherblocks-header": "Ostale {{PLURAL:$1|blokada|blokade}}",
        "importuploaderrortemp": "Postavljanje uvozne datoteke nije uspjelo.\nNedostaje privremeni folder.",
        "import-parse-failure": "Greška pri parsiranju XML uvoza",
        "import-noarticle": "Nema stranica za uvoz!",
-       "import-nonewrevisions": "Sve revizije su prethodno uvežene.",
+       "import-nonewrevisions": "Nijedna revizija nije uvezena (ili su sve već prisutne ili su preskočene zbog greške).",
        "xml-error-string": "$1 na liniji $2, kolona $3 (bajt $4): $5",
        "import-upload": "Postavljanje XML podataka",
        "import-token-mismatch": "Izgubljeni podaci sesije. Molimo pokušajte ponovno.",
        "import-error-create": "Stranica \"$1\" nije uvezena jer vam nije dozvoljeno da je napravite.",
        "import-error-interwiki": "Stranica \"$1\" nije uvezena jer je njen naziv rezerviran za vanjsko povezivanje (interwiki).",
        "import-error-special": "Stranica \"$1\" nije uvezena jer pripada posebnom imenskom prostoru koje ne prihvata stranice.",
-       "import-error-invalid": "Stranica \"$1\" nije uvezena jer je njen naziv neispravan.",
+       "import-error-invalid": "Stranica \"$1\" nije uvezena jer je naziv pod kojim treba biti uvezena nije valjan na ovoj wiki.",
        "import-options-wrong": "{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Navedena osnovna stranica ima neispravan naslov.",
        "import-rootpage-nosubpage": "Imenski prostor \"$1\" osnovne stranice ne dozvoljava podstranice.",
        "importlogpage": "Zapisnik uvoza",
        "importlogpagetext": "Administrativni uvozi stranica sa historijom izmjena sa drugih wikija.",
        "import-logentry-upload": "uvezena stranica [[$1]] putem postavljanja datoteke",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revizija|revizije|revizija}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|Uvezena jedna revizija|Uvezene $1 revizije|Uvezeno $1 revizija}}",
        "import-logentry-interwiki": "uveženo (''transwikied'') $1",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revizija|revizije|revizija}} od $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|Uvezena $1 revizija|Uvezene $1 revizije|Uvezeno $1 revizija}} od $2",
        "javascripttest": "Testiranje JavaScript-e",
        "javascripttest-title": "Pokretanje $1 testova",
        "javascripttest-pagetext-noframework": "Ova stranica je određena za pokretanje JavaScript testova.",
        "spam_reverting": "Vraćanje na posljednju verziju koja ne sadrži linkove ka $1",
        "spam_blanking": "Sve revizije koje sadrže linkove ka $1, očisti",
        "spam_deleting": "Sve revizije koje sadrže linkove na $1, brišem",
-       "simpleantispam-label": "Provjera protiv spama.\n'''NE''' popunjavaj ovo!",
+       "simpleantispam-label": "Provjera protiv spama.\n<strong>NE</strong> popunjavajte ovo!",
        "pageinfo-title": "Informacije za \"$1\"",
        "pageinfo-not-current": "Nažalost, nemoguće je dati ove informacije za starije revizije.",
        "pageinfo-header-basic": "Osnovne informacije",
        "newimages-summary": "Ova specijalna stranica prikazuje posljednje postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
+       "newimages-showbots": "Pokaži datoteke koje su poslali botovi",
        "noimages": "Ništa za prikazati.",
        "ilsubmit": "Traži",
        "bydate": "po datumu",
        "watchlistedit-raw-done": "Vaš spisak praćenja je ažuriran.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 naslov je dodan|$1 naslova su dodana|$1 naslova je dodano}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova je uklonjeno}}:",
+       "watchlistedit-clear-title": "Očišćen spisak nadgledanja",
+       "watchlistedit-clear-legend": "Očisti spisak nadgledanja",
+       "watchlistedit-clear-explain": "Svi naslovi će biti uklonjeni iz vašeg spiska nadgledanja",
+       "watchlistedit-clear-titles": "Naslovi:",
+       "watchlistedit-clear-submit": "Isprazni spisak nadgledanja (Ovo je trajno!)",
+       "watchlistedit-clear-done": "Vaš spisak praćenja je očišćen.",
        "watchlisttools-clear": "Očisti spisak nadgledanja",
        "watchlisttools-view": "Pregled promjena praćenih stranica",
        "watchlisttools-edit": "Pogledaj i uredi listu praćenih članaka.",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
        "timezone-utc": "KSV",
-       "unknown_extension_tag": "Nepoznata oznaka ekstenzije \"$1\"",
        "duplicate-defaultsort": "Upozorenje: Postavljeni ključ sortiranja \"$2\" zamjenjuje raniji ključ \"$1\".",
        "version": "Verzija",
        "version-extensions": "Instalirana proširenja (ekstenzije)",
-       "version-skins": "Kože",
+       "version-skins": "Instalirane kože",
        "version-specialpages": "Posebne stranice",
        "version-parserhooks": "Kuke parsera",
        "version-variables": "Promjenjive",
        "version-hook-name": "Naziv kuke",
        "version-hook-subscribedby": "Pretplaćeno od",
        "version-version": "(Verzija $1)",
+       "version-no-ext-name": "[nema imena]",
        "version-license": "Licenca",
        "version-ext-license": "Licenca",
        "version-ext-colheader-name": "Proširenje",
        "htmlform-yes": "Da",
        "htmlform-chosen-placeholder": "Izaberite opciju",
        "htmlform-cloner-create": "Dodaj još",
+       "htmlform-cloner-delete": "Ukloni",
        "sqlite-has-fts": "$1 sa podrškom pretrage cijelog teksta",
        "sqlite-no-fts": "$1 bez podrške pretrage cijelog teksta",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
        "duration-centuries": "$1 {{PLURAL:$1|vijek|vijeka|vijekova}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenij|milenija}}",
        "rotate-comment": "Slika rotirana za $1 {{PLURAL:$1|stepen|stepeni}} u smjeru kazaljke na satu",
+       "limitreport-cputime": "Vrijeme korištenja CPU",
        "limitreport-walltime": "Korištenje u realnom vremenu",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "expandtemplates": "Proširi šablone",
-       "expand_templates_intro": "Ova posebna stranica uzima neki tekst i proširuje sve šablone u njemu rekurzivno.\nOna također proširuje parserske funkcije poput\n<nowiki>{{</nowiki>#language:…}} i varijable poput\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash;u principu gotovo sve između dvostrukih zagrada.\nOvo se uradi putem poziva relevantnog parserskog nivoa iz same MediaWiki.",
+       "expand_templates_intro": "Ova posebna stranica uzima neki tekst i proširuje sve šablone u njemu rekurzivno.\nOna također proširuje parserske funkcije poput\n<code><nowiki>{{</nowiki>#language:…}}</code> i varijable poput\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. U principu proširuje gotovo sve između dvostrukih zagrada.",
        "expand_templates_title": "Naslov konteksta, za {{FULLPAGENAME}} itd.:",
        "expand_templates_input": "Tekst unosa:",
        "expand_templates_output": "Rezultat",
        "expand_templates_remove_comments": "Ukloni komentare",
        "expand_templates_remove_nowiki": "Onemogući oznake <nowiki> u rezultatima",
        "expand_templates_generate_xml": "Prikaži XML stablo parsera",
+       "expand_templates_generate_rawhtml": "Pokaži izvorni HTML",
        "expand_templates_preview": "Pregled",
        "pagelang-name": "Stranica",
        "pagelang-language": "Jezik",
        "pagelang-select-lang": "Izaberi jezik",
+       "mediastatistics-table-count": "Broj datoteka",
        "mediastatistics-header-unknown": "Nepoznato",
+       "mediastatistics-header-drawing": "Crteži (vektorske slike)",
+       "mediastatistics-header-audio": "Zvuk",
+       "mediastatistics-header-video": "Videa",
+       "mediastatistics-header-multimedia": "Rich media",
+       "mediastatistics-header-office": "Kancelarija",
+       "mediastatistics-header-text": "Tekstualno",
+       "mediastatistics-header-executable": "Izvršni",
+       "mediastatistics-header-archive": "Kompresovani formati",
        "json-error-syntax": "Sintaksna greška"
 }
index 180a185..49c4ff0 100644 (file)
        "parser-unstrip-loop-warning": "ДӀачӀагӀанца pre карина",
        "undo-success": "Нисйинарг а тlе цалаца мега. Дехар до, хьажа цхьатерра йуй башхо, тешна хила, баккъалла иза хийцам буйте хьуна безарг, тlакха тlе таlайе «дlайазйе агlо», хийцам хlотта ба.",
        "undo-failure": "Юккъера хийцамаш бахьнехь нисдар юхадаккха йиш яц.",
+       "undo-norev": "Нисдар юхадаккха цало, иза доцу делла я дӀаяьккхина дела.",
+       "undo-nochange": "Нисдар хьалхо юхадяьккхиначух тера ду.",
        "undo-summary": "Юхадаьккхина {{GENDER:$2|декъашхочун}} [[Special:Contributions/$2|$2]] ([[User talk:$2|дийц.]]) нисдар $1",
        "undo-summary-username-hidden": "Юхадаьккхина декъашхочун нисдарш $1, цунна цӀе дӀахьулйина",
        "cantcreateaccounttitle": "Декъашхочун дӀаяздар кхолла йиш яц",
        "watchlisttools-edit": "Хьажа/нисбé могӀам",
        "watchlisttools-raw": "Йоза санна тае",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дийцаре]])",
-       "unknown_extension_tag": "«$1» шордаран ца йоьвзу тег",
        "version": "Верси MediaWiki",
        "version-extensions": "ДӀахӀоттийна шордарш",
        "version-skins": "ДӀахӀоттийна кечяран темаш",
index 342c3f5..bfb08d9 100644 (file)
        "hebrew-calendar-m7-gen": "نیسان",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|لێدوان]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "تاگی درێژکراوەی نەناسراو \"$1\"",
        "duplicate-defaultsort": "'''ئاگاداری''' کلیلی پۆلێنکردنی \"$2'' چووەتە شوێنی کلیلی پۆلێنکردنی  \"$1\"",
        "version": "وەشان",
        "version-extensions": "پێوەکراوە دامەزراوەکان",
        "duration-decades": "$1 {{PLURAL:$1|دەیە|دەیە}}",
        "duration-centuries": "$1 {{PLURAL:$1|سەدە|سەدە}}",
        "duration-millennia": "$1 {{PLURAL:$1|ھەزارە|ھەزارە}}",
-       "expand_templates_ok": "باشە"
+       "expand_templates_output": "ئاکام",
+       "expand_templates_ok": "باشە",
+       "expand_templates_preview": "پێشبینین",
+       "pagelang-name": "پەڕە",
+       "pagelang-language": "زمان",
+       "pagelang-select-lang": "زمان ھەڵبژێرە",
+       "right-pagelang": "زمانی پەڕە بگۆڕە",
+       "action-pagelang": "زمانی پەڕەکە بگۆڕە",
+       "mediastatistics": "ئامارەکانی میدیا",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 بایت|$1 بایت}} ($2؛ $3%)",
+       "mediastatistics-table-mimetype": "جۆری MIME",
+       "mediastatistics-table-count": "ژمارەی پەڕگەکان",
+       "mediastatistics-header-unknown": "نەزانراو",
+       "mediastatistics-header-bitmap": "وێنەی Bitmap",
+       "mediastatistics-header-audio": "دەنگ",
+       "mediastatistics-header-video": "ڤیدیۆکان",
+       "json-error-syntax": "ھەڵەی ئیملایی"
 }
index 7df6b42..c2631b1 100644 (file)
        "anoneditwarning": "'''Varování:''' Nejste přihlášen(a). Pokud uložíte jakoukoli editaci, bude vaše IP adresa zveřejněna v historii této stránky. Pokud se <strong>[$1 přihlásíte]</strong> nebo si <strong>[$2 vytvoříte účet]</strong>, budou vaše editace připsány vašemu uživatelskému jménu a získáte i další výhody.",
        "anonpreviewwarning": "''Nejste přihlášen(a). Uložením zveřejníte svou IP adresu v historii této stránky.''",
        "missingsummary": "'''Připomenutí:''' Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na Uložit změny, bude vaše editace zapsána bez shrnutí.",
-       "selfredirect": "<strong>Upozornění:</strong> Vytváříte přesměrování na týž článek. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude přesměrování vytvořeno.",
+       "selfredirect": "<strong>Upozornění:</strong> Pokušíte se tuto stránku přesměrovat samu na sebe.\nMožná jste uvedli chybný cíl přesměrování nebo editujete špatnou stránku.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude přesměrování přesto vytvořeno.",
        "missingcommenttext": "Zadejte komentář",
        "missingcommentheader": "'''Připomenutí:''' Nezadali jste předmět/nadpis pro tento komentář.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace zapsána i bez toho.",
        "summary-preview": "Náhled shrnutí:",
        "history-feed-empty": "Požadovaná stránka neexistuje.\nMohla být smazána či přejmenována.\nZkuste [[Special:Search|hledání]].",
        "rev-deleted-comment": "(shrnutí editace odstraněno)",
        "rev-deleted-user": "(uživatelské jméno odstraněno)",
-       "rev-deleted-event": "(záznam odstraněn)",
+       "rev-deleted-event": "(podrobnosti odstraněny)",
        "rev-deleted-user-contribs": "[uživatelské jméno nebo IP adresa odstraněny – editace v příspěvcích skryta]",
        "rev-deleted-text-permission": "Tato revize byla '''smazána'''.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
        "rev-suppressed-text-permission": "Tato revize byla <strong>utajena</strong>. Podrobnosti jsou uvedeny v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} knize utajení].",
        "revdelete-legend": "Nastavit omezení viditelnosti",
        "revdelete-hide-text": "Text revize",
        "revdelete-hide-image": "Skrýt obsah souboru",
-       "revdelete-hide-name": "Skrýt událost a cíl",
+       "revdelete-hide-name": "Skrýt cíl a parametry",
        "revdelete-hide-comment": "Shrnutí editace",
        "revdelete-hide-user": "Uživatelské jméno / IP adresa",
        "revdelete-hide-restricted": "Utajit data i před správci",
        "thumbnail-temp-create": "Dočasný soubor náhledu nelze vytvořit.",
        "thumbnail-dest-create": "Náhled nelze uložit na dané místo.",
        "thumbnail_invalid_params": "Neplatný parametr náhledu",
+       "thumbnail_toobigimagearea": "Soubor s rozměry většími než $1",
        "thumbnail_dest_directory": "Nelze vytvořit cílový adresář",
        "thumbnail_image-type": "Nepodporovaný typ obrázku",
        "thumbnail_gd-library": "Neúplná konfigurace knihovny GD: chybí funkce $1",
        "hebrew-calendar-m11-gen": "avu",
        "hebrew-calendar-m12-gen": "elulu",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskuse]])",
-       "unknown_extension_tag": "Neznámá značka rozšíření: „$1“",
        "duplicate-defaultsort": "Upozornění: Implicitní klíč řazení (DEFAULTSORTKEY) „$2“ přepisuje dříve nastavenou hodnotu „$1“.",
        "duplicate-displaytitle": "<strong>Upozornění:</strong> Předchozí zobrazovaný název „$1“ je nahrazen zobrazovaným názvem „$2“.",
        "invalid-indicator-name": "<strong>Chyba:</strong> Atribut <code>name</code> indikátoru stavu stránky nesmí být prázdný.",
        "api-error-stashzerolength": "Server nemohl soubor uložit do skrýše, protože má nulovou délku.",
        "api-error-stashnotloggedin": "Pro ukládání souboru do skrýše musíte být přihlášeni.",
        "api-error-stashwrongowner": "Soubor, ke kterému se ve skrýši pokoušíte přistoupit, vám nepatří.",
-       "api-error-stashnosuchfilekey": "Klíč souboru, ke kterém se ve skrýši pokoušíte přistoupit, neexistuje.",
+       "api-error-stashnosuchfilekey": "Klíč souboru, ke kterému se ve skrýši pokoušíte přistoupit, neexistuje.",
        "api-error-timeout": "Server neodpověděl v očekávaném čase.",
        "api-error-unclassified": "Došlo k neznámé chybě.",
        "api-error-unknown-code": "Neznámá chyba: „$1“.",
index b0200ec..cc6b4f9 100644 (file)
        "anoneditwarning": "<strong>Warnung:</strong> Du bist nicht angemeldet. Deine IP-Adresse wird öffentlich sichtbar, falls du Bearbeitungen durchführst. Wenn du dich <strong>[$1 anmeldest]</strong> oder <strong>[$2 ein Benutzerkonto erstellst]</strong>, werden deine Bearbeitungen zusammen mit anderen Beiträgen deinem Benutzernamen zugeordnet.",
        "anonpreviewwarning": "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
        "missingsummary": "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
-       "selfredirect": "<strong>Warnung:</strong> Du erstellst eine Weiterleitung auf den gleichen Artikel.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Weiterleitung erstellt.",
+       "selfredirect": "<strong>Warnung:</strong> Du leitest auf diese Seite selbst weiter.\nDu hast vermutlich das falsche Weiterleitungsziel angegeben oder du bearbeitest die falsche Seite.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Weiterleitung dennoch erstellt.",
        "missingcommenttext": "Dein Abschnitt enthält keinen Text.",
        "missingcommentheader": "'''Achtung:''' Du hast kein Betreff/Überschrift eingegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
        "summary-preview": "Vorschau der Zusammenfassungszeile:",
        "content-model-text": "Klartext",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Leeres Objekt",
+       "content-json-empty-array": "Leeres Array",
        "duplicate-args-category": "Seiten, die doppelte Argumente in Vorlagenaufrufen verwenden",
        "duplicate-args-category-desc": "Die Seite enthält Vorlagenaufrufe, die Duplikate von Argumenten verwenden, wie <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> oder <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Achtung:''' Diese Seite enthält zu viele Aufrufe aufwändiger Parserfunktionen.\n\nSie darf nicht mehr als $2 {{PLURAL:$2|Aufruf|Aufrufe}} haben, es {{PLURAL:$1|ist aktuell $1 Aufruf|sind aktuell $1 Aufrufe}}.",
        "history-feed-empty": "Die angeforderte Seite existiert nicht. Vielleicht wurde sie gelöscht oder verschoben. [[Special:Search|Durchsuche]] {{SITENAME}} nach passenden neuen Seiten.",
        "rev-deleted-comment": "(Zusammenfassung entfernt)",
        "rev-deleted-user": "(Benutzername entfernt)",
-       "rev-deleted-event": "(Logbuchaktion entfernt)",
+       "rev-deleted-event": "(Logbucheinzelheiten entfernt)",
        "rev-deleted-user-contribs": "[Benutzername oder IP-Adresse entfernt – Bearbeitung aus Beiträgen versteckt]",
        "rev-deleted-text-permission": "Diese Version wurde '''gelöscht'''.\nNähere Angaben zum Löschvorgang sowie eine Begründung stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].",
        "rev-suppressed-text-permission": "Diese Seitenversion wurde <strong>unterdrückt</strong>.\nEinzelheiten können im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Oversight-Logbuch] gefunden werden.",
        "revdelete-legend": "Setzen der Sichtbarkeitseinschränkungen",
        "revdelete-hide-text": "Text der Version",
        "revdelete-hide-image": "Dateiinhalt verstecken",
-       "revdelete-hide-name": "Logbuchaktion und Ziel verstecken",
+       "revdelete-hide-name": "Ziel und Parameter verstecken",
        "revdelete-hide-comment": "Bearbeitungszusammenfassung",
        "revdelete-hide-user": "Benutzername/IP-Adresse des Bearbeiters",
        "revdelete-hide-restricted": "Daten sowohl vor Administratoren als auch anderen Benutzern unterdrücken",
        "thumbnail-temp-create": "Die Datei für die temporäre Miniaturansicht konnte nicht erstellt werden",
        "thumbnail-dest-create": "Die Miniaturansicht konnte nicht am vorgesehenen Ort gespeichert werden",
        "thumbnail_invalid_params": "Ungültige Thumbnail-Parameter",
+       "thumbnail_toobigimagearea": "Datei mit Abmessungen größer als $1",
        "thumbnail_dest_directory": "Zielverzeichnis kann nicht erstellt werden.",
        "thumbnail_image-type": "Bildtyp nicht unterstützt",
        "thumbnail_gd-library": "Unvollständige Konfiguration der GD-Bibliothek: Fehlende Funktion $1",
        "hijri-calendar-m11": "Dhu l-qaʿda",
        "hijri-calendar-m12": "Dhu l-hiddscha",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskussion]])",
-       "unknown_extension_tag": "Unbekanntes Parsertag „$1“",
        "duplicate-defaultsort": "Achtung: Der Sortierungsschlüssel „$2“ überschreibt den vorher verwendeten Schlüssel „$1“.",
        "duplicate-displaytitle": "<strong>Warnung:</strong> Der Anzeigetitel „$2“ überschreibt den früheren Anzeigetitel „$1“.",
        "invalid-indicator-name": "<strong>Fehler:</strong> Das Attribut <code>name</code> des Seitenstatusindikators darf nicht leer sein.",
index c455a76..0fbe678 100644 (file)
        "welcomecreation-msg": "Hesabê şıma abiyo.\n[[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.",
        "yourname": "Nameyê karberi:",
        "userlogin-yourname": "Nameyê karberi",
-       "userlogin-yourname-ph": "Namey ğoyé karberi cı kewe",
-       "createacct-another-username-ph": "Namey karberi de fi",
+       "userlogin-yourname-ph": "Nameyê xoyê karberi cı kewe",
+       "createacct-another-username-ph": "Nameyê karberi cı kewe",
        "yourpassword": "Parola",
        "userlogin-yourpassword": "Parola",
        "userlogin-yourpassword-ph": "Parolaya xo cıkewe",
        "passwordreset-emailtitle": "Hesab timarê {{SITENAME}}",
        "passwordreset-emailtext-ip": "Jeweri, {{SITENAME}} ra (ma heta şımayê, $1 IP adresi ra) ($4) teferuatê hesabdê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "passwordreset-emailtext-user": "$1 enê karberi, {{SITENAME}}  ra ($4) teferuatê hesab dê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
-       "passwordreset-emailelement": "Namey karberi: $1\nParola vêrdiye: $2",
+       "passwordreset-emailelement": "Nameyê karberi: $1\nParolaya vêrdiye: $2",
        "passwordreset-emailsent": "Yew e-posteyê esterıtışê parola rışiya.",
        "passwordreset-emailsent-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.",
        "passwordreset-emailerror-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1",
        "history-feed-item-nocomment": "$1 miyanê $2i de",
        "history-feed-empty": "Pela cıgeyrayiye çıniya.\nBeno ke ena esteriya, ya zi namê cı vuriyo.\nSeba pelanê muhimanê newan [[Special:Search|cıgeyrayışê wiki de]] bıcerebne.",
        "rev-deleted-comment": "(Timarkerdışe enay hewadeyayo)",
-       "rev-deleted-user": "(namey karberi esteriyo)",
+       "rev-deleted-user": "(nameyê karberi esteriyo)",
        "rev-deleted-event": "(fealiyetê cıkewtışi esteriyo)",
        "rev-deleted-user-contribs": "[namey karberi ya zi adresa IPy esteriya - vurnayış iştırakan ra nımniyo]",
        "rev-deleted-text-permission": "Çımraviyarnayışê ena pele '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
        "prefs-help-email": "Dayışê adresa e-postey keyfiyo, labelê seba eyarê parola lazıma, wexto ke şıma naye xo vira kerê.",
        "prefs-help-email-others": "Pera ğoya kerderi de zew link vırazése karberé bini şımaré şenê mesac bırşé. Lakin e-posta adresa şıma héç cayé de niasena.",
        "prefs-help-email-required": "E-mail adrese mecburiya.",
-       "prefs-info": "Melumata şıma",
+       "prefs-info": "Melumato bıngehên",
        "prefs-i18n": "Şar şélıg kerdış",
        "prefs-signature": "İmza",
        "prefs-dateformat": "Formatê tarixi",
        "right-writeapi": "İstıfadey APIyê nuştey",
        "right-delete": "Pele bestere",
        "right-bigdelete": "Pelanê be tarixanê dergan bestere",
-       "right-deletelogentry": "besternayış u mebesternayışa re qeyde definayışê xısusi",
-       "right-deleterevision": "Vurnayışê xısusiyê ke ê pelanê, inan bestere ya zi peyser bia",
+       "right-deletelogentry": "Qeydanê cıkewtışanê xısusiyan bestere û peyser biya",
+       "right-deleterevision": "Vurnayışanê xısusiyanê pele bestere ya zi peyser biya",
        "right-deletedhistory": "Qeydanê tarixanê esterıteyan de qayt ke, bê nuştey inan",
        "right-deletedtext": "Mabênê newede vurnayışanê esterıtiyan de qaytê nuştey esterıtey u vurnayışan ke",
        "right-browsearchive": "Pelanê esterıteyan bıgeyre",
        "right-undelete": "Jû pela esterıtiye peyser bia",
-       "right-suppressrevision": "İdarekeran ra dızdeni/miyanki, newede vurnayışan de qayt ke u newede vıraze",
+       "right-suppressrevision": "İdarekeran ra miyanki, newede vurnayışan de qayt ke u newede vıraze",
+       "right-viewsuppressed": "İdarekeran ra miyanki newede vurnayışan de qayt ke",
        "right-suppressionlog": "Rocekanê xasan bıvêne",
        "right-block": "Karberanê binan karê vurnayışi ra bloke bıke",
        "right-blockemail": "Yew karberê erşawıtışê/rıştena e-maili ra bloke bıke",
-       "right-hideuser": "Yew namey karberi  şari ra dızdeni/miyanki bloke bıke",
+       "right-hideuser": "Yew nameyê karberi şari ra miyanki bloke bıke",
        "right-ipblock-exempt": "Blokanê IPi, oto-blokan u blokanê menzıli ra ravêre",
        "right-proxyunbannable": "Blokanê otomatikiê proksiyan ra ravêre",
        "right-unblockself": "Blokeyınan ake",
        "noemailtext": "no/na karber yew e-postayo meqbul nêdawa/o",
        "nowikiemailtext": "no/na karber/e, karberanê binani ra gırewtışê e-postayi tercih nêkerd.",
        "emailnotarget": "Qandê Gêreninamey karberiyo wuna çınyo yana xırabo.",
-       "emailtarget": "Namey Karberi defiyê de.",
+       "emailtarget": "Nameyê karberiyê gırewtoği cıkewên.",
        "emailusername": "Nameyê karberi:",
        "emailusernamesubmit": "İtaet",
        "email-legend": "karberê {{SITENAME}} binan re e-posta bıerşaw",
        "emailblock": "e-mail blok biyo",
        "blocklist-nousertalk": "ti nieşken pele minaqaşe xo bivurne",
        "ipblocklist-empty": "Lista kılitkerdışi venga.",
-       "ipblocklist-no-results": "Adresa IPya waştiye ya zi namey karberi kılit nêbiyo.",
+       "ipblocklist-no-results": "Adresa IPya waştiye ya zi nameyê karberi kılit nêbiyo.",
        "blocklink": "kılit ke",
        "unblocklink": "bloki wedare",
        "change-blocklink": "kılitkerdışi bıvurne",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|mesac]])",
        "timezone-utc": "[[UTC]]",
-       "unknown_extension_tag": "Etiketê ilaweyo nêzanayey \"$1\"",
        "duplicate-defaultsort": "'''Tembe:''' Hesıbyaye sırmey ratnayış de \"$2\" sırmey ratnayış de \"$1\"i nêhesıbneno.",
        "version": "Versiyon",
        "version-extensions": "Ekstensiyonî ke ronaye",
index 82e3fdf..b064b40 100644 (file)
        "history-feed-empty": "La pàgina serchêda l'an gh'é mìa; la pré èser stēda scanşlêda dal sît o gh'é stê cambiê nòm. Verifichêr cun [[Special:Search|pàgina 'd sèirca]] se gh'é dal pàgini nōvi.",
        "rev-deleted-comment": "(argumèint ed la mudéfica armôs)",
        "rev-deleted-user": "(nòm utèint armôs)",
-       "rev-deleted-event": "(asiòun dal log armôsa)",
+       "rev-deleted-event": "(particulêr dal log armôs)",
        "rev-deleted-user-contribs": "(nòm utèint o indirés IP armôs - mudéfica lughêda da la stòria)",
        "rev-deleted-text-permission": "Cla versiòun ché 'd la pàgina l'é stêda <strong> scanşlêda </strong>. \nConsultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.",
        "rev-suppressed-text-permission": "Cla versiòun ché 'd la pàgina l'é stêda <strong> scanşlêda </strong>. Consultêr al [{{fullurl:{{#Special:Log}}/ suppress |page={{ FULLPAGENAMEE }}}} log dal canşladûri] per nōv particulêr.",
        "right-markbotedits": "Sègna al mudéfichi da turnêr a mèter cme préma cme fâti da 'na mâchina in avtomâtich",
        "right-noratelimit": "An n'é mìa ublighê al lémit 'd asiòun",
        "right-import": "Côpia dal pàgini da 'd j êter wiki",
+       "right-importupload": "Zuntêr da pàgini da un file carghê.",
+       "right-patrol": "Sègna al mudéfichi 'd j êter utèint cme verifichêdi",
+       "right-autopatrol": "Sègna in avtomâtich al mudéfichi che t'é fât cme verifichêdi",
+       "right-patrolmarks": "Drōva la funsiòun ed veréfica dal j ûltmi mudéfichi",
+       "right-unwatchedpages": "Fa vèder un elèinch ed pàgini mìa guardêdi",
+       "right-mergehistory": "Al mèt insèm la stôria dal pàgini",
+       "right-userrights": "Mudéfica i dirét ed l'utèint",
+       "right-userrights-interwiki": "Mudéfica i dirét ed j êter utèint 'd êtri wiki",
+       "right-siteadmin": "Blōca e şblōca al databêş",
+       "right-override-export-depth": "Pôrta fōra al pàgini cun insèm al pàgini coleghêdi per 'na larghèsa ed 5",
+       "right-sendemail": "Spidés pôsta eletrônica a êter utèint",
        "newuserlogpage": "Utèint nōv",
        "action-read": "lēzer cla pàgina ché",
        "action-edit": "Mudifichêr cla pàgina ché",
index 583fc5d..8fc9cf2 100644 (file)
        "anoneditwarning": "<strong>Warning:</strong> You are not logged in. Your IP address will be publicly visible if you make any edits. If you <strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
        "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
        "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
-       "selfredirect": "<strong>Warning:</strong> You are creating redirect to the same article.\nIf you click \"{{int:savearticle}}\" again, the redirect will be created.",
+       "selfredirect": "<strong>Warning:</strong> You are redirecting this page to itself.\nYou may have specified the wrong target for the redirect, or you may be editing the wrong page.\nIf you click \"{{int:savearticle}}\" again, the redirect will be created anyway.",
        "missingcommenttext": "Please enter a comment below.",
        "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject/headline for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
        "summary-preview": "Summary preview:",
        "content-model-text": "plain text",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
+       "content-json-empty-object": "Empty object",
+       "content-json-empty-array": "Empty array",
        "duplicate-args-category": "Pages using duplicate arguments in template calls",
        "duplicate-args-category-desc": "The page contains template calls that use duplicates of arguments, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Warning:</strong> This page contains too many expensive parser function calls.\n\nIt should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.",
        "history-feed-empty": "The requested page does not exist.\nIt may have been deleted from the wiki, or renamed.\nTry [[Special:Search|searching on the wiki]] for relevant new pages.",
        "rev-deleted-comment": "(edit summary removed)",
        "rev-deleted-user": "(username removed)",
-       "rev-deleted-event": "(log action removed)",
+       "rev-deleted-event": "(log details removed)",
        "rev-deleted-user-contribs": "[username or IP address removed - edit hidden from contributions]",
        "rev-deleted-text-permission": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "rev-suppressed-text-permission": "This page revision has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
        "revdelete-legend": "Set visibility restrictions",
        "revdelete-hide-text": "Revision text",
        "revdelete-hide-image": "Hide file content",
-       "revdelete-hide-name": "Hide action and target",
+       "revdelete-hide-name": "Hide target and parameters",
        "revdelete-hide-comment": "Edit summary",
        "revdelete-hide-user": "Editor's username/IP address",
        "revdelete-hide-restricted": "Suppress data from administrators as well as others",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
        "signature-anon": "[[{{#special:Contributions}}/$1|$2]]",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Unknown extension tag \"$1\"",
        "duplicate-defaultsort": "<strong>Warning:</strong> Default sort key \"$2\" overrides earlier default sort key \"$1\".",
        "duplicate-displaytitle": "<strong>Warning:</strong> Display title \"$2\" overrides earlier display title \"$1\".",
        "invalid-indicator-name": "<strong>Error:</strong> Page status indicators' <code>name</code> attribute must not be empty.",
index 4564aac..624a792 100644 (file)
        "anoneditwarning": "<strong>Advertencia:</strong> No has iniciado sesión. Tu dirección IP será visible públicamente si haces cualquier edición. Si <strong>[$1 inicias sesión]</strong> o <strong>[$2 creas una cuenta]</strong>, tus ediciones se atribuirán a tu nombre de usuario, junto con otros beneficios.",
        "anonpreviewwarning": "<em>No has iniciado sesión. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de esta página.</em>",
        "missingsummary": "<strong>Recordatorio:</strong> No has escrito un resumen de edición.\nSi haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
+       "selfredirect": "<strong>Advertencia:</strong> estás redirigiendo esta página a sí misma.\nPuedes haber especificado erróneamente el destino de la redirección o puedes estar editando la página equivocada.\nSi haces clic de nuevo en \"{{int:savearticle}}\", la redirección se creará de todas maneras.",
        "missingcommenttext": "Escribe un comentario a continuación.",
        "missingcommentheader": "<strong>Recordatorio:</strong> No has escrito un asunto/encabezado para este comentario.\nSi haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
        "summary-preview": "Previsualización del resumen:",
        "history-feed-empty": "La página solicitada no existe.\nPuede haber sido borrada del wiki o renombrada.\nPrueba a [[Special:Search|buscar en el wiki]] nuevas páginas relevantes.",
        "rev-deleted-comment": "(resumen de edición eliminado)",
        "rev-deleted-user": "(nombre de usuario eliminado)",
-       "rev-deleted-event": "(entrada borrada)",
+       "rev-deleted-event": "(detalles del registro eliminados)",
        "rev-deleted-user-contribs": "[nombre de usuario o dirección IP eliminada - edición ocultada de la lista de contribuciones]",
        "rev-deleted-text-permission": "Esta revisión de la página ha sido '''borrada'''.\nPuede haber detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
        "rev-suppressed-text-permission": "Esta revisión de la página se <strong>suprimió</strong>.\nLos detalles se pueden ver en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresión].",
        "revdelete-legend": "Establecer restricciones de revisión:",
        "revdelete-hide-text": "Texto de la revisión",
        "revdelete-hide-image": "Ocultar el contenido del archivo",
-       "revdelete-hide-name": "Ocultar acción y objetivo",
+       "revdelete-hide-name": "Ocultar objetivo y parámetros.",
        "revdelete-hide-comment": "Resumen de edición",
        "revdelete-hide-user": "Nombre/IP del editor",
        "revdelete-hide-restricted": "Suprimir datos a los administradores así como al resto",
        "watchlisttools-edit": "Ver y editar tu lista de seguimiento",
        "watchlisttools-raw": "Editar lista de seguimiento en crudo",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discusión]])",
-       "unknown_extension_tag": "Etiqueta desconocida «$1»",
        "duplicate-defaultsort": "'''Atención:''' La clave de ordenamiento predeterminada «$2» anula la clave de ordenamiento anterior «$1».",
        "duplicate-displaytitle": "<strong>Advertencia:</strong> El título visualizado \"$2\" sobreescribe al anterior \"$1\".",
        "invalid-indicator-name": "<strong>Error:</strong> el atributo <code>name</code> de los indicadores de estado de página no debe estar vacío.",
index dd05717..a7eaea2 100644 (file)
        "anoneditwarning": "<strong>Hoiatus:</strong> Sa pole sisse logitud. Sinu IP-aadress on kõigile nähtav, kui muudatusi teed. Kui <strong>[$1 logid sisse]</strong> või <strong>[$2 lood konto]</strong>, siis teiste eeliste seas omistatakse sinu muudatused sulle kasutajanime järgi.",
        "anonpreviewwarning": "''Sa pole sisse logitud. Selle lehe redigeerimislogisse salvestatakse su IP-aadress.''",
        "missingsummary": "'''Meeldetuletus:''' Sa ei ole lisanud muudatuse resümeed.\nKui vajutad uuesti salvestamise nupule, salvestatakse muudatus ilma resümeeta.",
-       "selfredirect": "<strong>Hoiatus:</strong> Teed ümbersuunamise samasse artiklisse.\nÜmbersuunamine luuakse, kui klõpsad uuesti \"{{int:savearticle}}\".",
+       "selfredirect": "<strong>Hoiatus:</strong> Suunad selle lehekülje iseeneda juurde.\nVõimalik, et oled määranud ümbersuunamise jaoks vale sihtleheküljeks või redigeerid vale lehekülge.\nÜmbersuunamine luuakse sellest hoolimata, kui klõpsad uuesti \"{{int:savearticle}}\".",
        "missingcommenttext": "Palun sisesta siit allapoole kommentaar.",
        "missingcommentheader": "'''Meeldetuletus:''' Sa pole kirjutanud kommentaarile teemat ega pealkirja.\nKui klõpsad uuesti \"{{int:savearticle}}\", salvestatakse su kommentaar kummatagi.",
        "summary-preview": "Resümee eelvaade:",
        "content-model-text": "lihttekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Tühi objekt",
+       "content-json-empty-array": "Tühi massiiv",
        "duplicate-args-category": "Leheküljed, kus mallikutses on topeltargument",
        "duplicate-args-category-desc": "Lehekülg sisaldab mallikutseid, kus mõnd argumenti on kasutatud mitu korda, näiteks <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> või <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Hoiatus:''' See lehekülg kasutab liialt palju aeglustavaid laiendusfunktsioone. Neid võiks kasutada vähem kui {{PLURAL:$2|ühel|$2}} korral, praegu on kasutatud {{PLURAL:$1|ühel|$1}} korral.",
        "history-feed-empty": "Soovitud lehekülge ei ole olemas.\nSee võib olla vikist kustutatud või ümber nimetatud.\nÜrita [[Special:Search|vikist otsida]] teemakohaseid lehekülgi.",
        "rev-deleted-comment": "(muudatuse resümee eemaldatud)",
        "rev-deleted-user": "(kasutajanimi eemaldatud)",
-       "rev-deleted-event": "(logitoiming eemaldatud)",
+       "rev-deleted-event": "(logi üksikasjad eemaldatud)",
        "rev-deleted-user-contribs": "[kasutajanimi või IP-aadress eemaldatud – muudatust ei näidata]",
        "rev-deleted-text-permission": "See lehekülje redaktsioon on '''kustutatud'''.\nÜksikasju võib olla [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kustutamise logis].",
        "rev-suppressed-text-permission": "Lehekülje see redaktsioon on <strong>varjatud</strong>.\nÜksikasju leiad [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} varjamislogist].",
        "revdelete-legend": "Nähtavuse piirangute seadmine",
        "revdelete-hide-text": "Redaktsiooni tekst",
        "revdelete-hide-image": "Peida faili sisu",
-       "revdelete-hide-name": "Peida toiming ja selle objekt",
+       "revdelete-hide-name": "Peida toimingu objekt ja parameetrid",
        "revdelete-hide-comment": "Resümee",
        "revdelete-hide-user": "Toimetaja kasutajanimi või IP-aadress",
        "revdelete-hide-restricted": "Varja andmeid nii administraatorite kui ka teiste eest.",
        "thumbnail-temp-create": "Ajutist pisipildifaili ei õnnestu luua.",
        "thumbnail-dest-create": "Pisipilti ei õnnestu sihtkohas salvestada",
        "thumbnail_invalid_params": "Vigased pisipildi parameetrid",
+       "thumbnail_toobigimagearea": "Faili mõõtmed on suuremad kui $1",
        "thumbnail_dest_directory": "Sihtkataloogi loomine ebaõnnestus.",
        "thumbnail_image-type": "Selline pildi tüüp ei ole toetatav",
        "thumbnail_gd-library": "GD teegi häälestus on poolik: funktsioon $1 puudub",
        "watchlisttools-edit": "Vaata ja redigeeri jälgimisloendit",
        "watchlisttools-raw": "Muuda lähteteksti",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|arutelu]])",
-       "unknown_extension_tag": "Tundmatu lisa silt \"$1\".",
        "duplicate-defaultsort": "'''Hoiatus:''' Järjestamisvõti \"$2\" tühistab eespool oleva järjestamisvõtme \"$1\".",
        "duplicate-displaytitle": "<strong>Hoiatus:</strong> Kuvatava pealkirjaga \"$2\" kirjutatakse üle varasem kuvatav pealkiri \"$1\".",
        "invalid-indicator-name": "<strong>Tõrge:</strong> Lehekülje olekunäidu juures ei tohi atribuudi <code>name</code> väärtus puududa.",
index eaea3f6..d094ad0 100644 (file)
        "revdel-restore": "تغییر پیدایی",
        "pagehist": "تاریخچهٔ صفحه",
        "deletedhist": "تاریخچهٔ حذف‌شده",
-       "revdelete-hide-current": "خطا در پنهان‌کردن مورد مورخ $2 ساعت $1: این نسخه، نسخهٔ اخیر است و قابل پنهان‌کردن نیست.",
-       "revdelete-show-no-access": "خطا در پنهانکردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.",
-       "revdelete-modify-no-access": "خطا در پنهانکردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.",
-       "revdelete-modify-missing": "خطا در پنهانکردن مورد شمارهٔ $1: این نسخه در پایگاه داده وجود ندارد!",
+       "revdelete-hide-current": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه، نسخهٔ اخیر است و قابل پنهان کردن نیست.",
+       "revdelete-show-no-access": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.",
+       "revdelete-modify-no-access": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.",
+       "revdelete-modify-missing": "خطا در پنهان کردن مورد شمارهٔ $1: این نسخه در پایگاه داده وجود ندارد!",
        "revdelete-no-change": "'''هشدار:''' مورد مورخ $2 ساعت $1 از قبل تنظیمات پیدایی درخواست شده را دارا بود.",
-       "revdelete-concurrent-change": "خطا در پنهانکردن مورد مورخ $2 ساعت $1: به نظر می‌رسد که در مدتی که شما برای تغییر وضعیت آن تلاش می‌کردید وضعیت آن توسط فرد دیگری تغییر یافته است.\nلطفاً سیاهه‌ها را بررسی کنید.",
+       "revdelete-concurrent-change": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: به نظر می‌رسد که در مدتی که شما برای تغییر وضعیت آن تلاش می‌کردید وضعیت آن توسط فرد دیگری تغییر یافته است.\nلطفاً سیاهه‌ها را بررسی کنید.",
        "revdelete-only-restricted": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: شما نمی‌توانید موارد را از دید مدیران پنهان کنید مگر آن که یکی دیگر از گزینه‌های پنهان‌سازی را نیز انتخاب کنید.",
        "revdelete-reason-dropdown": "*دلایل متداول حذف\n** نقض حق تکثیر\n** اظهار نظر یا اطلاعات فردی نامناسب\n** نام کاربری نامناسب\n** اطلاعات به طور بالقوه افتراآمیز",
        "revdelete-otherreason": "دلیل دیگر/اضافی:",
        "right-suppressionlog": "مشاهدهٔ سیاهه‌های خصوصی",
        "right-block": "قطع دسترسی ویرایشی دیگر کاربران",
        "right-blockemail": "قطع دسترسی دیگر کاربران برای ارسال رایانامه",
-       "right-hideuser": "قطع دسترسی کاربر و پنهانکردن آن از دید عموم",
+       "right-hideuser": "قطع دسترسی کاربر و پنهان کردن آن از دید عموم",
        "right-ipblock-exempt": "تاثیر نپذیرفتن از قطع دسترسی‌های آی‌پی، خودکار یا فاصله‌ای",
        "right-proxyunbannable": "تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسی‌ها",
        "right-unblockself": "بازکردن دسترسی خود",
        "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
-       "rcshowhideminor-hide": "پنهانکردن",
+       "rcshowhideminor-hide": "پنهان کردن",
        "rcshowhidebots": "$1 ربات‌ها",
        "rcshowhidebots-show": "نمایش",
-       "rcshowhidebots-hide": "پنهانکردن",
+       "rcshowhidebots-hide": "پنهان کردن",
        "rcshowhideliu": "$1 کاربران ثبت‌نام‌کردە",
        "rcshowhideliu-show": "نمایش",
-       "rcshowhideliu-hide": "پنهانکردن",
+       "rcshowhideliu-hide": "پنهان کردن",
        "rcshowhideanons": "$1 کاربران ناشناس",
        "rcshowhideanons-show": "نمایش",
-       "rcshowhideanons-hide": "پنهانکردن",
+       "rcshowhideanons-hide": "پنهان کردن",
        "rcshowhidepatr": "$1 ویرایش‌های گشت‌خورده",
        "rcshowhidepatr-show": "نمایش",
-       "rcshowhidepatr-hide": "پنهانکردن",
+       "rcshowhidepatr-hide": "پنهان کردن",
        "rcshowhidemine": "$1 ویرایش‌های من",
        "rcshowhidemine-show": "نمایش",
-       "rcshowhidemine-hide": "پنهانکردن",
+       "rcshowhidemine-hide": "پنهان کردن",
        "rclinks": "نمایش آخرین $1 تغییر در $2 روز اخیر<br />$3",
        "diff": "تفاوت",
        "hist": "تاریخچه",
        "protectedpages-indef": "فقط محافظت‌های بی‌پایان",
        "protectedpages-summary": "در این صفحه فهرست صفحات موجود است که در حال حاضر محافظت شده اند. برای فهرست عنوان‌هایی که از ایجاد محافظت شده‌اند، به [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] مراجعه کنید.",
        "protectedpages-cascade": "فقط محافظت‌های آبشاری",
-       "protectedpages-noredirect": "پنهانکردن تغییر مسیرها",
+       "protectedpages-noredirect": "پنهان کردن تغییر مسیرها",
        "protectedpagesempty": "در حال حاضر هیچ‌صفحه‌ای محافظت نشده‌است.",
        "protectedpages-timestamp": "برچسب زمان",
        "protectedpages-page": "صفحه",
        "blocklist": "کاربران بسته‌شده",
        "ipblocklist": "کاربران بسته‌شده",
        "ipblocklist-legend": "جستجوی کاربر بسته شده",
-       "blocklist-userblocks": "پنهانکردن بسته‌شدن‌های حساب",
-       "blocklist-tempblocks": "پنهانکردن بستن‌های موقت",
-       "blocklist-addressblocks": "پنهانکردن تک آی‌پی‌های بسته شده",
+       "blocklist-userblocks": "پنهان کردن بسته‌شدن‌های حساب",
+       "blocklist-tempblocks": "پنهان کردن بستن‌های موقت",
+       "blocklist-addressblocks": "پنهان کردن تک آی‌پی‌های بسته شده",
        "blocklist-rangeblocks": "پنهان کردنی قطع دسترسی بازه‌ها",
        "blocklist-timestamp": "برچسب زمان",
        "blocklist-target": "هدف",
        "sorbsreason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.",
        "sorbs_create_account_reason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.\nشما اجازهٔ ساختن حساب کاربری ندارید.",
        "xffblockreason": "نشانی آی‌پی در X-Forwarded-For header موجود است و پروکسی شما یا سروری که از آن استفاده می‌کنید بسته‌شده‌است. دلیل بسته‌شدن: $1",
-       "cant-see-hidden-user": "کاربری که می‌خواهید ببندید قبلاً بسته شده و پنهان گردیده‌است. چون شما دسترسی پنهان‌کردن کاربران را ندارید، نمی‌توانید قطع دسترسی کاربر را ببینید یا ویرایش کنید.",
+       "cant-see-hidden-user": "کاربری که می‌خواهید ببندید قبلاً بسته شده و پنهان گردیده است. چون شما دسترسی پنهان کردن کاربران را ندارید، نمی‌توانید قطع دسترسی کاربر را ببینید یا ویرایش کنید.",
        "ipbblocked": "شما نمی‌توانید دسترسی دیگر کاربران را ببندید یا باز کنید زیرا دسترسی خودتان بسته است.",
        "ipbnounblockself": "شما مجاز به باز کردن دسترسی خود نیستید.",
        "lockdb": "قفل کردن پایگاه داده",
        "hebrew-calendar-m11-gen": "آب",
        "hebrew-calendar-m12-gen": "ایلول",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|بحث]])",
-       "unknown_extension_tag": "برچسب ناشناختهٔ افزونه «$1»",
        "duplicate-defaultsort": "هشدار: ترتیب پیش‌فرض «$2» ترتیب پیش‌فرض قبلی «$1» را باطل می‌کند.",
        "duplicate-displaytitle": "<strong>هشدار:</strong> نمایش عنوان \" $2 \"باعث ابطال پیش نمایش عنوان\" $1 \" می‌شود.",
        "invalid-indicator-name": "<strong>خطا:</strong>ویژگی های شاخص‌های وضعیت صفحهٔ <code>name</code> نباید خالی باشند.",
index 79a45ea..62b1d63 100644 (file)
        "anoneditwarning": "<strong>Varoitus:</strong> Et ole kirjautunut sisään. IP-osoitteesi näkyy julkisesti kaikille, jos muokkaat. Jos <strong>[$1 kirjaudut sisään]</strong> tai <strong>[$2 luot tunnuksen]</strong>, muokkauksesi kirjataan käyttäjätunnuksesi tekemiksi ja samalla saat käyttöösi hyödyllisiä välineitä.",
        "anonpreviewwarning": "''Et ole kirjautunut sisään. Tallentaminen kirjaa IP-osoitteesi tämän sivun muutoshistoriaan.''",
        "missingsummary": "Et ole antanut yhteenvetoa. Jos valitset Tallenna uudelleen, niin muokkauksesi tallennetaan ilman yhteenvetoa.",
-       "selfredirect": "<strong>Varoitus:</strong> Olet tekemässä uudelleenohjausta samaan artikkeliin. Jos painat toimintoa \"{{int:savearticle}}\" uudestaan, tämä ohjaussivu luodaan.",
+       "selfredirect": "<strong>Varoitus:</strong> Olet tekemässä uudelleenohjausta, joka johtaa tästä sivusta tähän samaan sivuun. \n\nOlet ehkä määrittänyt ohjauksen kohteen väärin tai kenties muokkaat parhaillaan väärää sivua.\n\nJos painat toimintoa \"{{int:savearticle}}\" uudestaan, tämä ohjaussivu luodaan joka tapauksessa.",
        "missingcommenttext": "Kirjoita viesti alle.",
        "missingcommentheader": "Et ole antanut otsikkoa kommentillesi. Napsauta ”{{int:savearticle}}”, jos et halua antaa otsikkoa.",
        "summary-preview": "Yhteenvedon esikatselu:",
        "content-model-text": "pelkkä teksti",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Tyhjä objekti",
+       "content-json-empty-array": "Tyhjä array",
        "duplicate-args-category": "Sivut, jotka käyttävät kaksinkertaisia argumentteja mallinekutsuissa",
        "duplicate-args-category-desc": "Tämä sivu sisältää sellaisia mallinekutsuja, jotka käyttävät kaksi kertaa samaa argumenttia kuten <nowiki>{{foo|bar=1|bar=2}}</nowiki></code> taikka <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Tällä sivulla on liian monta hitaiden laajennusfunktioiden kutsua.\nKutsuja pitäisi olla alle $2 {{PLURAL:$2|kappale|kappaletta}}, mutta nyt niitä on $1 {{PLURAL:$1|kappale|kappaletta}}.",
        "history-feed-empty": "Pyydettyä sivua ei ole olemassa.\nSe on saatettu poistaa wikistä tai nimetä uudelleen.\nKokeile [[Special:Search|hakua]] löytääksesi asiaan liittyviä sivuja.",
        "rev-deleted-comment": "(muokkausyhteenveto poistettu)",
        "rev-deleted-user": "(käyttäjänimi poistettu)",
-       "rev-deleted-event": "(lokitapahtuma poistettu)",
+       "rev-deleted-event": "(lokitiedot poistettu)",
        "rev-deleted-user-contribs": "[käyttäjätunnus tai IP-osoite poistettu – muokkaus on piilotettu muokkausluettelosta]",
        "rev-deleted-text-permission": "Tämä versio sivusta on '''poistettu'''.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
        "rev-suppressed-text-permission": "Tämä versio sivusta on <strong>häivytetty</strong>.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  häivytyslokista].",
        "revdelete-legend": "Aseta version näkyvyyden rajoitukset",
        "revdelete-hide-text": "Piilota version tekstisisältö",
        "revdelete-hide-image": "Piilota tiedoston sisältö",
-       "revdelete-hide-name": "Piilota toiminto ja kohde",
+       "revdelete-hide-name": "Piilota kohde ja parametrit",
        "revdelete-hide-comment": "Piilota yhteenveto",
        "revdelete-hide-user": "Piilota tekijän tunnus tai IP-osoite",
        "revdelete-hide-restricted": "Häivytä tiedot sekä ylläpitäjien että muiden käyttäjien näkyviltä",
        "thumbnail-temp-create": "Väliaikaisen esikatselukuvan luonti epäonnistui",
        "thumbnail-dest-create": "Esikatselukuvaa ei voitu tallentaa kohteeseen",
        "thumbnail_invalid_params": "Virheelliset parametrit pienoiskuvalle",
+       "thumbnail_toobigimagearea": "Tiedosto, jonka mitat ovat suuremmat kuin $1",
        "thumbnail_dest_directory": "Kohdehakemiston luominen ei onnistunut",
        "thumbnail_image-type": "Kuvamuoto ei ole tuettu",
        "thumbnail_gd-library": "GD-kirjastoa ei ole asennettu oikein. Funktio $1 puuttuu.",
        "watchlisttools-edit": "Katso ja muokkaa tarkkailulistaa",
        "watchlisttools-raw": "Muokkaa listaa raakamuodossa",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|keskustelu]])",
-       "unknown_extension_tag": "Tuntematon laajennuskoodi ”$1”.",
        "duplicate-defaultsort": "'''Varoitus:''' Oletuslajitteluavain ”$2” korvaa aiemman oletuslajitteluavaimen ”$1”.",
        "duplicate-displaytitle": "<strong>Varoitus:</strong> Näytettävä otsikko \"$2\" päällekirjoittaa edellisen otsikon \"$1\".",
        "invalid-indicator-name": "<strong>Virhe:</strong> Sivun tilan osoittimien attribuutti <code>name</code> ei saa olla tyhjä.",
index cf58229..00b2cf6 100644 (file)
        "anoneditwarning": "<strong>Attention :</strong> Vous n’êtes pas connecté. Votre adresse IP sera visible de tout le monde si vous faites des modifications. Si vous <strong>[$1 vous connectez]</strong> ou <strong>[$2 créez un compte]</strong>, vos modifications seront attribuées à votre nom d’utilisateur, entre autres avantages.",
        "anonpreviewwarning": "''Vous n’êtes pas identifié(e). Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.''",
        "missingsummary": "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
-       "selfredirect": "<strong>Attention :</strong> Vous êtes en train de créer une redirection vers le même article.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la redirection sera créée.",
+       "selfredirect": "<strong>Attention :</strong> Vous êtes en train de rediriger la page vers elle-même.\nVous pouvez avoir spécifié la mauvaise cible pour la redirection, ou vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la redirection sera créée tout de même.",
        "missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
        "missingcommentheader": "'''Rappel :''' vous n'avez pas fourni de sujet ou de titre à ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans titre.",
        "summary-preview": "Aperçu du résumé :",
        "content-model-text": "texte brut",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objet vide",
+       "content-json-empty-array": "Tableau vide",
        "duplicate-args-category": "Pages utilisant des arguments dupliqués dans les appels de modèle",
        "duplicate-args-category-desc": "La page contient des appels de modèle qui utilisent des arguments dupliqués, comme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Attention : cette page contient de trop nombreux appels à des fonctions coûteuses de l'analyseur syntaxique.\n\nIl devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu'il y en a maintenant $1.",
        "history-feed-empty": "La page demandée n'existe pas.\nElle a peut-être été effacée ou renommée.\nEssayez de [[Special:Search|rechercher sur le wiki]] pour trouver des pages en rapport.",
        "rev-deleted-comment": "(résumé de modification retiré)",
        "rev-deleted-user": "(nom d'utilisateur retiré)",
-       "rev-deleted-event": "(entrée retirée)",
+       "rev-deleted-event": "(détails de l’entrée retirée)",
        "rev-deleted-user-contribs": "[nom d'utilisateur ou adresse IP retiré - modification masquée sur les contributions]",
        "rev-deleted-text-permission": "Cette version de la page a été '''effacée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
        "rev-suppressed-text-permission": "Cette version de la page a été <strong>supprimée</strong>.\nLes détails se trouvent dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des suppressions].",
        "revdelete-legend": "Mettre en place des restrictions de visibilité :",
        "revdelete-hide-text": "Texte de la révision",
        "revdelete-hide-image": "Masquer le contenu du fichier",
-       "revdelete-hide-name": "Masquer l'action et la cible",
+       "revdelete-hide-name": "Masquer la cible et les paramètres",
        "revdelete-hide-comment": "Modifier le résumé",
        "revdelete-hide-user": "Nom d’utilisateur/Adresse IP de l’éditeur",
        "revdelete-hide-restricted": "Supprimer ces données aux administrateurs ainsi qu'aux autres",
        "thumbnail-temp-create": "Impossible de créer le fichier de vignette temporaire",
        "thumbnail-dest-create": "Impossible d'enregistrer la vignette sur la destination",
        "thumbnail_invalid_params": "Paramètres de la miniature incorrects",
+       "thumbnail_toobigimagearea": "Fichier avec des dimensions supérieures à $1",
        "thumbnail_dest_directory": "Impossible de créer le répertoire de destination",
        "thumbnail_image-type": "Type d'image non supporté",
        "thumbnail_gd-library": "Configuration incomplète de la bibliothèque GD : fonction $1 introuvable",
        "hebrew-calendar-m11-gen": "Av",
        "hebrew-calendar-m12-gen": "Éloul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
-       "unknown_extension_tag": "Balise d’extension « $1 » inconnue",
        "duplicate-defaultsort": "Attention : la clé de tri par défaut « $2 » écrase la précédente clé « $1 ».",
        "duplicate-displaytitle": "<strong>Attention :</strong> Le titre d'affichage «$2» remplace l'ancien titre d'affichage «$1».",
        "invalid-indicator-name": "<strong>Erreur :</strong> L’attribut <code>name</code> des indicateurs d’état de la page ne doit pas être vide.",
index 4754b14..0a8e4d3 100644 (file)
        "anoneditwarning": "<strong>Aviso:</strong> Non accedeu ao sistema. O seu enderezo IP será rexistado no histórico de edicións desta páxina. Se <strong>[$1 accede ao sistema]</strong> ou <strong>[$2 crea unha conta]</strong>, as súas edicións serán rexistadas co seu nome de usuario, ademais doutros beneficios.",
        "anonpreviewwarning": "''Non accedeu ao sistema. Se garda a páxina, o seu enderezo IP quedará rexistrado no historial de edicións.''",
        "missingsummary": "'''Aviso:''' Esqueceu incluír o texto do campo resumo.\nSe preme en \"{{int:savearticle}}\" a súa edición gardarase sen ningunha descrición da edición.",
-       "selfredirect": "<strong>Atención:</strong> Está a crear unha redireción cara o mesmo artigo. Se preme \"{{int:savearticle}}\" de novo, crearase a redireción.",
+       "selfredirect": "<strong>Atención:</strong> Está redirecionando esta páxina a ela mesma. Vostede pode ter especificado a páxina incorrecta para a redireción, ou pode que estea a editar a páxina incorrecta. Se preme \"{{int:savearticle}}\" de novo, crearase a redireción de tódolos xeitos.",
        "missingcommenttext": "Por favor, escriba un comentario a continuación.",
        "missingcommentheader": "'''Aviso:''' Non escribiu ningún texto no asunto/título deste comentario.\nSe preme sobre \"{{int:savearticle}}\", a súa edición gardarase sen el.",
        "summary-preview": "Vista previa do resumo:",
        "content-model-text": "texto simple",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Obxecto baleiro",
+       "content-json-empty-array": "Matriz baleira",
        "duplicate-args-category": "Páxinas con argumentos duplicados nas chamadas aos modelos",
        "duplicate-args-category-desc": "Esta páxina contén as chamadas aos modelos que utilizan argumentos duplicados, como <code><nowiki>{{exemplo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{exemplo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Aviso:''' Esta páxina contén demasiadas chamadas a funcións analíticas custosas.\n\nDebe ter menos {{PLURAL:$2|dunha chamada|de $2 chamadas}}, e agora hai $1.",
        "history-feed-empty": "A páxina solicitada non existe.\nPuido borrarse ou moverse a outro nome.\nProbe a [[Special:Search|buscar no wiki]] para atopar as páxinas relacionadas.",
        "rev-deleted-comment": "(resumo de edición eliminado)",
        "rev-deleted-user": "(nome de usuario eliminado)",
-       "rev-deleted-event": "(entrada eliminada)",
+       "rev-deleted-event": "(detalles do rexistro eliminados)",
        "rev-deleted-user-contribs": "[nome de usuario ou enderezo IP eliminado; edición agochada das contribucións]",
        "rev-deleted-text-permission": "Esta revisión da páxina foi '''borrada'''.\nPode ampliar os detalles no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados].",
        "rev-suppressed-text-permission": "Esta revisión da páxina foi <strong>suprimida</strong>.\nPode ampliar os detalles no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rexistro de supresións].",
        "revdelete-legend": "Aplicar restricións de visibilidade",
        "revdelete-hide-text": "Texto da revisión",
        "revdelete-hide-image": "Agochar o contido do ficheiro",
-       "revdelete-hide-name": "Agochar a acción e o destino",
+       "revdelete-hide-name": "Agochar destino e parámetros",
        "revdelete-hide-comment": "Resumo de edición",
        "revdelete-hide-user": "Nome de usuario ou enderezo IP do editor",
        "revdelete-hide-restricted": "Eliminar os datos da vista dos administradores así coma da doutros",
        "thumbnail-temp-create": "Non se puido crear o ficheiro de miniatura temporal",
        "thumbnail-dest-create": "Non se puido gardar a miniatura no destino",
        "thumbnail_invalid_params": "Parámetros de miniatura non válidos",
+       "thumbnail_toobigimagearea": "Ficheiro con dimensións maiores que $1",
        "thumbnail_dest_directory": "Non se puido crear o directorio de destino",
        "thumbnail_image-type": "Tipo de imaxe non soportado",
        "thumbnail_gd-library": "Configuración da libraría GD incompleta: Falta a función $1",
        "watchlisttools-edit": "Ver e editar a lista de vixilancia",
        "watchlisttools-raw": "Editar a lista de vixilancia simple",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|conversa]])",
-       "unknown_extension_tag": "Etiqueta de extensión descoñecida \"$1\"",
        "duplicate-defaultsort": "<strong>Aviso:</strong> A clave de ordenación por defecto \"$2\" anula a clave de ordenación anterior por defecto \"$1\".",
        "duplicate-displaytitle": "'''Aviso:''' O título mostrado \"$2\" anula o título anterior \"$1\".",
        "invalid-indicator-name": "<strong>Erro:</strong> O atributo <code>name</code> dos indicadores do estado da páxina non pode estar baleiro.",
index 0fc292d..1089aed 100644 (file)
        "anoneditwarning": "<strong>אזהרה:</strong> אינכם מחוברים לחשבון. כתובת ה־IP שלכם תוצג בפומבי אם תבצעו עריכות כלשהן. אם <strong>[$1 תיכנסו לחשבון]</strong> או <strong>[$2 תיצרו חשבון]</strong>, העריכות שלכם תיוחסנה לשם המשתמש שלכם ותקבלו גם יתרונות אחרים.",
        "anonpreviewwarning": "''אינכם מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.''",
        "missingsummary": "<strong>תזכורת:</strong> לא הזנת תקציר עריכה.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר בלעדיו.",
-       "selfredirect": "<strong>×\90×\96×\94ר×\94:</strong> × ×\99ס×\99ת ×\9c×\99צ×\95ר ×\94פנ×\99×\94 ×\9e×\93×£ ×\96×\94 ×\9cעצ×\9e×\95.\n×\9c×\97×\99צ×\94 ×\97×\95×\96רת ×¢×\9c ×\94×\9bפת×\95ר \"{{int:savearticle}}\" ×ª×\92ר×\95×\9d ×\9c×\94פנ×\99×\94 ×\9c×\94×\99×\95×\95צר.",
+       "selfredirect": "<strong>×\90×\96×\94ר×\94:</strong> × ×\99ס×\99ת ×\9c×\99צ×\95ר ×\94פנ×\99×\94 ×\9e×\93×£ ×\96×\94 ×\9cעצ×\9e×\95.\n×\90×\95×\9c×\99 ×\9bת×\91ת ×\99×¢×\93 ×©×\92×\95×\99 ×\9c×\94פנ×\99×\94, ×\95×\90×\95×\9c×\99 ×¢×¨×\9bת ×\90ת ×\94×\93×£ ×\94×\9c×\90Ö¾× ×\9b×\95×\9f.\n×\9c×\97×\99צ×\94 ×\97×\95×\96רת ×¢×\9c ×\94×\9bפת×\95ר \"{{int:savearticle}}\" ×ª×\92ר×\95×\9d ×\9c×\94פנ×\99×\94 ×\9c×\94×\99×\95×\95צר ×\91×\9b×\9c ×\96×\90ת.",
        "missingcommenttext": "יש להקליד את ההודעה למטה.",
        "missingcommentheader": "<strong>תזכורת:</strong> לא הזנת נושא/כותרת להודעה זו.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר ללא נושא/כותרת.",
        "summary-preview": "תצוגה מקדימה של התקציר:",
        "content-model-text": "טקסט פשוט",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "אוביקט ריק",
+       "content-json-empty-array": "מערך ריק",
        "duplicate-args-category": "דפים שמשתמשים בפרמטרים כפולים בקריאות לתבניות",
        "duplicate-args-category-desc": "הדף מכיל קריאות לתבניות שמשתמשות בפרמטרים כפולים, כגון <code><nowiki>{{תאריך|יום=1|יום=2}}</nowiki></code> או <code><nowiki>{{שעה|חמש|1=שש}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''אזהרה:''' דף זה כולל יותר מדי קריאות לפונקציות מפענח שגוזלות משאבים.\n\nנדרש {{PLURAL:$2|שתהיה בו לכל היותר קריאה אחת|שתהיינה בו לכל היותר $2 קריאות}} לפונקציות כאלה, אך כרגע יש בו {{PLURAL:$1|קריאה אחת|$1 קריאות}}.",
        "history-feed-empty": "הדף המבוקש לא נמצא.\nייתכן שהוא נמחק, או ששמו שונה.\nבאפשרותך לנסות [[Special:Search|לחפש]] דפים רלוונטיים חדשים.",
        "rev-deleted-comment": "(תקציר העריכה הוסר)",
        "rev-deleted-user": "(שם המשתמש הוסר)",
-       "rev-deleted-event": "(פע×\95×\9cת ×\94×\99×\95×\9e×\9f ×\94×\95סר×\94)",
+       "rev-deleted-event": "(פר×\98×\99×\9d ×\9e×\94×\99×\95×\9e×\9f ×\94×\95סר×\95)",
        "rev-deleted-user-contribs": "[שם המשתמש או כתובת ה־IP הוסרו – העריכה הוסתרה מדף התרומות]",
        "rev-deleted-text-permission": "גרסת הדף הזו <strong>נמחקה</strong>.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "rev-suppressed-text-permission": "גרסת הדף הזו <strong>הועלמה</strong>.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].",
        "revdelete-legend": "הגדרת הגבלות התצוגה",
        "revdelete-hide-text": "תוכן הגרסה",
        "revdelete-hide-image": "הסתרת תוכן הקובץ",
-       "revdelete-hide-name": "×\94סתרת ×\94פע×\95×\9c×\94 ×\95×\93×£ ×\94×\99×¢×\93",
+       "revdelete-hide-name": "×\94סתרת ×\93×£ ×\94×\99×¢×\93 ×\95×\94פר×\9e×\98ר×\99×\9d",
        "revdelete-hide-comment": "תקציר העריכה",
        "revdelete-hide-user": "שם המשתמש או כתובת ה־IP של העורך",
        "revdelete-hide-restricted": "העלמת המידע גם ממפעילי המערכת",
        "thumbnail-temp-create": "לא הצליחה יצירת קובץ תמונה ממוזערת זמני",
        "thumbnail-dest-create": "לא הייתה אפשרות לשמור את התמונה הממוזערת אל יעדה",
        "thumbnail_invalid_params": "פרמטרים שגויים לתמונה הממוזערת",
+       "thumbnail_toobigimagearea": "קובץ בגודל של יותר מ־$1",
        "thumbnail_dest_directory": "לא ניתן היה ליצור את תיקיית היעד",
        "thumbnail_image-type": "סוג התמונה אינו נתמך",
        "thumbnail_gd-library": "הגדרת הספריה GD אינה שלמה: חסרה הפונקציה $1",
        "hebrew-calendar-m11-gen": "באב",
        "hebrew-calendar-m12-gen": "באלול",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|שיחה]])",
-       "unknown_extension_tag": "תגית בלתי ידועה: \"$1\"",
        "duplicate-defaultsort": "'''אזהרה:''' המיון הרגיל \"$2\" דורס את המיון הרגיל המוקדם ממנו \"$1\".",
        "duplicate-displaytitle": "<strong>אזהרה:</strong> כותרת התצוגה \"$2\" דורסת את כותרת התצוגה הקודמת \"$1\".",
        "invalid-indicator-name": "<strong>שגיאה:</strong> התכונה <code>name</code> של מצייני מצב הדף אינה יכולה להיות ריקה.",
index b6703cb..35371f8 100644 (file)
        "watchlisttools-edit": "A figyelőlista megtekintése és szerkesztése",
        "watchlisttools-raw": "A nyers figyelőlista szerkesztése",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|vita]])",
-       "unknown_extension_tag": "Ismeretlen tag kiterjesztés: $1",
        "duplicate-defaultsort": "Figyelem: a(z) „$2” rendezőkulcs felülírja a korábbit („$1”).",
        "version": "Névjegy",
        "version-extensions": "Telepített kiterjesztések",
index 26951bc..eea95e9 100644 (file)
        "anoneditwarning": "<strong>Attention:</strong> Tu non ha aperite un session. Le adresse IP tue essera publicamente visibile si tu face modificationes. Si tu <strong>[$1 aperi un session]</strong> o <strong>[$2 crea un conto]</strong>, le modificationes essera attribuite al nomine de usator tue, inter altere avantages.",
        "anonpreviewwarning": "''Tu non ha aperite un session. Salveguardar registrara tu adresse IP in le historia de modificationes de iste pagina.''",
        "missingsummary": "'''Rememoration:''' Tu non ha specificate un summario del modification.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin summario.",
+       "selfredirect": "<strong>Attention:</strong> Tu redirige iste pagina verso se mesme.\nTu pote haber specificate le mal destination pro le redirection, o tu modifica forsan le mal pagina.\nSi tu clicca sur \"{{int:savearticle}}\" de novo, le redirection essera create in despecto de isto.",
        "missingcommenttext": "Per favor entra un commento infra.",
        "missingcommentheader": "'''Rememoration:''' Tu non ha specificate un subjecto/titulo pro iste commento.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin titulo.",
        "summary-preview": "Previsualisation del summario:",
        "content-model-text": "texto simple",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objecto vacue",
+       "content-json-empty-array": "Array vacue",
        "duplicate-args-category": "Paginas que usa parametros duplicate in appellos de patrono",
        "duplicate-args-category-desc": "Le pagina contine appellos de patrono que usa duplicatos de parametros, como per exemplo <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Attention: Iste pagina contine troppo de appellos costose al functiones del analysator syntactic.\n\nIllo debe haber minus de $2 {{PLURAL:$2|appello|appellos}}, sed al momento ha $1 {{PLURAL:$1|appello|appellos}}.",
        "history-feed-empty": "Le pagina que tu requestava non existe.\nEs possibile que illo esseva delite del wiki, o renominate.\nProva [[Special:Search|cercar nove paginas relevante]] in le wiki.",
        "rev-deleted-comment": "(summario del modification removite)",
        "rev-deleted-user": "(nomine de usator eliminate)",
-       "rev-deleted-event": "(entrata eliminate)",
+       "rev-deleted-event": "(detalios de registro removite)",
        "rev-deleted-user-contribs": "[nomine de usator o adresse IP removite - modification celate ab contributiones]",
        "rev-deleted-text-permission": "Iste version del pagina ha essite '''delite'''.\nEs possibile que se trova detalios in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].",
        "rev-suppressed-text-permission": "Iste version del pagina ha essite <strong>supprimite</strong>.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de suppressiones].",
        "revdelete-legend": "Definir restrictiones de visibilitate",
        "revdelete-hide-text": "Texto del version",
        "revdelete-hide-image": "Celar le contento del file",
-       "revdelete-hide-name": "Celar action e objectivo",
+       "revdelete-hide-name": "Celar objectivo e parametros",
        "revdelete-hide-comment": "Summario del modification",
        "revdelete-hide-user": "Nomine de usator o adresse IP del modificator",
        "revdelete-hide-restricted": "Supprimer le datos a administratores assi como a alteres",
        "thumbnail-temp-create": "Impossibile crear un file temporari de miniatura",
        "thumbnail-dest-create": "Impossibile salveguardar le miniatura in su destination",
        "thumbnail_invalid_params": "Parametros de miniatura invalide",
+       "thumbnail_toobigimagearea": "File con dimensiones superior a $1",
        "thumbnail_dest_directory": "Impossibile crear directorio de destination",
        "thumbnail_image-type": "typo de imagine non supportate",
        "thumbnail_gd-library": "le configuration del bibliotheca GD es incomplete: manca le function $1",
        "watchlisttools-edit": "Vider e modificar le observatorio",
        "watchlisttools-raw": "Modificar observatorio crude",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
-       "unknown_extension_tag": "Etiquetta de extension incognite \"$1\"",
        "duplicate-defaultsort": "Attention: Le clave de ordination predefinite \"$2\" supplanta le anterior clave de ordination predefinite \"$1\".",
        "duplicate-displaytitle": "<strong>Attention:</strong> Le titulo a monstrar \"$2\" supplanta le ancian titulo a monstrar \"$1\".",
        "invalid-indicator-name": "<strong>Error:</strong> Le attributo <code>name</code> del indicatores del stato del pagina non pote esser vacue.",
index 00faf9d..519446e 100644 (file)
@@ -77,7 +77,8 @@
                        "C.R.",
                        "Elitre",
                        "Laurentius",
-                       "Macofe"
+                       "Macofe",
+                       "Ricordisamoa"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "history-feed-empty": "La pagina richiesta non esiste; potrebbe essere stata cancellata dal sito o rinominata. Verificare con la [[Special:Search|pagina di ricerca]] se vi sono nuove pagine.",
        "rev-deleted-comment": "(Oggetto della modifica rimosso)",
        "rev-deleted-user": "(nome utente rimosso)",
-       "rev-deleted-event": "(azione del log rimossa)",
+       "rev-deleted-event": "(dettagli del registro rimossi)",
        "rev-deleted-user-contribs": "[nome utente o indirizzo IP rimosso - edit nascosto dalla cronologia]",
        "rev-deleted-text-permission": "Questa versione della pagina è stata '''cancellata'''.\nConsultare il [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.",
        "rev-suppressed-text-permission": "Questa versione della pagina è stata '''soppressa'''.\nConsultare il [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log delle soppressioni] per ulteriori dettagli.",
        "hebrew-calendar-m10": "Tammuz",
        "hebrew-calendar-m10-gen": "Tammuz",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussioni]])",
-       "unknown_extension_tag": "Tag estensione sconosciuto: \"$1\"",
        "duplicate-defaultsort": "Attenzione: la chiave di ordinamento predefinita \"$2\" sostituisce la precedente \"$1\".",
        "duplicate-displaytitle": "<strong>Attenzione:</strong> il titolo visualizzato \"$2\" sostituisce il precedente titolo \"$1\".",
        "invalid-indicator-name": "<strong>Errore:</strong> attributo <code>name</code> degli indicatori dello stato della pagina non può essere vuoto.",
index f6184c0..e5f79c7 100644 (file)
@@ -61,7 +61,8 @@
                        "Rxy",
                        "Mfuji",
                        "Takot",
-                       "SkyDaisy9"
+                       "SkyDaisy9",
+                       "Los688"
                ]
        },
        "tog-underline": "リンクの下線:",
@@ -89,7 +90,7 @@
        "tog-shownumberswatching": "ページをウォッチしている利用者数を表示",
        "tog-oldsig": "既存の署名:",
        "tog-fancysig": "署名をウィキ文として扱う (自動リンクなし)",
-       "tog-uselivepreview": "ライブプレビューを使用 (開発中)",
+       "tog-uselivepreview": "ライブプレビューを使用",
        "tog-forceeditsummary": "要約欄が空欄の場合に確認を促す",
        "tog-watchlisthideown": "自分の編集をウォッチリストに表示しない",
        "tog-watchlisthidebots": "ボットによる編集をウォッチリストに表示しない",
        "history-feed-empty": "要求されたページは存在しません。\nこのウィキから既に削除されたか、名前が変更された可能性があります。\n[[Special:Search|このウィキの検索]]で関連する新しいページを探してみてください。",
        "rev-deleted-comment": "(要約は除去されています)",
        "rev-deleted-user": "(利用者名は除去されています)",
-       "rev-deleted-event": "(記録は除去されています)",
+       "rev-deleted-event": "(è¨\98é\8c²ã\81®è©³ç´°ã\81¯é\99¤å\8e»ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99)",
        "rev-deleted-user-contribs": "[利用者名またはIPアドレスは除去されました - その編集は投稿記録で非表示にされています]",
        "rev-deleted-text-permission": "この版は<strong>削除されています</strong>。\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
        "rev-suppressed-text-permission": "この版は<strong>秘匿されています</strong>。[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。",
        "hebrew-calendar-m11-gen": "アブ",
        "hebrew-calendar-m12-gen": "エルール",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|トーク]])",
-       "unknown_extension_tag": "不明な拡張機能タグ「$1」です",
        "duplicate-defaultsort": "<strong>警告:</strong> 既定のソートキー「$2」が、その前に書かれている既定のソートキー「$1」を上書きしています。",
        "duplicate-displaytitle": "<strong>警告:</strong> DISPLAYTITLE「$2」が、その前に書かれているDISPLAYTITLE「$1」を上書きしています。",
        "version": "バージョン情報",
index d3c9690..ded517b 100644 (file)
        "blankarticle": "<strong>Ескерту:</strong> Сіз бастамақшы болған бет бос.\nЕгер сіз «{{int:savearticle}}» дегенші қайта шертсеңіз бет қандайда бір мағлұматсыз басталады.",
        "anoneditwarning": "<strong> Ескерту:</strong>  Сіз жүйеге кірмегенсіз.\nIP мекенжайыңыз бұл беттің өңделу тарихында жазылып алынады.",
        "anonpreviewwarning": "<em>Сіз жүйеге кірмегенсіз. IP мекенжайыңыз бұл беттің өңделу тарихында жазылып алынады.</em>",
-       "missingsummary": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83:</strong> Ó¨Ò£Ð´ÐµÐ¼ÐµÐ½Ñ\96Ò£ Ò\9bÑ\8bÑ\81Ò\9bаÑ\88а Ñ\82үйÑ\96ндемеÑ\81Ñ\96н ÐµÐ½Ð³Ñ\96збепÑ\81Ñ\96з.\n«{{int:savearticle}}» Ð±Ð°Ñ\82Ñ\8bÑ\80маÑ\81Ñ\8bн Ò\9bайÑ\82а Ð±Ð°Ñ\81Ñ\81аңÑ\8bз Ó©Ò£Ð´ÐµÐ½Ð¼ÐµÒ£Ñ\96з Ñ\82үйÑ\96ндемеÑ\81Ñ\96з Ñ\81аÒ\9bÑ\82аладÑ\8b.",
+       "missingsummary": "<strong>Ескерту:</strong> Өңдеменің қысқаша түйіндемесін енгізбепсіз.\n«{{int:savearticle}}» батырмасын қайта бассаңыз өңдемеңіз түйіндемесіз сақталады.",
        "missingcommenttext": "Пікіріңізді төменге енгізіңіз.",
        "missingcommentheader": "<strong>Ескерту:</strong> Бұл пікірге тақырыпы/бас жолы жазбапсыз.\n«{{int:savearticle}}» түймесін тағы бассаңыз өңдемеңіз түйіндемесіз сақталады.",
        "summary-preview": "Қысқаша түйіндемесін қарап шығу:",
        "tooltip-feed-atom": "Бұл беттің Atom арнасы",
        "tooltip-t-contributions": "Осы қатысушының үлестерінің тізімі",
        "tooltip-t-emailuser": "Осы қатысушыға хат жөнелту",
+       "tooltip-t-info": "Бұл бет туралы көбірек мәлімет",
        "tooltip-t-upload": "Файлдарды жүктеу",
        "tooltip-t-specialpages": "Барлық арнайы беттер тізімі",
        "tooltip-t-print": "Бұл беттің басып шығарышқа арналған нұсқасы",
        "hebrew-calendar-m11-gen": "абтың",
        "hebrew-calendar-m12-gen": "айлолдың",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|талқылауы]])",
-       "unknown_extension_tag": "Белгісіз кеңейтпе белгісі \"$1\"",
        "version": "Нұсқа",
        "version-extensions": "Орнатылған кеңейтімдер",
        "version-skins": "Орнатылған мәнерлер",
index 8cb30ab..36b205d 100644 (file)
@@ -70,7 +70,7 @@
        "tog-shownumberswatching": "주시하는 사용자 수 보이기",
        "tog-oldsig": "현재 서명:",
        "tog-fancysig": "서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)",
-       "tog-uselivepreview": "실시간 미리 보기 사용하기 (실험 기능)",
+       "tog-uselivepreview": "실시간 미리 보기 사용하기",
        "tog-forceeditsummary": "편집 요약을 쓰지 않았을 때 알려주기",
        "tog-watchlisthideown": "주시문서 목록에서 내 편집을 숨기기",
        "tog-watchlisthidebots": "주시문서 목록에서 봇 편집을 숨기기",
        "watchlisttools-edit": "주시문서 목록 보기/편집하기",
        "watchlisttools-raw": "주시문서 목록 직접 편집하기",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|토론]])",
-       "unknown_extension_tag": "알 수 없는 확장 기능 태그 \"$1\"",
        "duplicate-defaultsort": "'''경고:''' 기본 정렬 키 \"$2\"가 이전의 기본 정렬 키 \"$1\"를 덮어쓰고 있습니다.",
        "duplicate-displaytitle": "<strong>경고:</strong> \"$2\" 제목 표시는 기존의 표시되는 제목 \"$1\"을 덮어씁니다.",
        "invalid-indicator-name": "<strong>오류:</strong> 문서 상태 표시기의 <code>name</code> 특성은 비어 있지 않아야 합니다.",
        "log-name-pagelang": "언어 바꾸기 기록",
        "log-description-pagelang": "문서 언어를 바꾼 기록입니다.",
        "logentry-pagelang-pagelang": "$1 사용자가 $3의 문서 언어를 $4에서 $5로 {{GENDER:$2|바꾸었습니다}}.",
-       "default-skin-not-found": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치에는 다음 스킨이 포함된 것으로 보입니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.\n\n$2\n\n; 미디어위키를 설치했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 프로그램]을 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다.\n\n; 미디어위키를 업그레이드했다면:\n: 미디어위키 1.24와 새 버전은 더 이상 설치된 스킨을 자동으로 활성화하지 않습니다 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: 스킨 자동발견]을 보세요). 현재 설치된 스킨을 모두 활성화하려면 <code>LocalSettings.php</code> 안에 다음 줄을 붙여 넣을 수 있습니다:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>를 수정했다면:\n: 스킨 이름에 오타가 났는지 다시 확인하세요.",
-       "default-skin-not-found-no-skins": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치된 스킨은 없습니다.\n\n; 미디어위키를 설치했거나 업그레이드했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. 미디어위키 1.24와 새 버전은 주 저장소에 어떠한 스킨도 포함되어 있지 않습니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 프로그램]을 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.",
+       "default-skin-not-found": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치에는 다음 스킨이 포함된 것으로 보입니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.\n\n$2\n\n; 미디어위키를 설치했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다.\n\n; 미디어위키를 업그레이드했다면:\n: 미디어위키 1.24와 새 버전은 더 이상 설치된 스킨을 자동으로 활성화하지 않습니다 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: 스킨 자동발견]을 보세요). 현재 설치된 스킨을 모두 활성화하려면 <code>LocalSettings.php</code> 안에 다음 줄을 붙여 넣을 수 있습니다:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>를 수정했다면:\n: 스킨 이름에 오타가 났는지 다시 확인하세요.",
+       "default-skin-not-found-no-skins": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치된 스킨은 없습니다.\n\n; 미디어위키를 설치했거나 업그레이드했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. 미디어위키 1.24와 새 버전은 주 저장소에 어떠한 스킨도 포함되어 있지 않습니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (활성화)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''비활성화''')",
        "mediastatistics": "미디어 통계",
index 8a14185..799b083 100644 (file)
        "category-subcat-count-limited": "ای دسه وا دم {{جمی:$1|زیردسه|$1زیردسه یا}} بوئه",
        "category-article-count": "{{جمی:$2|ای دسه ده ور گرته بلگه نهاییه .| {{جمی:$1| بلگه هئ|$1 بلگیا هئن}} د ای دسه, وه در $2 کل.}}",
        "category-article-count-limited": "نها {{جمی:$1|بلگه هئ|$1بلگیا هئن}} د دسه ایسنی .",
-       "category-file-count": "{{جمی:$2|ای دسه فقط شامل فایل نهایی هئ file.| نهایی {{جمی:$1|فایل هئ|$1 فایلیا هئن}} د ای دسه, وه در د کل $2 .}}",
+       "category-file-count": "{{جمی:$2|ای دسه فقط شامل جانیا نهایی هئ file.| نهایی {{جمی:$1|جانیا هئ|$1 جانیایا هئن}} د ای دسه, وه در د کل $2 .}}",
        "category-file-count-limited": " {{جمی:$1|[جانیا هئ|1$جانیایا هئن}}نهایی هان د دسه ایسنی.",
        "listingcontinuesabbrev": "دماله",
        "index-category": "بلگيا سيائه دار",
        "noindex-category": "بلگيا بی سيائه",
-       "broken-file-category": "بلگیایی که هوم پیوند فایلیا اشکسه دارن",
+       "broken-file-category": "بلگیایی که هوم پیوند جانیایا اشکسه دارن",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "دباره",
        "article": "مینونه بلگه",
        "history": "ويرگار بلگه",
        "history_short": "ويرگار",
        "updatedmarker": "د آخرین دیئن مه وه هنگوم سازی کو",
-       "printableversion": "نسقه چاپ بيئنی",
+       "printableversion": "نسقه پلا بيئنی",
        "permalink": "هوم پیوند هميشئی",
-       "print": "چاپ كردن",
+       "print": "پلا كردن",
        "view": "ديئن",
        "view-foreign": "د $1 نه بوینیت",
        "edit": "ويرايشت",
        "create-local": "یه گل توضیح ولات نشینی اضاف بکیتو",
        "editthispage": "ويرايشت ای بلگه",
        "create-this-page": "راس كردن ای بلگه",
-       "delete": "حذف كردن",
+       "delete": "پاکسا كردن",
        "deletethispage": "ای بلگه نه پاکسا بكيد",
        "undeletethispage": "ای بلگه نه پاکسا نكيد",
        "undelete_short": "زنه کردن {{جمی:$1|یه گل ویرایشت|$1 ویرایشتیا}}",
        "policy-url": "پروجه:خط و مش",
        "portal": "درآسونه کومله یکی",
        "portal-url": "پروجه:سرآسونه کومله یکی",
-       "privacy": "رهبرد رازداری",
+       "privacy": "پولتیک رازینه داری",
        "privacypage": "پروجه: خط مشی رازینه کاری کردن",
        "badaccess": "خطا :صلاداری کو",
        "badaccess-group0": "شما صلا انجوم کاری که حاستیت نارین",
        "pagetitle": "$1 - {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
-       "retrievedfrom": "بازÙ\8aاÙ\81ته د\"$1\"",
+       "retrievedfrom": "د Ù\86Ù\88 Ø²Ù\86Ù\87 Ø¨Û\8cه د\"$1\"",
        "youhavenewmessages": "شما داريت $1($2)",
        "youhavenewmessagesfromusers": "{{جمی:$4|شما }} $1 د {{جمی:$3|کاریار هنی|$3 کاریاریا}}داریتو($2).",
        "youhavenewmessagesmanyusers": "شما $1 د  فره کاریار داريت ($2).",
-       "newmessageslinkplural": "{{جمی:$1|یه گل پیغوم تازه|999=پیغوم ئل تازه}}",
+       "newmessageslinkplural": "{{جمی:$1|یه گل پیغوم تازه|999=پیغومیا تازه}}",
        "newmessagesdifflinkplural": "آخر {{جمی:$1|آلشت|آلشتیا}}",
        "youhavenewmessagesmulti": "شما یه گل پیغوم تازه د $1 داریتو",
        "editsection": "ويرايشت",
        "thisisdeleted": "دیئن یا ورگنين $1?",
        "viewdeleted": "دیئن$1?",
        "restorelink": "{{جمی:$1|یه گل ویرایشت پاک بیه|$1 ویرایشتیا پاک بیه}}",
-       "feedlinks": "خورحو:",
+       "feedlinks": "هوال حون:",
        "feed-invalid": "نوع مشترک بین هوال حون نامعتور",
        "feed-unavailable": "هوال حونیا د دسرس نئین",
        "site-rss-feed": "هوال حون RSS سی $1",
        "nstab-template": "چوئه",
        "nstab-help": "بلگه هومياری",
        "nstab-category": "دسه",
-       "nosuchaction": "چنو كاری وجود ناره",
+       "nosuchaction": "چنی کنشتگری وجود ناره",
        "nosuchactiontext": "کاری که وا یو آر ال مشقص بیه معتور نئ.\nشایت شما یو آر ال نه دروس ننشتیته، یا یه گل هوم پیوند نادرست وارد بیه.\nوه شاید وه یه گل سیسریک د نرم افزار وه کار گرته بیه وا {{نوم مالگه}} هشاره داشتوه.",
-       "nosuchspecialpage": "چنو بلگه خاصی وجود ناره",
+       "nosuchspecialpage": "چنی بلگه خاصی وجود ناره",
        "nospecialpagetext": "<strong>شما سی یه گل بلگه نامعتور درحاست داشتیته.</strong>\nیه گل نوم گه سی  اعتوار بلگه یا بوئه د [[ویجه:بلگه یا ویجه|{{رقم:بلگه یا ویجه}}]] پیدا با.",
        "error": "خطا",
        "databaseerror": "خطا د جاگه دونسمنيا",
-       "databaseerror-text": "یه خطا جست کردن د پایگا داده پیش اوما.یه ممکنه یه در کار ونن د نرم اوزار پیش بیاره",
+       "databaseerror-text": "یه خطا جست کردن د رسینه جا پیش اوما.یه ممکنه یه در کار ونن د نرم اوزار پیش بیاره",
        "databaseerror-textcl": "خطاجست گرتن رسینه جا دونسمنيا پيشومد كرده",
        "databaseerror-query": "نوم گشتن: $1",
-       "databaseerror-function": "تابع:$1",
+       "databaseerror-function": "Ø¢Ù\84شت Ù\88Ù\86:$1",
        "databaseerror-error": "خطا: $1",
        "laggedslavemode": "زنهار:بلگه شايت د ور گرینه وه هنگوم سازی تازه باو نبوئه",
        "readonly": "جاگه دونسمنيا بسه بيه",
-       "enterlockreason": "دلیل قلف کردن نه بنیست،یه وختی سی وا کردن قلف د ویر داشتویت.",
-       "readonlytext": "پایگا دونسمنیا ایسه سی دئن ورودی یا تازه یا آلشتگریا هنی قلف بیه،شایت سی منن معمولی پایگا دونسمنی نها وه که ورئرده وه حالت عادیش.\nمدیری که ونه قلف کرده ونه گوته:$1",
-       "missing-article": "پاگا دونمسمنی نتونه بلگه ای با پیدا بکه بجوره.که نومش $1 و $2 هئ.\nمعمولند یه سی یه که فرخ ویرگار رئته دش بیه پاک بیه.",
-       "missingarticle-rev": "(دوواره ديئن#: $1)",
+       "enterlockreason": "دلیل قلف کردن نه بنیست،یه گاتی سی وا کردن قلف د ویر داشتویت.",
+       "readonlytext": "رسینه جا ایسه سی دئن ورودی یا تازه یا آلشتگریا هنی قلف بیه،شایت سی منن معمولی رسینه جانها وه که ورئرده وه حال و بال عادیش.\nدیوونداری که ونه قلف کرده ونه گوته:$1",
+       "missing-article": "رسینه جا نتونه بلگه ای با پیدا بکه بجوره.که نومش $1 و $2 هئ.\nمعمولند یه سی یه که فرخ ویرگار رئته دش بیه پاک بیه.",
+       "missingarticle-rev": "(وانئری#: $1)",
        "missingarticle-diff": "(فرخ: $1، $2)",
-       "readonly_lag": "ای پاگا دونسمنی قلف بیه تا اوسه که سرور پایگا دونسمنیا وه مینجاون برسه.",
+       "readonly_lag": "ای رسینه جا قلف بیه تا اوسه که سرور رسینه جا وه مینجاون برسه.",
        "internalerror": "خطا داخلی",
        "internalerror_info": "خطا داخلی:$1",
-       "filecopyerror": "نبوئه فایل $1 د $2 کپی بوئه",
-       "filerenameerror": "نبوئه فایل $1 د $2 نوم آلشت بوئه",
-       "filedeleteerror": "نبوئه فایل $1 پاک بوئه",
+       "filecopyerror": "نبوئه جانیا $1 د $2 ورداشته بوئه",
+       "filerenameerror": "نبوئه جانیا $1 د $2 نوم آلشت بوئه",
+       "filedeleteerror": "نبوئه جانیا $1 پاکسا بوئه",
        "directorycreateerror": "نبوئه سردسه $1 راس بوئه.",
-       "filenotfound": "نتونیت فایل $1 پیدا بکید",
+       "filenotfound": "نتونیت جانیا $1 نه پیدا بکید",
        "unexpected": "ارزایشت ناحاسته: \"$1\"=\"$2\".",
-       "formerror": "خطا:Ù\86بÙ\88ئÙ\87 Ù\81رÙ\85 وه مو بئيت",
+       "formerror": "خطا:Ù\86بÙ\88ئÙ\87 Ù\86Ù\88Ù\85 Ø¨Ù\84Ú¯Ù\87 وه مو بئيت",
        "badarticleerror": "ای انجوم دئنی د ای بلگه انجوم نگره.",
-       "cannotdelete": "بلگه یا فایل$1 نبوئه پاک با.\nشایت یه ایسه وا کسی هنی پاک بیه.",
-       "cannotdelete-title": "نبوئه بلگه $1 حذف بو",
-       "delete-hook-aborted": "پاک بیئن وا قلاو جلوگری بیه.\nهیچ توضیئ سیش نئ.",
-       "no-null-revision": "سی بلگه$1 دوواره خنثی دیئن راس بکید",
-       "badtitle": "موضو گن",
-       "badtitletext": "عÙ\86Ù\88اÙ\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\87 Ø¨Û\8cÙ\87 Ù\85عتÙ\88ر Ù\86Û\8cØ\8cÛ\8cا  Û\8cÙ\87 Ú¯Ù\84 Ù\85ئÙ\86 Ø²Ù\88Ù\86Û\8c Û\8cا Ù\85ئÙ\86 Ù\88Û\8cÚ©Û\8c Ø¹Ù\86Ù\88اÙ\86 ØºÙ\84Ø·Ù\87.\nÛ\8cÙ\87 Ø´Ø§Û\8cت Ø´Ù\88Ù\85Ù\84 Û\8cÚ©Û\8c Ø¨Ø§ Û\8cا Ø¨Û\8cشتر Ú©Ø§Ø±Ø§Ú©ØªØ±Û\8cا Ù\86بÙ\88ئÙ\87 Ø³Û\8c Ø§Û\8c Ù\85Ù\88ضÙ\88عÛ\8cا Ø§Ø³ØªÙ\81اده بوئن",
+       "cannotdelete": "بلگه یا جانیا $1 نبوئه پاکسا با.\nشایت یه ایسه وا کسی هنی پاکسابیه.",
+       "cannotdelete-title": "نبوئه بلگه $1 پاکسا بو",
+       "delete-hook-aborted": "پاکسا بیئن وا قلاو نهاگری بیه.\nهیچ توضیئ سیش نئ.",
+       "no-null-revision": "سی بلگه$1 وانئری خنثی نه راس بکید",
+       "badtitle": "داسون گن",
+       "badtitletext": "داسÙ\88Ù\86 Ø¨Ù\84Ú¯Ù\87 Ø­Ø§Ø³ØªÙ\87 Ø¨Û\8cÙ\87 Ù\85عتÙ\88ر Ù\86Û\8cØ\8cÛ\8cا  Û\8cÙ\87 Ú¯Ù\84 Ù\85ئÙ\86 Ø²Ù\88Ù\86Û\8c Û\8cا Ù\85ئÙ\86 Ù\88Û\8cÚ©Û\8c Ø¯Ø§Ø³Ù\88Ù\86 ØºÙ\84Ø·Ù\87.\nÛ\8cÙ\87 Ø´Ø§Û\8cت Ø¯ Ù\88ر Ú¯Ø±ØªÙ\87 Û\8cÚ©Û\8c Ø¨Ø§ Û\8cا Ø¨Û\8cشتر Ú©Ø§Ø±Ø§Ú©ØªØ±Û\8cا Ù\86بÙ\88ئÙ\87 Ø³Û\8c Ø§Û\8c Ø¯Ø§Ø³Ù\88Ù\86Û\8cا Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±Øªه بوئن",
        "perfcached": "رسینه یا نهایی د ویرگه نهونی موکشت بینه و شایت هنی وه هنگوم سازی نبینه.بیشترونه {{جمی:$4|یه گل نتیجه|$4 یه گل نتیجه}} د ویرگه نهونی هان د دسرس.",
        "perfcachedts": "رسینه یا نهایی د ویرگه نهونی موکشت بینه و شایت هنی وه هنگوم سازی نبینه.بیشترونه {{جمی:$4|یه گل نتیجه|$4 یه گل نتیجه}} د ویرگه نهونی هان د دسرس.",
        "querypage-no-updates": "نبوئه ای بلگه وه هنگوم سازی با.\nرسینه یا ایچه تازه نبیه.",
        "viewyourtext": "شما تونیت سرچشمه ویرایشتیا تونه ای د بلگه بوینیت و دشو ورداریت",
        "protectedinterface": "ای بلگه سی نرم افزار د ای ویکی نیسسه آماده می که، و د   .\nسی اضاف کردن یا آلشت دئن د همه ویکی یا لطفا [//translatewiki.net/ translatewiki.net] نه به کار بؤریت، ولات نشین کنی پروجه ویکی وارسگر.",
        "editinginterface": "<strong>زئنار دئن:</strong> شما داریت بلگه ای نه که سی      بیه ویرایشت می کید.",
-       "cascadeprotected": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ø¯ Ù\88Û\8cراÛ\8cشت Ù\85حاÙ\81ظت بیه سی یه که {{جمی:$1|وه بلگه یه |ونو بلگه یان}} که ها دش د                 :\n$2",
+       "cascadeprotected": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ø¯ Ù\88Û\8cراÛ\8cشت Ù¾Ø± Ù\88 Ù¾Û\8cÙ\85 بیه سی یه که {{جمی:$1|وه بلگه یه |ونو بلگه یان}} که ها دش د                 :\n$2",
        "namespaceprotected": "شما حقی سی ویرایشت بلگه یایی که هان د نومجا  <strong>$1</strong> ناریت.",
        "customcssprotected": "شما سی ویرایشت ای بلگه سی اس اس اجازه ناریت سی یه که میزونکاری دونسمنیا شخصی یه کاریار هنی ها د وه.",
-       "customjsprotected": "Ø´Ù\85ا Ø³Û\8c Ù\88Û\8cراÛ\8cشت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø¬Ø§Ù\88ا Ø§Ø³Ú©Ø±Û\8cپت Ø§Ø¬Ø§Ø²Ù\87 ناریت سی یه که میزونکاری دونسمنیا شخصی یه کاریار هنی ها د وه.",
+       "customjsprotected": "Ø´Ù\85ا Ø³Û\8c Ù\88Û\8cراÛ\8cشت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø¬Ø§Ù\88ا Ø§Ø³Ú©Ø±Û\8cپت ØµÙ\84ا ناریت سی یه که میزونکاری دونسمنیا شخصی یه کاریار هنی ها د وه.",
        "mycustomcssprotected": "شما حق ناریت ای بلگه سی اس اس نه ویرایشت بکید",
        "mycustomjsprotected": "شما حق ناریت ای بلگه جاوا اسکریپت نه ویرایشت بکید",
        "myprivateinfoprotected": "شما حق ناریت دونسمنیا خصوصی نه ویرایشت بکید",
        "invalidtitle-unknownnamespace": "نوم نامعتور سی شماره نومجا ناشناس $1 و نیسه \"$2\"",
        "exception-nologin": "نبوئه وارد بوئيد",
        "exception-nologin-text": "شما وارد [[ویجه:وامین اومائن کاریار|وامین اومائن]] بوئیت سی یه تونستویت که د ای بلگه یا کنشت دسرسی داشتویت.",
-       "exception-nologin-text-manual": "Ø®Ù\88اÙ\87Ø´Ù\85Ù\86Û\8cدم که $1 تونسه بوئه د ای بلگه دسرسی داشتوه یا کاری انجوم بیئه.",
-       "virus-badscanner": "سازÙ\88ارÙ\87 Ú¯Ù\86\88Û\8cرÙ\88س Ù\86اشÙ\86اس:<em>$1</em>",
+       "exception-nologin-text-manual": "دتÙ\88 ØªÙ\82اضا Ù\85Û\8cÚ©Û\8cم که $1 تونسه بوئه د ای بلگه دسرسی داشتوه یا کاری انجوم بیئه.",
+       "virus-badscanner": "سازÙ\88ارÙ\87 Ú¯Ù\86\88Û\8cرÙ\88س Ù\86ادÛ\8cار:<em>$1</em>",
        "virus-scanfailed": "زل بیئن شکست حرد($1)",
-       "virus-unknownscanner": "Ù\88Ù\8aرÙ\88س Ù\83Ø´ Ù\86اآشگار",
+       "virus-unknownscanner": "Ù\88Ù\8aرÙ\88س Ù\83Ø´ Ù\86ادÛ\8cار",
        "logouttext": "<strong>شما هنی نریتته وه در.</strong>\n\nد ویرتو با که ویرگه نهو انجومیارتو نه پاکسا نکیت، سی یه پاره ای د بلگه یا ممکنه جوری نشو دئه بوئن چی یه که منیستی  شما هنی هایین وامین.",
        "welcomeuser": "خوش اومايت،$1!",
        "welcomecreation-msg": "حساوتو دروس بیه.\nد ویرتو نروئه که{{نوم دیارگه}} [[Special:Preferences|preferences]]  خوتونه آلشت بکیت",
        "yourname": "نوم کاریاری:",
-       "userlogin-yourname": "نوم كاروری",
+       "userlogin-yourname": "نوم کاریاری",
        "userlogin-yourname-ph": "نوم کاریاری تو نه وارد بكيد",
-       "createacct-another-username-ph": "نوم كاروری ته وارد كو",
-       "yourpassword": "پاسورد:",
-       "userlogin-yourpassword": "رمز",
-       "userlogin-yourpassword-ph": "رمز بزه",
-       "createacct-yourpassword-ph": "رمزه بزه",
-       "yourpasswordagain": "دوواره رمز بزه",
-       "createacct-yourpasswordagain": "رمز محكم كو",
-       "createacct-yourpasswordagain-ph": "دوواره رمز بزه",
-       "remembermypassword": "اومائن وا مئن منه د ای مرورگر د ویر داشتو(سی بیشترونه$1{{جمی:$1|روز|روزیا}})",
-       "userlogin-remembermypassword": "منه مئن سيستم وادار",
-       "userlogin-signwithsecure": "د وصل بيئن امن استفاده كو",
+       "createacct-another-username-ph": "نوم کاریاری ته وارد كو",
+       "yourpassword": "رازینه گواردن:",
+       "userlogin-yourpassword": "رازینه گواردن",
+       "userlogin-yourpassword-ph": "رازینه گواردن نه بزه",
+       "createacct-yourpassword-ph": "رازینه گواردن نه بزه",
+       "yourpasswordagain": "دوواره رازینه گواردن نه بزه",
+       "createacct-yourpasswordagain": "رازینه گواردن نه پشت راس كو",
+       "createacct-yourpasswordagain-ph": "دوواره رازینه گواردن نه بزه",
+       "remembermypassword": "اومائن وا مین منه د ای دوارته نیئر د ویر داشتو(سی بیشترونه$1{{جمی:$1|روز|روزیا}})",
+       "userlogin-remembermypassword": "منه مین سامونه وادار",
+       "userlogin-signwithsecure": "د وصل بيئن امن وه کار بیئر",
        "yourdomainname": "پوشگیر شما:",
-       "password-change-forbidden": "شما نتونید پاسوردیانه د ای ویکی آلشت بکید",
-       "externaldberror": "اشتÙ\88اÛ\8cÛ\8c Ø¯ Ø§Ø±ØªÙ\88اط Ù\88ا Ø±Ø³Û\8cÙ\86Ù\87 Ú¯Ø§ Ù¾Û\8cØ´ Ø§Ù\88Ù\85ائÙ\87 Û\8cا Û\8cÙ\86Ù\87 Ú©Ù\87 Ø´Ù\85ا Ø§Ø¬Ø§Ø²Ù\87 وه هنگوم سازی حساو خارجی تونه ناریت.",
-       "login": "اومائن",
+       "password-change-forbidden": "شما نتونید رازینه گواردتون خوتونه د ای ویکی آلشت بکید",
+       "externaldberror": "اشتÙ\88اÛ\8cÛ\8c Ø¯ Ø§Ø±ØªÙ\88اط Ù\88ا Ø±Ø³Û\8cÙ\86Ù\87 Ú¯Ø§ Ù¾Û\8cØ´ Ø§Ù\88Ù\85ائÙ\87 Û\8cا Û\8cÙ\86Ù\87 Ú©Ù\87 Ø´Ù\85ا ØµÙ\84ا وه هنگوم سازی حساو خارجی تونه ناریت.",
+       "login": "وا مین اومائن",
        "nav-login-createaccount": " اومائن د سيستم/راس كردن حساو",
        "userlogin": " اومائن د سيستم/راس كردن حساو",
-       "userloginnocreate": "اومائن",
-       "logout": "رئتن",
-       "userlogout": "د سيستم دراومائن",
-       "notloggedin": "نبوئه وارد بوئيد",
+       "userloginnocreate": "وا مین اومائن",
+       "logout": "د Ø³Ø§Ù\85Ù\88Ù\86Ù\87 Ø¯Ø±Ø§Ù\88Ù\85ائن",
+       "userlogout": "د سامونه دراومائن",
+       "notloggedin": "نبوئه بیاییت وامین",
        "userlogin-noaccount": "یه گل حساو ناریت؟",
        "userlogin-joinproject": "وصل بوييت {{SITENAME}}",
-       "nologin": "حساو كاروری ناريت؟$1",
+       "nologin": "حساو کاریاری ناريت؟$1",
        "nologinlink": "يه گل حساو راست بكيد",
        "createaccount": "حساو راست بكيد",
        "gotaccount": "ایسنی حساو کاروری داریتو؟$1",
-       "gotaccountlink": "اومائن",
+       "gotaccountlink": "وا مین اومائن",
        "userlogin-resetlink": "جزییات وامین اومائن تونه د ویر بردیته",
-       "userlogin-resetpassword-link": "پاسورد د ویرتو رئته؟",
+       "userlogin-resetpassword-link": "رازینه گواردن د ویرتو رئته؟",
        "userlogin-helplink2": "هومیاری وا مین اومائن",
-       "userlogin-loggedin": "شما ایسه د عنوان {{جنس:$1|$1}} اومایته وا مین.\nد فرم هاری سی وا مین اومائن وه عنوان کاریار هنی استفاده بکیتو.",
+       "userlogin-loggedin": "شما ایسه چی {{جنس:$1|$1}} اومایته وا مین.\nد نوم بلگه هاری سی وا مین اومائن چی یه گل کاریار هنی وه کار بیئرتو.",
        "userlogin-createanother": "يه گل حساوهنی راست بكيد",
-       "createacct-emailrequired": "نشونی ايميل",
-       "createacct-emailoptional": "نشونی ايميل",
-       "createacct-email-ph": "نوم نشون ايميلتونه وارد بكيت",
-       "createacct-another-email-ph": "Ù\8aÙ\87 Ú¯Ù\84 Ø§Ù\8aÙ\85Ù\8aÙ\84 وارد بكيت",
-       "createaccountmail": "د یه گل پاسورد موقتیه بختکی استفاده بکید و ونه سی یه گل نشونی ایمیل ویجه بفرسنیت",
+       "createacct-emailrequired": "تیرنشون انجومانامه",
+       "createacct-emailoptional": "تیرنشون انجومانامه",
+       "createacct-email-ph": "تیرنشون انجومانامه تونه وارد بكيت",
+       "createacct-another-email-ph": "Ù\8aÙ\87 Ú¯Ù\84 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 وارد بكيت",
+       "createaccountmail": "د یه گل رازینه گواردن موقتیه بختکی وه کار بیئریت و ونه سی یه گل نشونی انجومانامه ویجه کل بکیت",
        "createacct-realname": "نوم راستكی(مژبوری نيئ)",
        "createaccountreason": "دليل",
        "createacct-reason": "دليل",
        "createacct-reason-ph": "سی چی شما داريتو يه گل حساو هنی راس می كيد",
        "createacct-captcha": "وارسی امنيت دار بين",
-       "createacct-imgcaptcha-ph": "Ù\85تÙ\86Û\8c نه كه د وارو ميئنيت وارد بكيد",
+       "createacct-imgcaptcha-ph": "Ù\86Û\8cسسÙ\87 نه كه د وارو ميئنيت وارد بكيد",
        "createacct-submit": "حساو خوتونه راس بكيد",
        "createacct-another-submit": "يه گل حساوهنی راست بكيد",
        "createacct-benefit-heading": "{{نوم مالگه}} وه دس خلکی چی شما راس بیه.",
        "createacct-benefit-body1": "{{جمی:$1|ویرایشت|ویرایشتیا}}",
        "createacct-benefit-body2": "{{جمی:$1|بلگه|بلگه یا}}",
        "createacct-benefit-body3": "تازه{{جمی:$1|هومیار|هومیارا}}",
-       "badretype": "پاسوردی که شما دئیته مطاوقت ناره",
-       "userexists": "کارور نوم که وارد بیه د ایسه استفاده بوئه.\nلطف بکید یه گل نوم هنی انتخاو بکید",
+       "badretype": "رازینه گواردنی که شما دئیته مطاوقت ناره",
+       "userexists": "کاریارنوم که وارد بیه د ایسه وه کار گرته بوئه.\nلطف بکید یه گل نوم هنی انتخاو بکید",
        "loginerror": "خطا اومائن د سيستم",
        "createacct-error": "خطا راس كردن حساو",
        "createaccounterror": "نبوئه حساو راس بكيد:$1",
-       "nocookiesnew": "حساو کاروری راس بی،اما شما وامئن نیامایئته.{{نوم مالگه}} د کوکیا سی اومائن د سیستم کاروریا استفاده می که.کوکیا شما د کار افتائه.لطفن وا کارشو بونیت، اوسه وا نوم کاروری تازه و پسورد هنی بیایت وا مئن.",
-       "nocookieslogin": "{{نوم مالگه}} د کوکیا سی وامئن اومائن کاروریا استفاده می که. کوکیا شما د کار افتائه.\nلطف بکید د کارشو بونیت و دوواره تلاش بکید.",
-       "nocookiesfornew": "حساو کاروری راس نبیه، سی یه ایما نتونیم سرچشمه ونه مئکم بکیم.\nمطمئن بوئیت که کوکیا فعال بینه، ای بلگه نه د نو سوار بکید و د نو تلاش بکید.",
+       "nocookiesnew": "حساو کاریاری راس بی،اما شما وامئن نیامایئته.{{نوم مالگه}} د کوکیا سی اومائن د سیستم کاریاریا وه کار میئره .کوکیا شما د کار افتائه.لطفن وا کارشو بونیت، اوسه وا نوم کاریاری تازه و رازینه گواردن هنی بیایت وا مئن.",
+       "nocookieslogin": "{{نوم مالگه}} د کوکیا سی وامئن اومائن کاریاریا وه کار میئره. کوکیا شما د کار افتائه.\nلطف بکید د کارشو بونیت و دوواره تلاش بکید.",
+       "nocookiesfornew": "حساو کاریاری راس نبیه، سی یه ایما نتونیم سرچشمه ونه مئکم بکیم.\nمطمئن بوئیت که کوکیا کنشتگر بینه، ای بلگه نه د نو سوار بکید و د نو تلاش بکید.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
-       "noname": "شما یه گل نوم کاروری خو ناریت",
+       "noname": "شما یه گل نوم کاریاری خو ناریت",
        "loginsuccesstitle": "اومائن د سيستم موفق بی",
-       "loginsuccess": "شما ایسه وارد بیته {{SITENAME}} د دعنوان \"$1\".'",
+       "loginsuccess": "شما ایسه وارد بیته {{SITENAME}} د چی\"$1\".'",
        "nosuchuser": "چنی کاریاری و نوم  \"$1\" نئیش.\nنوم کاریاری وه حرفیا حساس هئ.\nروشت نیسنن تونه وارسی بکید،یا [[ویجه:وامین اومائن کاریار/ثوت نام کردن|یه گل حساو تازه راس بکید]].",
-       "nosuchusershort": "چنو کاروری وا ای نوم $1 نی ئیش.\nنیسنن تونه دوواره نئری بکیتو",
-       "nouserspecified": "شما باید یه نوم کارور اختصاص بئیتو",
-       "login-userblocked": "کارور قلف بیه.وامین اومائن اجازه نی ئن",
-       "wrongpassword": "پاسورد غلط وارد بیه.\nهنی تلاش بکید",
-       "wrongpasswordempty": "پاسوردی که دئیت حالیه.د نؤ تلاش بکیت",
-       "passwordtooshort": "پاسورد با حداقل  {{PLURAL:$1|1 character|$1 characters}}          با",
-       "password-name-match": "پاسوردتو با د نوم کاروریتو فرخ داشتوه",
-       "password-login-forbidden": "وه کار گرتن ای پاسوردو نوم کاروری ممنو بیه.",
-       "mailmypassword": "د نۈ وارد كردن رمز",
-       "passwordremindertitle": "پاسورد موقت تازه سی {{SITENAME}}",
+       "nosuchusershort": "چنو کاریاری وا ای نوم $1 نی ئیش.\nنیسنن تونه دوواره نئری بکیتو",
+       "nouserspecified": "شما باید یه نوم کاریاری تیاری بکیت",
+       "login-userblocked": "کاریار قلف بیه.وامین اومائن اجازه نی ئن",
+       "wrongpassword": "رازینه گواردن غلط وارد بیه.\nهنی تلاش بکید",
+       "wrongpasswordempty": "رازینه گواردنی که دئیت حالیه.د نؤ تلاش بکیت",
+       "passwordtooshort": "رازینه گواردن با حداقل  {{PLURAL:$1|1 character|$1 characters}}          با",
+       "password-name-match": "رازینه گواردنتو با د نوم کاریاری فرخ داشتوه",
+       "password-login-forbidden": "وه کار گرتن ای پاسوردو نوم کاریاری قدقن بیه.",
+       "mailmypassword": "د نۈ وارد كردن رازینه گواردن",
+       "passwordremindertitle": "رازینه گواردن موقت تازه سی {{SITENAME}}",
        "passwordremindertext": "یه نفر(شات خوتو،د تیرنشون آی پی $1) یه گل رازینه گواردن هنی سی {{نوم دیارگه}}($4) حاسته.یه گل رازینه گواردن موقتی سی کاریاری\"$2\" دروس بیه و د \"$3\" جاگر بیه. ار قصدتو یه بیه،شما واس ایسه روئیت وامین و یه گل رازینه گواردن هنی انتخاو بکید.\nرازینه گورادن موقتی د  {{جمی:$5|یه رو|$5 رو}}  تموم بوئه.\n\nار یه نفر هنی یه حاست داشتوئه،یا ار رازینه گورادن تونه د ویرتو اوما، و ار نحاستیت ونه آلشت بکیت، شما شایت د ای پیغوم تیه پوش بکیت و بحایت د وه کار بسن رازینه گواردن دماترتو دماداری بکیت.",
-       "noemail": "هیچ نشونی ایمیلی سی کارور $1 ضفط نبیه.",
-       "noemailcreate": "شما باید یه نشونی نومه معتور فراهم بکید",
-       "passwordsent": "یه گل پاسورد هنی سی تیرنشون انجانامه ای که \"$1\" واش ثوت نام کرده بی کل بیه.\nخواهش میکیم هنی رویئت وامین و اوسه بئریتش.",
+       "noemail": "هیچ تیرنشون انجومانامه ای سی کاریار $1 ضفط نبیه.",
+       "noemailcreate": "شما باید یه تیرنشون انجومانامه خو فراهم بکید",
+       "passwordsent": "یه گل رازینه گواردن هنی سی تیرنشون انجومانامه ای که \"$1\" واش ثوت نام کرده بی کل بیه.\nخواهش میکیم هنی رویئت وامین و اوسه بئریتش.",
        "blocked-mailpassword": "نها آی پی شما سی ویرایشت گرته بیه، و",
        "eauthentsent": "یه گل انجومانامه پشت راس کردنی د یه گل تیرنشون ویجه کل بیه.\nدما یه که یه گل انجومانامه هنی د حساو کل بوئه، شما واس دما رئنمونی نه د انجومانامه بئریت، سی یه که حساو شما راستکی پشت راست بوئه.",
-       "throttled-mailpassword": "یه گل پسورد دواره زنه بیه ایسه کل بیه، د آخری {{جمی:$1|ساعت|$1 ساعتیا}}.\nسی نهاگری د اذیت دئن،فقط یه گل رازینه گواردن د انجومانامه دواره زنه بیه د هر {{جمی:$1|ساعت|$1 ساعتیا}} کل بیه.",
+       "throttled-mailpassword": "یه گل رازینه گواردن دواره زنه بیه ایسه کل بیه، د آخری {{جمی:$1|ساعت|$1 ساعتیا}}.\nسی نهاگری د اذیت دئن،فقط یه گل رازینه گواردن د انجومانامه دواره زنه بیه د هر {{جمی:$1|ساعت|$1 ساعتیا}} کل بیه.",
        "mailerror": "خطا داره کل موئه:$1",
-       "acct_creation_throttle_hit": "سÛ\8cÙ\84 Ú©Ø±Û\8cا Ø§Û\8c Ù\88Û\8cÚ©Û\8c Ø¯ ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø¢Û\8c Ù¾Û\8c Ø´Ù\85ا Ø§Ø³ØªÙ\81ادÙ\87 Ú©Ø±Ø¯Ù\86Ù\87 Ø¯ Ø±Ù\88ز Ø¯Ù\85اÛ\8cÛ\8c {{جÙ\85Û\8c:$1|1 Ø­Ø³Ø§Ù\88|$1 Ø­Ø³Ø§Ù\88Û\8cا}} Ù\86Ù\87 Ø¯Ø±Ù\88س Ú©Ø±Ø¯Ù\86Ù\87Ø\8c Ù\88 Ù\88Ù\87 Ø¯ Ø¨Û\8cشترÙ\88Ù\86Ù\87 ØµÙ\84ا Ø¯Ø¦Ù\86 Ø¯ Ø§Û\8c Ø¯Ù\88رÙ\87 Ú¯Ø§ØªÛ\8c Ø§Ù\86جÙ\88Ù\85 Ø¨Û\8cÙ\87.\nد Ù\86تÛ\8cجÙ\87Ø\8c Ø³Û\8cÙ\84 Ú©Ø±Û\8cاÛ\8cÛ\8c Ú©Ù\87 Ø¯ Ø§Û\8c ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø¢Û\8c Ù¾Û\8c Ø§Ø³ØªÙ\81ادÙ\87 Ú©Ø±Ø¯نه نمی تونن  حساویا بیشتری د ای گات دروس بکن.",
-       "emailauthenticated": "نشونی انجومانامه تونه د $2 سی 3$ مئکم بیه.",
+       "acct_creation_throttle_hit": "سÛ\8cÙ\84 Ú©Ø±Û\8cا Ø§Û\8c Ù\88Û\8cÚ©Û\8c ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø¢Û\8c Ù¾Û\8c Ø´Ù\85ا Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±ØªÙ\86Ù\87 Ø¯ Ø±Ù\88ز Ø¯Ù\85اÛ\8cÛ\8c {{جÙ\85Û\8c:$1|1 Ø­Ø³Ø§Ù\88|$1 Ø­Ø³Ø§Ù\88Û\8cا}} Ù\86Ù\87 Ø¯Ø±Ù\88س Ú©Ø±Ø¯Ù\86Ù\87Ø\8c Ù\88 Ù\88Ù\87 Ø¯ Ø¨Û\8cشترÙ\88Ù\86Ù\87 ØµÙ\84ا Ø¯Ø¦Ù\86 Ø¯ Ø§Û\8c Ø¯Ù\88رÙ\87 Ú¯Ø§ØªÛ\8c Ø§Ù\86جÙ\88Ù\85 Ø¨Û\8cÙ\87.\nد Ù\86تÛ\8cجÙ\87Ø\8c Ø³Û\8cÙ\84 Ú©Ø±Û\8cاÛ\8cÛ\8c Ú©Ù\87 Ø¯ Ø§Û\8c ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø¢Û\8c Ù¾Û\8c Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±Øªنه نمی تونن  حساویا بیشتری د ای گات دروس بکن.",
+       "emailauthenticated": "تیرنشون انجومانامه تونه د $2 سی 3$ مئکم بیه.",
        "emailnotauthenticated": "تیرنشون انجومانامه شما تا ایسه پشت راسگری نبیه.\nهنی انجومانامه ای سی چیا ری به نها کل نبیه.",
        "noemailprefs": "یه گل تیرنشون انجومانامه د الویتیاتو سی یه که ای ویجه گیا کار بکن انتخاو بکیت.",
-       "emailconfirmlink": "Ù\86Ø´Ù\88Ù\86Û\8c Ø§Ù\8aÙ\85Ù\84تÙ\88 Ù\86Ù\87 Ù\85Ø­Ù\83Ù\85 Ø¨Ù\83Ù\8aد",
+       "emailconfirmlink": "پشت Ø±Ø§Ø³ Ú©Ø±Ø¯Ù\86 ØªÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87",
        "invalidemailaddress": "تیرنشون انجومانامه حاستنی نئ شکل وه چوئه خوئی ناره.\nلطفن یه گل تیرنشون چوئه دار وارد بکیت یا ای رشنه گه نه حالی بنیت.",
-       "cannotchangeemail": "نشونی ایمیل حساو نتونه د ای ویکی آلشت بوئه.",
-       "emaildisabled": "ای مالگه نتونه ایمیل بفرسنه",
+       "cannotchangeemail": "تیرنشون انجومانامه حساو نتونه د ای ویکی آلشت بوئه.",
+       "emaildisabled": "ای مالگه نتونه انجومانامه کل نمی که",
        "accountcreated": "حساو راس بی",
        "accountcreatedtext": "حساو کاریاری سی [[{{ns:کاریار}}:$1|$1]] ([[{{ns:کاریار چک چنه}}:$1|چک چنه]]) دروس بیه.",
        "createaccount-title": "حساو راس کرده سی  {{SITENAME}}",
-       "createaccount-text": "یه نفر وا تیرنشون انجونامه تو یه گل حساو راس کرده{{نوم دیارگه}} ($4) نومشه نیائه\"$2\", با پاسورد \"$3\".\nشما همی ایسه باید روئیت وامین و پاسوردتونه آلشت بکیت.\n\nار شما ای پیغوم نه وش التفات نکیت، د راس بیین ای حساو خطا دروس موئه.",
+       "createaccount-text": "یه نفر وا تیرنشون انجونامه تو یه گل حساو راس کرده{{نوم دیارگه}} ($4) نومشه نیائه\"$2\", با پاسورد \"$3\".\nشما همی ایسه باید روئیت وامین و رازینه گواردتونه آلشت بکیت.\n\nار شما ای پیغوم نه وش التفات نکیت، د راس بیین ای حساو خطا دروس موئه.",
        "login-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید",
        "login-abort-generic": "اومائن وامین تو شکست حرد-شکست حرده",
        "login-migrated-generic": "حساو کاریاری شما جا وه جا بیه، و نوم کاریاری شما دیه د ای ویکی نیئش.",
        "loginlanguagelabel": "زون:$1",
        "suspicious-userlogout": "درحاست وه در رئتن شما انکار بیه سی یه کل وه نظر میا که د یه گل دووارته نیئر گن یا یه گل پروکسی که ها د ویرگه نهو کل بیه",
-       "createacct-another-realname-tip": "نوم راستکی دل به حائه.\nار شما وه نه نهااماییه بکیت، یه سی هوم نسبت دئن وه کاریار   سی کاریاش استفاده بوئه.",
+       "createacct-another-realname-tip": "نوم راستکی دل به حائه.\nار شما وه نه نهااماییه بکیت، یه سی هوم نسبت دئن وه کاریار   سی کاریاش وه کار گرته بوئه.",
        "pt-login": "وا مین اومائن",
        "pt-login-button": "وا مین اومائن",
        "pt-createaccount": "يه گل حساو راست بكيد",
-       "pt-userlogout": "د سيستم دراومائن",
-       "php-mail-error-unknown": "خطا Ù\86اشÙ\86اس Ù\85ئÙ\86 ØªØ§Ù\88ع  PHP's mail()",
-       "user-mail-no-addy": "سی کل کردن ایمیل بی نشونه ایمیل صورت گرته",
-       "user-mail-no-body": "سی کل کردن ایمیل وا مینونه حالی یا کؤچک بیئن سی دلیل غیر علقمنی تلاش بکید.",
-       "changepassword": "پاسورد نه آلشت بكيت",
-       "resetpass_announce": "سی تموم کردن وا مین اومائن، شما باید یه گل پاسورد هنی وارد بکیتو.",
+       "pt-userlogout": "د سامونه دراومائن",
+       "php-mail-error-unknown": "خطا Ù\86ادÛ\8cار Ù\85Û\8cÙ\86 Ø¢Ù\84شت Ù\88Ù\86 PHP's mail()",
+       "user-mail-no-addy": "سی کل کردن انجومانامه د یه گل انجومانامه بی تیرنشون کنشتگری بیه",
+       "user-mail-no-body": "سی کل کردن انجومانامه وا مینونه حالی یا کؤچک بیئن سی دلیل غیر علقمنی تلاش بکید.",
+       "changepassword": "رازینه گواردن نه آلشت بكيت",
+       "resetpass_announce": "سی تموم کردن وا مین اومائن، شما باید یه گل رازینه گواردن هنی وارد بکیتو.",
        "resetpass_text": "<!-- یه گل نیسسه ایچه اضاف بکیت -->",
-       "resetpass_header": "پاسورد حساوتونه آلشت بکید",
-       "oldpassword": "پاسورد قدیمی:",
-       "newpassword": "پاسورد تازه:",
-       "retypenew": "رمز تازه نه دوواره بنیسید:",
-       "resetpass_submit": "پاسور بنیت و وامین بیایت",
-       "changepassword-success": "پاسورد شما وا موفقیت آلشت بی",
+       "resetpass_header": "رازینه گواردن حساوتونه آلشت بکید",
+       "oldpassword": "رازینه گواردن قدیمی:",
+       "newpassword": "رازینه گواردن تازه:",
+       "retypenew": "رازینه گواردن تازه نه دوواره انجومیارنیسی :",
+       "resetpass_submit": "رازینه گواردن بنیت و وامین بیایت",
+       "changepassword-success": "رازینه گواردن شما د خوئی آلشت بی",
        "changepassword-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید",
-       "resetpass_forbidden": "پاسوردیا نتونن آلشت بوئن",
-       "resetpass-no-info": "شما با بیایت د سیستم تا د ای بلگه دسرسی داشتویت",
-       "resetpass-submit-loggedin": "پاسورد نه آلشت بكيت",
+       "resetpass_forbidden": "رازینه گواردناتون نتونن آلشت بوئن",
+       "resetpass-no-info": "شما با بیایت د سامونه تا د ای بلگه دسرسی داشتویت",
+       "resetpass-submit-loggedin": "رازینه گواردن نه آلشت بكيت",
        "resetpass-submit-cancel": "انجوم شیوسن",
        "resetpass-wrong-oldpass": "رازینه گواردن تازه یا موقتی نامعتور.\nشات شما ایسنی یا رازینه گواردن خوتونه د خوئی آلشت دئیته یا یه گل رازینه گواردن موقت هنی درحاست دئیته.",
        "resetpass-recycled": "لطفن رازینه گواردن خوتونه سی چیا تر د رازینه گواردن ایسنی د نو زنه بکیت",
        "resetpass-temp-emailed": "شما وا یه گل رازینه موقتی که انجوما گر بیه  اومایته وامین.\nسی تموم کردن اومائن وامین، یه گل رازینه گواردن هنی د ایچه  جاگر بکیت.",
-       "resetpass-temp-password": "رمز موقت:",
+       "resetpass-temp-password": "رازینه گواردن موقت:",
        "resetpass-abort-generic": "آلشت دئن رازینه گواردن وا یه گل فره پوش خرو بیه.",
        "resetpass-expired": "رازینه گواردن شما منقضی بیه. لطفن یه گل رازینه گواردن هنی سی وامین اومائن جاگری بکیت.",
        "resetpass-expired-soft": "رازینه گواردن شما منقضی بیه و واس د نو زنه با. لطفن یه گل رازینه هنی انتخاو بکیت، یا سی د نو زنه کردن د نهاتر د ایچه \"{{int:resetpass-submit-cancel}}\" بپورنیت.",
-       "resetpass-validity-soft": "زازینه گواردتون تو معتور نئ:$1\n\nلطفن یه گل رازینه گواردن هنی انتخاو بکیت، یا ری ایچه \"{{int:resetpass-submit-cancel}}\" سی د نو زنه کردن وه د نهاتر بپورنیت.",
-       "passwordreset": "د نۈ وارد كردن رمز",
+       "resetpass-validity-soft": "رازینه گواردتون تو معتور نئ:$1\n\nلطفن یه گل رازینه گواردن هنی انتخاو بکیت، یا ری ایچه \"{{int:resetpass-submit-cancel}}\" سی د نو زنه کردن وه د نهاتر بپورنیت.",
+       "passwordreset": "د نۈ وارد كردن رازینه گواردن",
        "passwordreset-text-one": "ای نوم بلگه نه سی گرتن یه گل رازینه گواردن موقتی وا انجومانامه پر بکیت.",
        "passwordreset-text-many": "{{جمی:$1|یه گل د رشنه گه یا نه سی یه که رازینه گواردن موقتی وا انجومانامه گرته بوئه پر بکیت}}",
-       "passwordreset-legend": "د نۈ وارد كردن رمز",
-       "passwordreset-disabled": "نو کرد پاسورد د ای ویکی غیرفعال بیه.",
-       "passwordreset-emaildisabled": "چی یا هنی ایمیل د ای ویکی غیرفعال بیه.",
-       "passwordreset-username": "نوم كاروری:",
+       "passwordreset-legend": "د نۈ وارد كردن رازینه گواردن",
+       "passwordreset-disabled": "نو کرد رازینه گواردن د ای ویکی ناکشتگر بیه.",
+       "passwordreset-emaildisabled": "چی یا هنی انجومانامه د ای ویکی ناکشتگر بیه.",
+       "passwordreset-username": "نوم کاریاری:",
        "passwordreset-domain": "پوشگیر",
-       "passwordreset-capture": "ایمیل نتیجه نه بوینیتو؟",
-       "passwordreset-capture-help": "ار شما ای جعوه نه وارسی بکید. ایمیل و خوئی اوسه که سی کارور کل بیه بوئه بوینیتش.",
+       "passwordreset-capture": "انجومانامه نتیجه نه بوینیتو؟",
+       "passwordreset-capture-help": "ار شما ای جعوه نه وارسی بکید. انجومانامه و خوئی اوسه که سی کاریار کل بیه بوئه بوینیتش.",
        "passwordreset-email": "نشونی ايميل",
        "passwordreset-emailtitle": "جزئیات حساو ها د {{نوم مالگه}}",
        "passwordreset-emailtext-ip": "یه کسی(شات خوتو، وا تیرنشون آی پی $1) سی د نو زنه کردن رازینه گواردن تو د {{SITENAME}}  درحاست کرده($4).\nسی کاریار «$2» یه گل رازینه گواردن موقتی دروس بیه و و هؤمبراور «$3» ئه.\nار تمارزو تو یه بیه ایسه باید بیایت وامین سامونه و یه گل رازینه گواردن هنی بهاییت\nرازینه گواردن شما د طیل {{PLURAL:$5|یه رو|$5 رو}} باطل بوئه.\n\nار کس هنی چنی درحاستی کرده یا یه که شما رازینه گواردن دمایی خوتونه د ویر اوردیت و تر نمیهایت ونه آلشت بیئت، می تونیت د ای پیغوم تیه پوشی بکیت و همو رازینه گواردن دمایی نه وه کار به ونیت.",
        "passwordreset-emailtext-user": "کاریار $1 د {{SITENAME}} د نو زنه کردن رازینه گواردن شمانه د{{SITENAME}} ($4) کرده. {{PLURAL:$3|حساو|حساویا}} کاریاری که هان د هار د وا ای تیرنشون انجومانامه ها د ارتواط:\n\n$2\n\n{{PLURAL:$3|ای رازینه گواردن موقت|ای رازینه گواردنیا موقت}} تا {{PLURAL:$5|یه رو|$5 رو}} باطل بوئه.\nار کس هنی چنی درحاستی کرده یا یه که شما رازینه گواردن دمایی خوتونه د ویر اوردیت و تر نمیهایت ونه آلشت بیئت، می تونیت د ای پیغوم تیه پوشی بکیت و همو رازینه گواردن دمایی نه وه کار به ونیت.",
-       "passwordreset-emailelement": "نوم کاروری: $1\nپاسورد موقتی: $2",
-       "passwordreset-emailsent": "پاسورد هنی سی ایمیل کل بیه.",
-       "passwordreset-emailsent-capture": "پاسورد تازه تو د ایمیلتو که د هار نشو دئه بیه کل بیه",
+       "passwordreset-emailelement": "نوم کاریاری: $1\nرازینه گواردن موقتی: $2",
+       "passwordreset-emailsent": "رازینه گواردن هنی سی انجومانامه کل بیه.",
+       "passwordreset-emailsent-capture": "رازینه گواردن تازه تو د انجومانامه تو که د هار نشو دئه بیه کل بیه",
        "passwordreset-emailerror-capture": "رازینه گواردن د انجومانامه د نو زنه کننه راس بیه، و وه د هار دیاری می که، اما کل بیین وه د{{جنس:$2|کاریار}} شکست حرده:$1",
-       "changeemail": "ایمیل تو نه آلشت بکید",
+       "changeemail": "انجومانامه تو نه آلشت بکید",
        "changeemail-text": "ای نوم بلگه نه سی آلشت دئن تیرنشون انجومانامه تو پر بکیت. شما سی پشت راس کردن ای آلشت واس رازینه گواردن خوتونه وارد بکیت.",
-       "changeemail-no-info": "شما با بیایت د سیستم تا د ای بلگه دسرسی داشتویت",
-       "changeemail-oldemail": "نشونی ایمیل تازه باو:",
-       "changeemail-newemail": "نشونی ایمیل تازه",
+       "changeemail-no-info": "شما با بیایت د سامونه تا د ای بلگه دسرسی داشتویت",
+       "changeemail-oldemail": "تیرنشون انجومانامه تازه باو:",
+       "changeemail-newemail": "تیرنشون انجومانامه تازه:",
        "changeemail-none": "(هيش كوم)",
-       "changeemail-password": "شما {{SITENAME}} پاسورد:",
-       "changeemail-submit": "آلشت کردن ایمیل",
+       "changeemail-password": "{{SITENAME}} رازینه گواردن شما:",
+       "changeemail-submit": "آلشت کردن انجومانامه",
        "changeemail-throttled": "شما ایسنی فره سی وامین اومائن تلاش کردیته.\n$1 لطفن سی تلاش هنی صبر بکید.",
        "resettokens": "تازه کردن نشونه یا",
        "resettokens-text": "شما سی صلا دئن دسرسی وه رسینه یا خصوصی که ها د حساو ایچنی تو می تونیت دیارگریا نه د نو زنه بکیت.\n\nشما اوسنی واس ای کار بکیت که رسینه یا شما سی یه کسی تر بئر بیه یا د حساو شما چل بیه.",
        "bold_tip": "متن توپر بيه",
        "italic_sample": "نوشته كج كوله",
        "italic_tip": "نوشته كج كوله",
-       "link_sample": "عÙ\86Ù\88اÙ\86 Ù\84Ù\8aÙ\86Ù\83",
-       "link_tip": "Ù\84Û\8cÙ\86Ú© Ù\85ئÙ\86 Ù\88Ù\86",
-       "extlink_sample": "http://www.example.com نوم ديس ون",
+       "link_sample": "داسÙ\88Ù\86 Ù\87Ù\88Ù\85 Ù¾Û\8cÙ\88Ù\86د",
+       "link_tip": "Ù\87Ù\88Ù\85 Ù¾Û\8cÙ\88Ù\86د Ø¯Ø§Ø®Ù\84Û\8c",
+       "extlink_sample": "http://www.example.com داسون هوم پیوند",
        "extlink_tip": "هوم پیوند خارجی(د ویر داشتو)",
-       "headline_sample": "سرخط نوشته",
-       "headline_tip": "قدم 2 خط سر ون",
-       "nowiki_sample": "د Ø§Û\8cÚ\86Ù\87 Û\8cÙ\87 Ú¯Ù\84 Ù\85تÙ\86 بی شلک وارد بکید",
+       "headline_sample": "سرخط نیسسه",
+       "headline_tip": "ریرتراز 2 خط سر ون",
+       "nowiki_sample": "د Ø§Û\8cÚ\86Ù\87 Û\8cÙ\87 Ú¯Ù\84 Ù\86Û\8cسسÙ\87 بی شلک وارد بکید",
        "nowiki_tip": "شلک ویکی نه ندید بگر",
        "image_sample": "Example.jpg",
        "image_tip": "جانیا محاط بيه",
        "media_sample": "Example.ogg",
-       "media_tip": "فایل هوم پیوند",
-       "sig_tip": "اÙ\85ضا Ø´Ù\85ا Ù\88 Ø¨Ø±Ú\86سÙ\88 وخت",
-       "hr_tip": "خط Ø§Ù\81Ù\82 Ù\88Ù\86Ù\87(سÙ\88ا Ø³Ù\88ا Ø¯Ø´ Ø§Ø³ØªÙ\81ادÙ\87 Ú©و)",
+       "media_tip": "جانیا هوم پیوند",
+       "sig_tip": "اÙ\85ضا Ø´Ù\85ا Ù\88 Ø¯Û\8cس Ù\88Ù\86 وخت",
+       "hr_tip": "خط Ø¢Ø³Ù\88 Ù\88Ù\86Ù\87(سÙ\88ا Ø³Ù\88ا Ù\88Ù\87 Ú©Ø§Ø± Ø¨Û\8cئرشو)",
        "summary": "چكسته",
        "subject": "موضو/سر خط:",
        "minoredit": "يه ويرايشت كؤچكيه",
        "watchthis": "ديئن ای بلگه",
        "savearticle": "اماییه کردن بلگه",
        "preview": "پيش سيل",
-       "showpreview": "پيش نمائش نشون بيئه",
+       "showpreview": "پيش سیل نشون بيئه",
        "showdiff": "آلشتيانه نشون بيئه",
        "blankarticle": "<strong>زنئار:</strong> بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"{{int:savearticle}}\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.",
        "anoneditwarning": "<strong>زئنار:</strong> شما هنی نیوماته وامین. تیرنشون آی پی شما هر گاتی که آلشتی راس بکیت سی کل خلک دیاره. ار <strong>[$1 روئیت وامین]</strong> یا <strong>[$2 یه گل حساو کاریاری راس بکیت]</strong>، ویرایشتیا شما وه نوم کاریاری خوتون دیاری می که، و وا چیا بیتر هنی.",
        "anonpreviewwarning": "<em>شما نیومائته وامین. تیرنشون آی پی شما د ویرگار ویرایشت ای بلگه اماییه بوئه.</em>",
        "missingsummary": "<strong>د ویر ونا:</strong> شما هنی یه گل چکسته ویرایشتی نها اماییه نکردیته.\nار شما د نو د ری\"{{int:savearticle}}\" بپورنیت, ویرایشت شما حالی اماییه بوئه.",
-       "missingcommenttext": "Ù\84Ø·Ù\81Ù\86 Ø¯ Ø§Û\8cÚ\86Ù\87 Ù\86ظر بیئتو",
+       "missingcommenttext": "Ù\84Ø·Ù\81Ù\86 Ø¯ Ø§Û\8cÚ\86Ù\87 Ù\88Û\8cر Ù\88 Ø¨Ø§Ù\88ر بیئتو",
        "missingcommentheader": "<strong>د ویر ونا:</strong> شما هنی یه گل موضوع/سرخط سی ای ویر و باور نها اماییه نکردیته.\nار شما د نو د ری\"{{int:savearticle}}\" بپورنیت, ویرایشت شما حالی اماییه بوئه.",
        "summary-preview": "چکسته پیش سیل:",
        "subject-preview": "پیش سیل موضو سرخط",
-       "blockedtitle": "كارور قلف بيه",
+       "blockedtitle": "کاریار نهاگری بیه",
        "blockedtext": "<strong>نوم کاریاری شما یا تیرنشون آی پی شما قلف بیه.</strong>\n\n\n$1 ونه قلف کرده.\nدلیل ها د ایچه<em>$2</em>.\n\nشرو د قلف بیین:$8\nآخر قلف بیین:$6\nکاریار ورتیه قلف بیه:$7\n\nشما می تونیت وا $1 یا [[{{MediaWiki:Grouppage-sysop}}|دیووندار]] هنی پیوند بئریت و سی قلف کردن چک چنه بزنیت.\nالوت د ویر داشتویت که شما نمی تونیت د خصوصیت انجومانامه کل کردن سی ای کاربر استفاده بکیت مئر  یه گل تیرنشون انجومانامه معتور د [[Special:Preferences|ترجیحیا کاریاری]] خوتو معلوم کرده بویت و باید امکان وه کار بستن وه نه داشتویتو\nتیرنشون آی پی ایسنی شما $3 ئه، و نوم دیارکن قلف کردن #$5 ئه.\nلطفا همه جزئیات نه د هر حاسته ای که داریت بوئیت.",
-       "autoblockedtext": "نوم کاریاری شما یا تیرنشون آی پی شما سی یه که یه گل کاریاری هنی وه کارش بسته خودانجومن قلف بیه $1 ونه قلف کرده.\nدلیل ها د ایچه\n\n:<em>$2</em>.\n\nشرو د قلف بیین:$8\nآخر قلف بیین:$6\nکاریار ورتیه قلف بیه:$7\n\nشما می تونیت وا $1 یا [[{{MediaWiki:Grouppage-sysop}}|دیووندار]] هنی پیوند بئریت و سی قلف کردن چک چنه بزنیت.\n\nالوت د ویر داشتویت که شما نمی تونیت د خصوصیت انجومانامه کل کردن سی ای کاربر استفاده بکیت مئر  یه گل تیرنشون انجومانامه معتور د [[Special:Preferences|ترجیحیا کاریاری]] خوتو معلوم کرده بویت و باید امکان وه کار بستن وه نه داشتویت.\n\nتیرنشون آی پی ایسنی شما $3 ئه، و نوم دیارکن قلف کردن #$5 ئه.\nلطفا همه جزئیات نه د هر حاسته ای که داریت بوئیت.",
+       "autoblockedtext": "نوم کاریاری شما یا تیرنشون آی پی شما سی یه که یه گل کاریاری هنی وه کارش بسته خودانجومن قلف بیه $1 ونه قلف کرده.\nدلیل ها د ایچه\n\n:<em>$2</em>.\n\nشرو د قلف بیین:$8\nآخر قلف بیین:$6\nکاریار ورتیه قلف بیه:$7\n\nشما می تونیت وا $1 یا [[{{MediaWiki:Grouppage-sysop}}|دیووندار]] هنی پیوند بئریت و سی قلف کردن چک چنه بزنیت.\n\nالوت د ویر داشتویت که شما نمی تونیت د خصوصیت انجومانامه کل کردن سی ای کاربر استفاده بکیت مئر  یه گل تیرنشون انجومانامه معتور د [[Special:Preferences|ترجیحیا کاریاری]] خوتو دیاری کرده بویت و باید امکان وه کار بستن وه نه داشتویت.\n\nتیرنشون آی پی ایسنی شما $3 ئه، و نوم دیارکن قلف کردن #$5 ئه.\nلطفا همه جزئیات نه د هر حاسته ای که داریت بوئیت.",
        "blockednoreason": "هیژ دلیلی دئه نبیه",
        "whitelistedittext": "شما باید $1 سی ویرایشت بلگیا",
        "confirmedittext": "شما واس دما ویرایشت کردن بلگه یا تیرنشون انجومانامه تونه پشت راس بکیت.\nلطفا یه گل تیرنشون خو سی [[Special:اولویتیا|اولویتیا کاریار]] بنیت.",
        "nosuchsectiontitle": "نبوئه بشخ پیدا بوئه",
        "nosuchsectiontext": "شما سی ویرایشت کردن جایی که وجود ناره تلاش کردیته.\nشات وه اوسه که شما بلگه نه می دیئته جا وه جا بیه یا پاکسا بیه.",
        "loginreqtitle": "وامین اومائن لازمه",
-       "loginreqlink": "اومائن",
+       "loginreqlink": "وا مین اومائن",
        "loginreqpagetext": "$1 لطف بکید بلگه یا هنی نه بوینیت",
-       "accmailtitle": "پاسورد کل بی",
+       "accmailtitle": "رازینه گواردن کل بی",
        "accmailtext": "یه گل رازینه گواردن شامسکی سی[[چک چنه کاریار:$1|$1]] سی $2 کل بیه.بوئه وه نه د گات وه کار بستن بلگه اومائن وامین د <em>[[Special:آلشت دئن رازینه گواردن|آلشت دئن رازینه گواردن]]</em>  آلشت دئه بوئه.",
        "newarticle": "تازه",
-       "newarticletext": "شما وادما هوم پیوندی هئیت که وجود ناره.\nسی راس کردن بلگه.شرو د نیسنن مئن جعوه هاری بکید(سیل[$1 ] سی دونسمنی بیشتر بکید).\nار شما سی اشتوا کردن هایئن ایچه، دگمه وادما رئتن مرورگر تونه بپورنیت.",
+       "newarticletext": "شما وادما هوم پیوندی هئیت که وجود ناره.\nسی راس کردن بلگه.شرو د نیسنن مئن جعوه هاری بکید(سیل[$1 ] سی دونسمنی بیشتر بکید).\nار شما سی اشتوا کردن هایئن ایچه، دگمه وادما رئتن دوارته نیئر تونه بپورنیت.",
        "anontalkpagetext": "----",
        "noarticletext": "د تازه یا د ای بلگه متن نی.\nشما تونید د[[Special:Search/{{PAGENAME}}|search for this page title]] بگردید د ای بلگه یا د بلگیا هنی یا<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}   د هنی پی جوری بوئه  logs]</span>   \n   [{{fullurl:{{FULLPAGENAME}}|action=edit}} یای ای بلگه نه ویرایشت بکیدpage]</span>.",
        "noarticletext-nopermission": "د تازه یا د ای بلگه متن نی.\nشما تونید د[[Special:Search/{{PAGENAME}}|search for this page title]] بگردید د ای بلگه یا د بلگیا هنی یا<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}   د هنی پی جوری بوئه  logs]</span>      اما شما حق ناریتو ای بلگه نه راس بکیت",
        "missing-revision": "وانئیری #$1 د بلگه ای که نومش ونه \"{{FULLPAGENAME}}\" وجود ناره.\n\nشایت بانی جاونه وه وا یه گل ویرگار وه هنگوم نبیه که د یه گل بلگه پاکسا بیه هوم پیوند بیه بوئه.\nشایت جزئیات د   [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]  پیدا بوئن.",
        "userpage-userdoesnotexist": "حساو کاریاری\"$1\" ثوت نام نبیه.\nار میهایت ای بلگه نه بسازیتو یا ویرایشت بکیت یه گل وارسی انجوم بئیت.",
        "userpage-userdoesnotexist-view": "حساو کارور\"$1\" ثوت نبیه.",
-       "blocked-notice-logextract": "ای کارور ایسنی دسرسی ناره.\nآخری نشون قلف ورودی د هار ایچه سی سرچشمه آماده بیه:",
-       "clearyourcache": "<strong>تÙ\88جÙ\87 داشتویت:</strong> نها اماییه کاری, شات مژبور وه وه کار ونن ویرگه نهو دوارته نیئر خوتو سی دیئن ای آلشتیا بوئیت .\n* <strong>فایرفاکس/ سفری:</strong> بپورنیت ری<em>شیفت</em> اوسه که می پورنیت<em>د نو سوار بوئه</em>یا هنی ری <em>Ctrl-F5</em> بپورنیت یا<em>Ctrl-R</em> (<em>⌘-R</em> د سامونه مک)\n* <strong>گوگل کروم:</ strong>بپورنیت ری <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> یا د سامونه)\n* <strong>اینترنت اکسپلورر:</strong> <em>Ctrl</em> واداریت اوسه که می پورنیت ری <em>Refresh</em>, یل بپورنیت ری<em>Ctrl-F5</em>\n* <strong>اوپرا:</strong> ویرگه نهو نه د <em>اوزاریا→ اولویتیا پاک بکیت</em>",
-       "usercssyoucanpreview": "<strong>نکته:</strong> د دگمه \"{{int:showpreview}}\" سی آزماشت کردن سی اس اس تازه دما اماییه کاری استفاده بکیت .",
-       "userjsyoucanpreview": "<strong>نکته:</strong> د دگمه \"{{int:showpreview}}\" سی آزماشت کردن دما اماییه کاری جاوا اسکریپت تازه استفاده بکیت .",
+       "blocked-notice-logextract": "ای کاریار ایسنی دسرسی ناره.\nآخری پهرستنومه قلف ورودی د هار ایچه سی سرچشمه آماده بیه:",
+       "clearyourcache": "<strong>د Ù\88Û\8cر داشتویت:</strong> نها اماییه کاری, شات مژبور وه وه کار ونن ویرگه نهو دوارته نیئر خوتو سی دیئن ای آلشتیا بوئیت .\n* <strong>فایرفاکس/ سفری:</strong> بپورنیت ری<em>شیفت</em> اوسه که می پورنیت<em>د نو سوار بوئه</em>یا هنی ری <em>Ctrl-F5</em> بپورنیت یا<em>Ctrl-R</em> (<em>⌘-R</em> د سامونه مک)\n* <strong>گوگل کروم:</ strong>بپورنیت ری <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> یا د سامونه)\n* <strong>اینترنت اکسپلورر:</strong> <em>Ctrl</em> واداریت اوسه که می پورنیت ری <em>Refresh</em>, یل بپورنیت ری<em>Ctrl-F5</em>\n* <strong>اوپرا:</strong> ویرگه نهو نه د <em>اوزاریا→ اولویتیا پاک بکیت</em>",
+       "usercssyoucanpreview": "<strong>نکته:</strong> د دگمه \"{{int:showpreview}}\" سی آزماشت کردن سی اس اس تازه دما اماییه کاری وه کار بیئریت.",
+       "userjsyoucanpreview": "<strong>نکته:</strong> د دگمه \"{{int:showpreview}}\" سی آزماشت کردن دما اماییه کاری جاوا اسکریپت تازه وه کار بیئریت.",
        "usercsspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت سی اس اس کاریاری تونه پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
        "userjspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت جاوا اسکریپت کاریاری تونه پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
        "sitecsspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت ای سی اس اس  نه فقط پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
        "session_fail_preview_html": "<strong>د بدبختی ما سی یه که رسینه یا جلسه مونه د دس دئیمه نمی تونیم کار پردازشت ویرایشت شمانه انجوم بیئمو.</strong>\nلطفن هنی تلاش بکیت.\n\n<em>سی یه که {{نوم دیارگه}} یه گل ردیف اچ تی ام ال کنشتگر بیه داره، پیش سیل سی یه که د دس حمله یا جاوا اسکریپ د امون با قام کرده بیه..</em>\n\n<strong>ار وه گات قانونی تلاش سی ویرایشته،لطفا د نو تلاش بکیت.</strong>\nار هنی کار وه دروس کار نکرد،[[Special:UserLogout|اومائن وه در]] نه ازمایشت بکیت و د نو بیایت وامین.",
        "token_suffix_mismatch": "<strong>ویرایشتیا شما سی یه که دووارته نئر شما نیسسه یا نقطه نیائن نه د رازینه امنیتی ویرایشت د یک تیچسه.</strong>\nویرایشت سی یه که د خراو بیئن نیسسه بلگه نهاگری با رد بیه.\nای رخ ون د گاتیایی پیش میا که شما د یه گل رسینه جا پروکسی استفاده می کیت.",
        "edit_form_incomplete": "<strong>پاره ای د ویرایشتا وه رسینه جا نمی رسن، هنی وارسی بکیت سی یه که بوینیت ویرایشتیا شما خوئه و هنی تلاش بکیت .</strong>",
-       "editing": "د حالت ويرايشت$1",
+       "editing": "د حال و بال ويرايشت$1",
        "creating": "راس كردن $1",
-       "editingsection": "د حال ویرایشت$1(بشخ)",
-       "editingcomment": "د حال ویرایشت$1(بشخ تازه)",
+       "editingsection": "د حال و بال ویرایشت$1(بشخ)",
+       "editingcomment": "د حال و بال ویرایشت$1(بهرجا تازه)",
        "editconflict": "تضاد د ویرایشت:$1",
-       "explainconflict": "داوسه که شما شرو د ویرایشت ای بلگه کردیته، یه نفر هنی ای بلگه نه آلشت دئه.\nراساگه روئی متن بلگه متن نه چی یه که وجود داشتوه د ور میئره.\nآلشتیا شما د متن هاری نشو دئه هئ.\nشما با آلشتیاتونه د متن که هئش یکی بکید.\nفقط متنی که ها د رو د وختی که شما\"{{رقم:ذخیره گوتار}}\" نه گزارشت می کید اماییه بوئه",
-       "yourtext": "Ù\85تÙ\86 شما",
+       "explainconflict": "داوسه که شما شرو د ویرایشت ای بلگه کردیته، یه نفر هنی ای بلگه نه آلشت دئه.\nراساگه وارو نیسسه بلگه نیسسه نه چی یه که وجود داشتوه د ور میئره.\nآلشتیا شما د نیسسه هاری نشو دئه هئ.\nشما با آلشتیاتونه د نیسسه که هئش یکی بکید.\nفقط متنی که ها د رو د گاتی که شما\"{{رقم:اماییه کاری گوتار}}\" نه گزارشت می کید اماییه بوئه",
+       "yourtext": "Ù\86Û\8cسسÙ\87 شما",
        "storedversion": "دوواره دیئن انبار بیه.",
        "nonunicodebrowser": "<strong>زئنار:دووارته نئر شما وا نیسسه یا یونیکد سازگاری ناره.</strong>\nیه گل راحل وه کار گرته بیه سی یه که شما بلگه یا نه وا امنیت ویرایشت بکیت:\nنیسه یا غیر-ASCII  د پایه رازینه یا 16 تایی دتو نشو دئه بوئه.",
        "editingold": "<strong>زئنار:شما داریت یه گل وانئری نا به هنگوم بیه نه سی ای بلگه ویرایشت می کید</strong>\nار شما ونه اماییه بکیت،هر آلشتی که د اول سی ای وانئری انجوم بیه گم بوئه.",
        "hijri-calendar-m4": "رجو",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چک چنه]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "سردیس دمادیس نادیار \"$1\"",
        "duplicate-defaultsort": "زنهار کلیت پیش فرض جور بیه $2 تازه ای یا کلید پیش فرض جوربیه $1 رد بیه.",
        "version": "نسقه",
        "version-extensions": "دمادیسیا پورسه",
index 19a78c3..b2d0dcc 100644 (file)
        "filerenameerror": "Tsy voaova ho \"$2\" ny anaran'ilay rakitra \"$1\".",
        "filedeleteerror": "Tsy voafafa ilay rakitra \"$1\".",
        "directorycreateerror": "Tsy afaka amboarina ny petra-drakitra (''dossier, directory'') « $1 ».",
+       "directoryreadonlyerror": "Vakiana ihany ny lahatahiry \"$1\"",
+       "directorynotreadableerror": "Tsy azo vakiana ny lahatahiry \"$1\".",
        "filenotfound": "Tsy hita ilay rakitra \"$1\".",
        "unexpected": "Tsy nandrasana: \"$1\"=\"$2\".",
        "formerror": "Tsy mety: tsy lasa ny fisy",
        "content-model-text": "soratra tsotra",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Zavatra foana",
+       "content-json-empty-array": "Tabilao foana",
+       "duplicate-args-category": "Pejy mampiasa dika mitovy hevitra amin'ny fiantsoana endrika",
        "expensive-parserfunction-warning": "Tandremo : Betsaka loatra ny fanantsoana ny tao parser.\n\nTsy maintsy latsaky ny $2 ny tao, kanefa misy $1. {{PLURAL:$2||}}",
        "expensive-parserfunction-category": "Pejy mampiasa be loatra ny tao parser",
        "post-expand-template-inclusion-warning": "'''Tandremo''' : be loatra ny endrika ampiasain'ity pejy ity, misy endrika tsy ho ampiasaina.",
        "history-feed-empty": "Tsy misy ny pejy notadiavina.\nMety efa voafafa na voafindra angamba izy.\nMitadiava amin'ny '''[[Special:Search|fiasàna fitadiavina]]''' mba hitady ny pejy misy fifandraisana.",
        "rev-deleted-comment": "(ambangovangom-panovana nesorina)",
        "rev-deleted-user": "(solonanarana nesorina)",
-       "rev-deleted-event": "(nesorina ny fampidirana)",
+       "rev-deleted-event": "(nesorina ny antsipirihan'ny laogy)",
        "rev-deleted-user-contribs": "[anaram-pikambana na adiresy IP voafafa - fanovana nasitria teo amin'ny fandraisan'anjara modification]",
        "rev-deleted-text-permission": "<strong>Voafafa</strong> ny santiônan'ity pejy ity.\nMety misy ny antsipirihany angamba ny [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME}}}} laogim-pamafàna pejy].",
        "rev-deleted-text-unhide": "Ity versionan'ity pejy ity dia '''voafafa'''.\nHita ao amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogim-pamafana] ny antsipirihany.\nAfaka [$1 mijery ilay versiona] ianao raha tianao.",
        "revdelete-show-file-confirm": "Tapa-kevitra hamafa ny ''revision''-n'i rakitra <nowiki>$1</nowiki> tamin'ny $2 tamin'ny $3 ve ianao ?",
        "revdelete-show-file-submit": "Eny",
        "logdelete-selected": "{{PLURAL:$1||}}Laogy voafidy :",
+       "revdelete-text-others": "Ny mpandrindra hafa dia mbola ho afaka nahazo ny votoaty miafina ary mamerina izany, \nraha tsy misy famerana mikasika izany.",
        "revdelete-confirm": "Amafiso eto ny hevitrao raha hanao io ianao, raha azonao sary an-tsaina ny mety ho vokany, ary raha araka ny [[{{MediaWiki:Policy-url}}|fepetra mihatra]] ny zavatra ataonao.",
        "revdelete-suppress-text": "Ny famafàna pejy dia ampiasaina rehefa :\n* Fampahalalana mampiely lainga\n* Misy fampahalalana tsy sarababem-bahoaka tsy metimety\n*: ''Adiresy onenana, laharana antso an-tariby, sns.''",
        "revdelete-legend": "Hametraka ny fe-pahitana",
        "revdelete-hide-text": "Tahirintsoratry ny versiona",
        "revdelete-hide-image": "asitriho ny votoatin'ilay rakitra",
-       "revdelete-hide-name": "Asitriho ny asa sy ny tanjona",
+       "revdelete-hide-name": "Asitriho ny tanjona sy ny parametatra",
        "revdelete-hide-comment": "Ambangovangon'ilay fiovàna",
        "revdelete-hide-user": "Adiresy IPn'ny Mpanova",
        "revdelete-hide-restricted": "Fafao ireo votoatiny ireo amin'ny mpiandrindra sy amin'ny mpikambana hafa",
        "right-protect": "Manova ny lenta fiarovan'ny pejy sy manova ny pejy voaaro miriana",
        "right-editprotected": "Manova pejy voaaro (tsy misy fiarovana en cascade)",
        "right-editsemiprotected": "Hanova ny pejy narovna ho \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Hanova ny modelim-botoatin'ny pejy",
        "right-editinterface": "Manova ny interface ny mpikambana",
        "right-editusercssjs": "Manova ny rakitra CSS sy JS ny mpikambana hafa",
        "right-editusercss": "Manova ny rakitra CSS ny mpikambana hafa",
        "action-viewmywatchlist": "Mijery ny pejy arahanao",
        "action-viewmyprivateinfo": "Mijery ny fampahalalana tsy sarababem-bahoakanao",
        "action-editmyprivateinfo": "Mijery ny fampahalalana sarababem-bahoakanao",
+       "action-editcontentmodel": "manova ny modelim-botoatin'ny pejy",
        "nchanges": "{{PLURAL:$1|fanovana|fanovana}} $1",
        "enhancedrc-since-last-visit": "$1 ({{PLURAL:$1|hatry ny famangiana farany}})",
        "enhancedrc-history": "tantara",
        "watchlisttools-view": "pejy arahako maso",
        "watchlisttools-edit": "Jereo sy ovao ny lisitra ny pejy fanaraha-maso",
        "watchlisttools-raw": "Ovay ilay pejy arahako maso amizao",
-       "unknown_extension_tag": "Balizy mitondra itatra « $1 » tsy fantatra",
        "duplicate-defaultsort": "'''Tandremo''' : manitsaka ny sort key taloha \"$1\" ilay sort key ankehitriny \"$2\".",
        "version": "Versiona",
        "version-extensions": "Fanitarana nampidirina",
index 139f3c1..9cc4f98 100644 (file)
        "anoneditwarning": "<strong>Предупредување:</strong> Не сте најавени. Вашата IP-адреса ќе биде јавно видлива ако уредувате. Ако <strong>[$1 се најавите]</strong> или <strong>[$2 направите сметка]</strong>, тогаш уредувањата ќе се припишуваат на вашето корисничко име, покрај другите погодности.",
        "anonpreviewwarning": "''Не сте најавени. Ако ја зачувате, Вашата IP-адреса ќе биде заведена во историјата на уредување на страницата.''",
        "missingsummary": "'''Потсетник:''' Не внесовте опис на измените. Ако притиснете Зачувај повторно, вашите измени ќе се зачуваат без опис.",
-       "selfredirect": "<strong>Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:</strong> Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°Ñ\82е Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе ÐºÐ¾Ð½ Ð¸Ñ\81Ñ\82аÑ\82а Ñ\81Ñ\82аÑ\82иÑ\98а.\nÐ\90ко Ñ\81Ñ\82иÑ\81неÑ\82е Ð½Ð° â\80\9e{{int:savearticle}}â\80\9c Ð¿Ð¾Ð²Ñ\82оÑ\80но, Ñ\82огаÑ\88 Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aеÑ\82о ќе се создаде.",
+       "selfredirect": "<strong>Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:</strong> Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°Ñ\82е Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе ÐºÐ¾Ð½ Ð¸Ñ\81Ñ\82аÑ\82а Ñ\81Ñ\82аÑ\82иÑ\98а.\nÐ\9cоже Ð´Ð° Ñ\81Ñ\82е Ñ\83кажале Ð³Ñ\80еÑ\88на Ñ\86елна Ñ\81Ñ\82Ñ\80аниÑ\86а, Ð¸Ð»Ð¸ Ð¿Ð°Ðº Ñ\83Ñ\80едÑ\83ваÑ\82е Ð¿Ð¾Ð³Ñ\80еÑ\88на Ñ\81Ñ\82Ñ\80аниÑ\86а.\nÐ\90ко Ñ\81Ñ\82иÑ\81неÑ\82е Ð½Ð° â\80\9e{{int:savearticle}}â\80\9c Ð¿Ð¾Ð²Ñ\82оÑ\80но, Ñ\82огаÑ\88 Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aеÑ\82о Ð±ÐµÐ·Ð´Ñ\80Ñ\83Ð³о ќе се создаде.",
        "missingcommenttext": "Ве молиме внесете коментар подолу.",
        "missingcommentheader": "'''Потсетување:''' Не внесовте наслов за овој коментар.\nАко повторно стиснете на „{{int:savearticle}}“, уредувањето ќе биде зачувано без наслов.",
        "summary-preview": "Изглед на описот:",
        "content-model-text": "прост текст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Празен објект",
+       "content-json-empty-array": "Празна низа",
        "duplicate-args-category": "Страници што користат дуплирани аргументи во повикувања на шаблони",
        "duplicate-args-category-desc": "Страницава содржи повикувања на шаблони кои се дупликати на аргументи, како што се <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Предупредување: Оваа страница користи премногу повикувања на parser функции.\n\nТреба да има помалку од $2 {{PLURAL:$2|повикување|повикувања}} а сега има {{PLURAL:$1|$1 повикување|$1 повикувања}}.",
        "history-feed-empty": "Бараната страница не постои.\nМоже била избришана од викито или преименувана.\nОбидете се да [[Special:Search|пребарате низ викито]] за релевантни нови страници.",
        "rev-deleted-comment": "(избришан опис на промени)",
        "rev-deleted-user": "(избришано корисничко име)",
-       "rev-deleted-event": "(избришан запис на дејство)",
+       "rev-deleted-event": "(избришани податоци од дневникот)",
        "rev-deleted-user-contribs": "[отстрането е корисничкото име или IP-адресата - уредувањето нема да се прикаже на списокот на придонеси]",
        "rev-deleted-text-permission": "Оваа преработка страницата е <strong>избришана</strong>.\nМожеби има подробности во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
        "rev-suppressed-text-permission": "Оваа преработка на страницата е <strong>притаена</strong>. Повеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневникот на скривања].",
        "revdelete-legend": "Постави ограничувања за видливост",
        "revdelete-hide-text": "Текст на преработката",
        "revdelete-hide-image": "Скриј содржина на податотека",
-       "revdelete-hide-name": "Скриј го дејството и неговата одредница",
+       "revdelete-hide-name": "Скриј ја целта и параметрите",
        "revdelete-hide-comment": "Опис на уредувањето",
        "revdelete-hide-user": "Корисничко име/IP-адреса на уредникот",
        "revdelete-hide-restricted": "Постави ограничувања и за администратори на ист начин како и за останатите",
        "thumbnail-temp-create": "Не можам да создадам привремена податотека на минијатурата",
        "thumbnail-dest-create": "Не можам да ја зачувам минијатурата во одредницата",
        "thumbnail_invalid_params": "Параметрите на минијатурата се погрешни",
+       "thumbnail_toobigimagearea": "Податотека со димензии поголеми од $1",
        "thumbnail_dest_directory": "Целниот именик не може да се создаде",
        "thumbnail_image-type": "Неподдржан тип на слика",
        "thumbnail_gd-library": "Нецелосни поставки на графичката библиотека: недостасува функцијата $1",
        "hebrew-calendar-m11-gen": "ав",
        "hebrew-calendar-m12-gen": "елул",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|разговор]])",
-       "unknown_extension_tag": "Непозната ознака на додатокот „$1“",
        "duplicate-defaultsort": "Предупредување: Основниот клуч за подредување „$2“ го поништува претходниот основен клуч за подредување „$1“.",
        "duplicate-displaytitle": "<strong>Предупредување:</strong> Приказниот наслов „$2“ го заменува претходнито приказен наслов „$1“.",
        "invalid-indicator-name": "<strong>Грешка:</strong> Атрибутот <code>name</code> што го покажува статусот на страницата не може да биде празен.",
index bbe6a1c..ea0c344 100644 (file)
        "anoneditwarning": "'''Attenzione:''' Nun avite fatto l'acciesso. 'A cronologgia d' 'a vosta sarrà visibbele pubbrecamente si facite cocche cagnamiento. Si <strong>[$1 tràse]</strong> o <strong>[$2 crìe nu cunto]</strong>, 'e cagnamiente vuoste ve sarranno attribbuite a vvuje, nzieme a n'ati migliuramente.",
        "anonpreviewwarning": "''Nun avite fatto 'o login. Sarvann' 'a paggena, l'indirizzo IP d' 'o vuosto sarrà riggistrato dint'a cronologgia.''",
        "missingsummary": "'''Attenziò:''' nun s'è specificato l'oggetto 'e stu cagnamiento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato cu l'oggetto abbacante.",
-       "selfredirect": "<strong>Attenziò:</strong> State crianno nu redirect a 'o stesso articolo.\nSi cliccate \"{{int:savearticle}}\" n'ata vota, si criarrà 'o redirect.",
+       "selfredirect": "<strong>Attenziò:</strong> State crianno nu redirect a 'o stesso articolo.\nPuò darse c'avites specificato 'o pizzo sbagliato p' 'o redirect, o ca stavate cagnanno 'o pizzo sbagliato.\nSi cliccate \"{{int:savearticle}}\" n'ata vota, si criarrà 'o redirect.",
        "missingcommenttext": "Pe' piacere scrivete nu commento ccà abbascio.",
        "missingcommentheader": "'''Attenziò:''' nun s'è specificato l'oggetto/titolo 'e stu commento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato c' 'o titolo abbacante.",
        "summary-preview": "Anteprimma'e l'oggetto:",
        "content-model-text": "testo nurmale",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Oggetto abbacante",
+       "content-json-empty-array": "Array abbacante",
        "duplicate-args-category": "Paggene c'ausano argomiente dupprecate dint' 'e chiammate a 'e mudelle",
        "duplicate-args-category-desc": "'A paggena tene chiammate a mudelle c'ausassero argomiente dupprecate, comme p'esempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Attenziò:''' Sta paggena cuntene troppe chiammate a 'e funzione parser.\n\nN'avesse 'a tené meno 'e $2, p' 'o mumento ce ne {{PLURAL:$1|stà $1|stanno $1}}.",
        "history-feed-empty": "'A paggena addimannata nun esiste.\nPuò darsi ca è stata scancellata d' 'a wiki, o s'è cagnato 'o nomme.\nProva a vedé [[Special:Search|dint' 'a wiki]] si ce stanno nnove paggene.",
        "rev-deleted-comment": "(Oggetto d' 'o cagnamiento luvato)",
        "rev-deleted-user": "(nomme utente luvato)",
-       "rev-deleted-event": "(azione d' 'o log luvata)",
+       "rev-deleted-event": "(dettaglie d' 'o log luvate)",
        "rev-deleted-user-contribs": "[nomme utente o indirizzo IP luvato - cagnamiento annascunnuto d' 'a cronologgia]",
        "rev-deleted-text-permission": "Sta verziona d' 'a paggena è stata '''scancellata'''.\nAscìa dint' 'o [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} riggistro d' 'e scancellamiente] pe ne sapé 'e cchiù.",
        "rev-suppressed-text-permission": "Sta verziona d' 'a paggena è stata '''luvata'''.\nVide 'o [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistro 'e paggene luvate] pe' ne sapé 'e cchiù.",
        "revdelete-legend": "Miette 'e limmete 'e visibilità",
        "revdelete-hide-text": "Testo d' 'a verziona",
        "revdelete-hide-image": "Annascunne 'e cuntenute d' 'o file",
-       "revdelete-hide-name": "Annascunne aziona e l'oggetto 'e cchesta",
+       "revdelete-hide-name": "Annascunne l'oggetto e parametre",
        "revdelete-hide-comment": "Modifeca oggetto",
        "revdelete-hide-user": "Nomme o indirizzo IP 'e ll'autore",
        "revdelete-hide-restricted": "Annascunne 'e nfurmaziune 'nnecate pure a l'ammenistrature",
        "thumbnail-temp-create": "Nun se può crià na miniatura temporanea d' 'o file",
        "thumbnail-dest-create": "Nun se può astipà 'a miniatura dint' 'a destinazione",
        "thumbnail_invalid_params": "Parametre 'e miniatura invalide",
+       "thumbnail_toobigimagearea": "Diminziona d' 'o File cchiù grossa d'$1",
        "thumbnail_dest_directory": "Nun se può crià 'a cartella 'e destinazione",
        "thumbnail_image-type": "'O tipo d'immaggene nun è suppurtato",
        "thumbnail_gd-library": "Configurazione d' 'a libbreria GD incompleta: funziona perza $1",
        "watchlisttools-edit": "Vide e cagna l'elenco 'e paggene cuntrullate",
        "watchlisttools-raw": "Cagna l'elenco 'e paggene cuntrullate ncruro",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|chiacchiere]])",
-       "unknown_extension_tag": "Tag 'e stensione scanusciuto \"$1\"",
        "duplicate-defaultsort": "<strong>Attenziò:</strong> A chiave d'arricetto \"$2\" se miette ncuollo a nu valore 'e primma \"$1\".",
        "duplicate-displaytitle": "<strong>Attenziò:</strong> A chiave d'arricetto \"$2\" se scagna p' 'o valore 'e primma \"$1\".",
        "invalid-indicator-name": "<strong>Errore:</strong> attribbuto <code>name</code> 'e ll'innecature d' 'o stato d' 'a paggena nu può rummanè abbacante.",
index 238ff58..59c7262 100644 (file)
        "watchlisttools-edit": "Volglieste bekieken en bewarken",
        "watchlisttools-raw": "Roewe volglieste bewarken",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|overleg]])",
-       "unknown_extension_tag": "Onbekende tag \"$1\"",
        "duplicate-defaultsort": "Waorschuwing: de standardsortering \"$2\" krig veurrang veur de sortering \"$1\".",
        "version": "Versie",
        "version-extensions": "Uutbreidingen die installeerd bin",
index fa7a9d3..e5db39d 100644 (file)
@@ -61,7 +61,8 @@
                        "Arg",
                        "NCoppens",
                        "Josse.Cottenier",
-                       "Macofe"
+                       "Macofe",
+                       "Mirolith"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "content-model-text": "tekst zonder opmaak",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Leeg object",
        "duplicate-args-category": "Pagina's met dubbele sjabloonparameters",
        "duplicate-args-category-desc": "De pagina bevat aanroepen van sjablonen waarin hetzelfde argument meerdere keren wordt gebruikt, bijvoorbeeld <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> of <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Waarschuwing:''' deze pagina gebruikt te veel kostbare parserfuncties.\n\nNu {{PLURAL:$1|is|zijn}} het er $1, terwijl het er minder dan $2 {{PLURAL:$2|moet|moeten}} zijn.",
        "iranian-calendar-m11": "Elfde Perzische maand",
        "iranian-calendar-m12": "Twaalfde Perzische maand",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|overleg]])",
-       "unknown_extension_tag": "Onbekende tag \"$1\"",
        "duplicate-defaultsort": "'''Waarschuwing:''' de standaardsortering \"$2\" krijgt voorrang voor de sortering \"$1\".",
        "duplicate-displaytitle": "<strong>Waarschuwing:</strong>Titelweergave \"$2\" overschrijft eerdere titelweergave \"$1\".",
        "invalid-indicator-name": "<strong>Fout:</strong> de eigenschap <code>name</code> van de paginastatusindicators mag niet leeg zijn.",
index 1a5e64e..6eaf652 100644 (file)
        "revdelete-legend": "Ustaw ograniczenia widoczności",
        "revdelete-hide-text": "Tekst wersji",
        "revdelete-hide-image": "Ukryj zawartość pliku",
-       "revdelete-hide-name": "Ukryj akcję i cel",
+       "revdelete-hide-name": "Ukryj cel i parametry",
        "revdelete-hide-comment": "Opis zmian",
        "revdelete-hide-user": "Nazwa użytkownika/adres IP",
        "revdelete-hide-restricted": "Ukryj informacje przed administratorami tak samo jak przed innymi",
        "nimagelinks": "Używane na $1 {{PLURAL:$1|stronie|stronach}}",
        "ntransclusions": "używany na $1 {{PLURAL:$1|stronie|stronach}}",
        "specialpage-empty": "Ta strona raportu jest pusta.",
-       "lonelypages": "Porzucone strony",
+       "lonelypages": "Osierocone strony",
        "lonelypagestext": "Do poniższych stron nie linkuje żadna inna strona lub nie są one dołączone do innych stron w {{GRAMMAR:MS.lp|{{SITENAME}}}}.",
        "uncategorizedpages": "Nieskategoryzowane strony",
        "uncategorizedcategories": "Nieskategoryzowane kategorie",
        "hebrew-calendar-m9-gen": "Siwan",
        "hebrew-calendar-m11-gen": "Aw",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|dyskusja]])",
-       "unknown_extension_tag": "Nieznany znacznik rozszerzenia „$1”",
        "duplicate-defaultsort": "Uwaga: Domyślnym kluczem sortowania będzie „$2” i zastąpi on wcześniej wykorzystywany klucz „$1”.",
        "duplicate-displaytitle": "<strong>Uwaga:</strong> Wyświetlenie tytułu „$2” powoduje nadpisanie wcześniej wyświetlanego tytułu „$1”.",
        "version": "Wersja oprogramowania",
index 375c69e..2726008 100644 (file)
        "tog-shownumberswatching": "Mostrar o número de usuários que estão vigiando",
        "tog-oldsig": "Assinatura existente:",
        "tog-fancysig": "Tratar assinatura como wikitexto (sem link automático)",
-       "tog-uselivepreview": "Utilizar pré-visualização em tempo real (experimental)",
+       "tog-uselivepreview": "Utilizar pré-visualização em tempo real",
        "tog-forceeditsummary": "Avisar-me ao introduzir um sumário de edição vazio",
        "tog-watchlisthideown": "Ocultar as minhas edições da lista de páginas vigiadas",
        "tog-watchlisthidebots": "Ocultar edições de bots da lista de páginas vigiadas",
        "filerenameerror": "Não foi possível renomear o arquivo \"$1\" para \"$2\".",
        "filedeleteerror": "Não foi possível eliminar o arquivo \"$1\".",
        "directorycreateerror": "Não foi possível criar o diretório \"$1\".",
+       "directoryreadonlyerror": "Diretorio \"$1\" é somente leitura.",
+       "directorynotreadableerror": "O diretório \"$1\" não é legível.",
        "filenotfound": "Não foi possível encontrar o arquivo \"$1\".",
        "unexpected": "Valor não esperado: \"$1\"=\"$2\".",
        "formerror": "Erro: Não foi possível enviar o formulário",
        "viewyourtext": "Pode ver e copiar o código fonte '''das suas edições''' nesta página:",
        "protectedinterface": "Esta página fornece texto de interface ao software deste wiki, se encontrando protegida para prevenir abusos.\n\nPara adicionar ou alterar traduções em todos os wikis, utilize o [//translatewiki.net/ translatewiki.net], projeto de traduções do MediaWiki.",
        "editinginterface": "'''Aviso:''' Você se encontra prestes a editar uma página que é utilizada para fornecer texto de interface ao software.\nAlterações nesta página irão afetar a aparência da interface de usuário para outros usuários deste wiki.\nPara alterar ou adicionar traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt-br translatewiki.net], um projeto destinado para a tradução do MediaWiki.",
+       "translateinterface": "Para adicionar ou modificar traduções para todas as wikis, por favor use  [//translatewiki.net/ translatewiki.net], o projeto de localização do MediaWiki.",
        "cascadeprotected": "Esta página foi protegida contra edições por estar incluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de \"proteção progressiva\" ativada):\n$2",
        "namespaceprotected": "Você não possui permissão para editar páginas no espaço nominal '''$1'''.",
        "customcssprotected": "Você não tem permissão para editar esta página CSS, porque ele contém configurações pessoais de outro usuário.",
        "anoneditwarning": "'''Atenção''': Você não se encontra autenticado.\nO seu endereço de IP será registrado no histórico de edições desta página.",
        "anonpreviewwarning": "''Você não está logado. Gravar registará o seu endereço IP no histórico de edições desta página.''",
        "missingsummary": "'''Lembrete:''' Você não introduziu um sumário de edição. Se clicar novamente em Salvar, a sua edição será salva sem um sumário.",
+       "selfredirect": "<strong>Aviso:</strong> Você esta redirecionando esta pagina para ela mesmo. Você pode ter especificado o caminho errado para redirecionar, ou você pode estar editando a pagina errada. Se você clicar \"{{int:savearticle}}\" novamente, o redirecionamento será criado de qualquer modo.",
        "missingcommenttext": "Por favor, introduzida um comentário abaixo.",
        "missingcommentheader": "'''Lembrete:''' Você não introduziu um assunto/título para este comentário.\nSe você clicar novamente \"{{int:savearticle}}\", a sua edição será salva sem um assunto/título.",
        "summary-preview": "Previsão de sumário:",
        "content-model-text": "texto simples",
        "content-model-javascript": "Javascript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objeto vazio",
+       "content-json-empty-array": "Array vazia",
        "duplicate-args-category": "Páginas que utilizam argumentos duplicados ao chamar predefinições",
+       "duplicate-args-category-desc": "A pagina contem modelos que usam argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Aviso: Esta página contém muitas chamadas a funções do analisador \"parser\".\n\nDeveria ter menos de $2 {{PLURAL:$2|chamada|chamadas}}. Neste momento {{PLURAL:$1|há $1 chamada|existem $1 chamadas}}.",
        "expensive-parserfunction-category": "Páginas com muitas chamadas a funções do analisador \"parser\"",
        "post-expand-template-inclusion-warning": "'''Aviso''': a soma do tamanho de inclusão de predefinições é muito grande.\nAlgumas predefinições não serão processadas.",
        "history-feed-empty": "A página requisitada não existe.\nPoderá ter sido eliminada do wiki ou renomeada.\nTente [[Special:Search|pesquisar no wiki]] por páginas relevantes.",
        "rev-deleted-comment": "(resumo da edição suprimido)",
        "rev-deleted-user": "(nome de usuário removido)",
-       "rev-deleted-event": "(entrada removida)",
+       "rev-deleted-event": "(registros de detalhes eliminados)",
        "rev-deleted-user-contribs": "[nome de usuário ou endereço de IP eliminado - edição ocultada das contribuições]",
        "rev-deleted-text-permission": "Esta revisão desta página foi '''eliminada'''.\nPodem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminações].",
        "rev-suppressed-text-permission": "A revisão desta página foi '''eliminada'''.\nVocê pode visualizá-la; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "revdelete-legend": "Definir restrições de visualização",
        "revdelete-hide-text": "Texto de revisão",
        "revdelete-hide-image": "Ocultar conteúdos do arquivo",
-       "revdelete-hide-name": "Ocultar ação e alvo",
+       "revdelete-hide-name": "Ocultar destino e parâmetros",
        "revdelete-hide-comment": "Sumário de edição",
        "revdelete-hide-user": "Nome de usuário/endereço IP",
        "revdelete-hide-restricted": "Suprimir dados de administradores assim como de outros",
        "mergehistory-empty": "Não existem edições habilitadas a serem fundidas.",
        "mergehistory-success": "$3 {{PLURAL:$3|revisão|revisões}} de [[:$1]] fundidas em [[:$2]] com sucesso.",
        "mergehistory-fail": "Não foi possível fundir os históricos; por gentileza, verifique a página e os parâmetros de tempo.",
+       "mergehistory-fail-toobig": "Não é possível fundir o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.",
        "mergehistory-no-source": "A página de origem ($1) não existe.",
        "mergehistory-no-destination": "A página de destino ($1) não existe.",
        "mergehistory-invalid-source": "A página de origem precisa ser um título válido.",
        "search-result-category-size": "{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoria|$2 subcategorias}}, {{PLURAL:$3|1 arquivo|$3 arquivos}})",
        "search-redirect": "(redirecionamento de $1)",
        "search-section": "(seção $1)",
+       "search-category": "(categoria $1)",
        "search-file-match": "(coincide com o conteúdo do arquivo)",
        "search-suggest": "Você quis dizer: $1",
        "search-interwiki-caption": "Projetos irmãos",
        "searchrelated": "relacionados",
        "searchall": "todos",
        "showingresults": "A seguir {{PLURAL:$1|é mostrado '''um''' resultado|são mostrados até '''$1''' resultados}}, iniciando no '''$2'''º.",
+       "showingresultsinrange": "Apresenta-se abaixo {{PLURAL:$1|<strong>1</strong> resultado|até <strong>$1</strong> resultados}} no intervalo #<strong>$2</strong> a #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Resultado <strong>$1</strong> de <strong>$3</strong>|Resultados <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Não há resultados que correspondam à consulta.",
        "powersearch-legend": "Pesquisa avançada",
        "powersearch-ns": "Pesquisar nos espaços nominais:",
        "right-browsearchive": "Buscar páginas eliminadas",
        "right-undelete": "Restaurar páginas",
        "right-suppressrevision": "Rever e restaurar edições indisponíveis a administradores",
+       "right-viewsuppressed": "Ver revisões escondidas de qualquer usuário",
        "right-suppressionlog": "Ver registros privados",
        "right-block": "Impedir outros usuários de editarem",
        "right-blockemail": "Impedir um usuário de enviar email",
        "right-protect": "Mudar níveis de proteção e editar páginas protegidas em cascata",
        "right-editprotected": "Editar páginas protegidas como \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Editar páginas protegidas como \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Editar o modelo de uma pagina",
        "right-editinterface": "Editar a interface de usuário",
        "right-editusercssjs": "Editar os arquivos CSS e JS de outros usuários",
        "right-editusercss": "Editar os arquivos CSS de outros usuários",
        "action-viewmywatchlist": "veja sua lista de páginas vigiadas",
        "action-viewmyprivateinfo": "veja suas informações privadas",
        "action-editmyprivateinfo": "modifique suas informações privadas",
+       "action-editcontentmodel": "editar o conteudo do modelo de uma pagina",
        "nchanges": "$1 {{PLURAL:$1|alteração|alterações}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "histórico",
        "recentchanges-legend-heading": "'''Legenda''':",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veja também a [[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Abaixo estão mostradas as alterações desde <strong>$2</strong> (até <strong>$1</strong>).",
+       "rcnotefrom": "Abaixo {{PLURAL:$5|é a mudança|são as mudanças}} desde <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Mostrar as novas alterações a partir das $2 de $3",
        "rcshowhideminor": "$1 edições menores",
        "rcshowhideminor-show": "Exibir",
        "wantedpages-badtitle": "Título inválido no conjunto de resultados: $1",
        "wantedfiles": "Arquivos pedidos",
        "wantedfiletext-cat": "Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>. As páginas que incluem arquivos inexistentes são listadas em [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Os arquivos seguintes são usados mas não existem. Além disso, as paginas que incorporam arquivos que não existem estão listadas em [[:$1]].",
        "wantedfiletext-nocat": "Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>.",
+       "wantedfiletext-nocat-noforeign": "Os seguintes arquivos são usados, mas não existem.",
        "wantedtemplates": "Predefinições pedidas",
        "mostlinked": "Páginas com mais afluentes",
        "mostlinkedcategories": "Categorias com mais membros",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
        "suppress": "Supervisor",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
+       "apihelp": "Ajuda de API",
+       "apihelp-no-such-module": "Modulo \"$1\" não foram achados.",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-search": "Pesquisar",
        "trackingcategories-name": "Nome da mensagem",
        "trackingcategories-desc": "Critérios de inclusão de categoria",
        "noindex-category-desc": "A página não é indexada por robôs, porque possui a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está em um namespace onde a flag é permitida.",
+       "index-category-desc": "A página contém a palavra mágica <code><nowiki>__INDEX__</nowiki></code> (e está num domínio em que essa marca é permitida) e, portanto, será indexada pelos robôs mesmo quando normalmente não o seria.",
        "post-expand-template-inclusion-category-desc": "O tamanho da página é superior a <code>$wgMaxArticleSize</code>, após a expansão de todas as predefinições, pelo que algumas predefinições não foram expandidas.",
+       "post-expand-template-argument-category-desc": "O tamanho da página é superior a <code>$wgMaxArticleSize</code>, após a expansão de um argumento de predefinição (algo em chavetas triplas, como <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "A página tem demasiadas funções do analisador custosas (como <code>#ifexist</code>) incluídas. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "A página contém uma ligação quebrada para um arquivo(uma ligação para incorporar um arquivo que não existe).",
+       "hidden-category-category-desc": "Esta é uma categoria com a marca <code><nowiki>__HIDDENCAT__</nowiki></code>, que faz com que ela não apareça na caixa de ligações de categoria nas páginas, por omissão.",
        "trackingcategories-nodesc": "Nenhuma descrição disponível.",
        "trackingcategories-disabled": "A categoria está desabilitada",
        "mailnologin": "Nenhum endereço de envio",
        "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo as páginas de discussão.",
        "wlheader-enotif": "A notificação por email encontra-se ativada.",
        "wlheader-showupdated": "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
-       "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas '''$1''' alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas '''$2''' horas}} a partir de $3, $4.",
+       "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas <strong>$1</strong> alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} até $3, $4.",
        "wlshowlast": "Ver últimas $1 horas $2 dias",
        "watchlist-options": "Opções da lista de páginas vigiadas",
        "watching": "Vigiando...",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "watchlisttools-raw": "Edição crua da lista de páginas vigiadas",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussão]])",
-       "unknown_extension_tag": "\"$1\" é uma tag de extensão desconhecida",
        "duplicate-defaultsort": "Aviso: A chave de ordenação padrão \"$2\" sobrepõe-se à anterior chave de ordenação padrão \"$1\".",
        "version": "Versão",
        "version-extensions": "Extensões instaladas",
index 21a976a..d7caab0 100644 (file)
        "anoneditwarning": "<strong>Aviso</strong>: Não iniciou sessão. O seu endereço IP será registado no histórico de edições desta página. Se <strong>[$1 iniciar sessão]</strong> ou <strong>[$2 criar uma conta]</strong>, as suas edições serão registadas com o seu nome de utilizador(a), bem como usufruir de outros benefícios.",
        "anonpreviewwarning": "''Não iniciou sessão. Ao gravar, registará o seu endereço IP no histórico de edições da página.''",
        "missingsummary": "'''Atenção:''' Não introduziu um resumo da edição.\nSe clicar novamente \"Gravar página\" a sua edição será gravada sem resumo.",
+       "selfredirect": "<strong>Aviso:</strong> Está a redirecionar esta página para si mesma.\nPode ter especificado o destino errado para a página ou até a editar a página errada.\nSe clicar em \"{{int:savearticle}}\" novamente, o redirecionamento será criado na mesma.",
        "missingcommenttext": "Introduza um comentário abaixo, por favor.",
        "missingcommentheader": "'''Atenção:''' Não introduziu um assunto ou cabeçalho para este comentário.\nSe clicar novamente \"{{int:savearticle}}\", a sua edição será gravada sem assunto ou cabeçalho.",
        "summary-preview": "Antevisão do resumo:",
        "history-feed-empty": "A página solicitada não existe.\nPode ter sido eliminada da wiki ou o nome sido alterado.\nTente [[Special:Search|pesquisar na wiki]] novas páginas relevantes.",
        "rev-deleted-comment": "(resumo da edição suprimido)",
        "rev-deleted-user": "(nome de utilizador removido)",
-       "rev-deleted-event": "(entrada removida)",
+       "rev-deleted-event": "(registos de detalhes eliminados)",
        "rev-deleted-user-contribs": "[nome de utilizador ou IP removido - edição ocultada das contribuições]",
        "rev-deleted-text-permission": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
        "rev-suppressed-text-permission": "Esta revisão de página foi <strong>suprimida</strong>.\nPode consultar os detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].",
        "revdelete-legend": "Definir restrições de visibilidade",
        "revdelete-hide-text": "Revisão do texto",
        "revdelete-hide-image": "Ocultar conteúdo do ficheiro",
-       "revdelete-hide-name": "Ocultar operação e destino",
+       "revdelete-hide-name": "Ocultar destino e parâmetros",
        "revdelete-hide-comment": "Resumo da edição",
        "revdelete-hide-user": "Nome de utilizador/endereço de IP",
        "revdelete-hide-restricted": "Ocultar dados dos administradores e de todos os outros",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "watchlisttools-raw": "Editar a lista de páginas vigiadas em forma de texto",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussão]])",
-       "unknown_extension_tag": "\"$1\" é uma marca de extensão desconhecida",
        "duplicate-defaultsort": "<strong>Aviso:</strong> A chave de ordenação padrão \"$2\" sobrepõe-se à anterior \"$1\".",
        "duplicate-displaytitle": "<strong>Aviso:</strong> Exibir título \"$2\" substituindo o título anteriormente em exibição \"$1\".",
        "version": "Versão",
index 813064d..2c01b02 100644 (file)
        "content-model-text": "Name for the plain text content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n{{Identical|Plain text}}",
        "content-model-javascript": "Name for the JavaScript content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "content-model-css": "Name for the CSS content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
+       "content-model-json": "Name for the JSON content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
+       "content-json-empty-object": "Used to represent an object with no properties on a JSON content model page.",
+       "content-json-empty-array": "Used to represent an array with no values on a JSON content model page.",
        "duplicate-args-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain template calls that use duplicates of arguments, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "duplicate-args-category-desc": "Duplicate arguments category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Duplicate-args-category}}",
        "expensive-parserfunction-warning": "On some (expensive) [[MetaWikipedia:Help:ParserFunctions|parser functions]] (e.g. <code><nowiki>{{#ifexist:}}</nowiki></code>) there is a limit of how many times it may be used. This is an error message shown when the limit is exceeded.\n\nParameters:\n* $1 - the current number of parser function calls\n* $2 - the allowed number of parser function calls\nSee also [[:mw:Manual:$wgExpensiveParserFunctionLimit|$wgExpensiveParserFunctionLimit in the MediaWiki manual]].\n\nSee also:\n* {{msg-mw|Expensive-parserfunction-category}}",
        "signature": "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp).\n\nParameters:\n* $1 - the username that is currently login\n* $2 - the customized signature which is specified in [[Special:Preferences|user's preferences]] as non-raw\nUse your language default parentheses ({{msg-mw|parentheses}}), but not use the message direct.\n\nSee also:\n* {{msg-mw|Signature-anon}} - signature for anonymous user",
        "signature-anon": "{{notranslate}}\nUsed as signature for anonymous user. Parameters:\n* $1 - username (IP address?)\n* $2 - nickname (IP address?)\nSee also:\n* {{msg-mw|Signature}} - signature for registered user",
        "timezone-utc": "{{optional}}",
-       "unknown_extension_tag": "This is an error shown when you use an unknown extension tag name.\n\nThis feature allows tags like <code><nowiki><pre></nowiki></code> to be called with a parser like <code><nowiki>{{#tag:pre}}</nowiki></code>.\n\nParameters:\n* $1 - the unknown extension tag name",
        "duplicate-defaultsort": "See definition of [[w:Sorting|sort key]] on Wikipedia. Parameters:\n* $1 - old default sort key\n* $2 - new default sort key",
        "duplicate-displaytitle": "Warning shown when a page has its display title set multiple times. Parameters:\n* $1 - old display title\n* $2 - new display title",
        "invalid-indicator-name": "Warning shown when the [https://www.mediawiki.org/wiki/Help:Page_status_indicators &lt;indicator name=\"''unique-identifier''\">''content''&lt;/indicator>] parser tag is used incorrectly.",
index ff387d9..f626ce1 100644 (file)
        "anoneditwarning": "<strong>Atenție:</strong> Nu v-ați autentificat. Adresa dumneavoastră IP va fi vizibilă în mod public dacă efectuați modificări. Dacă vă <strong>[$1 autentificați]</strong> sau vă <strong>[$2 creați un cont]</strong>, modificările dumneavoastră vor fi asociate numelui de utilizator, pe lângă alte beneficii.",
        "anonpreviewwarning": "''Nu v-ați autentificat. Dacă salvați pagina adresa dumneavoastră IP va fi înregistrată în istoric.''",
        "missingsummary": "'''Atenție:''' Nu ați completat caseta „descriere modificări”. Dacă apăsați din nou butonul „salvează pagina” modificările vor fi salvate fără descriere.",
-       "selfredirect": "<strong>Atenție:</strong> Sunteți pe cale să creați o redirecționare către același articol.\nDacă apăsați din nou pe „{{int:savearticle}}”, redirecționarea va fi creată.",
+       "selfredirect": "<strong>Atenție:</strong> Sunteți pe cale să redirecționați această pagină către ea însăși.\nProbabil ați greșit ținta redirecționării sau ați modificat pagina greșită.\nDacă apăsați din nou pe „{{int:savearticle}}”, redirecționarea va fi creată oricum.",
        "missingcommenttext": "Vă rugăm să introduceți un comentariu.",
        "missingcommentheader": "'''Atenție,''' nu ați pus titlu sau subiect la acest comentariu.\nDacă dați din nou clic pe „{{int:savearticle}}” modificarea va fi salvată fără titlu.",
        "summary-preview": "Previzualizare descriere:",
        "content-model-text": "text simplu",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Obiect vid",
+       "content-json-empty-array": "Matrice vidă",
        "duplicate-args-category": "Pagini care folosesc argumente duplicate în apelarea formatelor",
        "duplicate-args-category-desc": "Pagina conține apelări ale formatelor care folosesc argumente duplicate, cum ar fi <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> sau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Atenție: Această pagină conține prea multe apelări costisitoare ale funcțiilor parser.\n\nAr trebui să existe mai puțin de $2 {{PLURAL:$2|apelare|apelări}}, acolo există {{PLURAL:$1|$1 apelare|$1 apelări}}.",
        "history-feed-empty": "Pagina solicitată nu există.\nE posibil să fi fost ștearsă sau redenumită.\nÎncearcă să [[Special:Search|cauți]] pe wiki pentru pagini noi semnificative.",
        "rev-deleted-comment": "(descrierea modificării ștearsă)",
        "rev-deleted-user": "(nume de utilizator șters)",
-       "rev-deleted-event": "(intrare ștearsă)",
+       "rev-deleted-event": "(detaliile din jurnalul șterse)",
        "rev-deleted-user-contribs": "[nume de utilizator sau adresă IP ștearsă - modificare ascunsă din contribuții]",
        "rev-deleted-text-permission": "Această versiune a paginii a fost '''ștearsă'''.\nMai multe detalii în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
        "rev-suppressed-text-permission": "Această versiune a paginii a fost <strong>suprimată</strong>.\nDetalii puteți găsi în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul suprimărilor].",
        "revdelete-legend": "Restricții de afișare",
        "revdelete-hide-text": "Textul versiunii",
        "revdelete-hide-image": "Șterge conținutul fișierului",
-       "revdelete-hide-name": "Șterge operația și obiectul",
+       "revdelete-hide-name": "Ascunde ținta și parametrii",
        "revdelete-hide-comment": "Descrierea modificării",
        "revdelete-hide-user": "Numele de utilizator sau adresa IP",
        "revdelete-hide-restricted": "Ascunde informațiile față de administratori și față de alți utilizatori",
        "thumbnail-temp-create": "Imposibil de creat miniatura temporară",
        "thumbnail-dest-create": "Imposibil de salvat miniatura la destinație",
        "thumbnail_invalid_params": "Parametrii invalizi ai imaginii miniatură",
+       "thumbnail_toobigimagearea": "Fișier cu dimensiuni mai mari de $1",
        "thumbnail_dest_directory": "Nu poate fi creat directorul destinație",
        "thumbnail_image-type": "Acest tip de imagine nu este suportat",
        "thumbnail_gd-library": "Configurație incompletă a bibliotecii GD: lipsește funcția $1",
        "watchlisttools-edit": "Vezi și modifică lista paginilor urmărite",
        "watchlisttools-raw": "Modifică lista brută a paginilor urmărite",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discuție]])",
-       "unknown_extension_tag": "Extensie etichetă necunoscută „$1”",
        "duplicate-defaultsort": "'''Atenție:''' Cheia de sortare implicită („$2”) o înlocuiește pe precedenta („$1”).",
        "duplicate-displaytitle": "<strong>Atenție:</strong> Titlul afișat „$2” înlocuieşte titlul afișat anterior, „$1”.",
        "invalid-indicator-name": "<strong>Eroare:</strong> Parametrul <code>nume</code> al indicatorilor de stare a paginii nu trebuie să fie gol.",
index 6f83e8e..d9e0cbd 100644 (file)
        "anoneditwarning": "<strong>Внимание!</strong> Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы <strong>[$1 войдёте]</strong> или <strong>[$2 создадите учётную запись]</strong>, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.",
        "anonpreviewwarning": "''Вы не представились системе. Сохранение приведёт к записи вашего IP-адреса в историю изменений страницы.''",
        "missingsummary": "'''Напоминание.''' Вы не дали краткого описания изменений. При повторном нажатии на кнопку «{{int:savearticle}}», ваши изменения будут сохранены без комментария.",
+       "selfredirect": "<strong>Внимание:</strong> Вы создаете перенаправление на ту же самую статью.\nЕсли Вы нажмёте кнопку «{{int:savearticle}}» ещё раз, перенаправление всё же будет создано.",
        "missingcommenttext": "Пожалуйста, введите ниже ваше сообщение.",
        "missingcommentheader": "'''Напоминание.''' Вы не указали тему/заголовок для этого комментария.\nПри повторном нажатии на кнопку «{{int:savearticle}}», ваша правка будет записана без заголовка.",
        "summary-preview": "Описание будет:",
        "content-model-text": "обычный текст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Пустой объект",
+       "content-json-empty-array": "Пустой массив",
        "duplicate-args-category": "Страницы, использующие повторяющиеся аргументы в вызовах шаблонов",
        "duplicate-args-category-desc": "Страницы, содержащие вызовы шаблонов, использующие повторяющиеся аргументы, такие как <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> или <code><nowiki>{{foo|bar|1=bar}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Внимание!''' Эта страница содержит слишком много вызовов ресурсоёмких функций.\n\nДолжно быть не более {{PLURAL:$2|$2 вызова|$2 вызовов|1=одного вызова}}, в то время как сейчас здесь $1 {{PLURAL:$1|вызов|вызовов|вызова}}.",
        "right-protect": "изменение уровня защиты страниц и правка каскадно защищённых страниц",
        "right-editprotected": "правка страниц, защищённых как «{{int:protect-level-sysop}}»",
        "right-editsemiprotected": "правка страниц, защищённых как «{{int:protect-level-autoconfirmed}}»",
+       "right-editcontentmodel": "Редактирование контентной модели страницы",
        "right-editinterface": "изменение пользовательского интерфейса",
        "right-editusercssjs": "правка CSS- и JS-файлов других участников",
        "right-editusercss": "правка CSS-файлов других участников",
        "action-viewmywatchlist": "просмотр вашего списка наблюдения",
        "action-viewmyprivateinfo": "просмотр вашей частной информации",
        "action-editmyprivateinfo": "редактирование вашей частной информации",
+       "action-editcontentmodel": "редактирование контентной модели страницы",
        "nchanges": "$1 {{PLURAL:$1|изменение|изменения|изменений}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|с последнего посещения}}",
        "enhancedrc-history": "история",
        "hebrew-calendar-m11-gen": "Ава",
        "hebrew-calendar-m12-gen": "Элула",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|обсуждение]])",
-       "unknown_extension_tag": "Неизвестный тег расширения «$1»",
        "duplicate-defaultsort": "Внимание. Ключ сортировки по умолчанию «$2» переопределяет прежний ключ сортировки по умолчанию «$1».",
        "duplicate-displaytitle": "<strong>Внимание:</strong> Отображаемое название «$2» переопределяет ранее заданное отображаемое название «$1».",
        "invalid-indicator-name": "<strong>Ошибка:</strong> Атрибут <code>name</code> индикаторов состояния страницы не должен быть пустым.",
index a965ded..c9ca946 100644 (file)
        "anoneditwarning": "<strong>Opozorilo:</strong> Niste prijavljeni. Vaš IP-naslov bo javno viden, če naredite kakršno koli urejanje. Če se <strong>[$1 prijavite]</strong> ali <strong>[$2 ustvarite račun]</strong>, bodo vaša urejanja pripisana vašemu uporabniškemu imenu skupaj z drugimi prednostmi.",
        "anonpreviewwarning": "Niste prijavljeni. Ob spremembi strani se bo vaš IP-naslov zapisal v zgodovini urejanja te strani.",
        "missingsummary": "'''Opozorilo:''' Niste napisali povzetka urejanja. Ob ponovnem kliku gumba ''Shrani'' se bo vaše urejanje shranilo brez njega.",
-       "selfredirect": "<strong>Opozorilo:</strong> Ustvarjate preusmeritev na isti članek.\nČe ponovno kliknete »{{int:savearticle}}«, bomo preusmeritev ustvarili.",
+       "selfredirect": "<strong>Opozorilo:</strong> Stran preusmerjate na samo nase.\nMorda ste za cilj preusmeritve navedli napačno stran ali pa morda urejate napačno stran.\nČe ponovno kliknete »{{int:savearticle}}«, bomo preusmeritev vseeno ustvarili.",
        "missingcommenttext": "Prosimo, vpišite v spodnje polje komentar.",
        "missingcommentheader": "'''Opozorilo:''' Niste vnesli zadeve/naslova za ta komentar.\nČe boste ponovno kliknili »{{int:savearticle}}«, bo vaše urejanje shranjeno brez le-tega.",
        "summary-preview": "Predogled povzetka",
        "content-model-text": "golo besedilo",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Prazen objekt",
+       "content-json-empty-array": "Prazno polje",
        "duplicate-args-category": "Strani s podvojenimi argumenti v klicih predlog",
        "duplicate-args-category-desc": "Stran vsebuje klice predlog, ki vsebujejo dvojnike argumentov, kot sta <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ali <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Opozorilo:''' Ta stran vsebuje preveč klicev funkcije razčlenjevalnika kode.\n\nStran naj bi vsebovala manj kot $2 {{PLURAL:$2|klic|klica|klice|klicev}}, trenutno {{PLURAL:$1|je v uporabi $1 klic|sta v uporabi $1 klica|so v uporabi $1 klici|je v uporabi $1 klicev}}.",
        "history-feed-empty": "Zahtevana stran ne obstaja.\nMorda je bila izbrisana iz wikija ali pa jo je kdo preimenoval.\nProsimo, poskusite [[Special:Search|poiskati v wikiju]] ustrezajoče nove strani.",
        "rev-deleted-comment": "(povzetek urejanja je odstranjen)",
        "rev-deleted-user": "(uporabniško ime je bilo odstranjeno)",
-       "rev-deleted-event": "(dnevniški vnos je odstranjen)",
+       "rev-deleted-event": "(podrobnosti dnevnika so odstranjene)",
        "rev-deleted-user-contribs": "[uporabniško ime ali IP naslov odstranjeni - urajenje skrito v prispevkih]",
        "rev-deleted-text-permission": "Prikazana redakcija je bila '''izbrisana'''.\nPodrobnosti so na razpolago v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "rev-suppressed-text-permission": "Ta redakcija strani je bila <strong>zatrta</strong>.\nPodrobnosti so navedene v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dnevniku zatrtij].",
        "revdelete-legend": "Nastavi omejitve vidnosti",
        "revdelete-hide-text": "Besedilo redakcije",
        "revdelete-hide-image": "Skrij vsebino datoteke.",
-       "revdelete-hide-name": "Skrij dejanje in cilj",
+       "revdelete-hide-name": "Skrij cilj in parametre",
        "revdelete-hide-comment": "Povzetek urejanja",
        "revdelete-hide-user": "Uporabniško ime/IP-naslov urejevalca",
        "revdelete-hide-restricted": "Zadrži podatke od administratorjev kakor tudi od ostalih",
        "thumbnail-temp-create": "Ne morem ustvariti začasne datoteke sličice",
        "thumbnail-dest-create": "Ne morem shraniti sličice na ciljno mesto",
        "thumbnail_invalid_params": "Neveljavni parametri za sličico",
+       "thumbnail_toobigimagearea": "Datoteke z dimenzijami, večjimi od $1",
        "thumbnail_dest_directory": "Ne morem ustvariti ciljnega direktorija",
        "thumbnail_image-type": "Vrsta slike ni podprta",
        "thumbnail_gd-library": "Nepopolna konfiguracija knjižice GD: manjka funkcija $1",
        "watchlisttools-edit": "Prikaz in urejanje spiska nadzorov",
        "watchlisttools-raw": "Uredi gol spisek nadzorov",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pogovor]])",
-       "unknown_extension_tag": "Neznana razširitvena etiketa »$1«",
        "duplicate-defaultsort": "'''Opozorilo:''' Privzeti ključ razvrščanja »$2« prepiše prejšnji privzeti ključ razvrščanja »$1«.",
        "duplicate-displaytitle": "<strong>Opozorilo:</strong> Prikazni naslov »$2« prepiše prejšnji prikazni naslov »$1«.",
        "invalid-indicator-name": "<strong>Napaka:</strong> Atribut <code>name</code> indikatorjev stanja strani ne sme biti prazen.",
index 6f52692..3139b5c 100644 (file)
@@ -60,7 +60,8 @@
                        "아라",
                        "Abbedabb",
                        "Platinawolf",
-                       "Albinomamba"
+                       "Albinomamba",
+                       "Stens51"
                ]
        },
        "tog-underline": "Stryk under länkar:",
        "anoneditwarning": "<strong>Varning:</strong> Du är inte inloggad. Din IP-adress kommer att vara publikt synlig om du gör några redigeringar. Om du <strong>[$1 loggar in]</strong> eller <strong>[$2 skapar ett konto]</strong> kommer dina redigeringar att tillskrivas ditt användarnamn, tillsammans med andra fördelar.",
        "anonpreviewwarning": "''Du är inte inloggad. Om du sparar kommer din IP-adress registreras på denna sidas redigeringshistorik.''",
        "missingsummary": "<strong>Påminnelse:</strong> Du har inte skrivit någon redigeringskommentar.\nOm du klickar på \"{{int:savearticle}}\" igen kommer din redigering att sparas utan en sådan.",
-       "selfredirect": "<strong>Varning:</strong> Du omdirigerar till samma artikel.\nOm du klickar på \"{{int:savearticle}}\" igen kommer omdirigeringen att skapas.",
+       "selfredirect": "<strong>Varning:</strong> Du omdirigerar denna sida till sig själv.\nDu kanske angav fel mål för din omdirigering, eller redigerar fel sida.\nOm du klickar på \"{{int:savearticle}}\" igen kommer omdirigeringen att skapas trots detta.",
        "missingcommenttext": "Var god och skriv in en kommentar nedan.",
        "missingcommentheader": "<strong>Påminnelse:</strong> Du har inte skrivit något ämne/rubrik för den här kommentaren.\nOm du trycker på \"{{int:savearticle}}\" igen kommer din redigering sparas utan rubrik.",
        "summary-preview": "Förhandsgranskning av sammanfattning:",
        "content-model-text": "oformaterad text",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Tomt objekt",
+       "content-json-empty-array": "Tomt fält",
        "duplicate-args-category": "Sidor som använder upprepade argument i mallanrop",
        "duplicate-args-category-desc": "Sidan innehåller mallanrop som använder repeterade argument, så som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Varning: Denna sida innehåller för många anrop av resurskrävande parserfunktioner.\n\nAntalet anrop får vara högst $2, nu görs {{PLURAL:$1|$1 anrop}}",
        "history-feed-empty": "Den begärda sidan finns inte.\nDen kan ha tagits bort från wikin eller bytt namn.\nProva att [[Special:Search|söka på wikin]] för relevanta nya sidor.",
        "rev-deleted-comment": "(redigeringssammanfattning togs bort)",
        "rev-deleted-user": "(användarnamn borttaget)",
-       "rev-deleted-event": "(loggåtgärd borttagen)",
+       "rev-deleted-event": "(loggdetaljer borttagna)",
        "rev-deleted-user-contribs": "[användarnamn eller IP-adress har tagits bort - redigeringen visas ej bland bidragen]",
        "rev-deleted-text-permission": "Denna version av sidan har '''raderats'''.\nDet kan finnas mer information i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
        "rev-suppressed-text-permission": "Denna version av sidan har <strong>undanhållits</strong>.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} undanhållandeloggen].",
        "revdelete-legend": "Ändra synlighet",
        "revdelete-hide-text": "Versionstext",
        "revdelete-hide-image": "Dölj filinnehåll",
-       "revdelete-hide-name": "Dölj åtgärd och sidnamn",
+       "revdelete-hide-name": "Dölj mål och parametrar",
        "revdelete-hide-comment": "Redigeringssammanfattning",
        "revdelete-hide-user": "Redigerarens användarnamn/IP-adress",
        "revdelete-hide-restricted": "Undanhåll data från administratörer så väl som från övriga",
        "thumbnail-temp-create": "Kunde inte skapa temporär miniatyrfil",
        "thumbnail-dest-create": "Kunde inte spara miniatyr till destinationen",
        "thumbnail_invalid_params": "Ogiltiga parametrar för miniatyrbilden",
+       "thumbnail_toobigimagearea": "Fil med dimensioner som är större än $1",
        "thumbnail_dest_directory": "Kan inte skapa målkatalogen",
        "thumbnail_image-type": "Bildtypen stöds inte",
        "thumbnail_gd-library": "Inkomplett GD library konfigurering: saknar funktionen $1",
        "watchlisttools-edit": "Visa och redigera bevakningslistan",
        "watchlisttools-raw": "Redigera bevakningslistan i råformat",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskussion]])",
-       "unknown_extension_tag": "Okänd tagg \"$1\"",
        "duplicate-defaultsort": "'''Varning:''' Standardsorteringsnyckeln \"$2\" tar över från den tidigare standardsorteringsnyckeln \"$1\".",
        "duplicate-displaytitle": "<strong>Varning:</strong> Visningstiteln \"$2\" skriver över den tidigare visningstiteln \"$1\".",
        "invalid-indicator-name": "<p>Fel:</strong> Sidstatus-indikatorernas <code>namn</code>-attributet får inte vara tomt.",
index 336f588..897ad01 100644 (file)
        "hebrew-calendar-m12-gen": "Елула",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|обговорення]])",
        "timezone-utc": "UTC",
-       "unknown_extension_tag": "Невідомий тег доповнення «$1»",
        "duplicate-defaultsort": "Увага. Ключ сортування «$2» перекриває попередній ключ сортування «$1».",
        "duplicate-displaytitle": "<strong>Увага:</strong> Відображений заголовок \"$2\" заміщує раніше відображений заголовок \"$1\".",
        "invalid-indicator-name": "<strong>Помилка:</strong> Сторінка індикатора стану <code>name</code> атрибута не може бути пуста.",
index c862c3c..8ebea54 100644 (file)
@@ -40,7 +40,7 @@
        "tog-shownumberswatching": "ווייזן דעם נומער פון בלאט אויפֿפאסערס",
        "tog-oldsig": "איצטיגער אונטערשריפֿט:",
        "tog-fancysig": "באַהאַנדלן  אונטערשריפט אַלס וויקיטעקסט (אָן אויטאמאטישן לינק)",
-       "tog-uselivepreview": "באניצן זיך מיט גיכער פאראויסדיגער ווייזונג (עקספערימענטאל)",
+       "tog-uselivepreview": "באניצן זיך מיט גיכער פאראויסדיגער ווייזונג",
        "tog-forceeditsummary": "ווארן מיך ווען איך לייג א ליידיג קורץ ווארט ענדערונג",
        "tog-watchlisthideown": "באהאלט מיינע ענדערונגען פון דער אויפפאסן ליסטע",
        "tog-watchlisthidebots": "באהאלט באט עדיטס פון אויפפאסן ליסטע",
        "filerenameerror": "נאמען טויש פֿאַר \"$1\" צו \"$2\" איז נישט אדורכגעגאנגען.",
        "filedeleteerror": "אויסמעקן \"$1\" נישט דורך.",
        "directorycreateerror": "קען נישט באשאפן דירעקטארי \"$1\".",
+       "directoryreadonlyerror": "דירעקטאריע \"$1\" איז נאר לייענבאר.",
+       "directorynotreadableerror": "דירעקטאריע \"$1\" איז נישט לייענבאר.",
        "filenotfound": "קען נישט געפינען טעקע \"$1\".",
        "unexpected": "אומערווארטערטער ווערד: \"$1\"=\"$2\"",
        "formerror": "פֿעלער: קען נישט שיקן פֿארעם.",
        "history-feed-empty": "דער געבעטענער בלאט עקזיסטירט נישט.\nעס איז מעגליך אויסגעמעקט געווארן פון דער וויקי, אדער דער נאמען געטוישט.\nפרובירט [[Special:Search|צו זיכן אין וויקי]] נאך רעלאווענטע נייע בלעטער.",
        "rev-deleted-comment": "(קורץ־ווארט אראָפגענומען)",
        "rev-deleted-user": "(באנוצער נאמען אראפגענומען)",
-       "rev-deleted-event": "(×\9c×\90×\92×\99ר×\9f ×\90קצ×\99×¢ אראפגענומען)",
+       "rev-deleted-event": "(×\9c×\90×\92×\99ר×\9f ×¤×¨×\98×\99×\9d אראפגענומען)",
        "rev-deleted-user-contribs": "[באַניצער נאָמען אָדער IP אַדרעס אראפגענומען - רעדאַקטירונג פֿאַרבאָרגן פֿון בייַשטייַערונגען]",
        "rev-deleted-text-permission": "די בלאט רעוויזיע איז געווארן '''אויסגעמעקט '''.\nעס איז מעגלעך דא נאך פרטים אין דעם\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} אויסמעקונג לאג].",
        "rev-suppressed-text-permission": "די בלאט רעוויזיע איז געווארן <strong>אונטערדריקט</strong>. מען קען געפינען נאך פרטים אין דעם [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} אונטערדריקן לאגבוך].",
        "revdelete-legend": "שטעלט ווייזונג באגרענעצונגען",
        "revdelete-hide-text": "ווערסיע טעקסט",
        "revdelete-hide-image": "באהאלט טעקע אינהאלט",
-       "revdelete-hide-name": "באהאלט אקציע און ציל",
+       "revdelete-hide-name": "באהאלטן ציל און פאראמעטערס",
        "revdelete-hide-comment": "רעדאקטירונג רעזומע",
        "revdelete-hide-user": "רעדאַקטאר'ס באניצער-נאמען/IP-אַדרעס",
        "revdelete-hide-restricted": "באהאלט אינפארמאציע אויך פון אדמיניסטראטורן פונקט ווי פשוטע באנוצער",
        "mergehistory-empty": "קיין רעוויזיעס קען נישט ווערן צונויפֿגעגאסן.",
        "mergehistory-success": "{{PLURAL:$3|איין גירסא|$3 גירסאות}} פֿון [[:$1]] צונויפֿגעגאסן אין [[:$2]] מיט דערפֿאלג.",
        "mergehistory-fail": "נישט מעגלעך אדורכצופֿירן היסטאריע צונויפֿגאס, ביטע זײַט בודק די בלאַט און צײַט פאַראַמעטערס.",
+       "mergehistory-fail-toobig": "אוממעגלעך אויסצופירן היסטאריע צונויפמישונג ווײַל מען וואלט געדארפט באוועגן מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}.",
        "mergehistory-no-source": "מקור בלאַט $1 עקזיסטירט נישט.",
        "mergehistory-no-destination": "פֿארציל בלאַט $1 עקזיסטירט נישט.",
        "mergehistory-invalid-source": "מקור בלאַט מוז זײַן א גילטיק קעפל.",
        "hebrew-calendar-m11-gen": "אב",
        "hebrew-calendar-m12-gen": "אלול",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|רעדן]])",
-       "unknown_extension_tag": "אומבאַוואוסטער פֿאַרברייטערונג טאַג \"$1\"",
        "duplicate-defaultsort": "'''ווארענונג:''' גרונט סארטשליסל \"$2\" פֿאָרט איבערן פֿריערדיגן גרונט סארטשליסל \"$1\".",
        "version": "ווערסיע",
        "version-extensions": "אינסטאלירטע פארברייטערונגען",
index 742f39d..57b329a 100644 (file)
        "anoneditwarning": "<strong>警告:</strong>您没有登录。您做出任何编辑后您的IP地址会公开可见。如果您<strong>[$1 登陆]</strong>或<strong>[$2 注册]</strong>一个账户,您的编辑将归属于您的用户名,以及有其他好处。",
        "anonpreviewwarning": "<em>你没有登录。保存会记录你的IP地址于该页面的编辑历史中。</em>",
        "missingsummary": "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
-       "selfredirect": "<strong>è­¦å\91\8aï¼\9a</strong>æ\82¨æ­£å\9c¨å\88\9b建é\87\8då®\9aå\90\91å\88°å\90\8cä¸\80æ\9d¡ç\9b®ç\9a\84é\87\8då®\9aå\90\91ã\80\82\nå¦\82æ\9e\9cæ\82¨å\86\8d次ç\82¹å\87»â\80\9c{{int:savearticle}}â\80\9dï¼\8cé\87\8då®\9aå\90\91å°\86被创建。",
+       "selfredirect": "<strong>è­¦å\91\8aï¼\9a</strong>æ\82¨æ­£å\9c¨å°\86此页é\9d¢é\87\8då®\9aå\90\91è\87³å®\83è\87ªå·±ã\80\82\næ\82¨å\8f¯è\83½æ\8c\87å®\9aäº\86é\94\99误ç\9a\84é\87\8då®\9aå\90\91ç\9b®æ \87ï¼\8cæ\88\96è\80\85æ\82¨æ­£å\9c¨ç¼\96è¾\91é\94\99误ç\9a\84页é\9d¢ã\80\82\nå¦\82æ\9e\9cæ\82¨å\86\8d次ç\82¹å\87»â\80\9c{{int:savearticle}}â\80\9dï¼\8cé\87\8då®\9aå\90\91å°\86æ\97 è®ºå¦\82ä½\95被创建。",
        "missingcommenttext": "请在下面输入评论。",
        "missingcommentheader": "'''提示:''' 您还没有为此评论提供一个标题。如果您再次点击“{{int:savearticle}}”,您的编辑将不带标题保存。",
        "summary-preview": "摘要预览:",
        "content-model-text": "纯文本",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "空的对象",
+       "content-json-empty-array": "空的数组",
        "duplicate-args-category": "调用重复模板参数的页面",
        "duplicate-args-category-desc": "页面包含调用了重复参数的模板,例如<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>这个页面有太多高昂的语法功能调用。\n\n它应该少过$2次呼叫,现在有$1次呼叫。",
        "history-feed-empty": "所请求的页面不存在。它可能已被删除或重命名。\n尝试[[Special:Search|搜索本站]]获得相关的新建页面。",
        "rev-deleted-comment": "(编辑摘要被删除)",
        "rev-deleted-user": "(用户名被删除)",
-       "rev-deleted-event": "(日志操作被删除)",
+       "rev-deleted-event": "(日志详情已移除)",
        "rev-deleted-user-contribs": "[用户名或IP地址被删除 - 编辑在贡献中隐藏]",
        "rev-deleted-text-permission": "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
        "rev-suppressed-text-permission": "此页面修订已经被<strong>监督隐藏</strong>。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
        "revdelete-legend": "设置可见性之限制",
        "revdelete-hide-text": "版本文字",
        "revdelete-hide-image": "隐藏文件内容",
-       "revdelete-hide-name": "隐藏动作和目标",
+       "revdelete-hide-name": "隐藏目标和参数",
        "revdelete-hide-comment": "编辑摘要",
        "revdelete-hide-user": "编者用户名/IP地址",
        "revdelete-hide-restricted": "同时阻止管理员与其他用户查看数据",
        "thumbnail-temp-create": "无法创建临时缩略图文件",
        "thumbnail-dest-create": "无法将缩略图保存到目标地点",
        "thumbnail_invalid_params": "不正确的缩略图参数",
+       "thumbnail_toobigimagearea": "尺寸超过$1的文件",
        "thumbnail_dest_directory": "无法建立目标目录",
        "thumbnail_image-type": "图像类型不支持",
        "thumbnail_gd-library": "未完成的GD设置:功能遗失 $1",
        "watchlisttools-edit": "查看并编辑监视列表",
        "watchlisttools-raw": "编辑原始监视列表",
        "signature": "[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|讨论]])",
-       "unknown_extension_tag": "未知扩展标签“$1”",
        "duplicate-defaultsort": "'''警告:'''默认排序关键词“$2”覆盖了之前的默认排序关键词“$1”。",
        "duplicate-displaytitle": "<strong>警告:</strong>显示的标题“$2”重写了此前显示的标题“$1”。",
        "invalid-indicator-name": "<strong>错误:</strong>页面状态指示器的<code>name</code>属性必须不为空。",
index 84bbf30..cea7f2e 100644 (file)
        "anoneditwarning": "<strong>警告:</strong>您尚未登入。 若您進行任何的編輯您的 IP 位置將會被公開。 若您 <strong>[$1 登入]</strong> 或 <strong>[$2 建立帳號]</strong>,您的編輯將會以您的使用者名稱標示,擁有其他優點。",
        "anonpreviewwarning": "<em>您尚未登入。儲存頁面會將您的 IP 位址記錄在此頁面的編輯歷史中。</em>",
        "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
-       "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
+       "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n您可能指定錯要重新導向的目標頁面或者編輯錯頁面。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
        "missingcommenttext": "請在下方輸入評論。",
        "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨/標題。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
        "summary-preview": "摘要預覽:",
        "titleprotectedwarning": "<strong>警告:本頁面已被保護,需要 [[Special:ListGroupRights|特殊權限]] 方可建立。</strong>\n以下提供最近的日誌以便參考:",
        "templatesused": "此頁面使用了以下{{PLURAL:$1|模板}}:",
        "templatesusedpreview": "此預覽使用了以下{{PLURAL:$1|模板}}:",
-       "templatesusedsection": "此頁面使用了以下{{PLURAL:$1模板}}:",
+       "templatesusedsection": "此頁面使用了以下{{PLURAL:$1|模板}}:",
        "template-protected": "(受保護)",
        "template-semiprotected": "(受半保護)",
        "hiddencategories": "此頁面屬於 {{PLURAL:$1|1 個隱藏分類|$1 個隱藏分類}}的成員:",
        "content-model-text": "純文字",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "空物件",
+       "content-json-empty-array": "空陣列",
        "duplicate-args-category": "模板呼叫時使用重複的參數的頁面",
        "duplicate-args-category-desc": "該頁面包含重複使用參數的模板呼叫,如 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> 或 <code><nowiki>{{foo|bar|1=baz}}</nowiki>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>此頁面使用了太多消耗系統資源的解析函數。\n\n使用次數應小於 $2 次,但目前使用了 $1 次。",
        "history-feed-empty": "請求的頁面不存在,\n可能已被刪除或重新命名。\n請嘗試 [[Special:Search|搜尋本站]] 取得其他相關的新頁面。",
        "rev-deleted-comment": "(已移除編輯摘要)",
        "rev-deleted-user": " (已移除使用者名稱)",
-       "rev-deleted-event": "(已移é\99¤æ\97¥èª\8cæ\93\8dä½\9c)",
+       "rev-deleted-event": "(已移é\99¤æ\97¥èª\8cæ\98\8eç´°)",
        "rev-deleted-user-contribs": "[使用者名稱或 IP 位址已移除 - 已隱藏貢獻清單中的編輯]",
        "rev-deleted-text-permission": "此頁面修訂已被 <strong>刪除</strong>。\n可至 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌] 取得詳細資訊。",
        "rev-suppressed-text-permission": "此頁面修訂已被 <strong>禁止顯示</strong>。\n可至 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 禁止顯示日誌] 取得詳細資訊。",
        "revdelete-legend": "設定顯示限制",
        "revdelete-hide-text": "修訂文字",
        "revdelete-hide-image": "隱藏檔案內容",
-       "revdelete-hide-name": "隱藏動作和目標",
+       "revdelete-hide-name": "隱藏目標與參數",
        "revdelete-hide-comment": "編輯摘要",
        "revdelete-hide-user": "編輯者的使用者名稱/IP 位址",
        "revdelete-hide-restricted": "禁止顯示資料給管理者及其他使用者",
        "recentchanges-label-unpatrolled": "該編輯尚未巡查",
        "recentchanges-label-plusminus": "該頁面變更的大小 (位元組)",
        "recentchanges-legend-heading": "'''說明:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (è«\8bå\8f\83è\80\83 [[Special:NewPages|æ\9c\80æ\96°é \81é\9d¢]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考 [[Special:NewPages|新頁面]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
        "rclistfrom": "顯示自 $3 $2 以來的近期變更",
        "thumbnail-temp-create": "無法建立暫存縮圖檔案",
        "thumbnail-dest-create": "無法儲存縮圖至目標",
        "thumbnail_invalid_params": "無效的縮圖參數",
+       "thumbnail_toobigimagearea": "檔案的尺寸超過 $1",
        "thumbnail_dest_directory": "無法建立目標目錄",
        "thumbnail_image-type": "不支援的圖片類型",
        "thumbnail_gd-library": "未完成 GD 設定:缺少函數 $1",
        "pageinfo-recent-authors": "最近作者數",
        "pageinfo-magic-words": "魔術{{PLURAL:$1|字}} ($1)",
        "pageinfo-hidden-categories": "隱藏分類 ($1)",
-       "pageinfo-templates": "引用模板 ($1)",
+       "pageinfo-templates": "引用模板 ($1)",
        "pageinfo-transclusions": "頁面被引用於 ($1)",
        "pageinfo-toolboxlink": "頁面資訊",
        "pageinfo-redirectsto": "重新導向至",
        "watchlisttools-edit": "檢視並編輯監視清單",
        "watchlisttools-raw": "編輯原始監視清單",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|對話]])",
-       "unknown_extension_tag": "不明的擴充標籤 \"$1\"",
        "duplicate-defaultsort": "<strong>警告:</strong>預設的排序鍵 \"$2\" 會覆蓋先前預設的排序鍵 \"$1\"。",
        "duplicate-displaytitle": "<strong>警告:</strong> 顯示標題 \"$2\" 覆蓋之前的顯示標題 \"$1\"。",
        "invalid-indicator-name": "<strong>錯誤:</strong>頁面狀態指示器的<code>name</code> 屬性不能為空。",
index 108fe9f..2f8b7d2 100644 (file)
@@ -1321,7 +1321,7 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
        }
 
        /**
-        * Message to show the the update log was unable to log the completion of this update
+        * Message to show that the update log was unable to log the completion of this update
         * @return string
         */
        protected function updatelogFailedMessage() {
index 3e2c6c9..dd4f760 100644 (file)
@@ -44,7 +44,7 @@ class FetchText extends Maintenance {
         *   \n
         *   text  (may be empty)
         *
-        * note that that the text string itself is *not* followed by newline
+        * note that the text string itself is *not* followed by newline
         */
        public function execute() {
                $db = wfGetDB( DB_SLAVE );
index f77978f..686d9f2 100644 (file)
@@ -84,7 +84,7 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                                                "rev_id < " . intval( $row->rev_id ) ),
                                        __METHOD__,
                                        array( 'ORDER BY' => 'rev_id DESC' ) );
-                               # If there are none, check the the highest ID with a lower timestamp
+                               # If there are none, check the highest ID with a lower timestamp
                                if ( !$previousID ) {
                                        # Get the highest older timestamp
                                        $lastTimestamp = $db->selectField(
index a20b83b..93aacde 100755 (executable)
@@ -34,9 +34,15 @@ then
        exit 1
 fi
 
-# Copy files
-# - Exclude the minimised distribution files and RTL sheets for non-CSSJanus environments
-rsync --force --recursive --delete --exclude 'oojs-ui*.min.*' --exclude 'oojs-ui*.rtl.css' ./node_modules/oojs-ui/dist/ "$REPO_DIR/$TARGET_DIR" || exit 1
+# Copy files, excluding:
+# * the Apex theme files,
+# * the minimised distribution files, and
+# * the RTL sheets for non-CSSJanus environments
+rsync --force --recursive --delete \
+       --exclude '*apex*' \
+       --exclude 'oojs-ui*.min.*' \
+       --exclude 'oojs-ui*.rtl.css' \
+       ./node_modules/oojs-ui/dist/ "$REPO_DIR/$TARGET_DIR" || exit 1
 
 # Clean up temporary area
 rm -rf "$NPM_DIR"
index 45cc339..eb7eca1 100644 (file)
@@ -141,7 +141,7 @@ class RecompressTracked {
                        $header .= "({$this->slaveId})";
                }
                $header .= ' ' . wfWikiID();
-               wfErrorLog( sprintf( "%-50s %s\n", $header, $msg ), $file );
+               MWLoggerLegacyLogger::emit( sprintf( "%-50s %s\n", $header, $msg ), $file );
        }
 
        /**
index 0228684..caf8ecc 100644 (file)
@@ -374,13 +374,20 @@ CREATE TABLE /*_*/text (
 
   -- Comma-separated list of flags:
   -- gzip: text is compressed with PHP's gzdeflate() function.
-  -- utf8: text was stored as UTF-8.
-  --       If $wgLegacyEncoding option is on, rows *without* this flag
-  --       will be converted to UTF-8 transparently at load time.
+  -- utf-8: text was stored as UTF-8.
+  --        If $wgLegacyEncoding option is on, rows *without* this flag
+  --        will be converted to UTF-8 transparently at load time. Note
+  --        that due to a bug in a maintenance script, this flag may
+  --        have been stored as 'utf8' in some cases (T18841).
   -- object: text field contained a serialized PHP object.
   --         The object either contains multiple versions compressed
   --         together to achieve a better compression ratio, or it refers
   --         to another row where the text can be found.
+  -- external: text was stored in an external location specified by old_text.
+  --           Any additional flags apply to the data stored at that URL, not
+  --           the URL itself. The 'object' flag is *not* set for URLs of the
+  --           form 'DB://cluster/id/itemid', because the external storage
+  --           system itself decompresses these.
   old_flags tinyblob NOT NULL
 ) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
 -- In case tables are created as MyISAM, use row hints for MySQL <5.0 to avoid 4GB limit
index e5332df..ccb842d 100644 (file)
@@ -1011,6 +1011,7 @@ return array(
                'class' => 'ResourceLoaderEditToolbarModule',
                'scripts' => 'resources/src/mediawiki.toolbar/toolbar.js',
                'styles' => 'resources/src/mediawiki.toolbar/toolbar.less',
+               'position' => 'top',
        ),
 
        /* MediaWiki Action */
@@ -1020,7 +1021,6 @@ return array(
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.css',
                'dependencies' => array(
                        'mediawiki.action.edit.styles',
-                       'mediawiki.toolbar',
                        'jquery.textSelection',
                        'jquery.byteLimit',
                ),
index 136530a..19a775a 100644 (file)
@@ -1,4 +1,4 @@
-The icons used here are derived from the crystalsvg icons in the the
+The icons used here are derived from the crystalsvg icons in the
 pics/crystalsvg/ directory of kdelibs-3.4.0 they were modified on 2005-05-15
 by Ævar Arnfjörð Bjarmason for use in MediaWiki.
 
index d4b67f7..1c3aa82 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery JavaScript Library v1.11.1
+ * jQuery JavaScript Library v1.11.2
  * http://jquery.com/
  *
  * Includes Sizzle.js
@@ -9,7 +9,7 @@
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2014-05-01T17:42Z
+ * Date: 2014-12-17T15:27Z
  */
 
 (function( global, factory ) {
@@ -64,7 +64,7 @@ var support = {};
 
 
 var
-       version = "1.11.1",
+       version = "1.11.2",
 
        // Define a local copy of jQuery
        jQuery = function( selector, context ) {
@@ -269,7 +269,8 @@ jQuery.extend({
                // parseFloat NaNs numeric-cast false positives (null|true|false|"")
                // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
                // subtraction forces infinities to NaN
-               return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
+               // adding 1 corrects loss of precision from parseFloat (#15100)
+               return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
        },
 
        isEmptyObject: function( obj ) {
@@ -584,14 +585,14 @@ function isArraylike( obj ) {
 }
 var Sizzle =
 /*!
- * Sizzle CSS Selector Engine v1.10.19
+ * Sizzle CSS Selector Engine v2.2.0-pre
  * http://sizzlejs.com/
  *
- * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2014-04-18
+ * Date: 2014-12-16
  */
 (function( window ) {
 
@@ -618,7 +619,7 @@ var i,
        contains,
 
        // Instance-specific data
-       expando = "sizzle" + -(new Date()),
+       expando = "sizzle" + 1 * new Date(),
        preferredDoc = window.document,
        dirruns = 0,
        done = 0,
@@ -633,7 +634,6 @@ var i,
        },
 
        // General-purpose constants
-       strundefined = typeof undefined,
        MAX_NEGATIVE = 1 << 31,
 
        // Instance methods
@@ -643,12 +643,13 @@ var i,
        push_native = arr.push,
        push = arr.push,
        slice = arr.slice,
-       // Use a stripped-down indexOf if we can't use a native one
-       indexOf = arr.indexOf || function( elem ) {
+       // Use a stripped-down indexOf as it's faster than native
+       // http://jsperf.com/thor-indexof-vs-for/5
+       indexOf = function( list, elem ) {
                var i = 0,
-                       len = this.length;
+                       len = list.length;
                for ( ; i < len; i++ ) {
-                       if ( this[i] === elem ) {
+                       if ( list[i] === elem ) {
                                return i;
                        }
                }
@@ -688,6 +689,7 @@ var i,
                ")\\)|)",
 
        // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+       rwhitespace = new RegExp( whitespace + "+", "g" ),
        rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
 
        rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
@@ -739,6 +741,14 @@ var i,
                                String.fromCharCode( high + 0x10000 ) :
                                // Supplemental Plane codepoint (surrogate pair)
                                String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+       },
+
+       // Used for iframes
+       // See setDocument()
+       // Removing the function wrapper causes a "Permission Denied"
+       // error in IE
+       unloadHandler = function() {
+               setDocument();
        };
 
 // Optimize for push.apply( _, NodeList )
@@ -781,19 +791,18 @@ function Sizzle( selector, context, results, seed ) {
 
        context = context || document;
        results = results || [];
+       nodeType = context.nodeType;
 
-       if ( !selector || typeof selector !== "string" ) {
-               return results;
-       }
+       if ( typeof selector !== "string" || !selector ||
+               nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
 
-       if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
-               return [];
+               return results;
        }
 
-       if ( documentIsHTML && !seed ) {
+       if ( !seed && documentIsHTML ) {
 
-               // Shortcuts
-               if ( (match = rquickExpr.exec( selector )) ) {
+               // Try to shortcut find operations when possible (e.g., not under DocumentFragment)
+               if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
                        // Speed-up: Sizzle("#ID")
                        if ( (m = match[1]) ) {
                                if ( nodeType === 9 ) {
@@ -825,7 +834,7 @@ function Sizzle( selector, context, results, seed ) {
                                return results;
 
                        // Speed-up: Sizzle(".CLASS")
-                       } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+                       } else if ( (m = match[3]) && support.getElementsByClassName ) {
                                push.apply( results, context.getElementsByClassName( m ) );
                                return results;
                        }
@@ -835,7 +844,7 @@ function Sizzle( selector, context, results, seed ) {
                if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
                        nid = old = expando;
                        newContext = context;
-                       newSelector = nodeType === 9 && selector;
+                       newSelector = nodeType !== 1 && selector;
 
                        // qSA works strangely on Element-rooted queries
                        // We can work around this by specifying an extra ID on the root
@@ -1022,7 +1031,7 @@ function createPositionalPseudo( fn ) {
  * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
  */
 function testContext( context ) {
-       return context && typeof context.getElementsByTagName !== strundefined && context;
+       return context && typeof context.getElementsByTagName !== "undefined" && context;
 }
 
 // Expose support vars for convenience
@@ -1046,9 +1055,8 @@ isXML = Sizzle.isXML = function( elem ) {
  * @returns {Object} Returns the current document
  */
 setDocument = Sizzle.setDocument = function( node ) {
-       var hasCompare,
-               doc = node ? node.ownerDocument || node : preferredDoc,
-               parent = doc.defaultView;
+       var hasCompare, parent,
+               doc = node ? node.ownerDocument || node : preferredDoc;
 
        // If no document and documentElement is available, return
        if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
@@ -1058,9 +1066,7 @@ setDocument = Sizzle.setDocument = function( node ) {
        // Set our document
        document = doc;
        docElem = doc.documentElement;
-
-       // Support tests
-       documentIsHTML = !isXML( doc );
+       parent = doc.defaultView;
 
        // Support: IE>8
        // If iframe document is assigned to "document" variable and if iframe has been reloaded,
@@ -1069,21 +1075,22 @@ setDocument = Sizzle.setDocument = function( node ) {
        if ( parent && parent !== parent.top ) {
                // IE11 does not have attachEvent, so all must suffer
                if ( parent.addEventListener ) {
-                       parent.addEventListener( "unload", function() {
-                               setDocument();
-                       }, false );
+                       parent.addEventListener( "unload", unloadHandler, false );
                } else if ( parent.attachEvent ) {
-                       parent.attachEvent( "onunload", function() {
-                               setDocument();
-                       });
+                       parent.attachEvent( "onunload", unloadHandler );
                }
        }
 
+       /* Support tests
+       ---------------------------------------------------------------------- */
+       documentIsHTML = !isXML( doc );
+
        /* Attributes
        ---------------------------------------------------------------------- */
 
        // Support: IE<8
-       // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+       // Verify that getAttribute really returns attributes and not properties
+       // (excepting IE8 booleans)
        support.attributes = assert(function( div ) {
                div.className = "i";
                return !div.getAttribute("className");
@@ -1098,17 +1105,8 @@ setDocument = Sizzle.setDocument = function( node ) {
                return !div.getElementsByTagName("*").length;
        });
 
-       // Check if getElementsByClassName can be trusted
-       support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
-               div.innerHTML = "<div class='a'></div><div class='a i'></div>";
-
-               // Support: Safari<4
-               // Catch class over-caching
-               div.firstChild.className = "i";
-               // Support: Opera<10
-               // Catch gEBCN failure to find non-leading classes
-               return div.getElementsByClassName("i").length === 2;
-       });
+       // Support: IE<9
+       support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
 
        // Support: IE<10
        // Check if getElementById returns elements by name
@@ -1122,7 +1120,7 @@ setDocument = Sizzle.setDocument = function( node ) {
        // ID find and filter
        if ( support.getById ) {
                Expr.find["ID"] = function( id, context ) {
-                       if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+                       if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
                                var m = context.getElementById( id );
                                // Check parentNode to catch when Blackberry 4.6 returns
                                // nodes that are no longer in the document #6963
@@ -1143,7 +1141,7 @@ setDocument = Sizzle.setDocument = function( node ) {
                Expr.filter["ID"] =  function( id ) {
                        var attrId = id.replace( runescape, funescape );
                        return function( elem ) {
-                               var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+                               var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
                                return node && node.value === attrId;
                        };
                };
@@ -1152,14 +1150,20 @@ setDocument = Sizzle.setDocument = function( node ) {
        // Tag
        Expr.find["TAG"] = support.getElementsByTagName ?
                function( tag, context ) {
-                       if ( typeof context.getElementsByTagName !== strundefined ) {
+                       if ( typeof context.getElementsByTagName !== "undefined" ) {
                                return context.getElementsByTagName( tag );
+
+                       // DocumentFragment nodes don't have gEBTN
+                       } else if ( support.qsa ) {
+                               return context.querySelectorAll( tag );
                        }
                } :
+
                function( tag, context ) {
                        var elem,
                                tmp = [],
                                i = 0,
+                               // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
                                results = context.getElementsByTagName( tag );
 
                        // Filter out possible comments
@@ -1177,7 +1181,7 @@ setDocument = Sizzle.setDocument = function( node ) {
 
        // Class
        Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
-               if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+               if ( documentIsHTML ) {
                        return context.getElementsByClassName( className );
                }
        };
@@ -1206,13 +1210,15 @@ setDocument = Sizzle.setDocument = function( node ) {
                        // setting a boolean content attribute,
                        // since its presence should be enough
                        // http://bugs.jquery.com/ticket/12359
-                       div.innerHTML = "<select msallowclip=''><option selected=''></option></select>";
+                       docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
+                               "<select id='" + expando + "-\f]' msallowcapture=''>" +
+                               "<option selected=''></option></select>";
 
                        // Support: IE8, Opera 11-12.16
                        // Nothing should be selected when empty strings follow ^= or $= or *=
                        // The test attribute must be unknown in Opera but "safe" for WinRT
                        // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
-                       if ( div.querySelectorAll("[msallowclip^='']").length ) {
+                       if ( div.querySelectorAll("[msallowcapture^='']").length ) {
                                rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
                        }
 
@@ -1222,12 +1228,24 @@ setDocument = Sizzle.setDocument = function( node ) {
                                rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
                        }
 
+                       // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
+                       if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+                               rbuggyQSA.push("~=");
+                       }
+
                        // Webkit/Opera - :checked should return selected option elements
                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
                        // IE8 throws error here and will not see later tests
                        if ( !div.querySelectorAll(":checked").length ) {
                                rbuggyQSA.push(":checked");
                        }
+
+                       // Support: Safari 8+, iOS 8+
+                       // https://bugs.webkit.org/show_bug.cgi?id=136851
+                       // In-page `selector#id sibing-combinator selector` fails
+                       if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+                               rbuggyQSA.push(".#.+[+~]");
+                       }
                });
 
                assert(function( div ) {
@@ -1344,7 +1362,7 @@ setDocument = Sizzle.setDocument = function( node ) {
 
                        // Maintain original order
                        return sortInput ?
-                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
                                0;
                }
 
@@ -1371,7 +1389,7 @@ setDocument = Sizzle.setDocument = function( node ) {
                                aup ? -1 :
                                bup ? 1 :
                                sortInput ?
-                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
                                0;
 
                // If the nodes are siblings, we can do a quick check
@@ -1434,7 +1452,7 @@ Sizzle.matchesSelector = function( elem, expr ) {
                                        elem.document && elem.document.nodeType !== 11 ) {
                                return ret;
                        }
-               } catch(e) {}
+               } catch (e) {}
        }
 
        return Sizzle( expr, document, null, [ elem ] ).length > 0;
@@ -1653,7 +1671,7 @@ Expr = Sizzle.selectors = {
                        return pattern ||
                                (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
                                classCache( className, function( elem ) {
-                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
                                });
                },
 
@@ -1675,7 +1693,7 @@ Expr = Sizzle.selectors = {
                                        operator === "^=" ? check && result.indexOf( check ) === 0 :
                                        operator === "*=" ? check && result.indexOf( check ) > -1 :
                                        operator === "$=" ? check && result.slice( -check.length ) === check :
-                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+                                       operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
                                        operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
                                        false;
                        };
@@ -1795,7 +1813,7 @@ Expr = Sizzle.selectors = {
                                                        matched = fn( seed, argument ),
                                                        i = matched.length;
                                                while ( i-- ) {
-                                                       idx = indexOf.call( seed, matched[i] );
+                                                       idx = indexOf( seed, matched[i] );
                                                        seed[ idx ] = !( matches[ idx ] = matched[i] );
                                                }
                                        }) :
@@ -1834,6 +1852,8 @@ Expr = Sizzle.selectors = {
                                function( elem, context, xml ) {
                                        input[0] = elem;
                                        matcher( input, null, xml, results );
+                                       // Don't keep the element (issue #299)
+                                       input[0] = null;
                                        return !results.pop();
                                };
                }),
@@ -1845,6 +1865,7 @@ Expr = Sizzle.selectors = {
                }),
 
                "contains": markFunction(function( text ) {
+                       text = text.replace( runescape, funescape );
                        return function( elem ) {
                                return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
                        };
@@ -2266,7 +2287,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
                                i = matcherOut.length;
                                while ( i-- ) {
                                        if ( (elem = matcherOut[i]) &&
-                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+                                               (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
 
                                                seed[temp] = !(results[temp] = elem);
                                        }
@@ -2301,13 +2322,16 @@ function matcherFromTokens( tokens ) {
                        return elem === checkContext;
                }, implicitRelative, true ),
                matchAnyContext = addCombinator( function( elem ) {
-                       return indexOf.call( checkContext, elem ) > -1;
+                       return indexOf( checkContext, elem ) > -1;
                }, implicitRelative, true ),
                matchers = [ function( elem, context, xml ) {
-                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+                       var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
                                (checkContext = context).nodeType ?
                                        matchContext( elem, context, xml ) :
                                        matchAnyContext( elem, context, xml ) );
+                       // Avoid hanging onto element (issue #299)
+                       checkContext = null;
+                       return ret;
                } ];
 
        for ( ; i < len; i++ ) {
@@ -2557,7 +2581,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
 // Sort stability
 support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
 
-// Support: Chrome<14
+// Support: Chrome 14-35+
 // Always assume duplicates if they aren't passed to the comparison function
 support.detectDuplicates = !!hasDuplicate;
 
@@ -6115,7 +6139,14 @@ var getStyles, curCSS,
 
 if ( window.getComputedStyle ) {
        getStyles = function( elem ) {
-               return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+               // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
+               // IE throws on elements created in popups
+               // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+               if ( elem.ownerDocument.defaultView.opener ) {
+                       return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+               }
+
+               return window.getComputedStyle( elem, null );
        };
 
        curCSS = function( elem, name, computed ) {
@@ -6363,6 +6394,8 @@ function addGetHookIf( conditionFn, hookFn ) {
 
                        reliableMarginRightVal =
                                !parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight );
+
+                       div.removeChild( contents );
                }
 
                // Support: IE8
@@ -9070,7 +9103,8 @@ jQuery.extend({
                }
 
                // We can fire global events as of now if asked to
-               fireGlobals = s.global;
+               // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+               fireGlobals = jQuery.event && s.global;
 
                // Watch for a new set of requests
                if ( fireGlobals && jQuery.active++ === 0 ) {
@@ -9329,13 +9363,6 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
        };
 });
 
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
-       jQuery.fn[ type ] = function( fn ) {
-               return this.on( type, fn );
-       };
-});
-
 
 jQuery._evalUrl = function( url ) {
        return jQuery.ajax({
@@ -9561,8 +9588,9 @@ var xhrId = 0,
 
 // Support: IE<10
 // Open requests must be manually aborted on unload (#5280)
-if ( window.ActiveXObject ) {
-       jQuery( window ).on( "unload", function() {
+// See https://support.microsoft.com/kb/2856746 for more info
+if ( window.attachEvent ) {
+       window.attachEvent( "onunload", function() {
                for ( var key in xhrCallbacks ) {
                        xhrCallbacks[ key ]( undefined, true );
                }
@@ -9996,6 +10024,16 @@ jQuery.fn.load = function( url, params, callback ) {
 
 
 
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+       jQuery.fn[ type ] = function( fn ) {
+               return this.on( type, fn );
+       };
+});
+
+
+
+
 jQuery.expr.filters.animated = function( elem ) {
        return jQuery.grep(jQuery.timers, function( fn ) {
                return elem === fn.elem;
index 26171f1..d3db318 100644 (file)
@@ -5,5 +5,15 @@
                ]
        },
        "ooui-outline-control-move-down": "Onderwarp ummeneer zetten",
-       "ooui-outline-control-move-up": "Onderwarp umhoge zetten"
+       "ooui-outline-control-move-up": "Onderwarp umhoge zetten",
+       "ooui-outline-control-remove": "Element vortdoon",
+       "ooui-toolbar-more": "Meer",
+       "ooui-toolgroup-expand": "Meer",
+       "ooui-toolgroup-collapse": "Minder",
+       "ooui-dialog-message-accept": "Okee",
+       "ooui-dialog-message-reject": "Aofbreken",
+       "ooui-dialog-process-error": "Der gung iets fout",
+       "ooui-dialog-process-dismiss": "Sluten",
+       "ooui-dialog-process-retry": "Opniej proberen",
+       "ooui-dialog-process-continue": "Deurgaon"
 }
index 5737548..a40728a 100644 (file)
        "ooui-outline-control-move-up": "Prestavi predmet višje",
        "ooui-outline-control-remove": "Odstrani vnos",
        "ooui-toolbar-more": "Več",
+       "ooui-toolgroup-expand": "Več",
+       "ooui-toolgroup-collapse": "Manj",
        "ooui-dialog-message-accept": "V redu",
        "ooui-dialog-message-reject": "Prekliči",
        "ooui-dialog-process-error": "Nekaj je šlo narobe",
        "ooui-dialog-process-dismiss": "Skrij",
-       "ooui-dialog-process-retry": "Poskusi znova"
+       "ooui-dialog-process-retry": "Poskusi znova",
+       "ooui-dialog-process-continue": "Nadaljuj"
 }
index f4d4a5c..0197a4c 100644 (file)
@@ -28,5 +28,6 @@
        "ooui-dialog-message-reject": "Скасувати",
        "ooui-dialog-process-error": "Щось пішло не так",
        "ooui-dialog-process-dismiss": "Приховати",
-       "ooui-dialog-process-retry": "Спробуйте ще раз"
+       "ooui-dialog-process-retry": "Спробуйте ще раз",
+       "ooui-dialog-process-continue": "Продовжити"
 }
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.css b/resources/lib/oojs-ui/oojs-ui-apex.css
deleted file mode 100644 (file)
index 4c4512b..0000000
+++ /dev/null
@@ -1,2221 +0,0 @@
-/*!
- * OOjs UI v0.5.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-12-12T20:13:21Z
- */
-.oo-ui-progressBarWidget-slide-frames from {
-       margin-left: -40%;
-}
-.oo-ui-progressBarWidget-slide-frames to {
-       margin-left: 100%;
-}
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-ms-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-o-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-/* @noflip */
-.oo-ui-rtl {
-       direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-       direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-       cursor: pointer;
-       display: inline-block;
-       vertical-align: middle;
-       font-family: inherit;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-       cursor: default;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-       display: inline-block;
-       position: relative;
-}
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       display: inline-block;
-       vertical-align: top;
-       text-align: center;
-}
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-       color: #333333;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       margin-right: -0.75em;
-       margin-left: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       margin-left: 0;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       opacity: 0.8;
-       width: 1.9em;
-       height: 1.9em;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-       /*.oo-ui-transition(opacity 200ms);*/
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
-       outline: none;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
-       opacity: 1;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-       color: #000000;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #333333;
-}
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       margin-left: 0.25em;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #087ecc;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #76ab36;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #d45353;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #cccccc;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       margin: 0.1em 0;
-       padding: 0.2em 0.8em;
-       border-radius: 0.3em;
-       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-       border: 1px #c9c9c9 solid;
-       -webkit-transition: border-color 100ms ease-in-out;
-          -moz-transition: border-color 100ms ease-in-out;
-           -ms-transition: border-color 100ms ease-in-out;
-            -o-transition: border-color 100ms ease-in-out;
-               transition: border-color 100ms ease-in-out;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
-       border-color: #aaaaaa;
-       outline: none;
-}
-.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       line-height: 1.9em;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       color: black;
-       border-color: #c9c9c9;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: -0.5em;
-       margin-right: -0.5em;
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: -0.5em;
-       margin-right: 0.3em;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
-       border: solid 1px #a6cee1;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
-       border-color: #9dc2d4;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       border: solid 1px #a6cee1;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
-       border: solid 1px #b8d892;
-       background: #daf0be;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
-       background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:    -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:     -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:      -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:         linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
-       border-color: #adcb89;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       border: solid 1px #b8d892;
-       background: #daf0be;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
-       background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:    -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:     -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:      -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:         linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-       color: #d45353;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       opacity: 0.5;
-       -webkit-transform: translate3d(0, 0, 0);
-       box-shadow: none;
-       color: #333333;
-       background: #eeeeee;
-       border-color: #cccccc;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:focus {
-       border-color: #cccccc;
-       box-shadow: none;
-}
-.oo-ui-clippableElement-clippable {
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-draggableElement {
-       cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
-       /*
-        * HACK: In order to style horizontally, we must override
-        * OO.ui.OptionWidget's display rule that is currently set
-        * to be 'block'
-        */
-}
-.oo-ui-draggableElement-dragging {
-       cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
-       background: rgba(0, 0, 0, 0.2);
-       opacity: 0.4;
-}
-.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement.oo-ui-optionWidget {
-       display: inline-block;
-}
-.oo-ui-draggableGroupElement-placeholder {
-       position: absolute;
-       display: block;
-       background: rgba(0, 0, 0, 0.4);
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-       overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-       width: 100%;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-       overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-       padding: 2em;
-}
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 3em;
-       overflow-y: auto;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-       position: absolute;
-       bottom: 0;
-       left: 0;
-       right: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-       padding: 1.5em;
-}
-.oo-ui-bookletLayout-outlinePanel {
-       border-right: solid 1px #dddddd;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-       box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-fieldLayout {
-       display: block;
-       margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-       content: " ";
-       display: table;
-}
-.oo-ui-fieldLayout:after {
-       clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
-       display: block;
-       float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       text-align: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
-       display: table;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
-       display: table-cell;
-       vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-fieldLayout-help {
-       float: right;
-}
-.oo-ui-fieldLayout > .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       z-index: 1;
-}
-.oo-ui-fieldLayout > .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
-       padding: 0.5em 0.75em;
-       line-height: 1.5em;
-}
-.oo-ui-fieldLayout:last-child {
-       margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       padding-top: 0.5em;
-       margin-right: 5%;
-       width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
-       width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       padding: 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
-       padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-       color: #cccccc;
-}
-.oo-ui-fieldsetLayout {
-       position: relative;
-       margin: 0;
-       padding: 0;
-       border: none;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-       display: block;
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-       display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-       margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-       font-size: 1.5em;
-       margin-bottom: 0.5em;
-       padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-       padding-left: 1.75em;
-       line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-       left: 0;
-       top: 0.25em;
-       width: 2em;
-       height: 2em;
-}
-.oo-ui-gridLayout {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-}
-.oo-ui-panelLayout {
-       position: relative;
-}
-.oo-ui-panelLayout-scrollable {
-       overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-}
-.oo-ui-panelLayout-padded {
-       padding: 1.25em;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-       display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-       display: block;
-       position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-       z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-       /* @noflip */
-       margin-left: 1.25em;
-       font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-       display: inline-block;
-       vertical-align: middle;
-       margin: 0.3em;
-       border-radius: 0.25em;
-       border: solid 1px transparent;
-       -webkit-transition: border-color 300ms ease-in-out;
-          -moz-transition: border-color 300ms ease-in-out;
-           -ms-transition: border-color 300ms ease-in-out;
-            -o-transition: border-color 300ms ease-in-out;
-               transition: border-color 300ms ease-in-out;
-}
-.oo-ui-toolGroup-empty {
-       display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #000000;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-       display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-       display: inline-block;
-       position: relative;
-       vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-       display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-       display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-       cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-       margin: -1px 0 -1px -1px;
-       border: solid 1px transparent;
-}
-.oo-ui-barToolGroup .oo-ui-tool:first-child {
-       border-top-left-radius: 0.25em;
-       border-bottom-left-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool:last-child {
-       margin-right: -1px;
-       border-top-right-radius: 0.25em;
-       border-bottom-right-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-       height: 1.5em;
-       padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       height: 1.5em;
-       width: 1.5em;
-       opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-color: rgba(0, 0, 0, 0.2);
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-left-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 1;
-}
-.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-popupToolGroup {
-       position: relative;
-       height: 2em;
-       min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-       display: block;
-       cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-       cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-       display: none;
-       position: absolute;
-       z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-       background-repeat: no-repeat;
-       background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-       display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-       left: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-       right: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: inline-table;
-       vertical-align: middle;
-       width: 100%;
-       margin-right: -2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       display: table-cell;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text {
-       width: 100%;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       text-align: right;
-       padding-right: 2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel:not(:empty) {
-       padding-left: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-       min-width: 3.5em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       line-height: 2.6em;
-       font-size: 0.8em;
-       margin: 0 1em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       margin-left: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       margin-right: 2.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       top: 0;
-       width: 2em;
-       height: 2em;
-       opacity: 0.8;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       left: 0.25em;
-}
-.oo-ui-popupToolGroup-header {
-       line-height: 2.6em;
-       font-size: 0.8em;
-       margin: 0 0.6em;
-       font-weight: bold;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
-       border-bottom-left-radius: 0;
-       border-bottom-right-radius: 0;
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-       top: 2em;
-       margin: 0 -1px;
-       border: solid 1px #cccccc;
-       background-color: white;
-       box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       height: 2em;
-       width: 2em;
-       margin-right: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       line-height: 2em;
-       font-size: 0.8em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       color: #888888;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-       display: inline-block;
-       width: 100%;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-       padding: 0.25em;
-}
-.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-       border: solid 1px transparent;
-       margin: -1px 0;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       padding-right: 0.5em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-color: rgba(0, 0, 0, 0.1);
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-top-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.8;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 1;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #cccccc;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       color: #dddddd;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled {
-       color: #cccccc;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-menuToolGroup {
-       border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-       display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-       min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-       padding: 0.25em 0 0.25em 0;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-       border-color: rgba(0, 0, 0, 0.25);
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       padding: 0 1em 0 0.25em;
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-image: none;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-       background-color: #e1f3ff;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #cccccc;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled {
-       color: #cccccc;
-       border-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-toolbar {
-       clear: both;
-}
-.oo-ui-toolbar-bar {
-       line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-       float: right;
-}
-.oo-ui-toolbar-tools {
-       display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-       -webkit-touch-callout: default;
-       -webkit-user-select: all;
-          -moz-user-select: all;
-           -ms-user-select: all;
-               user-select: all;
-}
-.oo-ui-toolbar-shadow {
-       background-position: left top;
-       background-repeat: repeat-x;
-       position: absolute;
-       width: 100%;
-       pointer-events: none;
-}
-.oo-ui-toolbar-bar {
-       border-bottom: solid 1px #cccccc;
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-       border: none;
-       background: none;
-}
-.oo-ui-toolbar-shadow {
-       background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
-       bottom: -9px;
-       height: 9px;
-       opacity: 0.125;
-       -webkit-transition: opacity 500ms ease-in-out;
-          -moz-transition: opacity 500ms ease-in-out;
-           -ms-transition: opacity 500ms ease-in-out;
-            -o-transition: opacity 500ms ease-in-out;
-               transition: opacity 500ms ease-in-out;
-}
-.oo-ui-optionWidget {
-       position: relative;
-       display: block;
-       cursor: pointer;
-       padding: 0.25em 0.5em;
-       border: none;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-       cursor: default;
-}
-.oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: block;
-       white-space: nowrap;
-       text-overflow: ellipsis;
-       overflow: hidden;
-}
-.oo-ui-optionWidget-highlighted {
-       background-color: #e1f3ff;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-       line-height: 1.5em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
-       background-color: #a7dcff;
-}
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-       background-color: #a7dcff;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-       color: #cccccc;
-}
-.oo-ui-decoratedOptionWidget {
-       padding: 0.5em 2em 0.5em 3em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       position: absolute;
-       background-repeat: no-repeat;
-       background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       top: 50%;
-       width: 2em;
-       height: 2em;
-       margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-       left: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       right: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-       display: inline-block;
-       white-space: nowrap;
-       border-radius: 0.3em;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       border-radius: 0;
-       margin-left: -1px;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
-       margin-left: 0;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
-}
-.oo-ui-radioSelectWidget {
-       padding: 0.75em 0 0.5em 0;
-}
-.oo-ui-buttonOptionWidget {
-       display: inline-block;
-       padding: 0;
-       background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       position: static;
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       height: 1.9em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       height: 1.9em;
-       margin-top: 0;
-}
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget {
-       cursor: default;
-       padding: 0;
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
-.oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-highlighted {
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget > .oo-ui-labelElement-label {
-       padding: 0 0.5em;
-}
-.oo-ui-labelWidget {
-       display: inline-block;
-       padding: 0.5em 0;
-}
-.oo-ui-iconWidget {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-       line-height: 2.5em;
-       height: 1.9em;
-       width: 1.9em;
-       opacity: 0.8;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-       opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-       line-height: 2.5em;
-       height: 1.9em;
-       width: 1.9em;
-       opacity: 0.8;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-       opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-       display: inline-block;
-       white-space: nowrap;
-       border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       border-radius: 0;
-       margin-bottom: -1px;
-       margin-left: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
-       margin-left: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-       position: relative;
-       display: inline-block;
-       vertical-align: middle;
-       overflow: hidden;
-       cursor: pointer;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-       -webkit-transform: translateZ(0px);
-          -moz-transform: translateZ(0px);
-           -ms-transform: translateZ(0px);
-            -o-transform: translateZ(0px);
-               transform: translateZ(0px);
-       height: 2em;
-       width: 4em;
-       border-radius: 1em;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
-       border: solid 1px #cccccc;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-       cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-       position: absolute;
-       display: block;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-       position: absolute;
-       top: 0;
-       bottom: 0;
-       right: 0;
-       left: 0;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: none;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-       opacity: 0.5;
-}
-.oo-ui-toggleSwitchWidget-grip {
-       top: 0.25em;
-       left: 0.25em;
-       width: 1.5em;
-       height: 1.5em;
-       margin-top: -1px;
-       border-radius: 1em;
-       box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
-       border: 1px #c9c9c9 solid;
-       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-          -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-           -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-            -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-               transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
-       border-color: #aaaaaa;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-       border-radius: 1em;
-       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       -webkit-transition: opacity 200ms ease-in-out;
-          -moz-transition: opacity 200ms ease-in-out;
-           -ms-transition: opacity 200ms ease-in-out;
-            -o-transition: opacity 200ms ease-in-out;
-               transition: opacity 200ms ease-in-out;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-       opacity: 1;
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-       left: 2.25em;
-       margin-left: -2px;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: block;
-       opacity: 0;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-       left: 0.25em;
-       margin-left: 0;
-}
-.oo-ui-progressBarWidget {
-       max-width: 50em;
-       border: solid 1px #a6cee1;
-       border-radius: 0.25em;
-       overflow: hidden;
-}
-.oo-ui-progressBarWidget-bar {
-       height: 1em;
-       border-right: solid 1px #a6cee1;
-       -webkit-transition: width 200ms, margin-left 200ms;
-          -moz-transition: width 200ms, margin-left 200ms;
-           -ms-transition: width 200ms, margin-left 200ms;
-            -o-transition: width 200ms, margin-left 200ms;
-               transition: width 200ms, margin-left 200ms;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-}
-.oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
-       -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-          -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-               animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-       width: 40%;
-       margin-left: -10%;
-       border-left: solid 1px #a6cee1;
-}
-.oo-ui-progressBarWidget.oo-ui-widget-disabled {
-       opacity: 0.6;
-}
-.oo-ui-actionWidget.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-popupWidget {
-       position: absolute;
-       /* @noflip */
-       left: 0;
-}
-.oo-ui-popupWidget-popup {
-       position: relative;
-       overflow: hidden;
-       z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-       display: none;
-       z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-       display: block;
-       position: absolute;
-       top: 0;
-       /* @noflip */
-       left: 0;
-       background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-       float: right;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-       float: left;
-       cursor: default;
-}
-.oo-ui-popupWidget-body {
-       clear: both;
-       overflow: hidden;
-}
-.oo-ui-popupWidget-popup {
-       border: solid 1px #cccccc;
-       border-radius: 0.25em;
-       background-color: #ffffff;
-       box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-       margin-top: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-       content: "";
-       position: absolute;
-       width: 0;
-       height: 0;
-       border-style: solid;
-       border-color: transparent;
-       border-top: 0;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
-       bottom: -8px;
-       left: -7px;
-       border-bottom-color: #aaaaaa;
-       border-width: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-       bottom: -8px;
-       left: -6px;
-       border-bottom-color: #ffffff;
-       border-width: 6px;
-}
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-       -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-          -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-           -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-            -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-               transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-}
-.oo-ui-popupWidget-head {
-       height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-       margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-       margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body-padded {
-       padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-       position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-       position: absolute;
-       cursor: auto;
-}
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
-       left: 1em;
-}
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
-       left: 1.25em;
-}
-.oo-ui-textInputWidget {
-       position: relative;
-       vertical-align: middle;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-       display: inline-block;
-       width: 100%;
-       resize: none;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-       position: absolute;
-       top: 0;
-       height: 100%;
-       background-repeat: no-repeat;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-       left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-       padding: 0.5em;
-       font-size: 1em;
-       font-family: sans-serif;
-       background-color: #ffffff;
-       color: black;
-       border: solid 1px #cccccc;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
-       border-radius: 0.25em;
-       -webkit-transition: border-color 200ms, box-shadow 200ms;
-          -moz-transition: border-color 200ms, box-shadow 200ms;
-           -ms-transition: border-color 200ms, box-shadow 200ms;
-            -o-transition: border-color 200ms, box-shadow 200ms;
-               transition: border-color 200ms, box-shadow 200ms;
-}
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-       padding-left: 2em;
-}
-.oo-ui-textInputWidget-icon {
-       width: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-       outline: none;
-       border-color: #a7dcff;
-       box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
-       color: #777777;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
-       color: #cccccc;
-       text-shadow: 0 1px 1px #ffffff;
-       border-color: #dddddd;
-       background-color: #f3f3f3;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
-       opacity: 0.8;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement input,
-.oo-ui-textInputWidget.oo-ui-iconElement textarea {
-       padding-left: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       width: 2em;
-       background-position: right center;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement input,
-.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-       padding-right: 1.5em;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       width: 1.5em;
-       background-position: left center;
-}
-.oo-ui-menuSelectWidget {
-       position: absolute;
-       background: #ffffff;
-       margin-top: -1px;
-       border: solid 1px #cccccc;
-       border-radius: 0 0 0.25em 0.25em;
-       box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuSelectWidget input {
-       position: absolute;
-       width: 0;
-       height: 0;
-       overflow: hidden;
-       opacity: 0;
-}
-.oo-ui-menuOptionWidget {
-       position: relative;
-}
-.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
-       display: none;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
-       background-color: transparent;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-       display: block;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
-       background-color: transparent;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
-       background-color: #e1f3ff;
-}
-.oo-ui-menuSectionOptionWidget {
-       cursor: default;
-       padding: 0.33em 0.75em;
-       color: #888888;
-}
-.oo-ui-dropdownWidget {
-       position: relative;
-       display: inline-block;
-       margin: 0.25em 0;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-dropdownWidget-handle {
-       width: 100%;
-       display: inline-block;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
-       z-index: 1;
-       width: 100%;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
-       cursor: default;
-}
-.oo-ui-dropdownWidget-handle {
-       height: 2.5em;
-       border: solid 1px rgba(0, 0, 0, 0.1);
-       border-radius: 0.25em;
-}
-.oo-ui-dropdownWidget-handle:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       left: 0.25em;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       line-height: 2.5em;
-       margin: 0 0.5em;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       top: 0;
-       width: 2.5em;
-       height: 2.5em;
-       opacity: 0.8;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
-       color: #cccccc;
-       text-shadow: 0 1px 1px #ffffff;
-       border-color: #dddddd;
-       background-color: #f3f3f3;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
-       opacity: 0.2;
-}
-.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       margin-left: 3em;
-}
-.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       margin-right: 2em;
-}
-.oo-ui-outlineOptionWidget {
-       position: relative;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-       font-size: 1.1em;
-       padding: 0.75em;
-}
-.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-       padding-right: 1.5em;
-}
-.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget-level-0 {
-       padding-left: 3.5em;
-}
-.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
-       left: 1em;
-}
-.oo-ui-outlineOptionWidget-level-1 {
-       padding-left: 5em;
-}
-.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
-       left: 2.5em;
-}
-.oo-ui-outlineOptionWidget-level-2 {
-       padding-left: 6.5em;
-}
-.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
-       left: 4em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
-       background-color: #a7dcff;
-       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
-       font-weight: bold;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-placeholder {
-       font-style: italic;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-       opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-       color: #777777;
-}
-.oo-ui-outlineControlsWidget {
-       height: 3em;
-       background-color: #ffffff;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-       float: left;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-       float: left;
-       background-position: right center;
-       background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-       float: left;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-       float: left;
-}
-.oo-ui-outlineControlsWidget-movers {
-       float: right;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-       float: right;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-       height: 2em;
-       margin: 0.5em 0.5em 0.5em 0;
-       padding: 0;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-       width: 1.5em;
-       height: 2em;
-       margin: 0.5em 0 0.5em 0.5em;
-       opacity: 0.2;
-}
-.oo-ui-comboBoxWidget {
-       display: inline-block;
-       position: relative;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-       width: 100%;
-       z-index: 1;
-}
-.oo-ui-comboBoxWidget-handle {
-       border: solid 1px rgba(0, 0, 0, 0.1);
-       border-radius: 0.25em;
-}
-.oo-ui-comboBoxWidget-handle:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-comboBoxWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
-.oo-ui-comboBoxWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       cursor: default;
-       opacity: 0.2;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-       margin-top: -3px;
-}
-.oo-ui-searchWidget-query {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-       width: 100%;
-}
-.oo-ui-searchWidget-results {
-       position: absolute;
-       bottom: 0;
-       left: 0;
-       right: 0;
-       overflow-x: hidden;
-       overflow-y: auto;
-}
-.oo-ui-searchWidget-query {
-       height: 4em;
-       padding: 0 1em;
-       box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-       margin: 0.75em 0;
-}
-.oo-ui-searchWidget-results {
-       top: 4em;
-       padding: 1em;
-       line-height: 0;
-}
-.oo-ui-window {
-       line-height: 1em;
-}
-.oo-ui-window-frame {
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-       width: 100%;
-       height: 100%;
-       margin: 0;
-       padding: 0;
-}
-.oo-ui-window-content:focus {
-       outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-window-body {
-       margin: 0;
-       padding: 0;
-       background: none;
-}
-.oo-ui-window-overlay,
-.oo-ui-window-inner-overlay {
-       position: absolute;
-       top: 0;
-       /* @noflip */
-       left: 0;
-}
-.oo-ui-window,
-.oo-ui-window-isolated {
-       background-color: transparent;
-       background-image: none;
-       font-family: sans-serif;
-       font-size: 0.8em;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-       position: absolute;
-       left: 0;
-       right: 0;
-       overflow: hidden;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-       z-index: 1;
-       top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-       z-index: 2;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-       z-index: 1;
-       bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-inner-overlay {
-       z-index: 3;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-messageDialog-actions-horizontal {
-       display: table;
-       table-layout: fixed;
-       width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-       display: table-cell;
-       width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-       display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-       display: block;
-       overflow: hidden;
-       text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-       position: relative;
-       text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-       display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-       position: relative;
-       top: auto;
-       bottom: auto;
-       display: inline;
-       white-space: nowrap;
-}
-.oo-ui-messageDialog-content .oo-ui-window-body {
-       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-       display: block;
-       text-align: center;
-       padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-       font-size: 1.5em;
-       line-height: 1em;
-       color: #000000;
-}
-.oo-ui-messageDialog-message {
-       font-size: 0.9em;
-       line-height: 1.25em;
-       color: #666666;
-}
-.oo-ui-messageDialog-message-verbose {
-       font-size: 1.1em;
-       line-height: 1.5em;
-       text-align: left;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-       border-right: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-       border-right-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-       border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-       border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-       height: 3.4em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       text-align: center;
-       line-height: 3.4em;
-       padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-       background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-       background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
-       background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active {
-       background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
-       font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-       background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-       background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-       background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-       background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-       overflow: hidden;
-       text-overflow: ellipsis;
-       white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-       display: inline;
-       padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-       white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-       position: absolute;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-       left: 0;
-}
-.oo-ui-processDialog-actions-primary {
-       right: 0;
-}
-.oo-ui-processDialog-errors {
-       display: none;
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-       z-index: 2;
-       overflow-x: hidden;
-       overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-       height: 3.4em;
-}
-.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-       top: 3.4em;
-       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-processDialog-navigation {
-       position: relative;
-       height: 3.4em;
-       padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-       padding: 0.75em 0;
-       height: 1.9em;
-       cursor: default;
-       text-align: center;
-}
-.oo-ui-processDialog-title {
-       font-weight: bold;
-       line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-       min-width: 1.9em;
-       min-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-       line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em 0 0.75em 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       padding: 0 1em;
-       vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
-       background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
-       background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       /* Adjust for border so text aligns with title */
-       margin: -1px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
-       background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active {
-       background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
-       font-weight: bold;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-       background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-       background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-       background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-       background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-       min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-       background-color: rgba(255, 255, 255, 0.9);
-       padding: 3em 3em 1.5em 3em;
-       text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-       margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-       font-size: 1.5em;
-       color: #000000;
-       margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-       text-align: left;
-       margin: 1em;
-       padding: 1em;
-       border: solid 1px #ff9e9e;
-       background-color: #fff7f7;
-       border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-       position: fixed;
-       width: 0;
-       height: 0;
-       overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
-       width: auto;
-       height: auto;
-       top: 0;
-       right: 0;
-       bottom: 0;
-       left: 0;
-       padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-       position: absolute;
-       right: 0;
-       left: 0;
-       margin: auto;
-       overflow: hidden;
-       max-width: 100%;
-       max-height: 100%;
-       visibility: visible;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-       width: 100%;
-       height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-       visibility: hidden;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-       width: 100%;
-       height: 100%;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-       background-color: rgba(255, 255, 255, 0.5);
-       opacity: 0;
-       -webkit-transition: opacity 250ms ease-in-out;
-          -moz-transition: opacity 250ms ease-in-out;
-           -ms-transition: opacity 250ms ease-in-out;
-            -o-transition: opacity 250ms ease-in-out;
-               transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-       top: 1em;
-       bottom: 1em;
-       background-color: #ffffff;
-       -webkit-transform: scale(0.5);
-          -moz-transform: scale(0.5);
-           -ms-transform: scale(0.5);
-            -o-transform: scale(0.5);
-               transform: scale(0.5);
-       -webkit-transition: all 250ms ease-in-out;
-          -moz-transition: all 250ms ease-in-out;
-           -ms-transition: all 250ms ease-in-out;
-            -o-transition: all 250ms ease-in-out;
-               transition: all 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
-       opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-       -webkit-transform: scale(1);
-          -moz-transform: scale(1);
-           -ms-transform: scale(1);
-            -o-transform: scale(1);
-               transform: scale(1);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-       border: solid 1px #cccccc;
-       border-radius: 0.5em;
-       box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
-
-.oo-ui-icon-add {
-       background-image: /* @embed */ url(themes/apex/images/icons/add.png);
-}
-.oo-ui-icon-advanced {
-       background-image: /* @embed */ url(themes/apex/images/icons/advanced.png);
-}
-.oo-ui-icon-alert {
-       background-image: /* @embed */ url(themes/apex/images/icons/alert.png);
-}
-.oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/apex/images/icons/check.png);
-}
-.oo-ui-icon-clear {
-       background-image: /* @embed */ url(themes/apex/images/icons/clear.png);
-}
-.oo-ui-icon-close {
-       background-image: /* @embed */ url(themes/apex/images/icons/close.png);
-}
-.oo-ui-icon-code {
-       background-image: /* @embed */ url(themes/apex/images/icons/code.png);
-}
-.oo-ui-icon-collapse {
-       background-image: /* @embed */ url(themes/apex/images/icons/collapse.png);
-}
-.oo-ui-icon-comment {
-       background-image: /* @embed */ url(themes/apex/images/icons/comment.png);
-}
-.oo-ui-icon-expand {
-       background-image: /* @embed */ url(themes/apex/images/icons/expand.png);
-}
-.oo-ui-icon-help {
-       background-image: /* @embed */ url(themes/apex/images/icons/help.png);
-}
-.oo-ui-icon-info {
-       background-image: /* @embed */ url(themes/apex/images/icons/info.png);
-}
-.oo-ui-icon-link {
-       background-image: /* @embed */ url(themes/apex/images/icons/link.png);
-}
-.oo-ui-icon-menu {
-       background-image: /* @embed */ url(themes/apex/images/icons/menu.png);
-}
-.oo-ui-icon-next {
-       background-image: /* @embed */ url(themes/apex/images/icons/move-ltr.png);
-}
-.oo-ui-icon-picture {
-       background-image: /* @embed */ url(themes/apex/images/icons/picture.png);
-}
-.oo-ui-icon-previous {
-       background-image: /* @embed */ url(themes/apex/images/icons/move-rtl.png);
-}
-.oo-ui-icon-redo {
-       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-ltr.png);
-}
-.oo-ui-icon-remove {
-       background-image: /* @embed */ url(themes/apex/images/icons/remove.png);
-}
-.oo-ui-icon-search {
-       background-image: /* @embed */ url(themes/apex/images/icons/search.png);
-}
-.oo-ui-icon-settings {
-       background-image: /* @embed */ url(themes/apex/images/icons/settings.png);
-}
-.oo-ui-icon-tag {
-       background-image: /* @embed */ url(themes/apex/images/icons/tag.png);
-}
-.oo-ui-icon-undo {
-       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-rtl.png);
-}
-.oo-ui-icon-window {
-       background-image: /* @embed */ url(themes/apex/images/icons/window.png);
-}
-.oo-ui-indicator-alert {
-       background-image: /* @embed */ url(themes/apex/images/indicators/alert.png);
-}
-.oo-ui-indicator-up {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-up.png);
-}
-.oo-ui-indicator-down {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-down.png);
-}
-.oo-ui-indicator-next {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-ltr.png);
-}
-.oo-ui-indicator-previous {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-rtl.png);
-}
-.oo-ui-indicator-required {
-       background-image: /* @embed */ url(themes/apex/images/indicators/required.png);
-}
-.oo-ui-texture-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-texture-transparency {
-       background-image: /* @embed */ url(themes/apex/images/textures/transparency.png);
-}
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.js b/resources/lib/oojs-ui/oojs-ui-apex.js
deleted file mode 100644 (file)
index eefc652..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*!
- * OOjs UI v0.5.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-12-12T20:13:09Z
- */
-/* Instantiation */
-
-OO.ui.theme = new OO.ui.Theme();
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.svg.css b/resources/lib/oojs-ui/oojs-ui-apex.svg.css
deleted file mode 100644 (file)
index 1236d0b..0000000
+++ /dev/null
@@ -1,2221 +0,0 @@
-/*!
- * OOjs UI v0.5.0
- * https://www.mediawiki.org/wiki/OOjs_UI
- *
- * Copyright 2011–2014 OOjs Team and other contributors.
- * Released under the MIT license
- * http://oojs.mit-license.org
- *
- * Date: 2014-12-12T20:13:21Z
- */
-.oo-ui-progressBarWidget-slide-frames from {
-       margin-left: -40%;
-}
-.oo-ui-progressBarWidget-slide-frames to {
-       margin-left: 100%;
-}
-@-webkit-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-moz-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-ms-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@-o-keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
-/* @noflip */
-.oo-ui-rtl {
-       direction: rtl;
-}
-/* @noflip */
-.oo-ui-ltr {
-       direction: ltr;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-       cursor: pointer;
-       display: inline-block;
-       vertical-align: middle;
-       font-family: inherit;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       display: none;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       display: none;
-}
-.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-       cursor: default;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-buttonElement-frameless {
-       display: inline-block;
-       position: relative;
-}
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       display: inline-block;
-       vertical-align: top;
-       text-align: center;
-}
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       cursor: default;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button {
-       color: #333333;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: 0;
-}
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       margin-right: -0.75em;
-       margin-left: -0.75em;
-}
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       margin-left: 0;
-}
-.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       opacity: 0.8;
-       width: 1.9em;
-       height: 1.9em;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-       /*.oo-ui-transition(opacity 200ms);*/
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
-       outline: none;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
-       opacity: 1;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-       color: #000000;
-}
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #333333;
-}
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       margin-left: 0.25em;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #087ecc;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #76ab36;
-}
-.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #d45353;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #cccccc;
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       margin: 0.1em 0;
-       padding: 0.2em 0.8em;
-       border-radius: 0.3em;
-       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-       border: 1px #c9c9c9 solid;
-       -webkit-transition: border-color 100ms ease-in-out;
-          -moz-transition: border-color 100ms ease-in-out;
-           -ms-transition: border-color 100ms ease-in-out;
-            -o-transition: border-color 100ms ease-in-out;
-               transition: border-color 100ms ease-in-out;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
-       border-color: #aaaaaa;
-       outline: none;
-}
-.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       line-height: 1.9em;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       color: black;
-       border-color: #c9c9c9;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: -0.5em;
-       margin-right: -0.5em;
-}
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: -0.5em;
-       margin-right: 0.3em;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
-       border: solid 1px #a6cee1;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
-       border-color: #9dc2d4;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       border: solid 1px #a6cee1;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
-       border: solid 1px #b8d892;
-       background: #daf0be;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
-       background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:    -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:     -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:      -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-       background-image:         linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
-       border-color: #adcb89;
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       border: solid 1px #b8d892;
-       background: #daf0be;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
-       background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:    -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:     -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:      -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-       background-image:         linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
-}
-.oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-       color: #d45353;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       opacity: 0.5;
-       -webkit-transform: translate3d(0, 0, 0);
-       box-shadow: none;
-       color: #333333;
-       background: #eeeeee;
-       border-color: #cccccc;
-}
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:hover,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:focus {
-       border-color: #cccccc;
-       box-shadow: none;
-}
-.oo-ui-clippableElement-clippable {
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-draggableElement {
-       cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
-       /*
-        * HACK: In order to style horizontally, we must override
-        * OO.ui.OptionWidget's display rule that is currently set
-        * to be 'block'
-        */
-}
-.oo-ui-draggableElement-dragging {
-       cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
-       background: rgba(0, 0, 0, 0.2);
-       opacity: 0.4;
-}
-.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement.oo-ui-optionWidget {
-       display: inline-block;
-}
-.oo-ui-draggableGroupElement-placeholder {
-       position: absolute;
-       display: block;
-       background: rgba(0, 0, 0, 0.4);
-}
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
-       overflow-y: hidden;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-       width: 100%;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
-       overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
-       padding: 2em;
-}
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 3em;
-       overflow-y: auto;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-       position: absolute;
-       bottom: 0;
-       left: 0;
-       right: 0;
-}
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
-       padding: 1.5em;
-}
-.oo-ui-bookletLayout-outlinePanel {
-       border-right: solid 1px #dddddd;
-}
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
-       box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-fieldLayout {
-       display: block;
-       margin-bottom: 1em;
-}
-.oo-ui-fieldLayout:before,
-.oo-ui-fieldLayout:after {
-       content: " ";
-       display: table;
-}
-.oo-ui-fieldLayout:after {
-       clear: both;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
-       display: block;
-       float: left;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       text-align: right;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
-       display: table;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
-       display: table-cell;
-       vertical-align: middle;
-}
-.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       display: inline-block;
-}
-.oo-ui-fieldLayout > .oo-ui-fieldLayout-help {
-       float: right;
-}
-.oo-ui-fieldLayout > .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       z-index: 1;
-}
-.oo-ui-fieldLayout > .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
-       padding: 0.5em 0.75em;
-       line-height: 1.5em;
-}
-.oo-ui-fieldLayout:last-child {
-       margin-bottom: 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       padding-top: 0.5em;
-       margin-right: 5%;
-       width: 35%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
-       width: 60%;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       padding: 0.5em;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
-       padding: 0.5em 0;
-}
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       padding: 0.5em 0;
-}
-.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-top: 0.25em;
-}
-.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
-       color: #cccccc;
-}
-.oo-ui-fieldsetLayout {
-       position: relative;
-       margin: 0;
-       padding: 0;
-       border: none;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-       display: block;
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
-       display: inline-block;
-}
-.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
-       margin-top: 2em;
-}
-.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
-       font-size: 1.5em;
-       margin-bottom: 0.5em;
-       padding: 0.25em 0;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
-       padding-left: 1.75em;
-       line-height: 1.33em;
-}
-.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
-       left: 0;
-       top: 0.25em;
-       width: 2em;
-       height: 2em;
-}
-.oo-ui-gridLayout {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-}
-.oo-ui-panelLayout {
-       position: relative;
-}
-.oo-ui-panelLayout-scrollable {
-       overflow-y: auto;
-}
-.oo-ui-panelLayout-expanded {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-}
-.oo-ui-panelLayout-padded {
-       padding: 1.25em;
-}
-.oo-ui-stackLayout > .oo-ui-panelLayout {
-       display: none;
-}
-.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
-       display: block;
-       position: relative;
-}
-.oo-ui-popupTool .oo-ui-popupWidget-popup,
-.oo-ui-popupTool .oo-ui-popupWidget-anchor {
-       z-index: 4;
-}
-.oo-ui-popupTool .oo-ui-popupWidget {
-       /* @noflip */
-       margin-left: 1.25em;
-       font-size: 0.8em;
-}
-.oo-ui-toolGroup {
-       display: inline-block;
-       vertical-align: middle;
-       margin: 0.3em;
-       border-radius: 0.25em;
-       border: solid 1px transparent;
-       -webkit-transition: border-color 300ms ease-in-out;
-          -moz-transition: border-color 300ms ease-in-out;
-           -ms-transition: border-color 300ms ease-in-out;
-            -o-transition: border-color 300ms ease-in-out;
-               transition: border-color 300ms ease-in-out;
-}
-.oo-ui-toolGroup-empty {
-       display: none;
-}
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #000000;
-}
-.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
-.oo-ui-barToolGroup > .oo-ui-labelElement-label {
-       display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-       display: inline-block;
-       position: relative;
-       vertical-align: top;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-       display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: block;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: none;
-}
-.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-barToolGroup .oo-ui-tool-title,
-.oo-ui-barToolGroup .oo-ui-tool-accel {
-       display: none;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
-       cursor: pointer;
-}
-.oo-ui-barToolGroup .oo-ui-tool {
-       margin: -1px 0 -1px -1px;
-       border: solid 1px transparent;
-}
-.oo-ui-barToolGroup .oo-ui-tool:first-child {
-       border-top-left-radius: 0.25em;
-       border-bottom-left-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool:last-child {
-       margin-right: -1px;
-       border-top-right-radius: 0.25em;
-       border-bottom-right-radius: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link {
-       height: 1.5em;
-       padding: 0.25em;
-}
-.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       height: 1.5em;
-       width: 1.5em;
-       opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-color: rgba(0, 0, 0, 0.2);
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-left-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.8;
-}
-.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 1;
-}
-.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-popupToolGroup {
-       position: relative;
-       height: 2em;
-       min-width: 2.5em;
-}
-.oo-ui-popupToolGroup-handle {
-       display: block;
-       cursor: pointer;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
-       cursor: default;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-       display: none;
-       position: absolute;
-       z-index: 4;
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-       background-repeat: no-repeat;
-       background-position: center center;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
-       display: block;
-}
-.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
-       left: 0;
-}
-.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
-       right: 0;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: inline-table;
-       vertical-align: middle;
-       width: 100%;
-       margin-right: -2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       display: table-cell;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text {
-       width: 100%;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       text-align: right;
-       padding-right: 2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel:not(:empty) {
-       padding-left: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
-       min-width: 3.5em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       line-height: 2.6em;
-       font-size: 0.8em;
-       margin: 0 1em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       margin-left: 3em;
-}
-.oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-       margin-right: 2.25em;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       top: 0;
-       width: 2em;
-       height: 2em;
-       opacity: 0.8;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
-       left: 0.25em;
-}
-.oo-ui-popupToolGroup-header {
-       line-height: 2.6em;
-       font-size: 0.8em;
-       margin: 0 0.6em;
-       font-weight: bold;
-}
-.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
-       border-bottom-left-radius: 0;
-       border-bottom-right-radius: 0;
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
-       top: 2em;
-       margin: 0 -1px;
-       border: solid 1px #cccccc;
-       background-color: white;
-       box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       height: 2em;
-       width: 2em;
-       margin-right: 0.25em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       line-height: 2em;
-       font-size: 0.8em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       color: #888888;
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-       display: inline-block;
-       width: 100%;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
-       padding: 0.25em;
-}
-.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool {
-       border: solid 1px transparent;
-       margin: -1px 0;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       padding-right: 0.5em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-color: rgba(0, 0, 0, 0.1);
-       box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
-       border-top-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.8;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 1;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #cccccc;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
-       color: #dddddd;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled {
-       color: #cccccc;
-}
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-menuToolGroup {
-       border-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-menuToolGroup .oo-ui-tool {
-       display: block;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
-.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
-       min-width: 8em;
-}
-.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
-       padding: 0.25em 0 0.25em 0;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
-       border-color: rgba(0, 0, 0, 0.25);
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       padding: 0 1em 0 0.25em;
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-image: none;
-}
-.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
-       background-color: #e1f3ff;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
-       color: #cccccc;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled {
-       color: #cccccc;
-       border-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
-.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
-       opacity: 0.2;
-}
-.oo-ui-toolbar {
-       clear: both;
-}
-.oo-ui-toolbar-bar {
-       line-height: 1em;
-}
-.oo-ui-toolbar-actions {
-       float: right;
-}
-.oo-ui-toolbar-tools {
-       display: inline;
-}
-.oo-ui-toolbar-tools,
-.oo-ui-toolbar-actions,
-.oo-ui-toolbar-shadow {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-toolbar-actions .oo-ui-popupWidget {
-       -webkit-touch-callout: default;
-       -webkit-user-select: all;
-          -moz-user-select: all;
-           -ms-user-select: all;
-               user-select: all;
-}
-.oo-ui-toolbar-shadow {
-       background-position: left top;
-       background-repeat: repeat-x;
-       position: absolute;
-       width: 100%;
-       pointer-events: none;
-}
-.oo-ui-toolbar-bar {
-       border-bottom: solid 1px #cccccc;
-       background: #f8fbfd;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
-}
-.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-       border: none;
-       background: none;
-}
-.oo-ui-toolbar-shadow {
-       background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
-       bottom: -9px;
-       height: 9px;
-       opacity: 0.125;
-       -webkit-transition: opacity 500ms ease-in-out;
-          -moz-transition: opacity 500ms ease-in-out;
-           -ms-transition: opacity 500ms ease-in-out;
-            -o-transition: opacity 500ms ease-in-out;
-               transition: opacity 500ms ease-in-out;
-}
-.oo-ui-optionWidget {
-       position: relative;
-       display: block;
-       cursor: pointer;
-       padding: 0.25em 0.5em;
-       border: none;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-       cursor: default;
-}
-.oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: block;
-       white-space: nowrap;
-       text-overflow: ellipsis;
-       overflow: hidden;
-}
-.oo-ui-optionWidget-highlighted {
-       background-color: #e1f3ff;
-}
-.oo-ui-optionWidget .oo-ui-labelElement-label {
-       line-height: 1.5em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
-       background-color: #a7dcff;
-}
-.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
-       background-color: #a7dcff;
-}
-.oo-ui-optionWidget.oo-ui-widget-disabled {
-       color: #cccccc;
-}
-.oo-ui-decoratedOptionWidget {
-       padding: 0.5em 2em 0.5em 3em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       position: absolute;
-       background-repeat: no-repeat;
-       background-position: center center;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       top: 50%;
-       width: 2em;
-       height: 2em;
-       margin-top: -1em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
-       left: 0.5em;
-}
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
-       right: 0.5em;
-}
-.oo-ui-buttonSelectWidget {
-       display: inline-block;
-       white-space: nowrap;
-       border-radius: 0.3em;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       border-radius: 0;
-       margin-left: -1px;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
-       margin-left: 0;
-}
-.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
-}
-.oo-ui-radioSelectWidget {
-       padding: 0.75em 0 0.5em 0;
-}
-.oo-ui-buttonOptionWidget {
-       display: inline-block;
-       padding: 0;
-       background-color: transparent;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       position: relative;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       position: static;
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       height: 1.9em;
-}
-.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       height: 1.9em;
-       margin-top: 0;
-}
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget {
-       cursor: default;
-       padding: 0;
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
-.oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-highlighted {
-       background-color: transparent;
-}
-.oo-ui-radioOptionWidget > .oo-ui-labelElement-label {
-       padding: 0 0.5em;
-}
-.oo-ui-labelWidget {
-       display: inline-block;
-       padding: 0.5em 0;
-}
-.oo-ui-iconWidget {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-       line-height: 2.5em;
-       height: 1.9em;
-       width: 1.9em;
-       opacity: 0.8;
-}
-.oo-ui-iconWidget.oo-ui-widget-disabled {
-       opacity: 0.2;
-}
-.oo-ui-indicatorWidget {
-       display: inline-block;
-       vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
-       line-height: 2.5em;
-       height: 1.9em;
-       width: 1.9em;
-       opacity: 0.8;
-}
-.oo-ui-indicatorWidget.oo-ui-widget-disabled {
-       opacity: 0.2;
-}
-.oo-ui-buttonWidget {
-       display: inline-block;
-       vertical-align: middle;
-}
-.oo-ui-buttonGroupWidget {
-       display: inline-block;
-       white-space: nowrap;
-       border-radius: 0.3em;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       border-radius: 0;
-       margin-bottom: -1px;
-       margin-left: -1px;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
-       border-bottom-left-radius: 0.3em;
-       border-top-left-radius: 0.3em;
-       margin-left: 0;
-}
-.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
-       border-bottom-right-radius: 0.3em;
-       border-top-right-radius: 0.3em;
-}
-.oo-ui-toggleSwitchWidget {
-       position: relative;
-       display: inline-block;
-       vertical-align: middle;
-       overflow: hidden;
-       cursor: pointer;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-       -webkit-transform: translateZ(0px);
-          -moz-transform: translateZ(0px);
-           -ms-transform: translateZ(0px);
-            -o-transform: translateZ(0px);
-               transform: translateZ(0px);
-       height: 2em;
-       width: 4em;
-       border-radius: 1em;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
-       border: solid 1px #cccccc;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
-       background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:    -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:     -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:      -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
-       background-image:         linear-gradient(top, #dddddd 0%, #ffffff 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-       cursor: default;
-}
-.oo-ui-toggleSwitchWidget-grip {
-       position: absolute;
-       display: block;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-       position: absolute;
-       top: 0;
-       bottom: 0;
-       right: 0;
-       left: 0;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: none;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
-       opacity: 0.5;
-}
-.oo-ui-toggleSwitchWidget-grip {
-       top: 0.25em;
-       left: 0.25em;
-       width: 1.5em;
-       height: 1.5em;
-       margin-top: -1px;
-       border-radius: 1em;
-       box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
-       border: 1px #c9c9c9 solid;
-       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-          -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-           -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-            -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-               transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
-       border-color: #aaaaaa;
-}
-.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
-       border-radius: 1em;
-       box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       -webkit-transition: opacity 200ms ease-in-out;
-          -moz-transition: opacity 200ms ease-in-out;
-           -ms-transition: opacity 200ms ease-in-out;
-            -o-transition: opacity 200ms ease-in-out;
-               transition: opacity 200ms ease-in-out;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
-       background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:    -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:     -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:      -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-       background-image:         linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
-       opacity: 1;
-}
-.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-       left: 2.25em;
-       margin-left: -2px;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
-       display: block;
-       opacity: 0;
-}
-.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-       left: 0.25em;
-       margin-left: 0;
-}
-.oo-ui-progressBarWidget {
-       max-width: 50em;
-       border: solid 1px #a6cee1;
-       border-radius: 0.25em;
-       overflow: hidden;
-}
-.oo-ui-progressBarWidget-bar {
-       height: 1em;
-       border-right: solid 1px #a6cee1;
-       -webkit-transition: width 200ms, margin-left 200ms;
-          -moz-transition: width 200ms, margin-left 200ms;
-           -ms-transition: width 200ms, margin-left 200ms;
-            -o-transition: width 200ms, margin-left 200ms;
-               transition: width 200ms, margin-left 200ms;
-       background: #cde7f4;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
-       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
-}
-.oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
-       -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-          -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-               animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-       width: 40%;
-       margin-left: -10%;
-       border-left: solid 1px #a6cee1;
-}
-.oo-ui-progressBarWidget.oo-ui-widget-disabled {
-       opacity: 0.6;
-}
-.oo-ui-actionWidget.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-popupWidget {
-       position: absolute;
-       /* @noflip */
-       left: 0;
-}
-.oo-ui-popupWidget-popup {
-       position: relative;
-       overflow: hidden;
-       z-index: 1;
-}
-.oo-ui-popupWidget-anchor {
-       display: none;
-       z-index: 1;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
-       display: block;
-       position: absolute;
-       top: 0;
-       /* @noflip */
-       left: 0;
-       background-repeat: no-repeat;
-}
-.oo-ui-popupWidget-head {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-       float: right;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-       float: left;
-       cursor: default;
-}
-.oo-ui-popupWidget-body {
-       clear: both;
-       overflow: hidden;
-}
-.oo-ui-popupWidget-popup {
-       border: solid 1px #cccccc;
-       border-radius: 0.25em;
-       background-color: #ffffff;
-       box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
-       margin-top: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-       content: "";
-       position: absolute;
-       width: 0;
-       height: 0;
-       border-style: solid;
-       border-color: transparent;
-       border-top: 0;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
-       bottom: -8px;
-       left: -7px;
-       border-bottom-color: #aaaaaa;
-       border-width: 7px;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
-       bottom: -8px;
-       left: -6px;
-       border-bottom-color: #ffffff;
-       border-width: 6px;
-}
-.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-       -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-          -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-           -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-            -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-               transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-}
-.oo-ui-popupWidget-head {
-       height: 2.5em;
-}
-.oo-ui-popupWidget-head .oo-ui-buttonWidget {
-       margin: 0.25em;
-}
-.oo-ui-popupWidget-head .oo-ui-labelElement-label {
-       margin: 0.75em 1em;
-}
-.oo-ui-popupWidget-body-padded {
-       padding: 0 1em;
-}
-.oo-ui-popupButtonWidget {
-       position: relative;
-}
-.oo-ui-popupButtonWidget .oo-ui-popupWidget {
-       position: absolute;
-       cursor: auto;
-}
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
-       left: 1em;
-}
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
-       left: 1.25em;
-}
-.oo-ui-textInputWidget {
-       position: relative;
-       vertical-align: middle;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-       display: inline-block;
-       width: 100%;
-       resize: none;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-       position: absolute;
-       top: 0;
-       height: 100%;
-       background-repeat: no-repeat;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
-       left: 0;
-}
-.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-textInputWidget input,
-.oo-ui-textInputWidget textarea {
-       padding: 0.5em;
-       font-size: 1em;
-       font-family: sans-serif;
-       background-color: #ffffff;
-       color: black;
-       border: solid 1px #cccccc;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
-       border-radius: 0.25em;
-       -webkit-transition: border-color 200ms, box-shadow 200ms;
-          -moz-transition: border-color 200ms, box-shadow 200ms;
-           -ms-transition: border-color 200ms, box-shadow 200ms;
-            -o-transition: border-color 200ms, box-shadow 200ms;
-               transition: border-color 200ms, box-shadow 200ms;
-}
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-       padding-left: 2em;
-}
-.oo-ui-textInputWidget-icon {
-       width: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-       outline: none;
-       border-color: #a7dcff;
-       box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
-.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
-       color: #777777;
-}
-.oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
-       color: #cccccc;
-       text-shadow: 0 1px 1px #ffffff;
-       border-color: #dddddd;
-       background-color: #f3f3f3;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget .oo-ui-iconElement-icon,
-.oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
-       opacity: 0.8;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement input,
-.oo-ui-textInputWidget.oo-ui-iconElement textarea {
-       padding-left: 2em;
-}
-.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       width: 2em;
-       background-position: right center;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement input,
-.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-       padding-right: 1.5em;
-}
-.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       width: 1.5em;
-       background-position: left center;
-}
-.oo-ui-menuSelectWidget {
-       position: absolute;
-       background: #ffffff;
-       margin-top: -1px;
-       border: solid 1px #cccccc;
-       border-radius: 0 0 0.25em 0.25em;
-       box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
-}
-.oo-ui-menuSelectWidget input {
-       position: absolute;
-       width: 0;
-       height: 0;
-       overflow: hidden;
-       opacity: 0;
-}
-.oo-ui-menuOptionWidget {
-       position: relative;
-}
-.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
-       display: none;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
-       background-color: transparent;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-       display: block;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
-       background-color: transparent;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
-       background-color: #e1f3ff;
-}
-.oo-ui-menuSectionOptionWidget {
-       cursor: default;
-       padding: 0.33em 0.75em;
-       color: #888888;
-}
-.oo-ui-dropdownWidget {
-       position: relative;
-       display: inline-block;
-       margin: 0.25em 0;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-dropdownWidget-handle {
-       width: 100%;
-       display: inline-block;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
-}
-.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
-       z-index: 1;
-       width: 100%;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
-       cursor: default;
-}
-.oo-ui-dropdownWidget-handle {
-       height: 2.5em;
-       border: solid 1px rgba(0, 0, 0, 0.1);
-       border-radius: 0.25em;
-}
-.oo-ui-dropdownWidget-handle:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-       right: 0;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       left: 0.25em;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       line-height: 2.5em;
-       margin: 0 0.5em;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       top: 0;
-       width: 2.5em;
-       height: 2.5em;
-       opacity: 0.8;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
-       color: #cccccc;
-       text-shadow: 0 1px 1px #ffffff;
-       border-color: #dddddd;
-       background-color: #f3f3f3;
-}
-.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
-       opacity: 0.2;
-}
-.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       margin-left: 3em;
-}
-.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-       margin-right: 2em;
-}
-.oo-ui-outlineOptionWidget {
-       position: relative;
-       cursor: pointer;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-       font-size: 1.1em;
-       padding: 0.75em;
-}
-.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-       padding-right: 1.5em;
-}
-.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget-level-0 {
-       padding-left: 3.5em;
-}
-.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
-       left: 1em;
-}
-.oo-ui-outlineOptionWidget-level-1 {
-       padding-left: 5em;
-}
-.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
-       left: 2.5em;
-}
-.oo-ui-outlineOptionWidget-level-2 {
-       padding-left: 6.5em;
-}
-.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
-       left: 4em;
-}
-.oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
-       background-color: #a7dcff;
-       text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
-       font-weight: bold;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-placeholder {
-       font-style: italic;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-       opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-       color: #777777;
-}
-.oo-ui-outlineControlsWidget {
-       height: 3em;
-       background-color: #ffffff;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-       float: left;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-       float: left;
-       background-position: right center;
-       background-repeat: no-repeat;
-}
-.oo-ui-outlineControlsWidget-items {
-       float: left;
-}
-.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
-       float: left;
-}
-.oo-ui-outlineControlsWidget-movers {
-       float: right;
-}
-.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
-       float: right;
-}
-.oo-ui-outlineControlsWidget-items,
-.oo-ui-outlineControlsWidget-movers {
-       height: 2em;
-       margin: 0.5em 0.5em 0.5em 0;
-       padding: 0;
-}
-.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
-       width: 1.5em;
-       height: 2em;
-       margin: 0.5em 0 0.5em 0.5em;
-       opacity: 0.2;
-}
-.oo-ui-comboBoxWidget {
-       display: inline-block;
-       position: relative;
-       width: 100%;
-       max-width: 50em;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-       width: 100%;
-       z-index: 1;
-}
-.oo-ui-comboBoxWidget-handle {
-       border: solid 1px rgba(0, 0, 0, 0.1);
-       border-radius: 0.25em;
-}
-.oo-ui-comboBoxWidget-handle:hover {
-       border-color: rgba(0, 0, 0, 0.2);
-}
-.oo-ui-comboBoxWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
-.oo-ui-comboBoxWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-       cursor: default;
-       opacity: 0.2;
-}
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
-       margin-top: -3px;
-}
-.oo-ui-searchWidget-query {
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-       width: 100%;
-}
-.oo-ui-searchWidget-results {
-       position: absolute;
-       bottom: 0;
-       left: 0;
-       right: 0;
-       overflow-x: hidden;
-       overflow-y: auto;
-}
-.oo-ui-searchWidget-query {
-       height: 4em;
-       padding: 0 1em;
-       box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
-}
-.oo-ui-searchWidget-query .oo-ui-textInputWidget {
-       margin: 0.75em 0;
-}
-.oo-ui-searchWidget-results {
-       top: 4em;
-       padding: 1em;
-       line-height: 0;
-}
-.oo-ui-window {
-       line-height: 1em;
-}
-.oo-ui-window-frame {
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-window-frame > iframe {
-       width: 100%;
-       height: 100%;
-       margin: 0;
-       padding: 0;
-}
-.oo-ui-window-content:focus {
-       outline: none;
-}
-.oo-ui-window-head,
-.oo-ui-window-foot {
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-}
-.oo-ui-window-body {
-       margin: 0;
-       padding: 0;
-       background: none;
-}
-.oo-ui-window-overlay,
-.oo-ui-window-inner-overlay {
-       position: absolute;
-       top: 0;
-       /* @noflip */
-       left: 0;
-}
-.oo-ui-window,
-.oo-ui-window-isolated {
-       background-color: transparent;
-       background-image: none;
-       font-family: sans-serif;
-       font-size: 0.8em;
-}
-.oo-ui-dialog-content > .oo-ui-window-head,
-.oo-ui-dialog-content > .oo-ui-window-body,
-.oo-ui-dialog-content > .oo-ui-window-foot {
-       position: absolute;
-       left: 0;
-       right: 0;
-       overflow: hidden;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
-}
-.oo-ui-dialog-content > .oo-ui-window-head {
-       z-index: 1;
-       top: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-       z-index: 2;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-foot {
-       z-index: 1;
-       bottom: 0;
-}
-.oo-ui-dialog-content > .oo-ui-window-inner-overlay {
-       z-index: 3;
-}
-.oo-ui-dialog-content > .oo-ui-window-body {
-       box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
-}
-.oo-ui-messageDialog-actions-horizontal {
-       display: table;
-       table-layout: fixed;
-       width: 100%;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-       display: table-cell;
-       width: 1%;
-}
-.oo-ui-messageDialog-actions-vertical {
-       display: block;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-       display: block;
-       overflow: hidden;
-       text-overflow: ellipsis;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-       position: relative;
-       text-align: center;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
-       display: block;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
-       position: relative;
-       top: auto;
-       bottom: auto;
-       display: inline;
-       white-space: nowrap;
-}
-.oo-ui-messageDialog-content .oo-ui-window-body {
-       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-messageDialog-title,
-.oo-ui-messageDialog-message {
-       display: block;
-       text-align: center;
-       padding-top: 0.5em;
-}
-.oo-ui-messageDialog-title {
-       font-size: 1.5em;
-       line-height: 1em;
-       color: #000000;
-}
-.oo-ui-messageDialog-message {
-       font-size: 0.9em;
-       line-height: 1.25em;
-       color: #666666;
-}
-.oo-ui-messageDialog-message-verbose {
-       font-size: 1.1em;
-       line-height: 1.5em;
-       text-align: left;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
-       border-right: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
-       border-right-width: 0;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
-       border-bottom: solid 1px #e5e5e5;
-}
-.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
-       border-bottom-width: 0;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget {
-       height: 3.4em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       text-align: center;
-       line-height: 3.4em;
-       padding: 0 2em;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-       background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-       background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
-       background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active {
-       background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
-       font-weight: bold;
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-       background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-       background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-       background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-       background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog-location {
-       overflow: hidden;
-       text-overflow: ellipsis;
-       white-space: nowrap;
-}
-.oo-ui-processDialog-title {
-       display: inline;
-       padding: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
-       white-space: nowrap;
-}
-.oo-ui-processDialog-actions-safe,
-.oo-ui-processDialog-actions-primary {
-       position: absolute;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-processDialog-actions-safe {
-       left: 0;
-}
-.oo-ui-processDialog-actions-primary {
-       right: 0;
-}
-.oo-ui-processDialog-errors {
-       display: none;
-       position: absolute;
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
-       z-index: 2;
-       overflow-x: hidden;
-       overflow-y: auto;
-}
-.oo-ui-processDialog-content .oo-ui-window-head {
-       height: 3.4em;
-}
-.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-processDialog-content .oo-ui-window-body {
-       top: 3.4em;
-       box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
-}
-.oo-ui-processDialog-navigation {
-       position: relative;
-       height: 3.4em;
-       padding: 0 1em;
-}
-.oo-ui-processDialog-location {
-       padding: 0.75em 0;
-       height: 1.9em;
-       cursor: default;
-       text-align: center;
-}
-.oo-ui-processDialog-title {
-       font-weight: bold;
-       line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-       min-width: 1.9em;
-       min-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-       line-height: 1.9em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       margin-top: -0.125em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em 0 0.75em 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       padding: 0 1em;
-       vertical-align: middle;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
-       background-color: rgba(0, 0, 0, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
-       background-color: rgba(0, 0, 0, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       /* Adjust for border so text aligns with title */
-       margin: -1px;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
-       background-color: rgba(8, 126, 204, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active {
-       background-color: rgba(8, 126, 204, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
-       font-weight: bold;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-       background-color: rgba(118, 171, 54, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
-       background-color: rgba(118, 171, 54, 0.1);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-       background-color: rgba(212, 83, 83, 0.05);
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
-       background-color: rgba(212, 83, 83, 0.1);
-}
-.oo-ui-processDialog > .oo-ui-window-frame {
-       min-height: 5em;
-}
-.oo-ui-processDialog-errors {
-       background-color: rgba(255, 255, 255, 0.9);
-       padding: 3em 3em 1.5em 3em;
-       text-align: center;
-}
-.oo-ui-processDialog-errors .oo-ui-buttonWidget {
-       margin: 2em 1em 2em 1em;
-}
-.oo-ui-processDialog-errors-title {
-       font-size: 1.5em;
-       color: #000000;
-       margin-bottom: 2em;
-}
-.oo-ui-processDialog-error {
-       text-align: left;
-       margin: 1em;
-       padding: 1em;
-       border: solid 1px #ff9e9e;
-       background-color: #fff7f7;
-       border-radius: 0.25em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-       position: fixed;
-       width: 0;
-       height: 0;
-       overflow: hidden;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
-       width: auto;
-       height: auto;
-       top: 0;
-       right: 0;
-       bottom: 0;
-       left: 0;
-       padding: 1em;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-       position: absolute;
-       right: 0;
-       left: 0;
-       margin: auto;
-       overflow: hidden;
-       max-width: 100%;
-       max-height: 100%;
-       visibility: visible;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
-       width: 100%;
-       height: 100%;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-       visibility: hidden;
-}
-.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
-       width: 100%;
-       height: 100%;
-       top: 0;
-       bottom: 0;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog {
-       background-color: rgba(255, 255, 255, 0.5);
-       opacity: 0;
-       -webkit-transition: opacity 250ms ease-in-out;
-          -moz-transition: opacity 250ms ease-in-out;
-           -ms-transition: opacity 250ms ease-in-out;
-            -o-transition: opacity 250ms ease-in-out;
-               transition: opacity 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
-       top: 1em;
-       bottom: 1em;
-       background-color: #ffffff;
-       -webkit-transform: scale(0.5);
-          -moz-transform: scale(0.5);
-           -ms-transform: scale(0.5);
-            -o-transform: scale(0.5);
-               transform: scale(0.5);
-       -webkit-transition: all 250ms ease-in-out;
-          -moz-transition: all 250ms ease-in-out;
-           -ms-transition: all 250ms ease-in-out;
-            -o-transition: all 250ms ease-in-out;
-               transition: all 250ms ease-in-out;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
-       opacity: 1;
-}
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
-       -webkit-transform: scale(1);
-          -moz-transform: scale(1);
-           -ms-transform: scale(1);
-            -o-transform: scale(1);
-               transform: scale(1);
-}
-.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
-       border: solid 1px #cccccc;
-       border-radius: 0.5em;
-       box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-}
-
-.oo-ui-icon-add {
-       background-image: /* @embed */ url(themes/apex/images/icons/add.svg);
-}
-.oo-ui-icon-advanced {
-       background-image: /* @embed */ url(themes/apex/images/icons/advanced.svg);
-}
-.oo-ui-icon-alert {
-       background-image: /* @embed */ url(themes/apex/images/icons/alert.svg);
-}
-.oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/apex/images/icons/check.svg);
-}
-.oo-ui-icon-clear {
-       background-image: /* @embed */ url(themes/apex/images/icons/clear.svg);
-}
-.oo-ui-icon-close {
-       background-image: /* @embed */ url(themes/apex/images/icons/close.svg);
-}
-.oo-ui-icon-code {
-       background-image: /* @embed */ url(themes/apex/images/icons/code.svg);
-}
-.oo-ui-icon-collapse {
-       background-image: /* @embed */ url(themes/apex/images/icons/collapse.svg);
-}
-.oo-ui-icon-comment {
-       background-image: /* @embed */ url(themes/apex/images/icons/comment.svg);
-}
-.oo-ui-icon-expand {
-       background-image: /* @embed */ url(themes/apex/images/icons/expand.svg);
-}
-.oo-ui-icon-help {
-       background-image: /* @embed */ url(themes/apex/images/icons/help.svg);
-}
-.oo-ui-icon-info {
-       background-image: /* @embed */ url(themes/apex/images/icons/info.svg);
-}
-.oo-ui-icon-link {
-       background-image: /* @embed */ url(themes/apex/images/icons/link.svg);
-}
-.oo-ui-icon-menu {
-       background-image: /* @embed */ url(themes/apex/images/icons/menu.svg);
-}
-.oo-ui-icon-next {
-       background-image: /* @embed */ url(themes/apex/images/icons/move-ltr.svg);
-}
-.oo-ui-icon-picture {
-       background-image: /* @embed */ url(themes/apex/images/icons/picture.svg);
-}
-.oo-ui-icon-previous {
-       background-image: /* @embed */ url(themes/apex/images/icons/move-rtl.svg);
-}
-.oo-ui-icon-redo {
-       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-ltr.svg);
-}
-.oo-ui-icon-remove {
-       background-image: /* @embed */ url(themes/apex/images/icons/remove.svg);
-}
-.oo-ui-icon-search {
-       background-image: /* @embed */ url(themes/apex/images/icons/search.svg);
-}
-.oo-ui-icon-settings {
-       background-image: /* @embed */ url(themes/apex/images/icons/settings.svg);
-}
-.oo-ui-icon-tag {
-       background-image: /* @embed */ url(themes/apex/images/icons/tag.svg);
-}
-.oo-ui-icon-undo {
-       background-image: /* @embed */ url(themes/apex/images/icons/arched-arrow-rtl.svg);
-}
-.oo-ui-icon-window {
-       background-image: /* @embed */ url(themes/apex/images/icons/window.svg);
-}
-.oo-ui-indicator-alert {
-       background-image: /* @embed */ url(themes/apex/images/indicators/alert.svg);
-}
-.oo-ui-indicator-up {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-up.svg);
-}
-.oo-ui-indicator-down {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-down.svg);
-}
-.oo-ui-indicator-next {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-ltr.svg);
-}
-.oo-ui-indicator-previous {
-       background-image: /* @embed */ url(themes/apex/images/indicators/arrow-rtl.svg);
-}
-.oo-ui-indicator-required {
-       background-image: /* @embed */ url(themes/apex/images/indicators/required.svg);
-}
-.oo-ui-texture-pending {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-texture-transparency {
-       background-image: /* @embed */ url(themes/apex/images/textures/transparency.svg);
-}
index 2d1060c..24e0df6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.5.0
+ * OOjs UI v0.6.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-12-12T20:13:21Z
+ * Date: 2014-12-16T21:01:07Z
  */
 .oo-ui-progressBarWidget-slide-frames from {
        margin-left: -40%;
        display: block;
        background: rgba(0, 0, 0, 0.4);
 }
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
        overflow-y: hidden;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
        width: 100%;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
        overflow-y: auto;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
        padding: 2em;
 }
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
        position: absolute;
        top: 0;
        left: 0;
        bottom: 3em;
        overflow-y: auto;
 }
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
        padding: 1.5em;
 }
 .oo-ui-bookletLayout-outlinePanel {
        border-right: solid 1px #dddddd;
 }
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
        box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
 }
 .oo-ui-fieldLayout {
 .oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #000000;
 }
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-accel {
        color: #888888;
 }
 .oo-ui-barToolGroup > .oo-ui-iconElement-icon,
 .oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        display: block;
 }
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
        display: none;
 }
 .oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
        right: 0;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: inline-block;
+.oo-ui-popupToolGroup .oo-ui-tool-link {
+       display: table;
+       width: 100%;
        vertical-align: middle;
+       white-space: nowrap;
+       text-decoration: none;
 }
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon,
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: inline-table;
-       vertical-align: middle;
-       width: 100%;
-       margin-right: -2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
        display: table-cell;
+       vertical-align: middle;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text {
-       width: 100%;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
        text-align: right;
-       padding-right: 2.5em;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel:not(:empty) {
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel:not(:empty) {
        padding-left: 3em;
 }
 .oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        height: 2em;
        width: 2em;
-       margin-right: 0.25em;
+       min-width: 2em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       padding-left: 0.25em;
 }
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
        line-height: 2em;
        font-size: 0.8em;
 }
 .oo-ui-listToolGroup .oo-ui-tool {
-       display: inline-block;
-       width: 100%;
+       display: block;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
 .oo-ui-listToolGroup .oo-ui-tool-link {
-       display: block;
        cursor: pointer;
-       white-space: nowrap;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
        cursor: default;
 }
 .oo-ui-listToolGroup .oo-ui-tool {
-       padding: 0 0.25em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       padding-right: 0.5em;
+       padding: 0 0.5em 0 0.25em;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
        background-color: #eeeeee;
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-accel {
        color: #dddddd;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
        display: block;
 }
 .oo-ui-menuToolGroup .oo-ui-tool-link {
-       display: block;
        cursor: pointer;
-       white-space: nowrap;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
        cursor: default;
 .oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
        border-color: #aaaaaa;
 }
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       padding: 0 1em 0 0.25em;
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
+.oo-ui-menuToolGroup .oo-ui-tool {
+       padding: 0 0.75em 0 0.25em;
 }
 .oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        background-image: none;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
        border-radius: 0;
-       margin-bottom: -1px;
        margin-left: -1px;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
 .oo-ui-radioInputWidget {
        position: relative;
        line-height: 2em;
+       white-space: nowrap;
 }
 .oo-ui-radioInputWidget * {
        font: inherit;
        margin: 0 0.4em;
 }
 .oo-ui-radioInputWidget input[type="radio"] + span::before {
-               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
           -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
            -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
             -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
        content: "";
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
index b590c97..f39ec57 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.5.0
+ * OOjs UI v0.6.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-12-12T20:13:09Z
+ * Date: 2014-12-16T21:00:55Z
  */
 /**
  * @class
index 0713084..4409643 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.5.0
+ * OOjs UI v0.6.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-12-12T20:13:21Z
+ * Date: 2014-12-16T21:01:07Z
  */
 .oo-ui-progressBarWidget-slide-frames from {
        margin-left: -40%;
        display: block;
        background: rgba(0, 0, 0, 0.4);
 }
-.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
        overflow-y: hidden;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
        width: 100%;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
        overflow-y: auto;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
        padding: 2em;
 }
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
        position: absolute;
        top: 0;
        left: 0;
        bottom: 3em;
        overflow-y: auto;
 }
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
        position: absolute;
        bottom: 0;
        left: 0;
        right: 0;
 }
-.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
        padding: 1.5em;
 }
 .oo-ui-bookletLayout-outlinePanel {
        border-right: solid 1px #dddddd;
 }
-.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
        box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
 }
 .oo-ui-fieldLayout {
 .oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #000000;
 }
-.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-accel {
        color: #888888;
 }
 .oo-ui-barToolGroup > .oo-ui-iconElement-icon,
 .oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        display: block;
 }
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
        display: none;
 }
 .oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
        right: 0;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       display: inline-block;
+.oo-ui-popupToolGroup .oo-ui-tool-link {
+       display: table;
+       width: 100%;
        vertical-align: middle;
+       white-space: nowrap;
+       text-decoration: none;
 }
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon,
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
-       display: inline-table;
-       vertical-align: middle;
-       width: 100%;
-       margin-right: -2.5em;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
        display: table-cell;
+       vertical-align: middle;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-title-text {
-       width: 100%;
-}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
        text-align: right;
-       padding-right: 2.5em;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel:not(:empty) {
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel:not(:empty) {
        padding-left: 3em;
 }
 .oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        height: 2em;
        width: 2em;
-       margin-right: 0.25em;
+       min-width: 2em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       padding-left: 0.25em;
 }
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
        line-height: 2em;
        font-size: 0.8em;
 }
 .oo-ui-listToolGroup .oo-ui-tool {
-       display: inline-block;
-       width: 100%;
+       display: block;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
 .oo-ui-listToolGroup .oo-ui-tool-link {
-       display: block;
        cursor: pointer;
-       white-space: nowrap;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
        cursor: default;
 }
 .oo-ui-listToolGroup .oo-ui-tool {
-       padding: 0 0.25em;
-}
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       padding-right: 0.5em;
+       padding: 0 0.5em 0 0.25em;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
        background-color: #eeeeee;
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-accel {
        color: #dddddd;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
        display: block;
 }
 .oo-ui-menuToolGroup .oo-ui-tool-link {
-       display: block;
        cursor: pointer;
-       white-space: nowrap;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
        cursor: default;
 .oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
        border-color: #aaaaaa;
 }
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       padding: 0 1em 0 0.25em;
-       display: block;
-       cursor: pointer;
-       white-space: nowrap;
+.oo-ui-menuToolGroup .oo-ui-tool {
+       padding: 0 0.75em 0 0.25em;
 }
 .oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        background-image: none;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
        border-radius: 0;
-       margin-bottom: -1px;
        margin-left: -1px;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
 .oo-ui-radioInputWidget {
        position: relative;
        line-height: 2em;
+       white-space: nowrap;
 }
 .oo-ui-radioInputWidget * {
        font: inherit;
        margin: 0 0.4em;
 }
 .oo-ui-radioInputWidget input[type="radio"] + span::before {
-               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
           -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
            -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
             -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
        content: "";
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
index 7f519a6..5f75895 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.5.0
+ * OOjs UI v0.6.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-12-12T20:13:09Z
+ * Date: 2014-12-16T21:00:55Z
  */
 ( function ( OO ) {
 
@@ -2730,10 +2730,9 @@ OO.ui.WindowManager.prototype.afterWindowResize = function () {
  *
  * @param {jQuery.Event} e Mouse wheel event
  */
-OO.ui.WindowManager.prototype.onWindowMouseWheel = function ( e ) {
-       // Kill all events in the parent window if the child window is isolated,
-       // or if the event didn't come from the child window
-       return !( this.shouldIsolate() || !$.contains( this.getCurrentWindow().$frame[0], e.target ) );
+OO.ui.WindowManager.prototype.onWindowMouseWheel = function () {
+       // Kill all events in the parent window if the child window is isolated
+       return !this.shouldIsolate();
 };
 
 /**
@@ -2751,9 +2750,8 @@ OO.ui.WindowManager.prototype.onDocumentKeyDown = function ( e ) {
                case OO.ui.Keys.UP:
                case OO.ui.Keys.RIGHT:
                case OO.ui.Keys.DOWN:
-                       // Kill all events in the parent window if the child window is isolated,
-                       // or if the event didn't come from the child window
-                       return !( this.shouldIsolate() || !$.contains( this.getCurrentWindow().$frame[0], e.target ) );
+                       // Kill all events in the parent window if the child window is isolated
+                       return !this.shouldIsolate();
        }
 };
 
@@ -3183,6 +3181,10 @@ OO.ui.WindowManager.prototype.toggleGlobalEvents = function ( on ) {
                                // Start listening for top-level window dimension changes
                                'orientationchange resize': this.onWindowResizeHandler
                        } );
+                       // Disable window scrolling in isolated windows
+                       if ( !this.shouldIsolate() ) {
+                               $( this.getElementDocument().body ).css( 'overflow', 'hidden' );
+                       }
                        this.globalEvents = true;
                }
        } else if ( this.globalEvents ) {
@@ -3197,6 +3199,9 @@ OO.ui.WindowManager.prototype.toggleGlobalEvents = function ( on ) {
                        // Stop listening for top-level window dimension changes
                        'orientationchange resize': this.onWindowResizeHandler
                } );
+               if ( !this.shouldIsolate() ) {
+                       $( this.getElementDocument().body ).css( 'overflow', '' );
+               }
                this.globalEvents = false;
        }
 
@@ -5433,10 +5438,16 @@ OO.ui.ClippableElement.prototype.clip = function () {
                ccOffset = $container.offset() || { top: 0, left: 0 },
                ccHeight = $container.innerHeight() - buffer,
                ccWidth = $container.innerWidth() - buffer,
+               cHeight = this.$clippable.outerHeight() + buffer,
+               cWidth = this.$clippable.outerWidth() + buffer,
                scrollTop = this.$clippableScroller.scrollTop(),
                scrollLeft = this.$clippableScroller.scrollLeft(),
-               desiredWidth = ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
-               desiredHeight = ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
+               desiredWidth = cOffset.left < 0 ?
+                       cWidth + cOffset.left :
+                       ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
+               desiredHeight = cOffset.top < 0 ?
+                       cHeight + cOffset.top :
+                       ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
                naturalWidth = this.$clippable.prop( 'scrollWidth' ),
                naturalHeight = this.$clippable.prop( 'scrollHeight' ),
                clipWidth = desiredWidth < naturalWidth,
@@ -5493,7 +5504,6 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
        this.toolbar = this.toolGroup.getToolbar();
        this.active = false;
        this.$title = this.$( '<span>' );
-       this.$titleText = this.$( '<span>' );
        this.$accel = this.$( '<span>' );
        this.$link = this.$( '<a>' );
        this.title = null;
@@ -5502,7 +5512,7 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
        this.toolbar.connect( this, { updateState: 'onUpdateState' } );
 
        // Initialization
-       this.$titleText.addClass( 'oo-ui-tool-title-text' );
+       this.$title.addClass( 'oo-ui-tool-title' );
        this.$accel
                .addClass( 'oo-ui-tool-accel' )
                .prop( {
@@ -5511,12 +5521,9 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
                        dir: 'ltr',
                        lang: 'en'
                } );
-       this.$title
-               .addClass( 'oo-ui-tool-title' )
-               .append( this.$titleText, this.$accel );
        this.$link
                .addClass( 'oo-ui-tool-link' )
-               .append( this.$icon, this.$title )
+               .append( this.$icon, this.$title, this.$accel )
                .prop( 'tabIndex', 0 )
                .attr( 'role', 'button' );
        this.$element
@@ -5704,7 +5711,7 @@ OO.ui.Tool.prototype.updateTitle = function () {
                accel = this.toolbar.getToolAccelerator( this.constructor.static.name ),
                tooltipParts = [];
 
-       this.$titleText.text( this.title );
+       this.$title.text( this.title );
        this.$accel.text( accel );
 
        if ( titleTooltips && typeof this.title === 'string' && this.title.length ) {
@@ -8224,7 +8231,7 @@ OO.ui.ListToolGroup.prototype.populate = function () {
        // 'display' attribute and restores it, and the tool uses a <span> and can be hidden and re-shown.
        // Is this a jQuery bug? http://jsfiddle.net/gtj4hu3h/
        if ( this.getExpandCollapseTool().$element.css( 'display' ) === 'inline' ) {
-               this.getExpandCollapseTool().$element.css( 'display', 'inline-block' );
+               this.getExpandCollapseTool().$element.css( 'display', 'block' );
        }
 
        this.updateCollapsibleState();
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/add.png b/resources/lib/oojs-ui/themes/apex/images/icons/add.png
deleted file mode 100644 (file)
index 730d102..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/add.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/add.svg b/resources/lib/oojs-ui/themes/apex/images/icons/add.svg
deleted file mode 100644 (file)
index 29e5dba..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="add">
-        <path id="plus" d="M13 8h-2v3h-3v2h3v3h2v-3h3v-2h-3z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/advanced.png b/resources/lib/oojs-ui/themes/apex/images/icons/advanced.png
deleted file mode 100644 (file)
index 514ff1d..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/advanced.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/advanced.svg b/resources/lib/oojs-ui/themes/apex/images/icons/advanced.svg
deleted file mode 100644 (file)
index 201b4d7..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="settings">
-        <path id="gear" d="M20.869 13.476c.079-.482.131-.972.131-1.476s-.052-.994-.131-1.476l-2.463-.259c-.149-.556-.367-1.082-.648-1.57l1.558-1.924c-.576-.806-1.281-1.511-2.087-2.087l-1.924 1.558c-.488-.281-1.015-.499-1.57-.648l-.259-2.463c-.482-.079-.972-.131-1.476-.131s-.994.052-1.476.131l-.259 2.463c-.555.149-1.081.367-1.57.648l-1.924-1.557c-.805.576-1.51 1.281-2.086 2.086l1.558 1.924c-.281.488-.499 1.015-.648 1.57l-2.463.259c-.08.482-.132.972-.132 1.476s.052.994.131 1.476l2.463.259c.149.556.367 1.082.648 1.57l-1.558 1.924c.576.806 1.281 1.511 2.087 2.087l1.924-1.558c.488.281 1.015.499 1.57.648l.259 2.463c.482.079.972.131 1.476.131s.994-.052 1.476-.131l.259-2.463c.556-.149 1.082-.367 1.57-.648l1.924 1.558c.806-.576 1.511-1.281 2.087-2.087l-1.558-1.924c.281-.488.499-1.015.648-1.57l2.463-.259zm-8.869 2.522c-2.209 0-3.998-1.789-3.998-3.998s1.789-3.998 3.998-3.998 3.998 1.789 3.998 3.998-1.789 3.998-3.998 3.998z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/alert.png b/resources/lib/oojs-ui/themes/apex/images/icons/alert.png
deleted file mode 100644 (file)
index e98a14a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/alert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/alert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/alert.svg
deleted file mode 100644 (file)
index f0c6522..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="alert">
-        <path id="point" d="M11 16h2v2h-2z"/>
-        <path id="stroke" d="M13.516 10h-3l.484 5h2z"/>
-        <path id="triangle" d="M12.017 5.974l7.519 13.026h-15.04l7.521-13.026m0-2.474c-.544 0-1.088.357-1.5 1.071l-7.985 13.831c-.825 1.429-.15 2.598 1.5 2.598h15.968c1.65 0 2.325-1.169 1.5-2.599l-7.983-13.829c-.413-.715-.956-1.072-1.5-1.072z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.png
deleted file mode 100644 (file)
index 88db108..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.svg
deleted file mode 100644 (file)
index 8a670ef..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="arched-arrow-ltr">
-        <path id="arrow" d="M19.925 14.937l-2.391-6.901-1.48 2.329c-.964-.845-2.699-1.85-5.513-1.823-4.887.046-6.524 4.244-6.524 4.244s2.753-2.639 6.925-1.949c1.729.286 3.007 1.206 3.675 1.791l-1.474 2.319 6.782-.01z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.png
deleted file mode 100644 (file)
index 0afcbfa..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-rtl.svg
deleted file mode 100644 (file)
index 01fc216..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="arched-arrow-rtl">
-        <path id="arrow" d="M13.401 8.542c-2.814-.027-4.549.978-5.513 1.823l-1.48-2.329-2.391 6.901 6.782.009-1.474-2.319c.668-.584 1.945-1.504 3.675-1.791 4.172-.69 6.925 1.949 6.925 1.949s-1.637-4.197-6.524-4.243z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/check.png b/resources/lib/oojs-ui/themes/apex/images/icons/check.png
deleted file mode 100644 (file)
index 9a2c9db..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/check.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/check.svg b/resources/lib/oojs-ui/themes/apex/images/icons/check.svg
deleted file mode 100644 (file)
index 8d4a1f8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
-    <g id="check">
-        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear.png b/resources/lib/oojs-ui/themes/apex/images/icons/clear.png
deleted file mode 100644 (file)
index 51a33ff..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/clear.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clear.svg
deleted file mode 100644 (file)
index 0dcde9d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="clear">
-        <path id="circle-with-strike" d="M11.999 5.022c-3.853 0-6.977 3.124-6.977 6.978 0 3.853 3.124 6.978 6.977 6.978 3.854 0 6.979-3.125 6.979-6.978 0-3.854-3.125-6.978-6.979-6.978zm-5.113 6.978c0-1.092.572-3.25.93-2.929l7.113 7.113c.488.525-1.837.931-2.93.931-2.825-.001-5.113-2.291-5.113-5.115zm9.298 2.929l-7.114-7.113c-.445-.483 1.837-.931 2.929-.931 2.827 0 5.115 2.289 5.115 5.114 0 1.093-.364 3.543-.93 2.93z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/close.png b/resources/lib/oojs-ui/themes/apex/images/icons/close.png
deleted file mode 100644 (file)
index 4eedfbc..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/close.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/close.svg b/resources/lib/oojs-ui/themes/apex/images/icons/close.svg
deleted file mode 100644 (file)
index 1345e86..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="close">
-        <path id="x" d="M18.717 6.697l-1.414-1.414-5.303 5.303-5.303-5.303-1.414 1.414 5.303 5.303-5.303 5.303 1.414 1.414 5.303-5.303 5.303 5.303 1.414-1.414-5.303-5.303z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/code.png b/resources/lib/oojs-ui/themes/apex/images/icons/code.png
deleted file mode 100644 (file)
index ee58c9a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/code.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/code.svg b/resources/lib/oojs-ui/themes/apex/images/icons/code.svg
deleted file mode 100644 (file)
index 32f140d..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
-    <g id="code">
-        <path id="left-bracket" d="M4 12v-1h1c1 0 1 0 1-1v-2.386c0-.514.024-.896.073-1.142.054-.252.139-.463.257-.633.204-.279.473-.475.808-.584.335-.115.872-.255 1.835-.255h1.027v1h-.752c-.457 0-.77.191-.936.408-.167.215-.312.445-.312 1.068v1.857c0 .729-.041 1.18-.244 1.493-.2.307-.562.529-1.09.667.535.155.9.385 1.096.688.199.303.238.757.238 1.484v1.862c0 .619.145.848.312 1.062.166.22.479.407.936.407l.752.004v1h-1.027c-.963 0-1.5-.133-1.835-.248-.335-.109-.604-.307-.808-.591-.118-.165-.203-.374-.257-.625-.049-.253-.073-.636-.073-1.149v-2.387c0-1 0-1-1-1h-1z"/>
-        <use transform="matrix(-1 0 0 1 24 0)" id="right-bracket" width="24" height="24" xlink:href="#left-bracket"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/collapse.png b/resources/lib/oojs-ui/themes/apex/images/icons/collapse.png
deleted file mode 100644 (file)
index 353ac79..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/collapse.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/collapse.svg b/resources/lib/oojs-ui/themes/apex/images/icons/collapse.svg
deleted file mode 100644 (file)
index 55aa8f8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="collapse">
-        <path id="arrow" d="M6.697 15.714l5.303-5.302 5.303 5.302 1.414-1.414-6.717-6.717-6.717 6.717z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/comment.png b/resources/lib/oojs-ui/themes/apex/images/icons/comment.png
deleted file mode 100644 (file)
index 265a3e4..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/comment.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/comment.svg b/resources/lib/oojs-ui/themes/apex/images/icons/comment.svg
deleted file mode 100644 (file)
index 0ae7e63..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="comment">
-        <path id="speech-bubble" d="M15 6h-6c-1.657 0-3 1.344-3 3v4c0 1.656 1.343 3 3 3v3l3-3h3c1.657 0 3-1.344 3-3v-4c0-1.656-1.343-3-3-3z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/expand.png b/resources/lib/oojs-ui/themes/apex/images/icons/expand.png
deleted file mode 100644 (file)
index 9073d24..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/expand.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/expand.svg b/resources/lib/oojs-ui/themes/apex/images/icons/expand.svg
deleted file mode 100644 (file)
index 7666b41..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="expand">
-        <path id="arrow" d="M17.303 8.283l-5.303 5.303-5.303-5.303-1.414 1.414 6.717 6.717 6.717-6.717z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/help.png b/resources/lib/oojs-ui/themes/apex/images/icons/help.png
deleted file mode 100644 (file)
index b80df00..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/help.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/help.svg b/resources/lib/oojs-ui/themes/apex/images/icons/help.svg
deleted file mode 100644 (file)
index bb2545c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="help">
-        <path id="circle" d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/>
-        <g id="question-mark">
-            <path id="top" d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/>
-            <path id="bottom" d="M11 16h2v2h-2z"/>
-        </g>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/info.png b/resources/lib/oojs-ui/themes/apex/images/icons/info.png
deleted file mode 100644 (file)
index eb0fb46..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/info.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/info.svg b/resources/lib/oojs-ui/themes/apex/images/icons/info.svg
deleted file mode 100644 (file)
index 9c0d1cb..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
-    <g id="info">
-        <path id="circled-i" d="M11.499 17c-3.036 0-5.499-2.464-5.499-5.5 0-3.037 2.462-5.5 5.499-5.5 3.037 0 5.501 2.462 5.501 5.5 0 3.036-2.464 5.5-5.501 5.5zm.002-12c-3.591 0-6.501 2.91-6.501 6.5s2.91 6.5 6.501 6.5c3.588 0 6.499-2.911 6.499-6.5s-2.911-6.5-6.499-6.5zM12 10v4h1v1h-3v-1h1v-3h-1v-1zM11 8h1v1h-1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/link.png b/resources/lib/oojs-ui/themes/apex/images/icons/link.png
deleted file mode 100644 (file)
index 2a087a4..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/link.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/link.svg b/resources/lib/oojs-ui/themes/apex/images/icons/link.svg
deleted file mode 100644 (file)
index dbae341..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="link">
-        <path id="right" d="M19.188 12.001c0 1.1-.891 2.015-1.988 2.015l-4.195-.015c.538 1.088.963 1.999 1.997 1.999h3c1.656 0 2.998-2.343 2.998-4s-1.342-4-2.998-4h-3c-1.034 0-1.459.911-1.998 1.999l4.195-.015c1.098 0 1.989.917 1.989 2.017z"/>
-        <path id="center" d="M8 12c0 .535.42 1 .938 1h6.109c.518 0 .938-.465.938-1 0-.534-.42-1-.938-1h-6.109c-.518 0-.938.466-.938 1z"/>
-        <path id="left" d="M4.816 11.999c0-1.1.891-2.015 1.988-2.015l4.196.015c-.539-1.088-.964-1.999-1.998-1.999h-3c-1.656 0-2.998 2.343-2.998 4s1.342 4 2.998 4h3c1.034 0 1.459-.911 1.998-1.999l-4.195.015c-1.098 0-1.989-.917-1.989-2.017z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/menu.png b/resources/lib/oojs-ui/themes/apex/images/icons/menu.png
deleted file mode 100644 (file)
index 0a78119..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/menu.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/menu.svg b/resources/lib/oojs-ui/themes/apex/images/icons/menu.svg
deleted file mode 100644 (file)
index 50ac8a3..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="menu">
-        <path id="lines" d="M6 15h12c.553 0 1 .447 1 1v1c0 .553-.447 1-1 1h-12c-.553 0-1-.447-1-1v-1c0-.553.447-1 1-1zm-1-4v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1zm0-5v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1h-12c-.553 0-1 .447-1 1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.png
deleted file mode 100644 (file)
index fc4cd39..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/move-ltr.svg
deleted file mode 100644 (file)
index 51e6611..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="move-ltr">
-        <path id="arrow" d="M8.935 7.181l5.302 5.302-5.302 5.303 1.414 1.414 6.716-6.717-6.716-6.716z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.png
deleted file mode 100644 (file)
index dbce05e..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.svg
deleted file mode 100644 (file)
index bcee09d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="move-rtl">
-        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.414-6.716 6.716 6.716 6.717z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/picture.png b/resources/lib/oojs-ui/themes/apex/images/icons/picture.png
deleted file mode 100644 (file)
index 2043424..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/picture.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/picture.svg b/resources/lib/oojs-ui/themes/apex/images/icons/picture.svg
deleted file mode 100644 (file)
index 7400bca..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="picture">
-        <path id="frame" d="M18 4h-12c-2-.007-3 .993-3 2.993l.014 9.007c-.014 2 .986 2.988 2.986 3h12c2-.012 2.994-1 3-3.006v-9.001c-.006-2-1-3-3-2.993zm1 13h-14v-11h14v11z"/>
-        <path id="mountains" d="M6 13.5l3.5-3.5 2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12z"/>
-        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172 2.938-2.016 2.5 2v-4h-12z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/remove.png b/resources/lib/oojs-ui/themes/apex/images/icons/remove.png
deleted file mode 100644 (file)
index 9dc34b8..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/remove.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/remove.svg b/resources/lib/oojs-ui/themes/apex/images/icons/remove.svg
deleted file mode 100644 (file)
index 6ad7917..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="remove">
-        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0h-1v6h1v-6zm4 0h-1v6h1v-6zm0-4v-1h-5v1h-3v3h1v7.966l1 1.031v-.074.077h6.984l.016-.018v.015l1-1.031v-7.966h1v-3h-3zm1 11h-7v-8h7v8zm1-9h-9v-1h9v1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search.png b/resources/lib/oojs-ui/themes/apex/images/icons/search.png
deleted file mode 100644 (file)
index 39d3ab8..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/search.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search.svg b/resources/lib/oojs-ui/themes/apex/images/icons/search.svg
deleted file mode 100644 (file)
index e4db4f0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="search">
-        <path id="magnifying-glass" d="M16.021 15.96l-2.374-2.375-.169-.099c.403-.566.643-1.26.643-2.009-.001-1.92-1.558-3.477-3.477-3.477-1.921 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.749 0 1.442-.239 2.01-.643l.098.169 2.375 2.374c.19.189.543.143.79-.104s.293-.601.104-.791zm-5.377-2.27c-1.221 0-2.213-.991-2.213-2.213 0-1.221.992-2.213 2.213-2.213 1.222 0 2.213.992 2.213 2.213-.001 1.222-.992 2.213-2.213 2.213z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/settings.png b/resources/lib/oojs-ui/themes/apex/images/icons/settings.png
deleted file mode 100644 (file)
index dd2706b..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/settings.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/settings.svg b/resources/lib/oojs-ui/themes/apex/images/icons/settings.svg
deleted file mode 100644 (file)
index 9fa0a4b..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24">
-    <g id="settings">
-        <path id="gear" d="M3 4h3v2h-3zM12 4h9v2h-9zM8 3h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 11h9v2h-9zM18 11h3v2h-3zM14 10h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 18h6v2h-6zM15 18h6v2h-6zM11 17h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/tag.png b/resources/lib/oojs-ui/themes/apex/images/icons/tag.png
deleted file mode 100644 (file)
index 8e100fc..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/tag.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/tag.svg b/resources/lib/oojs-ui/themes/apex/images/icons/tag.svg
deleted file mode 100644 (file)
index 534824c..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="tag">
-        <path d="M18.748 11.717c.389.389.389 1.025 0 1.414l-4.949 4.95c-.389.389-1.025.389-1.414 0l-6.01-6.01c-.389-.389-.707-1.157-.707-1.707l-.001-4.364c0-.55.45-1 1-1h4.364c.55 0 1.318.318 1.707.707l6.01 6.01zm-10.644-4.261c-.579.576-.578 1.514-.001 2.093.578.577 1.516.577 2.095.001.576-.578.576-1.517 0-2.095-.581-.576-1.518-.577-2.094.001z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/window.png b/resources/lib/oojs-ui/themes/apex/images/icons/window.png
deleted file mode 100644 (file)
index db726a1..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/window.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/window.svg b/resources/lib/oojs-ui/themes/apex/images/icons/window.svg
deleted file mode 100644 (file)
index cd3b76c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="window">
-        <path id="title" d="M7 10h10v1h-10z"/>
-        <path id="frame" d="M16 19h-8c-2.206 0-4-1.794-4-4v-6c0-2.206 1.794-4 4-4h8c2.206 0 4 1.794 4 4v6c0 2.206-1.794 4-4 4zm-8-12c-1.103 0-2 .897-2 2v6c0 1.103.897 2 2 2h8c1.103 0 2-.897 2-2v-6c0-1.103-.897-2-2-2h-8z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/alert.png b/resources/lib/oojs-ui/themes/apex/images/indicators/alert.png
deleted file mode 100644 (file)
index 5bf0827..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/alert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/alert.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/alert.svg
deleted file mode 100644 (file)
index d9dc6a8..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="alert">
-        <path d="M6 12c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2v-5h-2zm0 3h2v-2h-2z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.png b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.png
deleted file mode 100644 (file)
index 6574725..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-down.svg
deleted file mode 100644 (file)
index bfa8ef0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="down">
-        <path id="arrow" d="M2 3l3.5 6 3.5-6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.png b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.png
deleted file mode 100644 (file)
index 7c84397..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.svg
deleted file mode 100644 (file)
index aeca27a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="ltr">
-        <path id="arrow" d="M3 9v-7l6 3.5z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.png b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.png
deleted file mode 100644 (file)
index 5bf9064..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.svg
deleted file mode 100644 (file)
index eba0099..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="rtl">
-        <path id="arrow" d="M3 5.5l6 3.5v-7z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.png b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.png
deleted file mode 100644 (file)
index 1a05ade..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/arrow-up.svg
deleted file mode 100644 (file)
index 4b01bb0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="up">
-        <path id="arrow" d="M5.5 2l-3.5 6h7z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/required.png b/resources/lib/oojs-ui/themes/apex/images/indicators/required.png
deleted file mode 100644 (file)
index 45eb03b..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/required.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/indicators/required.svg b/resources/lib/oojs-ui/themes/apex/images/indicators/required.svg
deleted file mode 100644 (file)
index 969fa2d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="required">
-        <path d="M5 1h2v10h-2zM9.83 2.634l1 1.732-8.66 5-1-1.732zM1.17 4.366l1-1.732 8.66 5-1 1.732z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/textures/pending.gif b/resources/lib/oojs-ui/themes/apex/images/textures/pending.gif
deleted file mode 100644 (file)
index 1194eed..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/textures/pending.gif and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/textures/transparency.png b/resources/lib/oojs-ui/themes/apex/images/textures/transparency.png
deleted file mode 100644 (file)
index 1843f27..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/textures/transparency.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/textures/transparency.svg b/resources/lib/oojs-ui/themes/apex/images/textures/transparency.svg
deleted file mode 100644 (file)
index 63a0b57..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="16" height="16" viewBox="0, 0, 16, 16">
-       <g id="transparency">
-               <path d="M0,0 L8,0 L8,8 L0,8 z" fill="#CCCCCC"/>
-               <path d="M8,8 L16,8 L16,16 L8,16 z" fill="#CCCCCC"/>
-               <path d="M8,0 L16,0 L16,8 L8,8 z" fill="#FFFFFF"/>
-               <path d="M0,8 L8,8 L8,16 L0,16 z" fill="#FFFFFF"/>
-       </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png b/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png
deleted file mode 100644 (file)
index 97e8d13..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/toolbar-shadow.png and /dev/null differ
index 58a99a5..2a37fa8 100644 (file)
@@ -6,7 +6,7 @@
 // * This installation of tipsy includes several local modifications to both Javascript and CSS.
 //   Please be careful when upgrading.
 
-(function($) {
+( function ( mw, $ ) {
 
     function maybeCall(thing, ctx) {
         return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
 
         if (!options.live) this.each(function() { get(this); });
 
-        if (options.trigger != 'manual') {
-            var binder   = options.live ? 'live' : 'bind',
-                eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',
+        if ( options.trigger != 'manual' ) {
+            var eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',
                 eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
-            this[binder](eventIn, enter)[binder](eventOut, leave);
+            if ( options.live ) {
+                mw.track( 'mw.deprecate', 'tipsy-live' );
+                mw.log.warn( 'Use of the "live" option of jquery.tipsy is deprecated.' );
+                // XXX: The official status of 'context' is deprecated, and the official status of
+                // 'selector' is removed, so this really needs to go.
+                $( this.context )
+                    .on( eventIn, this.selector, enter )
+                    .on( eventOut, this.selector, leave );
+            } else {
+                this
+                    .on( eventIn, enter )
+                    .on( eventOut, leave );
+            }
         }
 
         return this;
         }
     };
 
-})(jQuery);
+}( mediaWiki, jQuery ) );
index 6c7b4d4..f7c4217 100644 (file)
                                                                .prop( 'tabIndex', 0 );
                                                }
                                        } else {
-                                               // The toggle-link will be in one the the cells (td or th) of the first row
+                                               // The toggle-link will be in one of the cells (td or th) of the first row
                                                $firstItem = $collapsible.find( 'tr:first th, tr:first td' );
                                                $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
 
index 0d3341b..3918be7 100644 (file)
                                                buildCollationTable();
 
                                                // Legacy fix of .sortbottoms
-                                               // Wrap them inside inside a tfoot (because that's what they actually want to be) &
+                                               // Wrap them inside a tfoot (because that's what they actually want to be)
                                                // and put the <tfoot> at the end of the <table>
                                                var $tfoot,
                                                        $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
index f88b836..01a25f3 100644 (file)
@@ -1,27 +1,23 @@
 /*!
- * Scripts for action=edit
+ * Scripts for action=edit at domready
  */
-( function ( mw, $ ) {
+jQuery( function ( $ ) {
+       var editBox, scrollTop, $editForm;
 
-       $( function () {
-               var editBox, scrollTop, $editForm;
+       // Make sure edit summary does not exceed byte limit
+       $( '#wpSummary' ).byteLimit( 255 );
 
-               // Make sure edit summary does not exceed byte limit
-               $( '#wpSummary' ).byteLimit( 255 );
-
-               // Restore the edit box scroll state following a preview operation,
-               // and set up a form submission handler to remember this state.
-               editBox = document.getElementById( 'wpTextbox1' );
-               scrollTop = document.getElementById( 'wpScrolltop' );
-               $editForm = $( '#editform' );
-               if ( $editForm.length && editBox && scrollTop ) {
-                       if ( scrollTop.value ) {
-                               editBox.scrollTop = scrollTop.value;
-                       }
-                       $editForm.submit( function () {
-                               scrollTop.value = editBox.scrollTop;
-                       } );
+       // Restore the edit box scroll state following a preview operation,
+       // and set up a form submission handler to remember this state.
+       editBox = document.getElementById( 'wpTextbox1' );
+       scrollTop = document.getElementById( 'wpScrolltop' );
+       $editForm = $( '#editform' );
+       if ( $editForm.length && editBox && scrollTop ) {
+               if ( scrollTop.value ) {
+                       editBox.scrollTop = scrollTop.value;
                }
-       } );
-
-}( mediaWiki, jQuery ) );
+               $editForm.submit( function () {
+                       scrollTop.value = editBox.scrollTop;
+               } );
+       }
+} );
index 02bae5a..cf54cf9 100644 (file)
@@ -506,7 +506,7 @@ a.feedlink {
 table.wikitable {
        margin: 1em 0;
        background-color: #f9f9f9;
-       border: 1px #aaa solid;
+       border: 1px solid #aaa;
        border-collapse: collapse;
        color: black;
 }
@@ -515,7 +515,7 @@ table.wikitable > tr > th,
 table.wikitable > tr > td,
 table.wikitable > * > tr > th,
 table.wikitable > * > tr > td {
-       border: 1px #aaa solid;
+       border: 1px solid #aaa;
        padding: 0.2em;
 }
 
index f9944b4..70d54ce 100644 (file)
                // This causes further calls to addButton to go to insertion directly
                // instead of to the queue.
                // It is important that this is after the one and only loop through
-               // the the queue
+               // the queue
                isReady = true;
 
                // Apply to dynamically created textboxes as well as normal ones
index d93e291..4afccda 100644 (file)
        padding: 0.5em 1em;
 }
 
-.mw-json td {
-       background-color: #eee;
-       font-style: italic;
-}
-
 .mw-json .value {
        background-color: #dcfae3;
        font-family: monospace, monospace;
        white-space: pre-wrap;
 }
 
+.mw-json-empty {
+       background-color: #fff;
+       font-style: italic;
+}
+
 .mw-json tr {
        margin-bottom: 0.5em;
+       background-color: #eee;
 }
 
 .mw-json th {
index 9235d69..40f8ef9 100644 (file)
                                if ( 'documentMode' in document && document.documentMode <= 9 ) {
 
                                        $style = getMarker().prev();
-                                       // Verify that the the element before Marker actually is a
+                                       // Verify that the element before Marker actually is a
                                        // <style> tag and one that came from ResourceLoader
                                        // (not some other style tag or even a `<meta>` or `<script>`).
                                        if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
index 1968aa9..132c334 100644 (file)
@@ -12,7 +12,7 @@
        /**
         * A Notification object for 1 message.
         *
-        * The "_" in the name is to avoid a bug (http://github.com/senchalabs/jsduck/issues/304).
+        * The underscore in the name is to avoid a bug <https://github.com/senchalabs/jsduck/issues/304>.
         * It is not part of the actual class name.
         *
         * @class mw.Notification_
index c7fc380..f7dc0a9 100644 (file)
@@ -540,8 +540,6 @@ Italics and bold: 2-quote opening sequence: (2,2)
 
 !! test
 Italics and bold: 2-quote opening sequence: (2,3)
-!! options
-parsoid=wt2html
 !! wikitext
 ''foo'''
 !! html/*
@@ -549,16 +547,6 @@ parsoid=wt2html
 </p>
 !!end
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: 2-quote opening sequence: (2,3) w/ nowiki
-!! wikitext
-''foo'<nowiki/>''
-!! html
-<p><i>foo'</i>
-</p>
-!! end
-
 !! test
 Italics and bold: 2-quote opening sequence: (2,4)
 !! options
@@ -615,8 +603,6 @@ Italics and bold: 2-quote opening sequence: (2,5+3) w/ nowiki
 
 !! test
 Italics and bold: 3-quote opening sequence: (3,2)
-!! options
-parsoid=wt2html
 !! wikitext
 '''foo''
 !! html/*
@@ -624,16 +610,6 @@ parsoid=wt2html
 </p>
 !!end
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: 3-quote opening sequence: (3,2) w/ nowiki
-!! wikitext
-'<nowiki/>''foo''
-!! html
-<p>'<i>foo</i>
-</p>
-!!end
-
 !! test
 Italics and bold: 3-quote opening sequence: (3,3)
 !! wikitext
@@ -645,8 +621,6 @@ Italics and bold: 3-quote opening sequence: (3,3)
 
 !! test
 Italics and bold: 3-quote opening sequence: (3,4)
-!! options
-parsoid=wt2html
 !! wikitext
 '''foo''''
 !! html/*
@@ -654,16 +628,6 @@ parsoid=wt2html
 </p>
 !!end
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: 3-quote opening sequence: (3,4) w/ nowiki
-!! wikitext
-'''foo'<nowiki/>'''
-!! html
-<p><b>foo'</b>
-</p>
-!! end
-
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
 Italics and bold: 3-quote opening sequence: (3,5)
@@ -720,8 +684,6 @@ Italics and bold: 4-quote opening sequence: (4,2) w/ nowiki
 
 !! test
 Italics and bold: 4-quote opening sequence: (4,3)
-!! options
-parsoid=wt2html
 !! wikitext
 ''''foo'''
 !! html/*
@@ -729,16 +691,6 @@ parsoid=wt2html
 </p>
 !!end
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: 4-quote opening sequence: (4,3) w/ nowiki
-!! wikitext
-'<nowiki/>'''foo'''
-!! html
-<p>'<b>foo</b>
-</p>
-!!end
-
 !! test
 Italics and bold: 4-quote opening sequence: (4,4)
 !! options
@@ -849,16 +801,6 @@ parsoid=wt2html
 </p>
 !!end
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: 5-quote opening sequence: (5,4+2) w/ nowiki
-!! wikitext
-'''''foo'<nowiki/>'''''
-!! html
-<p><i><b>foo'</b></i>
-</p>
-!! end
-
 !! test
 Italics and bold: 5-quote opening sequence: (5,5)
 !! wikitext
@@ -868,6 +810,15 @@ Italics and bold: 5-quote opening sequence: (5,5)
 </p>
 !!end
 
+!! test
+Italics and bold: 5-quote opening sequence: (5,6)
+!! wikitext
+'''''foo''''''
+!! html/*
+<p><i><b>foo'</b></i>
+</p>
+!! end
+
 ###
 ### multiple quote sequences in a line
 ###
@@ -1047,8 +998,6 @@ Italics and bold: other quote tests: (3,2,3+2+2,2)
 
 !! test
 Italics and bold: other quote tests: (3,2,3,3)
-!! options
-parsoid=wt2html
 !! wikitext
 '''this is about ''foo'''s family'''
 !! html/*
@@ -1057,17 +1006,6 @@ parsoid=wt2html
 !!end
 
 
-# same html as previous, but wikitext adjusted to match parsoid html2wt
-!! test
-Italics and bold: other quote tests: (3,2,3,3) w/ nowiki
-!! wikitext
-'<nowiki/>''this is about ''foo'''s family'''
-!! html
-<p>'<i>this is about </i>foo<b>s family</b>
-</p>
-!!end
-
-
 !! test
 Italics and bold: other quote tests: (3,(2,2),3)
 !! wikitext
@@ -1082,9 +1020,11 @@ Italics and bold: other quote tests: (3,(2,2),3)
 Italicized possessive
 !! wikitext
 The ''[[Main Page]]'''s talk page.
-!! html
+!! html/php
 <p>The <i><a href="/wiki/Main_Page" title="Main Page">Main Page</a>'</i>s talk page.
 </p>
+!! html/parsoid
+<p>The <i><a rel="mw:WikiLink"  href="Main_Page" title="Main Page">Main Page</a>'</i>s talk page.</p>
 !! end
 
 !! test
@@ -3966,6 +3906,76 @@ Definition Lists: Weird Ones: Test 1
 </ul>
 !! end
 
+!! test
+Definition Lists: colons occurring in tags
+!! wikitext
+;a:b
+;'''a:b'''
+;<i>a:b</i>
+;<span>a:b</span>
+;<div>a:b</div>
+;{{echo|a:b}}
+;{{echo|''a:b''}}
+!! html
+<dl><dt>a</dt>
+<dd>b</dd>
+<dt><b>a:b</b></dt>
+<dt><i>a:b</i></dt>
+<dt><span>a:b</span></dt>
+<dt><div>a:b</div></dt>
+<dt>a</dt>
+<dd>b</dd>
+<dt><i>a:b</i></dt></dl>
+
+!! end
+
+!! test
+Definition Lists: colons and tables 1
+!! wikitext
+:{|
+| x
+|}
+:{|
+| y
+|}
+!! html
+<dl><dd><table>
+<tr>
+<td> x
+</td></tr></table></dd></dl>
+<dl><dd><table>
+<tr>
+<td> y
+</td></tr></table></dd></dl>
+
+!! end
+
+# Parsoid's output (as documented below) differs from php's in this case.
+# This is probably a bug. If we fixup parsoid to match php's output, the
+# above test should pass and the below test case can be removed. It is
+# unclear which output is more desirable.
+
+!! test
+Definition Lists: colons and tables 2
+!! wikitext
+:{|
+| x
+|}
+:{|
+| y
+|}
+!! html/parsoid
+<dl><dd><table>
+<tr>
+<td> x
+</td></tr></table></dd>
+<dd><table>
+<tr>
+<td> y
+</td></tr></table></dd></dl>
+!! end
+
+
 ###
 ### External links
 ###
@@ -4171,6 +4181,13 @@ http://example.com!
 http://example.com?
 http://example.com)
 http://example.com/url_with_(brackets)
+(http://example.com/url_without_brackets)
+http://example.com/url_with_entity&nbsp;
+http://example.com/url_with_entity&#xA0;
+http://example.com/url_with_entity&#160;
+http://example.com/url_with_entity&lt;
+http://example.com/url_with_entity&#x3C;
+http://example.com/url_with_entity&#60;
 !! html
 <p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>,
 <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>;
@@ -4181,6 +4198,13 @@ http://example.com/url_with_(brackets)
 <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>?
 <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
 <a rel="nofollow" class="external free" href="http://example.com/url_with_(brackets)">http://example.com/url_with_(brackets)</a>
+(<a rel="nofollow" class="external free" href="http://example.com/url_without_brackets">http://example.com/url_without_brackets</a>)
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&lt;
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity%3C">http://example.com/url_with_entity%3C</a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity%3C">http://example.com/url_with_entity%3C</a>
 </p>
 !! end
 
@@ -19990,17 +20014,15 @@ parsoid=html2wt
 !! test
 Headings: 3. Nested inside html with wikitext split by html tags
 !! options
-parsoid=html2wt
+parsoid=html2wt,wt2wt
 !! wikitext
 = ='''bold'''<nowiki>foo=</nowiki> =
-!! html
-<h1>=<b>bold</b><span typeof="mw:Nowiki">foo=</span></h1>
+!! html/parsoid
+<h1>=<b>bold</b>foo=</h1>
 !!end
 
 !! test
 Headings: 4a. No escaping needed (testing just h1 and h2)
-!! options
-parsoid=html2wt
 !! wikitext
 = =foo =
 
@@ -20014,20 +20036,28 @@ parsoid=html2wt
 
 == foo= ==
 
-= ''=''foo= =
-
-= <nowiki>=</nowiki> =
-!! html
+= = =
+!! html/parsoid
 <h1>=foo</h1>
 <h1>foo=</h1>
 <h1> =foo= </h1>
 <h1>=foo= bar</h1>
 <h2>=foo</h2>
 <h2>foo=</h2>
-<h1><i>=</i>foo=</h1>
-<h1><span typeof="mw:Nowiki">=</span></h1>
+<h1>=</h1>
 !!end
 
+!! test
+Headings: 4a'. No escaping needed (Parsoid bug T84903)
+!! wikitext
+= ''=''foo= =
+!! html/php
+<h1><span class="mw-headline" id=".3Dfoo.3D"><i>=</i>foo=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =foo=">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+
+!! html/parsoid
+<h1><i>=</i>foo=</h1>
+!! end
+
 !! test
 Headings: 4b. No escaping needed (inside p-tags)
 !! options
@@ -20274,33 +20304,36 @@ Lists: 5. No unnecessary escapes
 !! wikitext
 * bar <span><nowiki>[[foo]]</nowiki></span>
 
-*=bar <span><nowiki>[[foo]]</nowiki></span>
+* =bar <span><nowiki>[[foo]]</nowiki></span>
 
-*[[bar <span><nowiki>[[foo]]</nowiki></span>
+* [[bar <span><nowiki>[[foo]]</nowiki></span>
 
-*]]bar <span><nowiki>[[foo]]</nowiki></span>
+* ]]bar <span><nowiki>[[foo]]</nowiki></span>
 
-*=bar <span>foo]]</span>=
+* =bar <span>foo]]</span>=
 
 * <s></s>: a
+
+* ''* foo''
 !! html
 <ul><li> bar <span>[[foo]]</span></li></ul>
-<ul><li>=bar <span>[[foo]]</span></li></ul>
-<ul><li>[[bar <span>[[foo]]</span></li></ul>
-<ul><li>]]bar <span>[[foo]]</span></li></ul>
-<ul><li>=bar <span>foo]]</span>=</li></ul>
+<ul><li> =bar <span>[[foo]]</span></li></ul>
+<ul><li> [[bar <span>[[foo]]</span></li></ul>
+<ul><li> ]]bar <span>[[foo]]</span></li></ul>
+<ul><li> =bar <span>foo]]</span>=</li></ul>
 <ul><li> <s></s>: a</li></ul>
+<ul><li> <i>* foo</i></li></ul>
 
 !!end
 
 !! test
 Lists: 6. Escape bullets in SOL position
 !! options
-parsoid
+parsoid=html2wt
 !! wikitext
-<!--cmt--><nowiki>*foo</nowiki>
+<!--cmt--><nowiki>*</nowiki>foo
 !! html
-<p><!--cmt--><span typeof="mw:Nowiki">*foo</span></p>
+<p><!--cmt-->*foo</p>
 !!end
 
 !! test
 </p>
 !!end
 
+!! test
+Lists: 8. Escape colons only if not present in tags
+!! options
+parsoid=html2wt
+!! wikitext
+; <nowiki>a:b</nowiki>''c:d''
+!! html
+<dl><dt>a:b<i>c:d</i></dt></dl>
+!! end
+
 #### --------------- HRs ---------------
 #### 1. Single line
 #### -----------------------------------
 
 !! test
 HRs: 1. Single line
-!! options
-parsoid
 !! wikitext
 ----<nowiki>----</nowiki>
 ----=foo=
 ----*foo
-!! html
-<hr><p><span typeof="mw:Nowiki">----</span></p>
-<hr><p>=foo=</p>
-<hr><p>*foo</p>
+!! html+tidy
+<hr />
+<p>----</p>
+<hr />
+<p>=foo=</p>
+<hr />
+<p>*foo</p>
 !! end
 
 #### --------------- Tables ---------------
@@ -20393,127 +20437,196 @@ Tables: 1d. No escaping needed
 Tables: 2a. Nested in td
 !! options
 parsoid=html2wt
+!! html/parsoid
+<table><tbody><tr>
+<td>foo|bar</td></tr>
+<tr><td>x<div>a|b</div></td>
+</tbody></table>
 !! wikitext
 {|
 |<nowiki>foo|bar</nowiki>
 |-
 |x<div><nowiki>a|b</nowiki></div>
 |}
-!! html
-<table><tbody><tr>
-<td>foo|bar</td></tr>
-<tr><td>x<div>a|b</div></td>
-</tbody></table>
+!! html/php+tidy
+<table>
+<tr>
+<td>foo|bar</td>
+</tr>
+<tr>
+<td>x
+<div>a|b</div>
+</td>
+</tr>
+</table>
 !! end
 
 !! test
 Tables: 2b. Nested in td
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+<table><tbody><tr>
+<td>foo||bar</td>
+<td>a<i>b||c</i></td>
+<td>a<i><div>b||c</div></i></td>
+</tr></tbody></table>
 !! wikitext
 {|
 |<nowiki>foo||bar</nowiki>
-|''it''<nowiki>foo||bar</nowiki>
+|a''<nowiki>b||c</nowiki>''
+|a''<div><nowiki>b||c</nowiki></div>''
 |}
-!! html
-<table><tbody><tr>
-<td><span typeof="mw:Nowiki">foo||bar</span></td>
-<td><i>it</i><span typeof="mw:Nowiki">foo||bar</span></td></tr></tbody></table>
+!! html/php
+<table>
+<tr>
+<td>foo||bar
+</td>
+<td>a<i>b||c</i>
+</td>
+<td>a<i><div>b||c</div></i>
+</td></tr></table>
+
 !! end
 
 !! test
 Tables: 2c. Nested in td -- no escaping needed
-!! options
-parsoid
 !! wikitext
 {|
+
 |foo!!bar
 |}
-!! html
-<table><tbody><tr><td>foo!!bar
-</td></tr></tbody></table>
+!! html/*
+<table>
+
+<tr>
+<td>foo!!bar
+</td></tr></table>
 
 !! end
 
 !! test
 Tables: 3a. Nested in th
-!! options
-parsoid
 !! wikitext
 {|
+
 !foo!bar
 |}
-!! html
-<table><tbody><tr><th>foo!bar
-</th></tr></tbody></table>
+!! html/*
+<table>
+
+<tr>
+<th>foo!bar
+</th></tr></table>
 
 !! end
 
 !! test
 Tables: 3b. Nested in th
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+<table><tbody>
+<tr><th>foo!!bar</th>
+<th><i>foo|bar</i></th>
+<th><i>foo!!bar</i></th>
+<th><i><span>foo!!bar</span></i></th>
+</tr></tbody></table>
 !! wikitext
 {|
 !<nowiki>foo!!bar</nowiki>
+!''<nowiki>foo|bar</nowiki>''
+!''<nowiki>foo!!bar</nowiki>''
+!''<span><nowiki>foo!!bar</nowiki></span>''
 |}
-!! html
+!! html/php
 <table>
-<tbody><tr><th><span typeof="mw:Nowiki">foo!!bar</span></th></tr>
-</tbody></table>
+<tr>
+<th>foo!!bar
+</th>
+<th><i>foo|bar</i>
+</th>
+<th><i>foo!!bar</i>
+</th>
+<th><i><span>foo!!bar</span></i>
+</th></tr></table>
+
 !! end
 
 !! test
-Tables: 3c. Nested in th -- no escaping needed
+Tables: 3c. Nested in th
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+<table><tbody>
+<tr><th>foo||bar</th>
+<th><span typeof="mw:Nowiki">foo||bar</span></th>
+</tr></tbody></table>
 !! wikitext
 {|
 !<nowiki>foo||bar</nowiki>
+!<nowiki>foo||bar</nowiki>
 |}
-!! html
-<table><tbody><tr>
-<th><span typeof="mw:Nowiki">foo||bar</span></th></tr></tbody></table>
+!! html/php
+<table>
+<tr>
+<th>foo||bar
+</th>
+<th>foo||bar
+</th></tr></table>
+
 !! end
 
 !! test
 Tables: 4a. Escape -
 !! options
-parsoid
+parsoid=html2wt
 !! wikitext
 {|
+
 !-bar
+
 |-
 |<nowiki>-bar</nowiki>
 |}
-!! html
-<table><tbody>
-<tr><th>-bar</th></tr>
+!! html/*
+<table>
+
+<tr>
+<th>-bar
+</th></tr>
 <tr>
-<td><span typeof="mw:Nowiki">-bar</span></td></tr></tbody></table>
+<td>-bar
+</td></tr></table>
+
 !! end
 
 !! test
 Tables: 4b. Escape +
 !! options
-parsoid
+parsoid=html2wt
 !! wikitext
 {|
+
 !+bar
+
 |-
 |<nowiki>+bar</nowiki>
 |}
-!! html
-<table><tbody>
-<tr><th>+bar</th></tr>
+!! html/*
+<table>
+
 <tr>
-<td><span typeof="mw:Nowiki">+bar</span></td></tr></tbody></table>
+<th>+bar
+</th></tr>
+<tr>
+<td>+bar
+</td></tr></table>
+
 !! end
 
 !! test
 Tables: 4c. No escaping needed
-!! options
-parsoid
 !! wikitext
 {|
 |foo-bar
@@ -20530,7 +20643,31 @@ bar|baz
 |x
 <div>a|b</div>
 |}
-!! html
+!! html/php
+<table>
+<tr>
+<td>foo-bar
+</td>
+<td>foo+bar
+</td></tr>
+<tr>
+<td><i>foo</i>-bar
+</td>
+<td><i>foo</i>+bar
+</td></tr>
+<tr>
+<td>foo
+<p>bar|baz
++bar
+-bar
+</p>
+</td></tr>
+<tr>
+<td>x
+<div>a|b</div>
+</td></tr></table>
+
+!! html/parsoid
 <table><tbody>
 <tr><td>foo-bar</td><td>foo+bar</td></tr>
 <tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
@@ -20545,15 +20682,23 @@ bar|baz
 
 !! test
 Tables: 4d. No escaping needed
-!! options
-parsoid
 !! wikitext
 {|
 |[[Foo]]-bar
 ||+1
 ||-2
 |}
-!! html
+!! html/php
+<table>
+<tr>
+<td><a href="/wiki/Foo" title="Foo">Foo</a>-bar
+</td>
+<td>+1
+</td>
+<td>-2
+</td></tr></table>
+
+!! html/parsoid
 <table>
 <tbody><tr><td><a rel="mw:WikiLink" href="./Foo" title="Foo">Foo</a>-bar</td>
 <td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>+1</td>
@@ -20800,6 +20945,18 @@ Links 12. Don't add spurious <nowiki/>s between text-nodes and ISBN-links (bug 6
 ISBN 1234567890's
 !! end
 
+!! test
+Links 13: Protect link-like plain text. (Parsoid bug T78425)
+!! options
+parsoid=html2wt
+!! html/*
+<p>this is not a link: http://example.com
+</p>
+!! wikitext
+this is not a link: <nowiki>http://example.com</nowiki>
+!! end
+
+
 #### --------------- Quotes ---------------
 #### 1. Quotes inside <b> and <i>
 #### 2. Link fragments separated by <i> and <b> tags
@@ -20807,7 +20964,7 @@ ISBN 1234567890's
 #### 4. No escaping needed
 #### --------------------------------------
 !! test
-1. Quotes inside <b> and <i>
+1a. Quotes inside <b> and <i>
 !! options
 parsoid=html2wt,wt2wt
 !! wikitext
@@ -20820,14 +20977,16 @@ parsoid=html2wt,wt2wt
 '''<nowiki>'''foo'''</nowiki>'''
 '''foo'<nowiki/>''bar'<nowiki/>''baz'''
 '''foo'''<nowiki/>'s
-'<nowiki/>''foo''
+'''foo''
 ''foo''<nowiki/>'
+''foo'<nowiki/>''<nowiki/>'
 '<nowiki/>''foo''<nowiki/>'
-'<nowiki/>'''foo'''
+''''foo'''
 '''foo'''<nowiki/>'
 '<nowiki/>'''foo'''<nowiki/>'
 ''fools'<span> errand</span>''
 ''<span>fool</span>'s errand''
+a|!*#-:;+-~[]{}b'''x''
 !! html/*
 <p><i>'foo'</i>
 <i>''foo''</i>
@@ -20840,15 +20999,33 @@ parsoid=html2wt,wt2wt
 <b>foo</b>'s
 '<i>foo</i>
 <i>foo</i>'
+<i>foo'</i>'
 '<i>foo</i>'
 '<b>foo</b>
 <b>foo</b>'
 '<b>foo</b>'
 <i>fools'<span> errand</span></i>
 <i><span>fool</span>'s errand</i>
+a|!*#-:;+-~[]{}b'<i>x</i>
 </p>
 !! end
 
+!! test
+1b. Quotes inside <b> and <i> with other chars
+!! options
+parsoid=html2wt,wt2wt
+!! wikitext
+'''a'' foo ''[[bar]]''
+''a''' foo ''[[bar]]''
+''a''' foo '''{{echo|[[bar]]}}'''
+[[foo]] x'''[[bar]]''
+!! html
+'<i>a</i> foo <i><a rel="mw:WikiLink" href="Bar" title="Bar">bar</a></i>
+<i>a'</i> foo <i><a rel="mw:WikiLink" href="Bar" title="Bar">bar</a></i>
+<i>a'</i> foo <b><a rel="mw:WikiLink" href="Bar" title="Bar" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[bar]]"}},"i":0}}]}'>bar</a></b>
+<a rel="mw:WikiLink" href="Foo" title="Foo">foo</a> x'<i><a href="Bar" rel="mw:WikiLink" title="Bar">bar</a></i>
+!! end
+
 !! test
 2. Link fragments separated by <i> and <b> tags
 !! wikitext
@@ -20880,9 +21057,11 @@ parsoid=html2wt,wt2wt
 !! wikitext
 '<span>''bar''</span>'
 '<span>'''bar'''</span>'
+'a:b'foo
 !! html
 <p>'<span><i>bar</i></span>'
 '<span><b>bar</b></span>'
+'a:b'foo
 </p>
 !! end
 
@@ -22386,6 +22565,36 @@ parsoid=html2wt
 <p><i>A</i><b><i>B</i></b></p>
 !! end
 
+!! test
+5a. Merge adjacent quote nodes if they've been edited
+!! options
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["p", "contents", "remove", ":contains('b')"]
+  ]
+}
+!! wikitext
+''a''b''c''
+!! wikitext/edited
+''ac''
+!! end
+
+!! test
+5b. Merge adjacent quote nodes if they've been edited
+!! options
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["#x", "remove"]
+  ]
+}
+!! wikitext
+''a''<span id="x">b</span>''c''
+!! wikitext/edited
+''ac''
+!! end
+
 #------------------------------------
 # End of I/B quote minimization tests
 #------------------------------------
index 71e0f4b..df4690a 100644 (file)
@@ -38,7 +38,7 @@ class LessFileCompilationTest extends ResourceLoaderTestCase {
                        "$thisString must refer to a readable file"
                );
 
-               $rlContext = static::getResourceLoaderContext();
+               $rlContext = $this->getResourceLoaderContext();
 
                // Bleh
                $method = new ReflectionMethod( $this->module, 'getLessCompiler' );
index f5f302e..055beb0 100644 (file)
@@ -1,7 +1,12 @@
 <?php
 
 abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
-       protected static function getResourceLoaderContext( $lang = 'en' ) {
+       /**
+        * @param string $lang
+        * @param string $dir
+        * @return ResourceLoaderContext
+        */
+       protected function getResourceLoaderContext( $lang = 'en', $dir = 'ltr' ) {
                $resourceLoader = new ResourceLoader();
                $request = new FauxRequest( array(
                                'lang' => $lang,
@@ -10,7 +15,14 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                                'skin' => 'vector',
                                'target' => 'test',
                ) );
-               return new ResourceLoaderContext( $resourceLoader, $request );
+               $ctx = $this->getMockBuilder( 'ResourceLoaderContext' )
+                       ->setConstructorArgs( array( $resourceLoader, $request ) )
+                       ->setMethods( array( 'getDirection' ) )
+                       ->getMock();
+               $ctx->expects( $this->any() )->method( 'getDirection' )->will(
+                       $this->returnValue( $dir )
+               );
+               return $ctx;
        }
 
        protected function setUp() {
diff --git a/tests/phpunit/includes/ArrayUtilsTest.php b/tests/phpunit/includes/ArrayUtilsTest.php
deleted file mode 100644 (file)
index 7bdb1ca..0000000
+++ /dev/null
@@ -1,311 +0,0 @@
-<?php
-/**
- * Test class for ArrayUtils class
- *
- * @group Database
- */
-
-class ArrayUtilsTest extends MediaWikiTestCase {
-       private $search;
-
-       /**
-        * @covers ArrayUtils::findLowerBound
-        * @dataProvider provideFindLowerBound
-        */
-       function testFindLowerBound(
-               $valueCallback, $valueCount, $comparisonCallback, $target, $expected
-       ) {
-               $this->assertSame(
-                       ArrayUtils::findLowerBound(
-                               $valueCallback, $valueCount, $comparisonCallback, $target
-                       ), $expected
-               );
-       }
-
-       function provideFindLowerBound() {
-               $self = $this;
-               $indexValueCallback = function ( $size ) use ( $self ) {
-                       return function ( $val ) use ( $self, $size ) {
-                               $self->assertTrue( $val >= 0 );
-                               $self->assertTrue( $val < $size );
-                               return $val;
-                       };
-               };
-               $comparisonCallback = function ( $a, $b ) {
-                       return $a - $b;
-               };
-
-               return array(
-                       array(
-                               $indexValueCallback( 0 ),
-                               0,
-                               $comparisonCallback,
-                               1,
-                               false,
-                       ),
-                       array(
-                               $indexValueCallback( 1 ),
-                               1,
-                               $comparisonCallback,
-                               -1,
-                               false,
-                       ),
-                       array(
-                               $indexValueCallback( 1 ),
-                               1,
-                               $comparisonCallback,
-                               0,
-                               0,
-                       ),
-                       array(
-                               $indexValueCallback( 1 ),
-                               1,
-                               $comparisonCallback,
-                               1,
-                               0,
-                       ),
-                       array(
-                               $indexValueCallback( 2 ),
-                               2,
-                               $comparisonCallback,
-                               -1,
-                               false,
-                       ),
-                       array(
-                               $indexValueCallback( 2 ),
-                               2,
-                               $comparisonCallback,
-                               0,
-                               0,
-                       ),
-                       array(
-                               $indexValueCallback( 2 ),
-                               2,
-                               $comparisonCallback,
-                               0.5,
-                               0,
-                       ),
-                       array(
-                               $indexValueCallback( 2 ),
-                               2,
-                               $comparisonCallback,
-                               1,
-                               1,
-                       ),
-                       array(
-                               $indexValueCallback( 2 ),
-                               2,
-                               $comparisonCallback,
-                               1.5,
-                               1,
-                       ),
-                       array(
-                               $indexValueCallback( 3 ),
-                               3,
-                               $comparisonCallback,
-                               1,
-                               1,
-                       ),
-                       array(
-                               $indexValueCallback( 3 ),
-                               3,
-                               $comparisonCallback,
-                               1.5,
-                               1,
-                       ),
-                       array(
-                               $indexValueCallback( 3 ),
-                               3,
-                               $comparisonCallback,
-                               2,
-                               2,
-                       ),
-                       array(
-                               $indexValueCallback( 3 ),
-                               3,
-                               $comparisonCallback,
-                               3,
-                               2,
-                       ),
-               );
-       }
-
-       /**
-        * @covers ArrayUtils::arrayDiffAssocRecursive
-        * @dataProvider provideArrayDiffAssocRecursive
-        */
-       function testArrayDiffAssocRecursive( $expected ) {
-               $args = func_get_args();
-               array_shift( $args );
-               $this->assertEquals( call_user_func_array(
-                       'ArrayUtils::arrayDiffAssocRecursive', $args
-               ), $expected );
-       }
-
-       function provideArrayDiffAssocRecursive() {
-               return array(
-                       array(
-                               array(),
-                               array(),
-                               array(),
-                       ),
-                       array(
-                               array(),
-                               array(),
-                               array(),
-                               array(),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1 ),
-                               array(),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1 ),
-                               array(),
-                               array(),
-                       ),
-                       array(
-                               array(),
-                               array(),
-                               array( 1 ),
-                       ),
-                       array(
-                               array(),
-                               array(),
-                               array( 1 ),
-                               array( 2 ),
-                       ),
-                       array(
-                               array( '' => 1 ),
-                               array( '' => 1 ),
-                               array(),
-                       ),
-                       array(
-                               array(),
-                               array(),
-                               array( '' => 1 ),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1 ),
-                               array( 2 ),
-                       ),
-                       array(
-                               array(),
-                               array( 1 ),
-                               array( 2 ),
-                               array( 1 ),
-                       ),
-                       array(
-                               array(),
-                               array( 1 ),
-                               array( 1, 2 ),
-                       ),
-                       array(
-                               array( 1 => 1 ),
-                               array( 1 => 1 ),
-                               array( 1 ),
-                       ),
-                       array(
-                               array(),
-                               array( 1 => 1 ),
-                               array( 1 ),
-                               array( 1 => 1),
-                       ),
-                       array(
-                               array(),
-                               array( 1 => 1 ),
-                               array( 1, 1, 1 ),
-                       ),
-                       array(
-                               array(),
-                               array( array() ),
-                               array(),
-                       ),
-                       array(
-                               array(),
-                               array( array( array() ) ),
-                               array(),
-                       ),
-                       array(
-                               array( 1, array( 1 ) ),
-                               array( 1, array( 1 ) ),
-                               array(),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1, array( 1 ) ),
-                               array( 2, array( 1 ) ),
-                       ),
-                       array(
-                               array(),
-                               array( 1, array( 1 ) ),
-                               array( 2, array( 1 ) ),
-                               array( 1, array( 2 ) ),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1, array() ),
-                               array( 2 ),
-                       ),
-                       array(
-                               array(),
-                               array( 1, array() ),
-                               array( 2 ),
-                               array( 1 ),
-                       ),
-                       array(
-                               array( 1, array( 1 => 2 ) ),
-                               array( 1, array( 1, 2 ) ),
-                               array( 2, array( 1 ) ),
-                       ),
-                       array(
-                               array( 1 ),
-                               array( 1, array( 1, 2 ) ),
-                               array( 2, array( 1 ) ),
-                               array( 2, array( 1 => 2 ) ),
-                       ),
-                       array(
-                               array( 1 => array( 1, 2 ) ),
-                               array( 1, array( 1, 2 ) ),
-                               array( 1, array( 2 ) ),
-                       ),
-                       array(
-                               array( 1 => array( array( 2, 3 ), 2 ) ),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1, array( 2 ) ),
-                       ),
-                       array(
-                               array( 1 => array( array( 2 ), 2 ) ),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1, array( array( 1 => 3 ) ) ),
-                       ),
-                       array(
-                               array( 1 => array( 1 => 2 ) ),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1, array( array( 1 => 3, 0 => 2 ) ) ),
-                       ),
-                       array(
-                               array( 1 => array( 1 => 2 ) ),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1, array( array( 1 => 3 ) ) ),
-                               array( 1 => array( array( 2 ) ) ),
-                       ),
-                       array(
-                               array(),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1 => array( 1 => 2, 0 => array( 1 => 3, 0 => 2 ) ), 0 => 1 ),
-                       ),
-                       array(
-                               array(),
-                               array( 1, array( array( 2, 3 ), 2 ) ),
-                               array( 1 => array( 1 => 2 ) ),
-                               array( 1 => array( array( 1 => 3 ) ) ),
-                               array( 1 => array( array( 2 ) ) ),
-                               array( 1 ),
-                       ),
-               );
-       }
-}
diff --git a/tests/phpunit/includes/ArticleTablesTest.php b/tests/phpunit/includes/ArticleTablesTest.php
deleted file mode 100644 (file)
index 9f2b7a0..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/**
- * @group Database
- */
-class ArticleTablesTest extends MediaWikiLangTestCase {
-       /**
-        * Make sure that bug 14404 doesn't strike again. We don't want
-        * templatelinks based on the user language when {{int:}} is used, only the
-        * content language.
-        *
-        * @covers Title::getTemplateLinksFrom
-        * @covers Title::getLinksFrom
-        */
-       public function testTemplatelinksUsesContentLanguage() {
-               $title = Title::newFromText( 'Bug 14404' );
-               $page = WikiPage::factory( $title );
-               $user = new User();
-               $user->mRights = array( 'createpage', 'edit', 'purge' );
-               $this->setMwGlobals( 'wgLanguageCode', 'es' );
-               $this->setMwGlobals( 'wgContLang', Language::factory( 'es' ) );
-               $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
-
-               $page->doEditContent(
-                       new WikitextContent( '{{:{{int:history}}}}' ),
-                       'Test code for bug 14404',
-                       0,
-                       false,
-                       $user
-               );
-               $templates1 = $title->getTemplateLinksFrom();
-
-               $this->setMwGlobals( 'wgLang', Language::factory( 'de' ) );
-               $page = WikiPage::factory( $title ); // In order to force the re-rendering of the same wikitext
-
-               // We need an edit, a purge is not enough to regenerate the tables
-               $page->doEditContent(
-                       new WikitextContent( '{{:{{int:history}}}}' ),
-                       'Test code for bug 14404',
-                       EDIT_UPDATE,
-                       false,
-                       $user
-               );
-               $templates2 = $title->getTemplateLinksFrom();
-
-               /**
-                * @var Title[] $templates1
-                * @var Title[] $templates2
-                */
-               $this->assertEquals( $templates1, $templates2 );
-               $this->assertEquals( $templates1[0]->getFullText(), 'Historial' );
-       }
-}
diff --git a/tests/phpunit/includes/ArticleTest.php b/tests/phpunit/includes/ArticleTest.php
deleted file mode 100644 (file)
index ae069ea..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-class ArticleTest extends MediaWikiTestCase {
-
-       /**
-        * @var Title
-        */
-       private $title;
-       /**
-        * @var Article
-        */
-       private $article;
-
-       /** creates a title object and its article object */
-       protected function setUp() {
-               parent::setUp();
-               $this->title = Title::makeTitle( NS_MAIN, 'SomePage' );
-               $this->article = new Article( $this->title );
-       }
-
-       /** cleanup title object and its article object */
-       protected function tearDown() {
-               parent::tearDown();
-               $this->title = null;
-               $this->article = null;
-       }
-
-       /**
-        * @covers Article::__get
-        */
-       public function testImplementsGetMagic() {
-               $this->assertEquals( false, $this->article->mLatest, "Article __get magic" );
-       }
-
-       /**
-        * @depends testImplementsGetMagic
-        * @covers Article::__set
-        */
-       public function testImplementsSetMagic() {
-               $this->article->mLatest = 2;
-               $this->assertEquals( 2, $this->article->mLatest, "Article __set magic" );
-       }
-
-       /**
-        * @depends testImplementsSetMagic
-        * @covers Article::__call
-        */
-       public function testImplementsCallMagic() {
-               $this->article->mLatest = 33;
-               $this->article->mDataLoaded = true;
-               $this->assertEquals( 33, $this->article->getLatest(), "Article __call magic" );
-       }
-
-       /**
-        * @covers Article::__get
-        * @covers Article::__set
-        */
-       public function testGetOrSetOnNewProperty() {
-               $this->article->ext_someNewProperty = 12;
-               $this->assertEquals( 12, $this->article->ext_someNewProperty,
-                       "Article get/set magic on new field" );
-
-               $this->article->ext_someNewProperty = -8;
-               $this->assertEquals( -8, $this->article->ext_someNewProperty,
-                       "Article get/set magic on update to new field" );
-       }
-
-       /**
-        * Checks for the existence of the backwards compatibility static functions
-        * (forwarders to WikiPage class)
-        *
-        * @covers Article::selectFields
-        * @covers Article::onArticleCreate
-        * @covers Article::onArticleDelete
-        * @covers Article::onArticleEdit
-        * @covers Article::getAutosummary
-        */
-       public function testStaticFunctions() {
-               $this->hideDeprecated( 'Article::selectFields' );
-               $this->hideDeprecated( 'Article::getAutosummary' );
-               $this->hideDeprecated( 'WikiPage::getAutosummary' );
-               $this->hideDeprecated( 'CategoryPage::getAutosummary' ); // Inherited from Article
-
-               $this->assertEquals( WikiPage::selectFields(), Article::selectFields(),
-                       "Article static functions" );
-               $this->assertEquals( true, is_callable( "Article::onArticleCreate" ),
-                       "Article static functions" );
-               $this->assertEquals( true, is_callable( "Article::onArticleDelete" ),
-                       "Article static functions" );
-               $this->assertEquals( true, is_callable( "ImagePage::onArticleEdit" ),
-                       "Article static functions" );
-               $this->assertTrue( is_string( CategoryPage::getAutosummary( '', '', 0 ) ),
-                       "Article static functions" );
-       }
-}
diff --git a/tests/phpunit/includes/ExternalStoreTest.php b/tests/phpunit/includes/ExternalStoreTest.php
deleted file mode 100644 (file)
index 07c2957..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/**
- * External Store tests
- */
-
-class ExternalStoreTest extends MediaWikiTestCase {
-
-       /**
-        * @covers ExternalStore::fetchFromURL
-        */
-       public function testExternalFetchFromURL() {
-               $this->setMwGlobals( 'wgExternalStores', false );
-
-               $this->assertFalse(
-                       ExternalStore::fetchFromURL( 'FOO://cluster1/200' ),
-                       'Deny if wgExternalStores is not set to a non-empty array'
-               );
-
-               $this->setMwGlobals( 'wgExternalStores', array( 'FOO' ) );
-
-               $this->assertEquals(
-                       ExternalStore::fetchFromURL( 'FOO://cluster1/200' ),
-                       'Hello',
-                       'Allow FOO://cluster1/200'
-               );
-               $this->assertEquals(
-                       ExternalStore::fetchFromURL( 'FOO://cluster1/300/0' ),
-                       'Hello',
-                       'Allow FOO://cluster1/300/0'
-               );
-               # Assertions for r68900
-               $this->assertFalse(
-                       ExternalStore::fetchFromURL( 'ftp.example.org' ),
-                       'Deny domain ftp.example.org'
-               );
-               $this->assertFalse(
-                       ExternalStore::fetchFromURL( '/example.txt' ),
-                       'Deny path /example.txt'
-               );
-               $this->assertFalse(
-                       ExternalStore::fetchFromURL( 'http://' ),
-                       'Deny protocol http://'
-               );
-       }
-}
-
-class ExternalStoreFOO {
-
-       protected $data = array(
-               'cluster1' => array(
-                       '200' => 'Hello',
-                       '300' => array(
-                               'Hello', 'World',
-                       ),
-               ),
-       );
-
-       /**
-        * Fetch data from given URL
-        * @param string $url An url of the form FOO://cluster/id or FOO://cluster/id/itemid.
-        * @return mixed
-        */
-       function fetchFromURL( $url ) {
-               // Based on ExternalStoreDB
-               $path = explode( '/', $url );
-               $cluster = $path[2];
-               $id = $path[3];
-               if ( isset( $path[4] ) ) {
-                       $itemID = $path[4];
-               } else {
-                       $itemID = false;
-               }
-
-               if ( !isset( $this->data[$cluster][$id] ) ) {
-                       return null;
-               }
-
-               if ( $itemID !== false
-                       && is_array( $this->data[$cluster][$id] )
-                       && isset( $this->data[$cluster][$id][$itemID] )
-               ) {
-                       return $this->data[$cluster][$id][$itemID];
-               }
-
-               return $this->data[$cluster][$id];
-       }
-}
index 9dbfa45..1c3e853 100644 (file)
@@ -4,6 +4,20 @@
  * @group HtmlFormatter
  */
 class HtmlFormatterTest extends MediaWikiTestCase {
+
+       /**
+        * Use TidySupport to check whether we should use $wgTidyInternal.
+        *
+        * The Tidy extension in HHVM does not support error text return, so it is
+        * nominally usable, but does not pass tests which require error text from
+        * Tidy.
+        */
+       protected function setUp() {
+               parent::setUp();
+               $tidySupport = new TidySupport();
+               $this->setMwGlobals( 'wgTidyInternal', $tidySupport->isInternal() );
+       }
+
        /**
         * @dataProvider getHtmlData
         *
diff --git a/tests/phpunit/includes/ImagePage404Test.php b/tests/phpunit/includes/ImagePage404Test.php
deleted file mode 100644 (file)
index 197a2b3..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * For doing Image Page tests that rely on 404 thumb handling
- */
-class ImagePage404Test extends MediaWikiMediaTestCase {
-
-       protected function getRepoOptions() {
-               return parent::getRepoOptions() + array( 'transformVia404' => true );
-       }
-
-       function setUp() {
-               $this->setMwGlobals( 'wgImageLimits', array(
-                       array( 320, 240 ),
-                       array( 640, 480 ),
-                       array( 800, 600 ),
-                       array( 1024, 768 ),
-                       array( 1280, 1024 )
-               ) );
-               parent::setUp();
-       }
-
-       function getImagePage( $filename ) {
-               $title = Title::makeTitleSafe( NS_FILE, $filename );
-               $file = $this->dataFile( $filename );
-               $iPage = new ImagePage( $title );
-               $iPage->setFile( $file );
-               return $iPage;
-       }
-
-       /**
-        * @dataProvider providerGetThumbSizes
-        * @param string $filename
-        * @param int $expectedNumberThumbs How many thumbnails to show
-        */
-       function testGetThumbSizes( $filename, $expectedNumberThumbs ) {
-               $iPage = $this->getImagePage( $filename );
-               $reflection = new ReflectionClass( $iPage );
-               $reflMethod = $reflection->getMethod( 'getThumbSizes' );
-               $reflMethod->setAccessible( true );
-
-               $actual = $reflMethod->invoke( $iPage, 545, 700 );
-               $this->assertEquals( count( $actual ), $expectedNumberThumbs );
-       }
-
-       function providerGetThumbSizes() {
-               return array(
-                       array( 'animated.gif', 6 ),
-                       array( 'Toll_Texas_1.svg', 6 ),
-                       array( '80x60-Greyscale.xcf', 6 ),
-                       array( 'jpeg-comment-binary.jpg', 6 ),
-               );
-       }
-}
diff --git a/tests/phpunit/includes/ImagePageTest.php b/tests/phpunit/includes/ImagePageTest.php
deleted file mode 100644 (file)
index 3c255b5..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-class ImagePageTest extends MediaWikiMediaTestCase {
-
-       function setUp() {
-               $this->setMwGlobals( 'wgImageLimits', array(
-                       array( 320, 240 ),
-                       array( 640, 480 ),
-                       array( 800, 600 ),
-                       array( 1024, 768 ),
-                       array( 1280, 1024 )
-               ) );
-               parent::setUp();
-       }
-
-       function getImagePage( $filename ) {
-               $title = Title::makeTitleSafe( NS_FILE, $filename );
-               $file = $this->dataFile( $filename );
-               $iPage = new ImagePage( $title );
-               $iPage->setFile( $file );
-               return $iPage;
-       }
-
-       /**
-        * @dataProvider providerGetDisplayWidthHeight
-        * @param array $dim Array [maxWidth, maxHeight, width, height]
-        * @param array $expected Array [width, height] The width and height we expect to display at
-        */
-       function testGetDisplayWidthHeight( $dim, $expected ) {
-               $iPage = $this->getImagePage( 'animated.gif' );
-               $reflection = new ReflectionClass( $iPage );
-               $reflMethod = $reflection->getMethod( 'getDisplayWidthHeight' );
-               $reflMethod->setAccessible( true );
-
-               $actual = $reflMethod->invoke( $iPage, $dim[0], $dim[1], $dim[2], $dim[3] );
-               $this->assertEquals( $actual, $expected );
-       }
-
-       function providerGetDisplayWidthHeight() {
-               return array(
-                       array(
-                               array( 1024.0, 768.0, 600.0, 600.0 ),
-                               array( 600.0, 600.0 )
-                       ),
-                       array(
-                               array( 1024.0, 768.0, 1600.0, 600.0 ),
-                               array( 1024.0, 384.0 )
-                       ),
-                       array(
-                               array( 1024.0, 768.0, 1024.0, 768.0 ),
-                               array( 1024.0, 768.0 )
-                       ),
-                       array(
-                               array( 1024.0, 768.0, 800.0, 1000.0 ),
-                               array( 614.0, 768.0 )
-                       ),
-                       array(
-                               array( 1024.0, 768.0, 0, 1000 ),
-                               array( 0, 0 )
-                       ),
-                       array(
-                               array( 1024.0, 768.0, 2000, 0 ),
-                               array( 0, 0 )
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider providerGetThumbSizes
-        * @param string $filename
-        * @param int $expectedNumberThumbs How many thumbnails to show
-        */
-       function testGetThumbSizes( $filename, $expectedNumberThumbs ) {
-               $iPage = $this->getImagePage( $filename );
-               $reflection = new ReflectionClass( $iPage );
-               $reflMethod = $reflection->getMethod( 'getThumbSizes' );
-               $reflMethod->setAccessible( true );
-
-               $actual = $reflMethod->invoke( $iPage, 545, 700 );
-               $this->assertEquals( count( $actual ), $expectedNumberThumbs );
-       }
-
-       function providerGetThumbSizes() {
-               return array(
-                       array( 'animated.gif', 2 ),
-                       array( 'Toll_Texas_1.svg', 1 ),
-                       array( '80x60-Greyscale.xcf', 1 ),
-                       array( 'jpeg-comment-binary.jpg', 2 ),
-               );
-       }
-}
diff --git a/tests/phpunit/includes/LinksUpdateTest.php b/tests/phpunit/includes/LinksUpdateTest.php
deleted file mode 100644 (file)
index 02f6b2a..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-<?php
-
-/**
- * @group Database
- * ^--- make sure temporary tables are used.
- */
-class LinksUpdateTest extends MediaWikiTestCase {
-
-       function __construct( $name = null, array $data = array(), $dataName = '' ) {
-               parent::__construct( $name, $data, $dataName );
-
-               $this->tablesUsed = array_merge( $this->tablesUsed,
-                       array(
-                               'interwiki',
-                               'page_props',
-                               'pagelinks',
-                               'categorylinks',
-                               'langlinks',
-                               'externallinks',
-                               'imagelinks',
-                               'templatelinks',
-                               'iwlinks'
-                       )
-               );
-       }
-
-       protected function setUp() {
-               parent::setUp();
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->replace(
-                       'interwiki',
-                       array( 'iw_prefix' ),
-                       array(
-                               'iw_prefix' => 'linksupdatetest',
-                               'iw_url' => 'http://testing.com/wiki/$1',
-                               'iw_api' => 'http://testing.com/w/api.php',
-                               'iw_local' => 0,
-                               'iw_trans' => 0,
-                               'iw_wikiid' => 'linksupdatetest',
-                       )
-               );
-       }
-
-       protected function makeTitleAndParserOutput( $name, $id ) {
-               $t = Title::newFromText( $name );
-               $t->mArticleID = $id; # XXX: this is fugly
-
-               $po = new ParserOutput();
-               $po->setTitleText( $t->getPrefixedText() );
-
-               return array( $t, $po );
-       }
-
-       /**
-        * @covers ParserOutput::addLink
-        */
-       public function testUpdate_pagelinks() {
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addLink( Title::newFromText( "Foo" ) );
-               $po->addLink( Title::newFromText( "Special:Foo" ) ); // special namespace should be ignored
-               $po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
-               $po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
-
-               $update = $this->assertLinksUpdate(
-                       $t,
-                       $po,
-                       'pagelinks',
-                       'pl_namespace,
-                       pl_title',
-                       'pl_from = 111',
-                       array( array( NS_MAIN, 'Foo' ) )
-               );
-               $this->assertArrayEquals( array(
-                       Title::makeTitle( NS_MAIN, 'Foo' ),  // newFromText doesn't yield the same internal state....
-               ), $update->getAddedLinks() );
-
-               $po = new ParserOutput();
-               $po->setTitleText( $t->getPrefixedText() );
-
-               $po->addLink( Title::newFromText( "Bar" ) );
-               $po->addLink( Title::newFromText( "Talk:Bar" ) );
-
-               $update = $this->assertLinksUpdate(
-                       $t,
-                       $po,
-                       'pagelinks',
-                       'pl_namespace,
-                       pl_title',
-                       'pl_from = 111',
-                       array(
-                               array( NS_MAIN, 'Bar' ),
-                               array( NS_TALK, 'Bar' ),
-                       )
-               );
-               $this->assertArrayEquals( array(
-                       Title::makeTitle( NS_MAIN, 'Bar' ),
-                       Title::makeTitle( NS_TALK, 'Bar' ),
-               ), $update->getAddedLinks() );
-               $this->assertArrayEquals( array(
-                       Title::makeTitle( NS_MAIN, 'Foo' ),
-               ), $update->getRemovedLinks() );
-       }
-
-       /**
-        * @covers ParserOutput::addExternalLink
-        */
-       public function testUpdate_externallinks() {
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addExternalLink( "http://testing.com/wiki/Foo" );
-
-               $this->assertLinksUpdate( $t, $po, 'externallinks', 'el_to, el_index', 'el_from = 111', array(
-                       array( 'http://testing.com/wiki/Foo', 'http://com.testing./wiki/Foo' ),
-               ) );
-       }
-
-       /**
-        * @covers ParserOutput::addCategory
-        */
-       public function testUpdate_categorylinks() {
-               /** @var ParserOutput $po */
-               $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
-
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addCategory( "Foo", "FOO" );
-
-               $this->assertLinksUpdate( $t, $po, 'categorylinks', 'cl_to, cl_sortkey', 'cl_from = 111', array(
-                       array( 'Foo', "FOO\nTESTING" ),
-               ) );
-       }
-
-       /**
-        * @covers ParserOutput::addInterwikiLink
-        */
-       public function testUpdate_iwlinks() {
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $target = Title::makeTitleSafe( NS_MAIN, "Foo", '', 'linksupdatetest' );
-               $po->addInterwikiLink( $target );
-
-               $this->assertLinksUpdate( $t, $po, 'iwlinks', 'iwl_prefix, iwl_title', 'iwl_from = 111', array(
-                       array( 'linksupdatetest', 'Foo' ),
-               ) );
-       }
-
-       /**
-        * @covers ParserOutput::addTemplate
-        */
-       public function testUpdate_templatelinks() {
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addTemplate( Title::newFromText( "Template:Foo" ), 23, 42 );
-
-               $this->assertLinksUpdate(
-                       $t,
-                       $po,
-                       'templatelinks',
-                       'tl_namespace,
-                       tl_title',
-                       'tl_from = 111',
-                       array( array( NS_TEMPLATE, 'Foo' ) )
-               );
-       }
-
-       /**
-        * @covers ParserOutput::addImage
-        */
-       public function testUpdate_imagelinks() {
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addImage( "Foo.png" );
-
-               $this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
-                       array( 'Foo.png' ),
-               ) );
-       }
-
-       /**
-        * @covers ParserOutput::addLanguageLink
-        */
-       public function testUpdate_langlinks() {
-               $this->setMwGlobals( array(
-                       'wgCapitalLinks' => true,
-               ) );
-
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $po->addLanguageLink( Title::newFromText( "en:Foo" )->getFullText() );
-
-               $this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
-                       array( 'En', 'Foo' ),
-               ) );
-       }
-
-       /**
-        * @covers ParserOutput::setProperty
-        */
-       public function testUpdate_page_props() {
-               global $wgPagePropsHaveSortkey;
-
-               /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
-               $fields = array( 'pp_propname', 'pp_value' );
-               $expected = array();
-
-               $po->setProperty( "bool", true );
-               $expected[] = array( "bool", true );
-
-               $po->setProperty( "float", 4.0 + 1.0 / 4.0 );
-               $expected[] = array( "float", 4.0 + 1.0 / 4.0 );
-
-               $po->setProperty( "int", -7 );
-               $expected[] = array( "int", -7 );
-
-               $po->setProperty( "string", "33 bar" );
-               $expected[] = array( "string", "33 bar" );
-
-               // compute expected sortkey values
-               if ( $wgPagePropsHaveSortkey ) {
-                       $fields[] = 'pp_sortkey';
-
-                       foreach ( $expected as &$row ) {
-                               $value = $row[1];
-
-                               if ( is_int( $value ) || is_float( $value ) || is_bool( $value ) ) {
-                                       $row[] = floatval( $value );
-                               } else {
-                                       $row[] = null;
-                               }
-                       }
-               }
-
-               $this->assertLinksUpdate( $t, $po, 'page_props', $fields, 'pp_page = 111', $expected );
-       }
-
-       public function testUpdate_page_props_without_sortkey() {
-               $this->setMwGlobals( 'wgPagePropsHaveSortkey', false );
-
-               $this->testUpdate_page_props();
-       }
-
-       // @todo test recursive, too!
-
-       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput,
-               $table, $fields, $condition, array $expectedRows
-       ) {
-               $update = new LinksUpdate( $title, $parserOutput );
-
-               //NOTE: make sure LinksUpdate does not generate warnings when called inside a transaction.
-               $update->beginTransaction();
-               $update->doUpdate();
-               $update->commitTransaction();
-
-               $this->assertSelect( $table, $fields, $condition, $expectedRows );
-               return $update;
-       }
-}
diff --git a/tests/phpunit/includes/LocalFileTest.php b/tests/phpunit/includes/LocalFileTest.php
deleted file mode 100644 (file)
index 5c5052e..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-<?php
-
-/**
- * These tests should work regardless of $wgCapitalLinks
- * @group Database
- * @todo Split tests into providers and test methods
- */
-
-class LocalFileTest extends MediaWikiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->setMwGlobals( 'wgCapitalLinks', true );
-
-               $info = array(
-                       'name' => 'test',
-                       'directory' => '/testdir',
-                       'url' => '/testurl',
-                       'hashLevels' => 2,
-                       'transformVia404' => false,
-                       'backend' => new FSFileBackend( array(
-                               'name' => 'local-backend',
-                               'wikiId' => wfWikiId(),
-                               'containerPaths' => array(
-                                       'cont1' => "/testdir/local-backend/tempimages/cont1",
-                                       'cont2' => "/testdir/local-backend/tempimages/cont2"
-                               )
-                       ) )
-               );
-               $this->repo_hl0 = new LocalRepo( array( 'hashLevels' => 0 ) + $info );
-               $this->repo_hl2 = new LocalRepo( array( 'hashLevels' => 2 ) + $info );
-               $this->repo_lc = new LocalRepo( array( 'initialCapital' => false ) + $info );
-               $this->file_hl0 = $this->repo_hl0->newFile( 'test!' );
-               $this->file_hl2 = $this->repo_hl2->newFile( 'test!' );
-               $this->file_lc = $this->repo_lc->newFile( 'test!' );
-       }
-
-       /**
-        * @covers File::getHashPath
-        */
-       public function testGetHashPath() {
-               $this->assertEquals( '', $this->file_hl0->getHashPath() );
-               $this->assertEquals( 'a/a2/', $this->file_hl2->getHashPath() );
-               $this->assertEquals( 'c/c4/', $this->file_lc->getHashPath() );
-       }
-
-       /**
-        * @covers File::getRel
-        */
-       public function testGetRel() {
-               $this->assertEquals( 'Test!', $this->file_hl0->getRel() );
-               $this->assertEquals( 'a/a2/Test!', $this->file_hl2->getRel() );
-               $this->assertEquals( 'c/c4/test!', $this->file_lc->getRel() );
-       }
-
-       /**
-        * @covers File::getUrlRel
-        */
-       public function testGetUrlRel() {
-               $this->assertEquals( 'Test%21', $this->file_hl0->getUrlRel() );
-               $this->assertEquals( 'a/a2/Test%21', $this->file_hl2->getUrlRel() );
-               $this->assertEquals( 'c/c4/test%21', $this->file_lc->getUrlRel() );
-       }
-
-       /**
-        * @covers File::getArchivePath
-        */
-       public function testGetArchivePath() {
-               $this->assertEquals(
-                       'mwstore://local-backend/test-public/archive',
-                       $this->file_hl0->getArchivePath()
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-public/archive/a/a2',
-                       $this->file_hl2->getArchivePath()
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-public/archive/!',
-                       $this->file_hl0->getArchivePath( '!' )
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-public/archive/a/a2/!',
-                       $this->file_hl2->getArchivePath( '!' )
-               );
-       }
-
-       /**
-        * @covers File::getThumbPath
-        */
-       public function testGetThumbPath() {
-               $this->assertEquals(
-                       'mwstore://local-backend/test-thumb/Test!',
-                       $this->file_hl0->getThumbPath()
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-thumb/a/a2/Test!',
-                       $this->file_hl2->getThumbPath()
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-thumb/Test!/x',
-                       $this->file_hl0->getThumbPath( 'x' )
-               );
-               $this->assertEquals(
-                       'mwstore://local-backend/test-thumb/a/a2/Test!/x',
-                       $this->file_hl2->getThumbPath( 'x' )
-               );
-       }
-
-       /**
-        * @covers File::getArchiveUrl
-        */
-       public function testGetArchiveUrl() {
-               $this->assertEquals( '/testurl/archive', $this->file_hl0->getArchiveUrl() );
-               $this->assertEquals( '/testurl/archive/a/a2', $this->file_hl2->getArchiveUrl() );
-               $this->assertEquals( '/testurl/archive/%21', $this->file_hl0->getArchiveUrl( '!' ) );
-               $this->assertEquals( '/testurl/archive/a/a2/%21', $this->file_hl2->getArchiveUrl( '!' ) );
-       }
-
-       /**
-        * @covers File::getThumbUrl
-        */
-       public function testGetThumbUrl() {
-               $this->assertEquals( '/testurl/thumb/Test%21', $this->file_hl0->getThumbUrl() );
-               $this->assertEquals( '/testurl/thumb/a/a2/Test%21', $this->file_hl2->getThumbUrl() );
-               $this->assertEquals( '/testurl/thumb/Test%21/x', $this->file_hl0->getThumbUrl( 'x' ) );
-               $this->assertEquals( '/testurl/thumb/a/a2/Test%21/x', $this->file_hl2->getThumbUrl( 'x' ) );
-       }
-
-       /**
-        * @covers File::getArchiveVirtualUrl
-        */
-       public function testGetArchiveVirtualUrl() {
-               $this->assertEquals( 'mwrepo://test/public/archive', $this->file_hl0->getArchiveVirtualUrl() );
-               $this->assertEquals(
-                       'mwrepo://test/public/archive/a/a2',
-                       $this->file_hl2->getArchiveVirtualUrl()
-               );
-               $this->assertEquals(
-                       'mwrepo://test/public/archive/%21',
-                       $this->file_hl0->getArchiveVirtualUrl( '!' )
-               );
-               $this->assertEquals(
-                       'mwrepo://test/public/archive/a/a2/%21',
-                       $this->file_hl2->getArchiveVirtualUrl( '!' )
-               );
-       }
-
-       /**
-        * @covers File::getThumbVirtualUrl
-        */
-       public function testGetThumbVirtualUrl() {
-               $this->assertEquals( 'mwrepo://test/thumb/Test%21', $this->file_hl0->getThumbVirtualUrl() );
-               $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21', $this->file_hl2->getThumbVirtualUrl() );
-               $this->assertEquals(
-                       'mwrepo://test/thumb/Test%21/%21',
-                       $this->file_hl0->getThumbVirtualUrl( '!' )
-               );
-               $this->assertEquals(
-                       'mwrepo://test/thumb/a/a2/Test%21/%21',
-                       $this->file_hl2->getThumbVirtualUrl( '!' )
-               );
-       }
-
-       /**
-        * @covers File::getUrl
-        */
-       public function testGetUrl() {
-               $this->assertEquals( '/testurl/Test%21', $this->file_hl0->getUrl() );
-               $this->assertEquals( '/testurl/a/a2/Test%21', $this->file_hl2->getUrl() );
-       }
-
-       /**
-        * @covers ::wfLocalFile
-        */
-       public function testWfLocalFile() {
-               $file = wfLocalFile( "File:Some_file_that_probably_doesn't exist.png" );
-               $this->assertThat(
-                       $file,
-                       $this->isInstanceOf( 'LocalFile' ),
-                       'wfLocalFile() returns LocalFile for valid Titles'
-               );
-       }
-}
diff --git a/tests/phpunit/includes/MWFunctionTest.php b/tests/phpunit/includes/MWFunctionTest.php
deleted file mode 100644 (file)
index f4d1799..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/**
- * @covers MWFunction
- */
-class MWFunctionTest extends MediaWikiTestCase {
-       public function testNewObjFunction() {
-               $arg1 = 'Foo';
-               $arg2 = 'Bar';
-               $arg3 = array( 'Baz' );
-               $arg4 = new ExampleObject;
-
-               $args = array( $arg1, $arg2, $arg3, $arg4 );
-
-               $newObject = new MWBlankClass( $arg1, $arg2, $arg3, $arg4 );
-               $this->hideDeprecated( 'MWFunction::newObj' );
-               $this->assertEquals(
-                       MWFunction::newObj( 'MWBlankClass', $args )->args,
-                       $newObject->args
-               );
-       }
-}
-
-class MWBlankClass {
-
-       public $args = array();
-
-       function __construct( $arg1, $arg2, $arg3, $arg4 ) {
-               $this->args = array( $arg1, $arg2, $arg3, $arg4 );
-       }
-}
-
-class ExampleObject {
-}
index 05c1a66..3656254 100644 (file)
@@ -81,6 +81,17 @@ class MWTimestampTest extends MediaWikiLangTestCase {
                new MWTimestamp( "This is not a timestamp." );
        }
 
+       /**
+        * Test an out of range timestamp
+        * @dataProvider provideOutOfRangeTimestamps
+        * @expectedException TimestampException
+        * @covers MWTimestamp
+        */
+       public function testOutOfRangeTimestamps( $format, $input ) {
+               $timestamp = new MWTimestamp( $input );
+               $timestamp->getTimestamp( $format );
+       }
+
        /**
         * Test requesting an invalid output format.
         * @expectedException TimestampException
@@ -113,6 +124,18 @@ class MWTimestampTest extends MediaWikiLangTestCase {
                );
        }
 
+       /**
+        * Returns a list of out of range timestamps in the format:
+        * array( type, timestamp_of_type )
+        */
+       public static function provideOutOfRangeTimestamps() {
+               return array(
+                       // Various formats
+                       array( TS_MW, '-62167219201' ), // -0001-12-31T23:59:59Z
+                       array( TS_MW, '253402300800' ), // 10000-01-01T00:00:00Z
+               );
+       }
+
        /**
         * @dataProvider provideHumanTimestampTests
         * @covers MWTimestamp::getHumanTimestamp
index 89d1de7..4d63ea6 100644 (file)
@@ -177,13 +177,13 @@ mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"
 }</script>
 '
                        ),
-                       // Load module script with with ESI
+                       // Load module script with ESI
                        array(
                                array( 'test.foo', ResourceLoaderModule::TYPE_SCRIPTS, true ),
                                '<script><esi:include src="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.foo&amp;only=scripts&amp;skin=fallback&amp;*" /></script>
 '
                        ),
-                       // Load module styles with with ESI
+                       // Load module styles with ESI
                        array(
                                array( 'test.foo', ResourceLoaderModule::TYPE_STYLES, true ),
                                '<style><esi:include src="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.foo&amp;only=styles&amp;skin=fallback&amp;*" /></style>
diff --git a/tests/phpunit/includes/PasswordTest.php b/tests/phpunit/includes/PasswordTest.php
deleted file mode 100644 (file)
index 5ad8aca..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/**
- * Testing framework for the Password infrastructure
- *
- * 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
- */
-
-class PasswordTest extends MediaWikiTestCase {
-       /**
-        * @covers InvalidPassword::equals
-        */
-       public function testInvalidUnequalInvalid() {
-               $invalid1 = User::getPasswordFactory()->newFromCiphertext( null );
-               $invalid2 = User::getPasswordFactory()->newFromCiphertext( null );
-
-               $this->assertFalse( $invalid1->equals( $invalid2 ) );
-       }
-
-       public function testInvalidPlaintext() {
-               $invalid = User::getPasswordFactory()->newFromPlaintext( null );
-
-               $this->assertInstanceOf( 'InvalidPassword', $invalid );
-       }
-}
diff --git a/tests/phpunit/includes/RequestContextTest.php b/tests/phpunit/includes/RequestContextTest.php
deleted file mode 100644 (file)
index a9e5be2..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-
-/**
- * @group Database
- * @group RequestContext
- */
-class RequestContextTest extends MediaWikiTestCase {
-
-       /**
-        * Test the relationship between title and wikipage in RequestContext
-        * @covers RequestContext::getWikiPage
-        * @covers RequestContext::getTitle
-        */
-       public function testWikiPageTitle() {
-               $context = new RequestContext();
-
-               $curTitle = Title::newFromText( "A" );
-               $context->setTitle( $curTitle );
-               $this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
-                       "When a title is first set WikiPage should be created on-demand for that title." );
-
-               $curTitle = Title::newFromText( "B" );
-               $context->setWikiPage( WikiPage::factory( $curTitle ) );
-               $this->assertTrue( $curTitle->equals( $context->getTitle() ),
-                       "Title must be updated when a new WikiPage is provided." );
-
-               $curTitle = Title::newFromText( "C" );
-               $context->setTitle( $curTitle );
-               $this->assertTrue(
-                       $curTitle->equals( $context->getWikiPage()->getTitle() ),
-                       "When a title is updated the WikiPage should be purged "
-                               . "and recreated on-demand with the new title."
-               );
-       }
-
-       /**
-        * @covers RequestContext::importScopedSession
-        */
-       public function testImportScopedSession() {
-               $context = RequestContext::getMain();
-
-               $oInfo = $context->exportSession();
-               $this->assertEquals( '127.0.0.1', $oInfo['ip'], "Correct initial IP address." );
-               $this->assertEquals( 0, $oInfo['userId'], "Correct initial user ID." );
-
-               $user = User::newFromName( 'UnitTestContextUser' );
-               $user->addToDatabase();
-
-               $sinfo = array(
-                       'sessionId' => 'd612ee607c87e749ef14da4983a702cd',
-                       'userId' => $user->getId(),
-                       'ip' => '192.0.2.0',
-                       'headers' => array(
-                               'USER-AGENT' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0'
-                       )
-               );
-               // importScopedSession() sets these variables
-               $this->setMwGlobals( array(
-                       'wgUser' => new User,
-                       'wgRequest' => new FauxRequest,
-               ) );
-               $sc = RequestContext::importScopedSession( $sinfo ); // load new context
-
-               $info = $context->exportSession();
-               $this->assertEquals( $sinfo['ip'], $info['ip'], "Correct IP address." );
-               $this->assertEquals( $sinfo['headers'], $info['headers'], "Correct headers." );
-               $this->assertEquals( $sinfo['sessionId'], $info['sessionId'], "Correct session ID." );
-               $this->assertEquals( $sinfo['userId'], $info['userId'], "Correct user ID." );
-               $this->assertEquals(
-                       $sinfo['ip'],
-                       $context->getRequest()->getIP(),
-                       "Correct context IP address."
-               );
-               $this->assertEquals(
-                       $sinfo['headers'],
-                       $context->getRequest()->getAllHeaders(),
-                       "Correct context headers."
-               );
-               $this->assertEquals( $sinfo['sessionId'], session_id(), "Correct context session ID." );
-               $this->assertEquals( true, $context->getUser()->isLoggedIn(), "Correct context user." );
-               $this->assertEquals( $sinfo['userId'], $context->getUser()->getId(), "Correct context user ID." );
-               $this->assertEquals(
-                       'UnitTestContextUser',
-                       $context->getUser()->getName(),
-                       "Correct context user name."
-               );
-
-               unset( $sc ); // restore previous context
-
-               $info = $context->exportSession();
-               $this->assertEquals( $oInfo['ip'], $info['ip'], "Correct restored IP address." );
-               $this->assertEquals( $oInfo['headers'], $info['headers'], "Correct restored headers." );
-               $this->assertEquals( $oInfo['sessionId'], $info['sessionId'], "Correct restored session ID." );
-               $this->assertEquals( $oInfo['userId'], $info['userId'], "Correct restored user ID." );
-       }
-}
diff --git a/tests/phpunit/includes/SpecialPageTest.php b/tests/phpunit/includes/SpecialPageTest.php
deleted file mode 100644 (file)
index 245cdff..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-/**
- * @covers SpecialPage
- *
- * @group Database
- *
- * @licence GNU GPL v2+
- * @author Katie Filbert < aude.wiki@gmail.com >
- */
-class SpecialPageTest extends MediaWikiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->setMwGlobals( array(
-                       'wgScript' => '/index.php',
-                       'wgContLang' => Language::factory( 'en' )
-               ) );
-       }
-
-       /**
-        * @dataProvider getTitleForProvider
-        */
-       public function testGetTitleFor( $expectedName, $name ) {
-               $title = SpecialPage::getTitleFor( $name );
-               $expected = Title::makeTitle( NS_SPECIAL, $expectedName );
-               $this->assertEquals( $expected, $title );
-       }
-
-       public function getTitleForProvider() {
-               return array(
-                       array( 'UserLogin', 'Userlogin' )
-               );
-       }
-
-       /**
-        * @expectedException PHPUnit_Framework_Error_Notice
-        */
-       public function testInvalidGetTitleFor() {
-               $title = SpecialPage::getTitleFor( 'cat' );
-               $expected = Title::makeTitle( NS_SPECIAL, 'Cat' );
-               $this->assertEquals( $expected, $title );
-       }
-
-       /**
-        * @expectedException PHPUnit_Framework_Error_Notice
-        * @dataProvider getTitleForWithWarningProvider
-        */
-       public function testGetTitleForWithWarning( $expected, $name ) {
-               $title = SpecialPage::getTitleFor( $name );
-               $this->assertEquals( $expected, $title );
-       }
-
-       public function getTitleForWithWarningProvider() {
-               return array(
-                       array( Title::makeTitle( NS_SPECIAL, 'UserLogin' ), 'UserLogin' )
-               );
-       }
-
-       /**
-        * @dataProvider requireLoginAnonProvider
-        */
-       public function testRequireLoginAnon( $expected, $reason, $title ) {
-               $specialPage = new SpecialPage( 'Watchlist', 'viewmywatchlist' );
-
-               $user = User::newFromId( 0 );
-               $specialPage->getContext()->setUser( $user );
-               $specialPage->getContext()->setLanguage( Language::factory( 'en' ) );
-
-               $this->setExpectedException( 'UserNotLoggedIn', $expected );
-
-               // $specialPage->requireLogin( [ $reason [, $title ] ] )
-               call_user_func_array(
-                       array( $specialPage, 'requireLogin' ),
-                       array_filter( array( $reason, $title ) )
-               );
-       }
-
-       public function requireLoginAnonProvider() {
-               $lang = 'en';
-
-               $expected1 = wfMessage( 'exception-nologin-text' )->inLanguage( $lang )->text();
-               $expected2 = wfMessage( 'about' )->inLanguage( $lang )->text();
-
-               return array(
-                       array( $expected1, null, null ),
-                       array( $expected2, 'about', null ),
-                       array( $expected2, 'about', 'about' ),
-               );
-       }
-
-       public function testRequireLoginNotAnon() {
-               $specialPage = new SpecialPage( 'Watchlist', 'viewmywatchlist' );
-
-               $user = User::newFromName( "UTSysop" );
-               $specialPage->getContext()->setUser( $user );
-
-               $specialPage->requireLogin();
-
-               // no exception thrown, logged in use can access special page
-               $this->assertTrue( true );
-       }
-
-}
diff --git a/tests/phpunit/includes/WikiPageTest.php b/tests/phpunit/includes/WikiPageTest.php
deleted file mode 100644 (file)
index c011e9a..0000000
+++ /dev/null
@@ -1,1301 +0,0 @@
-<?php
-
-/**
- * @group ContentHandler
- * @group Database
- * ^--- important, causes temporary tables to be used instead of the real database
- * @group medium
- **/
-class WikiPageTest extends MediaWikiLangTestCase {
-
-       protected $pages_to_delete;
-
-       function __construct( $name = null, array $data = array(), $dataName = '' ) {
-               parent::__construct( $name, $data, $dataName );
-
-               $this->tablesUsed = array_merge(
-                       $this->tablesUsed,
-                       array( 'page',
-                               'revision',
-                               'text',
-
-                               'recentchanges',
-                               'logging',
-
-                               'page_props',
-                               'pagelinks',
-                               'categorylinks',
-                               'langlinks',
-                               'externallinks',
-                               'imagelinks',
-                               'templatelinks',
-                               'iwlinks' ) );
-       }
-
-       protected function setUp() {
-               parent::setUp();
-               $this->pages_to_delete = array();
-
-               LinkCache::singleton()->clear(); # avoid cached redirect status, etc
-       }
-
-       protected function tearDown() {
-               foreach ( $this->pages_to_delete as $p ) {
-                       /* @var $p WikiPage */
-
-                       try {
-                               if ( $p->exists() ) {
-                                       $p->doDeleteArticle( "testing done." );
-                               }
-                       } catch ( MWException $ex ) {
-                               // fail silently
-                       }
-               }
-               parent::tearDown();
-       }
-
-       /**
-        * @param Title|string $title
-        * @param string|null $model
-        * @return WikiPage
-        */
-       protected function newPage( $title, $model = null ) {
-               if ( is_string( $title ) ) {
-                       $ns = $this->getDefaultWikitextNS();
-                       $title = Title::newFromText( $title, $ns );
-               }
-
-               $p = new WikiPage( $title );
-
-               $this->pages_to_delete[] = $p;
-
-               return $p;
-       }
-
-       /**
-        * @param string|Title|WikiPage $page
-        * @param string $text
-        * @param int $model
-        *
-        * @return WikiPage
-        */
-       protected function createPage( $page, $text, $model = null ) {
-               if ( is_string( $page ) || $page instanceof Title ) {
-                       $page = $this->newPage( $page, $model );
-               }
-
-               $content = ContentHandler::makeContent( $text, $page->getTitle(), $model );
-               $page->doEditContent( $content, "testing", EDIT_NEW );
-
-               return $page;
-       }
-
-       /**
-        * @covers WikiPage::doEditContent
-        */
-       public function testDoEditContent() {
-               $page = $this->newPage( "WikiPageTest_testDoEditContent" );
-               $title = $page->getTitle();
-
-               $content = ContentHandler::makeContent(
-                       "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
-                               . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
-                       $title,
-                       CONTENT_MODEL_WIKITEXT
-               );
-
-               $page->doEditContent( $content, "[[testing]] 1" );
-
-               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
-               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
-               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
-               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
-
-               $id = $page->getId();
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getContent();
-               $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
-
-               # ------------------------
-               $content = ContentHandler::makeContent(
-                       "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
-                               . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.",
-                       $title,
-                       CONTENT_MODEL_WIKITEXT
-               );
-
-               $page->doEditContent( $content, "testing 2" );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getContent();
-               $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
-       }
-
-       /**
-        * @covers WikiPage::doEdit
-        */
-       public function testDoEdit() {
-               $this->hideDeprecated( "WikiPage::doEdit" );
-               $this->hideDeprecated( "WikiPage::getText" );
-               $this->hideDeprecated( "Revision::getText" );
-
-               //NOTE: assume help namespace will default to wikitext
-               $title = Title::newFromText( "Help:WikiPageTest_testDoEdit" );
-
-               $page = $this->newPage( $title );
-
-               $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
-                       . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
-
-               $page->doEdit( $text, "[[testing]] 1" );
-
-               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
-               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
-               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
-               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
-
-               $id = $page->getId();
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getText();
-               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
-
-               # ------------------------
-               $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
-                       . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
-
-               $page->doEdit( $text, "testing 2" );
-
-               # ------------------------
-               $page = new WikiPage( $title );
-
-               $retrieved = $page->getText();
-               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
-       }
-
-       /**
-        * @covers WikiPage::doQuickEdit
-        */
-       public function testDoQuickEdit() {
-               global $wgUser;
-
-               $this->hideDeprecated( "WikiPage::doQuickEdit" );
-
-               //NOTE: assume help namespace will default to wikitext
-               $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" );
-
-               $text = "quick text";
-               $page->doQuickEdit( $text, $wgUser, "testing q" );
-
-               # ---------------------
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $text, $page->getText() );
-       }
-
-       /**
-        * @covers WikiPage::doQuickEditContent
-        */
-       public function testDoQuickEditContent() {
-               global $wgUser;
-
-               $page = $this->createPage(
-                       "WikiPageTest_testDoQuickEditContent",
-                       "original text",
-                       CONTENT_MODEL_WIKITEXT
-               );
-
-               $content = ContentHandler::makeContent(
-                       "quick text",
-                       $page->getTitle(),
-                       CONTENT_MODEL_WIKITEXT
-               );
-               $page->doQuickEditContent( $content, $wgUser, "testing q" );
-
-               # ---------------------
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertTrue( $content->equals( $page->getContent() ) );
-       }
-
-       /**
-        * @covers WikiPage::doDeleteArticle
-        */
-       public function testDoDeleteArticle() {
-               $page = $this->createPage(
-                       "WikiPageTest_testDoDeleteArticle",
-                       "[[original text]] foo",
-                       CONTENT_MODEL_WIKITEXT
-               );
-               $id = $page->getId();
-
-               $page->doDeleteArticle( "testing deletion" );
-
-               $this->assertFalse(
-                       $page->getTitle()->getArticleID() > 0,
-                       "Title object should now have page id 0"
-               );
-               $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
-               $this->assertFalse(
-                       $page->exists(),
-                       "WikiPage::exists should return false after page was deleted"
-               );
-               $this->assertNull(
-                       $page->getContent(),
-                       "WikiPage::getContent should return null after page was deleted"
-               );
-               $this->assertFalse(
-                       $page->getText(),
-                       "WikiPage::getText should return false after page was deleted"
-               );
-
-               $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
-               $this->assertFalse(
-                       $t->exists(),
-                       "Title::exists should return false after page was deleted"
-               );
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
-       }
-
-       /**
-        * @covers WikiPage::doDeleteUpdates
-        */
-       public function testDoDeleteUpdates() {
-               $page = $this->createPage(
-                       "WikiPageTest_testDoDeleteArticle",
-                       "[[original text]] foo",
-                       CONTENT_MODEL_WIKITEXT
-               );
-               $id = $page->getId();
-
-               $page->doDeleteUpdates( $id );
-
-               # ------------------------
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
-               $n = $res->numRows();
-               $res->free();
-
-               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
-       }
-
-       /**
-        * @covers WikiPage::getRevision
-        */
-       public function testGetRevision() {
-               $page = $this->newPage( "WikiPageTest_testGetRevision" );
-
-               $rev = $page->getRevision();
-               $this->assertNull( $rev );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-
-               $rev = $page->getRevision();
-
-               $this->assertEquals( $page->getLatest(), $rev->getId() );
-               $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
-       }
-
-       /**
-        * @covers WikiPage::getContent
-        */
-       public function testGetContent() {
-               $page = $this->newPage( "WikiPageTest_testGetContent" );
-
-               $content = $page->getContent();
-               $this->assertNull( $content );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-
-               $content = $page->getContent();
-               $this->assertEquals( "some text", $content->getNativeData() );
-       }
-
-       /**
-        * @covers WikiPage::getText
-        */
-       public function testGetText() {
-               $this->hideDeprecated( "WikiPage::getText" );
-
-               $page = $this->newPage( "WikiPageTest_testGetText" );
-
-               $text = $page->getText();
-               $this->assertFalse( $text );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-
-               $text = $page->getText();
-               $this->assertEquals( "some text", $text );
-       }
-
-       /**
-        * @covers WikiPage::getRawText
-        */
-       public function testGetRawText() {
-               $this->hideDeprecated( "WikiPage::getRawText" );
-
-               $page = $this->newPage( "WikiPageTest_testGetRawText" );
-
-               $text = $page->getRawText();
-               $this->assertFalse( $text );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-
-               $text = $page->getRawText();
-               $this->assertEquals( "some text", $text );
-       }
-
-       /**
-        * @covers WikiPage::getContentModel
-        */
-       public function testGetContentModel() {
-               global $wgContentHandlerUseDB;
-
-               if ( !$wgContentHandlerUseDB ) {
-                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
-               }
-
-               $page = $this->createPage(
-                       "WikiPageTest_testGetContentModel",
-                       "some text",
-                       CONTENT_MODEL_JAVASCRIPT
-               );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
-       }
-
-       /**
-        * @covers WikiPage::getContentHandler
-        */
-       public function testGetContentHandler() {
-               global $wgContentHandlerUseDB;
-
-               if ( !$wgContentHandlerUseDB ) {
-                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
-               }
-
-               $page = $this->createPage(
-                       "WikiPageTest_testGetContentHandler",
-                       "some text",
-                       CONTENT_MODEL_JAVASCRIPT
-               );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
-       }
-
-       /**
-        * @covers WikiPage::exists
-        */
-       public function testExists() {
-               $page = $this->newPage( "WikiPageTest_testExists" );
-               $this->assertFalse( $page->exists() );
-
-               # -----------------
-               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-               $this->assertTrue( $page->exists() );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertTrue( $page->exists() );
-
-               # -----------------
-               $page->doDeleteArticle( "done testing" );
-               $this->assertFalse( $page->exists() );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertFalse( $page->exists() );
-       }
-
-       public static function provideHasViewableContent() {
-               return array(
-                       array( 'WikiPageTest_testHasViewableContent', false, true ),
-                       array( 'Special:WikiPageTest_testHasViewableContent', false ),
-                       array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
-                       array( 'Special:Userlogin', true ),
-                       array( 'MediaWiki:help', true ),
-               );
-       }
-
-       /**
-        * @dataProvider provideHasViewableContent
-        * @covers WikiPage::hasViewableContent
-        */
-       public function testHasViewableContent( $title, $viewable, $create = false ) {
-               $page = $this->newPage( $title );
-               $this->assertEquals( $viewable, $page->hasViewableContent() );
-
-               if ( $create ) {
-                       $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
-                       $this->assertTrue( $page->hasViewableContent() );
-
-                       $page = new WikiPage( $page->getTitle() );
-                       $this->assertTrue( $page->hasViewableContent() );
-               }
-       }
-
-       public static function provideGetRedirectTarget() {
-               return array(
-                       array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT, "hello world", null ),
-                       array(
-                               'WikiPageTest_testGetRedirectTarget_2',
-                               CONTENT_MODEL_WIKITEXT,
-                               "#REDIRECT [[hello world]]",
-                               "Hello world"
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider provideGetRedirectTarget
-        * @covers WikiPage::getRedirectTarget
-        */
-       public function testGetRedirectTarget( $title, $model, $text, $target ) {
-               $this->setMwGlobals( array(
-                       'wgCapitalLinks' => true,
-               ) );
-
-               $page = $this->createPage( $title, $text, $model );
-
-               # sanity check, because this test seems to fail for no reason for some people.
-               $c = $page->getContent();
-               $this->assertEquals( 'WikitextContent', get_class( $c ) );
-
-               # now, test the actual redirect
-               $t = $page->getRedirectTarget();
-               $this->assertEquals( $target, is_null( $t ) ? null : $t->getPrefixedText() );
-       }
-
-       /**
-        * @dataProvider provideGetRedirectTarget
-        * @covers WikiPage::isRedirect
-        */
-       public function testIsRedirect( $title, $model, $text, $target ) {
-               $page = $this->createPage( $title, $text, $model );
-               $this->assertEquals( !is_null( $target ), $page->isRedirect() );
-       }
-
-       public static function provideIsCountable() {
-               return array(
-
-                       // any
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               '',
-                               'any',
-                               true
-                       ),
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo',
-                               'any',
-                               true
-                       ),
-
-                       // comma
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo',
-                               'comma',
-                               false
-                       ),
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo, bar',
-                               'comma',
-                               true
-                       ),
-
-                       // link
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo',
-                               'link',
-                               false
-                       ),
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo [[bar]]',
-                               'link',
-                               true
-                       ),
-
-                       // redirects
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               '#REDIRECT [[bar]]',
-                               'any',
-                               false
-                       ),
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               '#REDIRECT [[bar]]',
-                               'comma',
-                               false
-                       ),
-                       array( 'WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               '#REDIRECT [[bar]]',
-                               'link',
-                               false
-                       ),
-
-                       // not a content namespace
-                       array( 'Talk:WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo',
-                               'any',
-                               false
-                       ),
-                       array( 'Talk:WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo, bar',
-                               'comma',
-                               false
-                       ),
-                       array( 'Talk:WikiPageTest_testIsCountable',
-                               CONTENT_MODEL_WIKITEXT,
-                               'Foo [[bar]]',
-                               'link',
-                               false
-                       ),
-
-                       // not a content namespace, different model
-                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
-                               null,
-                               'Foo',
-                               'any',
-                               false
-                       ),
-                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
-                               null,
-                               'Foo, bar',
-                               'comma',
-                               false
-                       ),
-                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
-                               null,
-                               'Foo [[bar]]',
-                               'link',
-                               false
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider provideIsCountable
-        * @covers WikiPage::isCountable
-        */
-       public function testIsCountable( $title, $model, $text, $mode, $expected ) {
-               global $wgContentHandlerUseDB;
-
-               $this->setMwGlobals( 'wgArticleCountMethod', $mode );
-
-               $title = Title::newFromText( $title );
-
-               if ( !$wgContentHandlerUseDB
-                       && $model
-                       && ContentHandler::getDefaultModelFor( $title ) != $model
-               ) {
-                       $this->markTestSkipped( "Can not use non-default content model $model for "
-                               . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." );
-               }
-
-               $page = $this->createPage( $title, $text, $model );
-
-               $editInfo = $page->prepareContentForEdit( $page->getContent() );
-
-               $v = $page->isCountable();
-               $w = $page->isCountable( $editInfo );
-
-               $this->assertEquals(
-                       $expected,
-                       $v,
-                       "isCountable( null ) returned unexpected value " . var_export( $v, true )
-                               . " instead of " . var_export( $expected, true )
-                       . " in mode `$mode` for text \"$text\""
-               );
-
-               $this->assertEquals(
-                       $expected,
-                       $w,
-                       "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
-                               . " instead of " . var_export( $expected, true )
-                       . " in mode `$mode` for text \"$text\""
-               );
-       }
-
-       public static function provideGetParserOutput() {
-               return array(
-                       array( CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>" ),
-                       // @todo more...?
-               );
-       }
-
-       /**
-        * @dataProvider provideGetParserOutput
-        * @covers WikiPage::getParserOutput
-        */
-       public function testGetParserOutput( $model, $text, $expectedHtml ) {
-               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
-
-               $opt = $page->makeParserOptions( 'canonical' );
-               $po = $page->getParserOutput( $opt );
-               $text = $po->getText();
-
-               $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
-               $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
-
-               $this->assertEquals( $expectedHtml, $text );
-
-               return $po;
-       }
-
-       /**
-        * @covers WikiPage::getParserOutput
-        */
-       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." );
-       }
-
-       /**
-        * @covers WikiPage::getParserOutput
-        */
-       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." );
-       }
-
-       public static $sections =
-
-               "Intro
-
-== stuff ==
-hello world
-
-== test ==
-just a test
-
-== foo ==
-more stuff
-";
-
-       public function dataReplaceSection() {
-               //NOTE: assume the Help namespace to contain wikitext
-               return array(
-                       array( 'Help:WikiPageTest_testReplaceSection',
-                               CONTENT_MODEL_WIKITEXT,
-                               WikiPageTest::$sections,
-                               "0",
-                               "No more",
-                               null,
-                               trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) )
-                       ),
-                       array( 'Help:WikiPageTest_testReplaceSection',
-                               CONTENT_MODEL_WIKITEXT,
-                               WikiPageTest::$sections,
-                               "",
-                               "No more",
-                               null,
-                               "No more"
-                       ),
-                       array( 'Help:WikiPageTest_testReplaceSection',
-                               CONTENT_MODEL_WIKITEXT,
-                               WikiPageTest::$sections,
-                               "2",
-                               "== TEST ==\nmore fun",
-                               null,
-                               trim( preg_replace( '/^== test ==.*== foo ==/sm',
-                                       "== TEST ==\nmore fun\n\n== foo ==",
-                                       WikiPageTest::$sections ) )
-                       ),
-                       array( 'Help:WikiPageTest_testReplaceSection',
-                               CONTENT_MODEL_WIKITEXT,
-                               WikiPageTest::$sections,
-                               "8",
-                               "No more",
-                               null,
-                               trim( WikiPageTest::$sections )
-                       ),
-                       array( 'Help:WikiPageTest_testReplaceSection',
-                               CONTENT_MODEL_WIKITEXT,
-                               WikiPageTest::$sections,
-                               "new",
-                               "No more",
-                               "New",
-                               trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more"
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider dataReplaceSection
-        * @covers WikiPage::replaceSection
-        */
-       public function testReplaceSection( $title, $model, $text, $section, $with,
-               $sectionTitle, $expected
-       ) {
-               $this->hideDeprecated( "WikiPage::replaceSection" );
-
-               $page = $this->createPage( $title, $text, $model );
-               $text = $page->replaceSection( $section, $with, $sectionTitle );
-               $text = trim( $text );
-
-               $this->assertEquals( $expected, $text );
-       }
-
-       /**
-        * @dataProvider dataReplaceSection
-        * @covers WikiPage::replaceSectionContent
-        */
-       public function testReplaceSectionContent( $title, $model, $text, $section,
-               $with, $sectionTitle, $expected
-       ) {
-               $page = $this->createPage( $title, $text, $model );
-
-               $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
-               $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
-
-               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
-       }
-
-       /**
-        * @dataProvider dataReplaceSection
-        * @covers WikiPage::replaceSectionAtRev
-        */
-       public function testReplaceSectionAtRev( $title, $model, $text, $section,
-               $with, $sectionTitle, $expected
-       ) {
-               $page = $this->createPage( $title, $text, $model );
-               $baseRevId = $page->getLatest();
-
-               $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
-               $c = $page->replaceSectionAtRev( $section, $content, $sectionTitle, $baseRevId );
-
-               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
-       }
-
-       /* @todo FIXME: fix this!
-       public function testGetUndoText() {
-       $this->checkHasDiff3();
-
-       $text = "one";
-       $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
-       $rev1 = $page->getRevision();
-
-       $text .= "\n\ntwo";
-       $page->doEditContent(
-               ContentHandler::makeContent( $text, $page->getTitle() ),
-               "adding section two"
-       );
-       $rev2 = $page->getRevision();
-
-       $text .= "\n\nthree";
-       $page->doEditContent(
-               ContentHandler::makeContent( $text, $page->getTitle() ),
-               "adding section three"
-       );
-       $rev3 = $page->getRevision();
-
-       $text .= "\n\nfour";
-       $page->doEditContent(
-               ContentHandler::makeContent( $text, $page->getTitle() ),
-               "adding section four"
-       );
-       $rev4 = $page->getRevision();
-
-       $text .= "\n\nfive";
-       $page->doEditContent(
-               ContentHandler::makeContent( $text, $page->getTitle() ),
-               "adding section five"
-       );
-       $rev5 = $page->getRevision();
-
-       $text .= "\n\nsix";
-       $page->doEditContent(
-               ContentHandler::makeContent( $text, $page->getTitle() ),
-               "adding section six"
-       );
-       $rev6 = $page->getRevision();
-
-       $undo6 = $page->getUndoText( $rev6 );
-       if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
-       $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
-
-       $undo3 = $page->getUndoText( $rev4, $rev2 );
-       if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
-       $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
-
-       $undo2 = $page->getUndoText( $rev2 );
-       if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
-       $this->assertEquals( "one\n\nfive", $undo2 );
-       }
-        */
-
-       /**
-        * @todo FIXME: this is a better rollback test than the one below, but it
-        * keeps failing in jenkins for some reason.
-        */
-       public function broken_testDoRollback() {
-               $admin = new User();
-               $admin->setName( "Admin" );
-
-               $text = "one";
-               $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
-                       "section one", EDIT_NEW, false, $admin );
-
-               $user1 = new User();
-               $user1->setName( "127.0.1.11" );
-               $text .= "\n\ntwo";
-               $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
-                       "adding section two", 0, false, $user1 );
-
-               $user2 = new User();
-               $user2->setName( "127.0.2.13" );
-               $text .= "\n\nthree";
-               $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
-                       "adding section three", 0, false, $user2 );
-
-               # we are having issues with doRollback spuriously failing. Apparently
-               # the last revision somehow goes missing or not committed under some
-               # circumstances. So, make sure the last revision has the right user name.
-               $dbr = wfGetDB( DB_SLAVE );
-               $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) );
-
-               $page = new WikiPage( $page->getTitle() );
-               $rev3 = $page->getRevision();
-               $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
-
-               $rev2 = $rev3->getPrevious();
-               $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
-
-               $rev1 = $rev2->getPrevious();
-               $this->assertEquals( 'Admin', $rev1->getUserText() );
-
-               # now, try the actual rollback
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
-               $token = $admin->getEditToken(
-                       array( $page->getTitle()->getPrefixedText(), $user2->getName() ),
-                       null
-               );
-               $errors = $page->doRollback(
-                       $user2->getName(),
-                       "testing revert",
-                       $token,
-                       false,
-                       $details,
-                       $admin
-               );
-
-               if ( $errors ) {
-                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
-                               . ";\n" . print_r( $details, true ) );
-               }
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
-                       "rollback did not revert to the correct revision" );
-               $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
-       }
-
-       /**
-        * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
-        * @covers WikiPage::doRollback
-        */
-       public function testDoRollback() {
-               $admin = new User();
-               $admin->setName( "Admin" );
-
-               $text = "one";
-               $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEditContent(
-                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "section one",
-                       EDIT_NEW,
-                       false,
-                       $admin
-               );
-               $rev1 = $page->getRevision();
-
-               $user1 = new User();
-               $user1->setName( "127.0.1.11" );
-               $text .= "\n\ntwo";
-               $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent(
-                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "adding section two",
-                       0,
-                       false,
-                       $user1
-               );
-
-               # now, try the rollback
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
-               $token = $admin->getEditToken(
-                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
-                       null
-               );
-               $errors = $page->doRollback(
-                       $user1->getName(),
-                       "testing revert",
-                       $token,
-                       false,
-                       $details,
-                       $admin
-               );
-
-               if ( $errors ) {
-                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
-                               . ";\n" . print_r( $details, true ) );
-               }
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
-                       "rollback did not revert to the correct revision" );
-               $this->assertEquals( "one", $page->getContent()->getNativeData() );
-       }
-
-       /**
-        * @covers WikiPage::doRollback
-        */
-       public function testDoRollbackFailureSameContent() {
-               $admin = new User();
-               $admin->setName( "Admin" );
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
-
-               $text = "one";
-               $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEditContent(
-                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "section one",
-                       EDIT_NEW,
-                       false,
-                       $admin
-               );
-               $rev1 = $page->getRevision();
-
-               $user1 = new User();
-               $user1->setName( "127.0.1.11" );
-               $user1->addGroup( "sysop" ); #XXX: make the test user a sysop...
-               $text .= "\n\ntwo";
-               $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent(
-                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "adding section two",
-                       0,
-                       false,
-                       $user1
-               );
-
-               # now, do a the rollback from the same user was doing the edit before
-               $resultDetails = array();
-               $token = $user1->getEditToken(
-                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
-                       null
-               );
-               $errors = $page->doRollback(
-                       $user1->getName(),
-                       "testing revert same user",
-                       $token,
-                       false,
-                       $resultDetails,
-                       $admin
-               );
-
-               $this->assertEquals( array(), $errors, "Rollback failed same user" );
-
-               # now, try the rollback
-               $resultDetails = array();
-               $token = $admin->getEditToken(
-                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
-                       null
-               );
-               $errors = $page->doRollback(
-                       $user1->getName(),
-                       "testing revert",
-                       $token,
-                       false,
-                       $resultDetails,
-                       $admin
-               );
-
-               $this->assertEquals( array( array( 'alreadyrolled', 'WikiPageTest testDoRollback',
-                       '127.0.1.11', 'Admin' ) ), $errors, "Rollback not failed" );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
-                       "rollback did not revert to the correct revision" );
-               $this->assertEquals( "one", $page->getContent()->getNativeData() );
-       }
-
-       public static function provideGetAutosummary() {
-               return array(
-                       array(
-                               'Hello there, world!',
-                               '#REDIRECT [[Foo]]',
-                               0,
-                               '/^Redirected page .*Foo/'
-                       ),
-
-                       array(
-                               null,
-                               'Hello world!',
-                               EDIT_NEW,
-                               '/^Created page .*Hello/'
-                       ),
-
-                       array(
-                               'Hello there, world!',
-                               '',
-                               0,
-                               '/^Blanked/'
-                       ),
-
-                       array(
-                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
-                               eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
-                               voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
-                               clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
-                               'Hello world!',
-                               0,
-                               '/^Replaced .*Hello/'
-                       ),
-
-                       array(
-                               'foo',
-                               'bar',
-                               0,
-                               '/^$/'
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider provideGetAutoSummary
-        * @covers WikiPage::getAutosummary
-        */
-       public function testGetAutosummary( $old, $new, $flags, $expected ) {
-               $this->hideDeprecated( "WikiPage::getAutosummary" );
-
-               $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
-
-               $summary = $page->getAutosummary( $old, $new, $flags );
-
-               $this->assertTrue( (bool)preg_match( $expected, $summary ),
-                       "Autosummary didn't match expected pattern $expected: $summary" );
-       }
-
-       public static function provideGetAutoDeleteReason() {
-               return array(
-                       array(
-                               array(),
-                               false,
-                               false
-                       ),
-
-                       array(
-                               array(
-                                       array( "first edit", null ),
-                               ),
-                               "/first edit.*only contributor/",
-                               false
-                       ),
-
-                       array(
-                               array(
-                                       array( "first edit", null ),
-                                       array( "second edit", null ),
-                               ),
-                               "/second edit.*only contributor/",
-                               true
-                       ),
-
-                       array(
-                               array(
-                                       array( "first edit", "127.0.2.22" ),
-                                       array( "second edit", "127.0.3.33" ),
-                               ),
-                               "/second edit/",
-                               true
-                       ),
-
-                       array(
-                               array(
-                                       array(
-                                               "first edit: "
-                                                       . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
-                                                       . " nonumy eirmod tempor invidunt ut labore et dolore magna "
-                                                       . "aliquyam erat, sed diam voluptua. At vero eos et accusam "
-                                                       . "et justo duo dolores et ea rebum. Stet clita kasd gubergren, "
-                                                       . "no sea  takimata sanctus est Lorem ipsum dolor sit amet.'",
-                                               null
-                                       ),
-                               ),
-                               '/first edit:.*\.\.\."/',
-                               false
-                       ),
-
-                       array(
-                               array(
-                                       array( "first edit", "127.0.2.22" ),
-                                       array( "", "127.0.3.33" ),
-                               ),
-                               "/before blanking.*first edit/",
-                               true
-                       ),
-
-               );
-       }
-
-       /**
-        * @dataProvider provideGetAutoDeleteReason
-        * @covers WikiPage::getAutoDeleteReason
-        */
-       public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
-               global $wgUser;
-
-               //NOTE: assume Help namespace to contain wikitext
-               $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
-
-               $c = 1;
-
-               foreach ( $edits as $edit ) {
-                       $user = new User();
-
-                       if ( !empty( $edit[1] ) ) {
-                               $user->setName( $edit[1] );
-                       } else {
-                               $user = $wgUser;
-                       }
-
-                       $content = ContentHandler::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() );
-
-                       $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user );
-
-                       $c += 1;
-               }
-
-               $reason = $page->getAutoDeleteReason( $hasHistory );
-
-               if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) {
-                       $this->assertEquals( $expectedResult, $reason );
-               } else {
-                       $this->assertTrue( (bool)preg_match( $expectedResult, $reason ),
-                               "Autosummary didn't match expected pattern $expectedResult: $reason" );
-               }
-
-               $this->assertEquals( $expectedHistory, $hasHistory,
-                       "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
-
-               $page->doDeleteArticle( "done" );
-       }
-
-       public static function providePreSaveTransform() {
-               return array(
-                       array( 'hello this is ~~~',
-                               "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
-                       ),
-                       array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
-                               'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider providePreSaveTransform
-        * @covers WikiPage::preSaveTransform
-        */
-       public function testPreSaveTransform( $text, $expected ) {
-               $this->hideDeprecated( 'WikiPage::preSaveTransform' );
-               $user = new User();
-               $user->setName( "127.0.0.1" );
-
-               //NOTE: assume Help namespace to contain wikitext
-               $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" );
-               $text = $page->preSaveTransform( $text, $user );
-
-               $this->assertEquals( $expected, $text );
-       }
-
-       /**
-        * @covers WikiPage::factory
-        */
-       public function testWikiPageFactory() {
-               $title = Title::makeTitle( NS_FILE, 'Someimage.png' );
-               $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiFilePage', get_class( $page ) );
-
-               $title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' );
-               $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
-
-               $title = Title::makeTitle( NS_MAIN, 'SomePage' );
-               $page = WikiPage::factory( $title );
-               $this->assertEquals( 'WikiPage', get_class( $page ) );
-       }
-}
diff --git a/tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php b/tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php
deleted file mode 100644 (file)
index 3db7628..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-/**
- * @group ContentHandler
- * @group Database
- * ^--- important, causes temporary tables to be used instead of the real database
- */
-class WikiPageTestContentHandlerUseDB extends WikiPageTest {
-
-       protected function setUp() {
-               parent::setUp();
-               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $page_table = $dbw->tableName( 'page' );
-               $revision_table = $dbw->tableName( 'revision' );
-               $archive_table = $dbw->tableName( 'archive' );
-
-               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
-                       $dbw->query( "alter table $page_table drop column page_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
-               }
-       }
-
-       /**
-        * @covers WikiPage::getContentModel
-        */
-       public function testGetContentModel() {
-               $page = $this->createPage(
-                       "WikiPageTest_testGetContentModel",
-                       "some text",
-                       CONTENT_MODEL_JAVASCRIPT
-               );
-
-               $page = new WikiPage( $page->getTitle() );
-
-               // NOTE: since the content model is not recorded in the database,
-               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
-               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
-       }
-
-       /**
-        * @covers WikiPage::getContentHandler
-        */
-       public function testGetContentHandler() {
-               $page = $this->createPage(
-                       "WikiPageTest_testGetContentHandler",
-                       "some text",
-                       CONTENT_MODEL_JAVASCRIPT
-               );
-
-               // NOTE: since the content model is not recorded in the database,
-               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
-       }
-}
diff --git a/tests/phpunit/includes/XmlTypeCheckTest.php b/tests/phpunit/includes/XmlTypeCheckTest.php
deleted file mode 100644 (file)
index 8d6f1ed..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-/**
- * PHPUnit tests for XMLTypeCheck.
- * @author physikerwelt
- * @group Xml
- * @covers XMLTypeCheck
- */
-class XmlTypeCheckTest extends MediaWikiTestCase {
-       const WELL_FORMED_XML = "<root><child /></root>";
-       const MAL_FORMED_XML = "<root><child /></error>";
-
-       /**
-        * @covers XMLTypeCheck::newFromString
-        * @covers XMLTypeCheck::getRootElement
-        */
-       public function testWellFormedXML() {
-               $testXML = XmlTypeCheck::newFromString( self::WELL_FORMED_XML );
-               $this->assertTrue( $testXML->wellFormed );
-               $this->assertEquals( 'root', $testXML->getRootElement() );
-       }
-
-       /**
-        * @covers XMLTypeCheck::newFromString
-        */
-       public function testMalFormedXML() {
-               $testXML = XmlTypeCheck::newFromString( self::MAL_FORMED_XML );
-               $this->assertFalse( $testXML->wellFormed );
-       }
-
-}
index 9a552fa..8c27b10 100644 (file)
@@ -46,6 +46,17 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                $this->apiContext = new ApiTestContext();
        }
 
+       protected function tearDown() {
+               // Avoid leaking session over tests
+               if ( session_id() != '' ) {
+                       global $wgUser;
+                       $wgUser->logout();
+                       session_destroy();
+               }
+
+               parent::tearDown();
+       }
+
        /**
         * Edits or creates a page/revision
         * @param string $pageName Page title
index 5170856..c00545f 100644 (file)
@@ -13,6 +13,13 @@ class ApiFormatWddxTest extends ApiFormatTestBase {
                        $this->markTestSkipped( "Function 'wddx_deserialize' not exist, skipping." );
                }
 
+               if ( wfIsHHVM() && false === strpos( wddx_serialize_value( "Test for &" ), '&amp;' ) ) {
+                       # Some version of HHVM fails to escape the ampersand
+                       #
+                       # https://phabricator.wikimedia.org/T75531
+                       $this->markTestSkipped( "wddx_deserialize is bugged under this version of HHVM" );
+               }
+
                $data = $this->apiRequest( 'wddx', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
 
                $this->assertInternalType( 'array', wddx_deserialize( $data ) );
index d4151a5..0df8d40 100644 (file)
@@ -6,48 +6,80 @@
  */
 class JsonContentTest extends MediaWikiLangTestCase {
 
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgWellFormedXml', true );
+       }
+
        public static function provideValidConstruction() {
                return array(
-                       array( 'foo', CONTENT_MODEL_JSON, false, null ),
-                       array( FormatJson::encode( array() ), CONTENT_MODEL_JSON, true, array() ),
-                       array( FormatJson::encode( array( 'foo' ) ), CONTENT_MODEL_JSON, true, array( 'foo' ) ),
+                       array( 'foo', false, null ),
+                       array( '{}', true, (object)array() ),
+                       array( '{ "0": "bar" }', true, (object)array( 'bar' ) ),
                );
        }
 
        /**
         * @dataProvider provideValidConstruction
         */
-       public function testValidConstruct( $text, $modelId, $isValid, $expected ) {
-               $obj = new JsonContent( $text, $modelId );
+       public function testIsValid( $text, $isValid, $expected ) {
+               $obj = new JsonContent( $text, CONTENT_MODEL_JSON );
                $this->assertEquals( $isValid, $obj->isValid() );
-               $this->assertEquals( $expected, $obj->getJsonData() );
+               $this->assertEquals( $expected, $obj->getData()->getValue() );
        }
 
        public static function provideDataToEncode() {
                return array(
-                       array( array() ),
-                       array( array( 'foo' ) ),
-                       array( array( 'foo', 'bar' ) ),
-                       array( array( 'baz' => 'foo', 'bar' ) ),
-                       array( array( 'baz' => 1000, 'bar' ) ),
+                       array(
+                               // Round-trip empty array
+                               '[]',
+                               '[]',
+                       ),
+                       array(
+                               // Round-trip empty object
+                               '{}',
+                               '{}',
+                       ),
+                       array(
+                               // Round-trip empty array/object (nested)
+                               '{ "foo": {}, "bar": [] }',
+                               "{\n    \"foo\": {},\n    \"bar\": []\n}",
+                       ),
+                       array(
+                               '{ "foo": "bar" }',
+                               "{\n    \"foo\": \"bar\"\n}",
+                       ),
+                       array(
+                               '{ "foo": 1000 }',
+                               "{\n    \"foo\": 1000\n}",
+                       ),
+                       array(
+                               '{ "foo": 1000, "0": "bar" }',
+                               "{\n    \"foo\": 1000,\n    \"0\": \"bar\"\n}",
+                       ),
                );
        }
 
        /**
         * @dataProvider provideDataToEncode
         */
-       public function testBeautifyUsesFormatJson( $data ) {
-               $obj = new JsonContent( FormatJson::encode( $data ) );
-               $this->assertEquals( FormatJson::encode( $data, true ), $obj->beautifyJSON() );
+       public function testBeautifyJson( $input, $beautified ) {
+               $obj = new JsonContent( $input );
+               $this->assertEquals( $beautified, $obj->beautifyJSON() );
        }
 
        /**
         * @dataProvider provideDataToEncode
         */
-       public function testPreSaveTransform( $data ) {
-               $obj = new JsonContent( FormatJson::encode( $data ) );
-               $newObj = $obj->preSaveTransform( $this->getMockTitle(), $this->getMockUser(), $this->getMockParserOptions() );
-               $this->assertTrue( $newObj->equals( new JsonContent( FormatJson::encode( $data, true ) ) ) );
+       public function testPreSaveTransform( $input, $transformed ) {
+               $obj = new JsonContent( $input );
+               $newObj = $obj->preSaveTransform(
+                       $this->getMockTitle(),
+                       $this->getMockUser(),
+                       $this->getMockParserOptions()
+               );
+               $this->assertTrue( $newObj->equals( new JsonContent( $transformed ) ) );
        }
 
        private function getMockTitle() {
@@ -70,34 +102,38 @@ class JsonContentTest extends MediaWikiLangTestCase {
        public static function provideDataAndParserText() {
                return array(
                        array(
-                               array(),
-                               '<table class="mw-json"><tbody></tbody></table>'
+                               (object)array(),
+                               '<table class="mw-json"><tbody><tr><td class="mw-json-empty">Empty object</td></tr>' .
+                               '</tbody></table>'
                        ),
                        array(
-                               array( 'foo' ),
-                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;foo&quot;</td></tr></tbody></table>'
+                               (object)array( 'foo' ),
+                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;foo&quot;</td></tr>' .
+                               '</tbody></table>'
                        ),
                        array(
-                               array( 'foo', 'bar' ),
+                               (object)array( 'foo', 'bar' ),
                                '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;foo&quot;</td></tr>' .
                                "\n" .
                                '<tr><th>1</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
                        ),
                        array(
-                               array( 'baz' => 'foo', 'bar' ),
+                               (object)array( 'baz' => 'foo', 'bar' ),
                                '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">&quot;foo&quot;</td></tr>' .
                                "\n" .
                                '<tr><th>0</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
                        ),
                        array(
-                               array( 'baz' => 1000, 'bar' ),
+                               (object)array( 'baz' => 1000, 'bar' ),
                                '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">1000</td></tr>' .
                                "\n" .
                                '<tr><th>0</th><td class="value">&quot;bar&quot;</td></tr></tbody></table>'
                        ),
                        array(
-                               array( '<script>alert("evil!")</script>'),
-                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;&lt;script&gt;alert(&quot;evil!&quot;)&lt;/script&gt;&quot;</td></tr></tbody></table>',
+                               (object)array( '<script>alert("evil!")</script>'),
+                               '<table class="mw-json"><tbody><tr><th>0</th><td class="value">&quot;' .
+                               '&lt;script&gt;alert(&quot;evil!&quot;)&lt;/script&gt;&quot;' .
+                               '</td></tr></tbody></table>',
                        ),
                );
        }
diff --git a/tests/phpunit/includes/context/RequestContextTest.php b/tests/phpunit/includes/context/RequestContextTest.php
new file mode 100644 (file)
index 0000000..a9e5be2
--- /dev/null
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * @group Database
+ * @group RequestContext
+ */
+class RequestContextTest extends MediaWikiTestCase {
+
+       /**
+        * Test the relationship between title and wikipage in RequestContext
+        * @covers RequestContext::getWikiPage
+        * @covers RequestContext::getTitle
+        */
+       public function testWikiPageTitle() {
+               $context = new RequestContext();
+
+               $curTitle = Title::newFromText( "A" );
+               $context->setTitle( $curTitle );
+               $this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
+                       "When a title is first set WikiPage should be created on-demand for that title." );
+
+               $curTitle = Title::newFromText( "B" );
+               $context->setWikiPage( WikiPage::factory( $curTitle ) );
+               $this->assertTrue( $curTitle->equals( $context->getTitle() ),
+                       "Title must be updated when a new WikiPage is provided." );
+
+               $curTitle = Title::newFromText( "C" );
+               $context->setTitle( $curTitle );
+               $this->assertTrue(
+                       $curTitle->equals( $context->getWikiPage()->getTitle() ),
+                       "When a title is updated the WikiPage should be purged "
+                               . "and recreated on-demand with the new title."
+               );
+       }
+
+       /**
+        * @covers RequestContext::importScopedSession
+        */
+       public function testImportScopedSession() {
+               $context = RequestContext::getMain();
+
+               $oInfo = $context->exportSession();
+               $this->assertEquals( '127.0.0.1', $oInfo['ip'], "Correct initial IP address." );
+               $this->assertEquals( 0, $oInfo['userId'], "Correct initial user ID." );
+
+               $user = User::newFromName( 'UnitTestContextUser' );
+               $user->addToDatabase();
+
+               $sinfo = array(
+                       'sessionId' => 'd612ee607c87e749ef14da4983a702cd',
+                       'userId' => $user->getId(),
+                       'ip' => '192.0.2.0',
+                       'headers' => array(
+                               'USER-AGENT' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0'
+                       )
+               );
+               // importScopedSession() sets these variables
+               $this->setMwGlobals( array(
+                       'wgUser' => new User,
+                       'wgRequest' => new FauxRequest,
+               ) );
+               $sc = RequestContext::importScopedSession( $sinfo ); // load new context
+
+               $info = $context->exportSession();
+               $this->assertEquals( $sinfo['ip'], $info['ip'], "Correct IP address." );
+               $this->assertEquals( $sinfo['headers'], $info['headers'], "Correct headers." );
+               $this->assertEquals( $sinfo['sessionId'], $info['sessionId'], "Correct session ID." );
+               $this->assertEquals( $sinfo['userId'], $info['userId'], "Correct user ID." );
+               $this->assertEquals(
+                       $sinfo['ip'],
+                       $context->getRequest()->getIP(),
+                       "Correct context IP address."
+               );
+               $this->assertEquals(
+                       $sinfo['headers'],
+                       $context->getRequest()->getAllHeaders(),
+                       "Correct context headers."
+               );
+               $this->assertEquals( $sinfo['sessionId'], session_id(), "Correct context session ID." );
+               $this->assertEquals( true, $context->getUser()->isLoggedIn(), "Correct context user." );
+               $this->assertEquals( $sinfo['userId'], $context->getUser()->getId(), "Correct context user ID." );
+               $this->assertEquals(
+                       'UnitTestContextUser',
+                       $context->getUser()->getName(),
+                       "Correct context user name."
+               );
+
+               unset( $sc ); // restore previous context
+
+               $info = $context->exportSession();
+               $this->assertEquals( $oInfo['ip'], $info['ip'], "Correct restored IP address." );
+               $this->assertEquals( $oInfo['headers'], $info['headers'], "Correct restored headers." );
+               $this->assertEquals( $oInfo['sessionId'], $info['sessionId'], "Correct restored session ID." );
+               $this->assertEquals( $oInfo['userId'], $info['userId'], "Correct restored user ID." );
+       }
+}
diff --git a/tests/phpunit/includes/deferred/LinksUpdateTest.php b/tests/phpunit/includes/deferred/LinksUpdateTest.php
new file mode 100644 (file)
index 0000000..02f6b2a
--- /dev/null
@@ -0,0 +1,266 @@
+<?php
+
+/**
+ * @group Database
+ * ^--- make sure temporary tables are used.
+ */
+class LinksUpdateTest extends MediaWikiTestCase {
+
+       function __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->tablesUsed = array_merge( $this->tablesUsed,
+                       array(
+                               'interwiki',
+                               'page_props',
+                               'pagelinks',
+                               'categorylinks',
+                               'langlinks',
+                               'externallinks',
+                               'imagelinks',
+                               'templatelinks',
+                               'iwlinks'
+                       )
+               );
+       }
+
+       protected function setUp() {
+               parent::setUp();
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->replace(
+                       'interwiki',
+                       array( 'iw_prefix' ),
+                       array(
+                               'iw_prefix' => 'linksupdatetest',
+                               'iw_url' => 'http://testing.com/wiki/$1',
+                               'iw_api' => 'http://testing.com/w/api.php',
+                               'iw_local' => 0,
+                               'iw_trans' => 0,
+                               'iw_wikiid' => 'linksupdatetest',
+                       )
+               );
+       }
+
+       protected function makeTitleAndParserOutput( $name, $id ) {
+               $t = Title::newFromText( $name );
+               $t->mArticleID = $id; # XXX: this is fugly
+
+               $po = new ParserOutput();
+               $po->setTitleText( $t->getPrefixedText() );
+
+               return array( $t, $po );
+       }
+
+       /**
+        * @covers ParserOutput::addLink
+        */
+       public function testUpdate_pagelinks() {
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addLink( Title::newFromText( "Foo" ) );
+               $po->addLink( Title::newFromText( "Special:Foo" ) ); // special namespace should be ignored
+               $po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
+               $po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
+
+               $update = $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'pagelinks',
+                       'pl_namespace,
+                       pl_title',
+                       'pl_from = 111',
+                       array( array( NS_MAIN, 'Foo' ) )
+               );
+               $this->assertArrayEquals( array(
+                       Title::makeTitle( NS_MAIN, 'Foo' ),  // newFromText doesn't yield the same internal state....
+               ), $update->getAddedLinks() );
+
+               $po = new ParserOutput();
+               $po->setTitleText( $t->getPrefixedText() );
+
+               $po->addLink( Title::newFromText( "Bar" ) );
+               $po->addLink( Title::newFromText( "Talk:Bar" ) );
+
+               $update = $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'pagelinks',
+                       'pl_namespace,
+                       pl_title',
+                       'pl_from = 111',
+                       array(
+                               array( NS_MAIN, 'Bar' ),
+                               array( NS_TALK, 'Bar' ),
+                       )
+               );
+               $this->assertArrayEquals( array(
+                       Title::makeTitle( NS_MAIN, 'Bar' ),
+                       Title::makeTitle( NS_TALK, 'Bar' ),
+               ), $update->getAddedLinks() );
+               $this->assertArrayEquals( array(
+                       Title::makeTitle( NS_MAIN, 'Foo' ),
+               ), $update->getRemovedLinks() );
+       }
+
+       /**
+        * @covers ParserOutput::addExternalLink
+        */
+       public function testUpdate_externallinks() {
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addExternalLink( "http://testing.com/wiki/Foo" );
+
+               $this->assertLinksUpdate( $t, $po, 'externallinks', 'el_to, el_index', 'el_from = 111', array(
+                       array( 'http://testing.com/wiki/Foo', 'http://com.testing./wiki/Foo' ),
+               ) );
+       }
+
+       /**
+        * @covers ParserOutput::addCategory
+        */
+       public function testUpdate_categorylinks() {
+               /** @var ParserOutput $po */
+               $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
+
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addCategory( "Foo", "FOO" );
+
+               $this->assertLinksUpdate( $t, $po, 'categorylinks', 'cl_to, cl_sortkey', 'cl_from = 111', array(
+                       array( 'Foo', "FOO\nTESTING" ),
+               ) );
+       }
+
+       /**
+        * @covers ParserOutput::addInterwikiLink
+        */
+       public function testUpdate_iwlinks() {
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $target = Title::makeTitleSafe( NS_MAIN, "Foo", '', 'linksupdatetest' );
+               $po->addInterwikiLink( $target );
+
+               $this->assertLinksUpdate( $t, $po, 'iwlinks', 'iwl_prefix, iwl_title', 'iwl_from = 111', array(
+                       array( 'linksupdatetest', 'Foo' ),
+               ) );
+       }
+
+       /**
+        * @covers ParserOutput::addTemplate
+        */
+       public function testUpdate_templatelinks() {
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addTemplate( Title::newFromText( "Template:Foo" ), 23, 42 );
+
+               $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'templatelinks',
+                       'tl_namespace,
+                       tl_title',
+                       'tl_from = 111',
+                       array( array( NS_TEMPLATE, 'Foo' ) )
+               );
+       }
+
+       /**
+        * @covers ParserOutput::addImage
+        */
+       public function testUpdate_imagelinks() {
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addImage( "Foo.png" );
+
+               $this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
+                       array( 'Foo.png' ),
+               ) );
+       }
+
+       /**
+        * @covers ParserOutput::addLanguageLink
+        */
+       public function testUpdate_langlinks() {
+               $this->setMwGlobals( array(
+                       'wgCapitalLinks' => true,
+               ) );
+
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addLanguageLink( Title::newFromText( "en:Foo" )->getFullText() );
+
+               $this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
+                       array( 'En', 'Foo' ),
+               ) );
+       }
+
+       /**
+        * @covers ParserOutput::setProperty
+        */
+       public function testUpdate_page_props() {
+               global $wgPagePropsHaveSortkey;
+
+               /** @var ParserOutput $po */
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $fields = array( 'pp_propname', 'pp_value' );
+               $expected = array();
+
+               $po->setProperty( "bool", true );
+               $expected[] = array( "bool", true );
+
+               $po->setProperty( "float", 4.0 + 1.0 / 4.0 );
+               $expected[] = array( "float", 4.0 + 1.0 / 4.0 );
+
+               $po->setProperty( "int", -7 );
+               $expected[] = array( "int", -7 );
+
+               $po->setProperty( "string", "33 bar" );
+               $expected[] = array( "string", "33 bar" );
+
+               // compute expected sortkey values
+               if ( $wgPagePropsHaveSortkey ) {
+                       $fields[] = 'pp_sortkey';
+
+                       foreach ( $expected as &$row ) {
+                               $value = $row[1];
+
+                               if ( is_int( $value ) || is_float( $value ) || is_bool( $value ) ) {
+                                       $row[] = floatval( $value );
+                               } else {
+                                       $row[] = null;
+                               }
+                       }
+               }
+
+               $this->assertLinksUpdate( $t, $po, 'page_props', $fields, 'pp_page = 111', $expected );
+       }
+
+       public function testUpdate_page_props_without_sortkey() {
+               $this->setMwGlobals( 'wgPagePropsHaveSortkey', false );
+
+               $this->testUpdate_page_props();
+       }
+
+       // @todo test recursive, too!
+
+       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput,
+               $table, $fields, $condition, array $expectedRows
+       ) {
+               $update = new LinksUpdate( $title, $parserOutput );
+
+               //NOTE: make sure LinksUpdate does not generate warnings when called inside a transaction.
+               $update->beginTransaction();
+               $update->doUpdate();
+               $update->commitTransaction();
+
+               $this->assertSelect( $table, $fields, $condition, $expectedRows );
+               return $update;
+       }
+}
diff --git a/tests/phpunit/includes/deferred/SearchUpdateTest.php b/tests/phpunit/includes/deferred/SearchUpdateTest.php
new file mode 100644 (file)
index 0000000..c627537
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+class MockSearch extends SearchEngine {
+       public static $id;
+       public static $title;
+       public static $text;
+
+       public function __construct( $db ) {
+       }
+
+       public function update( $id, $title, $text ) {
+               self::$id = $id;
+               self::$title = $title;
+               self::$text = $text;
+       }
+}
+
+/**
+ * @group Search
+ * @group Database
+ */
+class SearchUpdateTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( 'wgSearchType', 'MockSearch' );
+       }
+
+       public function updateText( $text ) {
+               return trim( SearchUpdate::updateText( $text ) );
+       }
+
+       /**
+        * @covers SearchUpdate::updateText
+        */
+       public function testUpdateText() {
+               $this->assertEquals(
+                       'test',
+                       $this->updateText( '<div>TeSt</div>' ),
+                       'HTML stripped, text lowercased'
+               );
+
+               $this->assertEquals(
+                       'foo bar boz quux',
+                       $this->updateText( <<<EOT
+<table style="color:red; font-size:100px">
+       <tr class="scary"><td><div>foo</div></td><tr>bar</td></tr>
+       <tr><td>boz</td><tr>quux</td></tr>
+</table>
+EOT
+                       ), 'Stripping HTML tables' );
+
+               $this->assertEquals(
+                       'a b',
+                       $this->updateText( 'a > b' ),
+                       'Handle unclosed tags'
+               );
+
+               $text = str_pad( "foo <barbarbar \n", 10000, 'x' );
+
+               $this->assertNotEquals(
+                       '',
+                       $this->updateText( $text ),
+                       'Bug 18609'
+               );
+       }
+
+       /**
+        * @covers SearchUpdate::updateText
+        * @todo give this test a real name explaining what is being tested here
+        */
+       public function testBug32712() {
+               $text = "text „http://example.com“ text";
+               $result = $this->updateText( $text );
+               $processed = preg_replace( '/Q/u', 'Q', $result );
+               $this->assertTrue(
+                       $processed != '',
+                       'Link surrounded by unicode quotes should not fail UTF-8 validation'
+               );
+       }
+}
index dc5dc6a..d73f17d 100644 (file)
@@ -15,7 +15,7 @@ class MWExceptionHandlerTest extends MediaWikiTestCase {
                $refvar = 'value';
                try {
                        $array = array( 'a', 'b' );
-                       $object = new StdClass();
+                       $object = new stdClass();
                        self::helperThrowAnException( $array, $object, $refvar );
                } catch ( Exception $e ) {
                }
diff --git a/tests/phpunit/includes/externalstore/ExternalStoreTest.php b/tests/phpunit/includes/externalstore/ExternalStoreTest.php
new file mode 100644 (file)
index 0000000..07c2957
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+/**
+ * External Store tests
+ */
+
+class ExternalStoreTest extends MediaWikiTestCase {
+
+       /**
+        * @covers ExternalStore::fetchFromURL
+        */
+       public function testExternalFetchFromURL() {
+               $this->setMwGlobals( 'wgExternalStores', false );
+
+               $this->assertFalse(
+                       ExternalStore::fetchFromURL( 'FOO://cluster1/200' ),
+                       'Deny if wgExternalStores is not set to a non-empty array'
+               );
+
+               $this->setMwGlobals( 'wgExternalStores', array( 'FOO' ) );
+
+               $this->assertEquals(
+                       ExternalStore::fetchFromURL( 'FOO://cluster1/200' ),
+                       'Hello',
+                       'Allow FOO://cluster1/200'
+               );
+               $this->assertEquals(
+                       ExternalStore::fetchFromURL( 'FOO://cluster1/300/0' ),
+                       'Hello',
+                       'Allow FOO://cluster1/300/0'
+               );
+               # Assertions for r68900
+               $this->assertFalse(
+                       ExternalStore::fetchFromURL( 'ftp.example.org' ),
+                       'Deny domain ftp.example.org'
+               );
+               $this->assertFalse(
+                       ExternalStore::fetchFromURL( '/example.txt' ),
+                       'Deny path /example.txt'
+               );
+               $this->assertFalse(
+                       ExternalStore::fetchFromURL( 'http://' ),
+                       'Deny protocol http://'
+               );
+       }
+}
+
+class ExternalStoreFOO {
+
+       protected $data = array(
+               'cluster1' => array(
+                       '200' => 'Hello',
+                       '300' => array(
+                               'Hello', 'World',
+                       ),
+               ),
+       );
+
+       /**
+        * Fetch data from given URL
+        * @param string $url An url of the form FOO://cluster/id or FOO://cluster/id/itemid.
+        * @return mixed
+        */
+       function fetchFromURL( $url ) {
+               // Based on ExternalStoreDB
+               $path = explode( '/', $url );
+               $cluster = $path[2];
+               $id = $path[3];
+               if ( isset( $path[4] ) ) {
+                       $itemID = $path[4];
+               } else {
+                       $itemID = false;
+               }
+
+               if ( !isset( $this->data[$cluster][$id] ) ) {
+                       return null;
+               }
+
+               if ( $itemID !== false
+                       && is_array( $this->data[$cluster][$id] )
+                       && isset( $this->data[$cluster][$id][$itemID] )
+               ) {
+                       return $this->data[$cluster][$id][$itemID];
+               }
+
+               return $this->data[$cluster][$id];
+       }
+}
diff --git a/tests/phpunit/includes/filerepo/file/LocalFileTest.php b/tests/phpunit/includes/filerepo/file/LocalFileTest.php
new file mode 100644 (file)
index 0000000..5c5052e
--- /dev/null
@@ -0,0 +1,184 @@
+<?php
+
+/**
+ * These tests should work regardless of $wgCapitalLinks
+ * @group Database
+ * @todo Split tests into providers and test methods
+ */
+
+class LocalFileTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgCapitalLinks', true );
+
+               $info = array(
+                       'name' => 'test',
+                       'directory' => '/testdir',
+                       'url' => '/testurl',
+                       'hashLevels' => 2,
+                       'transformVia404' => false,
+                       'backend' => new FSFileBackend( array(
+                               'name' => 'local-backend',
+                               'wikiId' => wfWikiId(),
+                               'containerPaths' => array(
+                                       'cont1' => "/testdir/local-backend/tempimages/cont1",
+                                       'cont2' => "/testdir/local-backend/tempimages/cont2"
+                               )
+                       ) )
+               );
+               $this->repo_hl0 = new LocalRepo( array( 'hashLevels' => 0 ) + $info );
+               $this->repo_hl2 = new LocalRepo( array( 'hashLevels' => 2 ) + $info );
+               $this->repo_lc = new LocalRepo( array( 'initialCapital' => false ) + $info );
+               $this->file_hl0 = $this->repo_hl0->newFile( 'test!' );
+               $this->file_hl2 = $this->repo_hl2->newFile( 'test!' );
+               $this->file_lc = $this->repo_lc->newFile( 'test!' );
+       }
+
+       /**
+        * @covers File::getHashPath
+        */
+       public function testGetHashPath() {
+               $this->assertEquals( '', $this->file_hl0->getHashPath() );
+               $this->assertEquals( 'a/a2/', $this->file_hl2->getHashPath() );
+               $this->assertEquals( 'c/c4/', $this->file_lc->getHashPath() );
+       }
+
+       /**
+        * @covers File::getRel
+        */
+       public function testGetRel() {
+               $this->assertEquals( 'Test!', $this->file_hl0->getRel() );
+               $this->assertEquals( 'a/a2/Test!', $this->file_hl2->getRel() );
+               $this->assertEquals( 'c/c4/test!', $this->file_lc->getRel() );
+       }
+
+       /**
+        * @covers File::getUrlRel
+        */
+       public function testGetUrlRel() {
+               $this->assertEquals( 'Test%21', $this->file_hl0->getUrlRel() );
+               $this->assertEquals( 'a/a2/Test%21', $this->file_hl2->getUrlRel() );
+               $this->assertEquals( 'c/c4/test%21', $this->file_lc->getUrlRel() );
+       }
+
+       /**
+        * @covers File::getArchivePath
+        */
+       public function testGetArchivePath() {
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive',
+                       $this->file_hl0->getArchivePath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/a/a2',
+                       $this->file_hl2->getArchivePath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/!',
+                       $this->file_hl0->getArchivePath( '!' )
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/a/a2/!',
+                       $this->file_hl2->getArchivePath( '!' )
+               );
+       }
+
+       /**
+        * @covers File::getThumbPath
+        */
+       public function testGetThumbPath() {
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/Test!',
+                       $this->file_hl0->getThumbPath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/a/a2/Test!',
+                       $this->file_hl2->getThumbPath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/Test!/x',
+                       $this->file_hl0->getThumbPath( 'x' )
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/a/a2/Test!/x',
+                       $this->file_hl2->getThumbPath( 'x' )
+               );
+       }
+
+       /**
+        * @covers File::getArchiveUrl
+        */
+       public function testGetArchiveUrl() {
+               $this->assertEquals( '/testurl/archive', $this->file_hl0->getArchiveUrl() );
+               $this->assertEquals( '/testurl/archive/a/a2', $this->file_hl2->getArchiveUrl() );
+               $this->assertEquals( '/testurl/archive/%21', $this->file_hl0->getArchiveUrl( '!' ) );
+               $this->assertEquals( '/testurl/archive/a/a2/%21', $this->file_hl2->getArchiveUrl( '!' ) );
+       }
+
+       /**
+        * @covers File::getThumbUrl
+        */
+       public function testGetThumbUrl() {
+               $this->assertEquals( '/testurl/thumb/Test%21', $this->file_hl0->getThumbUrl() );
+               $this->assertEquals( '/testurl/thumb/a/a2/Test%21', $this->file_hl2->getThumbUrl() );
+               $this->assertEquals( '/testurl/thumb/Test%21/x', $this->file_hl0->getThumbUrl( 'x' ) );
+               $this->assertEquals( '/testurl/thumb/a/a2/Test%21/x', $this->file_hl2->getThumbUrl( 'x' ) );
+       }
+
+       /**
+        * @covers File::getArchiveVirtualUrl
+        */
+       public function testGetArchiveVirtualUrl() {
+               $this->assertEquals( 'mwrepo://test/public/archive', $this->file_hl0->getArchiveVirtualUrl() );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/a/a2',
+                       $this->file_hl2->getArchiveVirtualUrl()
+               );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/%21',
+                       $this->file_hl0->getArchiveVirtualUrl( '!' )
+               );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/a/a2/%21',
+                       $this->file_hl2->getArchiveVirtualUrl( '!' )
+               );
+       }
+
+       /**
+        * @covers File::getThumbVirtualUrl
+        */
+       public function testGetThumbVirtualUrl() {
+               $this->assertEquals( 'mwrepo://test/thumb/Test%21', $this->file_hl0->getThumbVirtualUrl() );
+               $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21', $this->file_hl2->getThumbVirtualUrl() );
+               $this->assertEquals(
+                       'mwrepo://test/thumb/Test%21/%21',
+                       $this->file_hl0->getThumbVirtualUrl( '!' )
+               );
+               $this->assertEquals(
+                       'mwrepo://test/thumb/a/a2/Test%21/%21',
+                       $this->file_hl2->getThumbVirtualUrl( '!' )
+               );
+       }
+
+       /**
+        * @covers File::getUrl
+        */
+       public function testGetUrl() {
+               $this->assertEquals( '/testurl/Test%21', $this->file_hl0->getUrl() );
+               $this->assertEquals( '/testurl/a/a2/Test%21', $this->file_hl2->getUrl() );
+       }
+
+       /**
+        * @covers ::wfLocalFile
+        */
+       public function testWfLocalFile() {
+               $file = wfLocalFile( "File:Some_file_that_probably_doesn't exist.png" );
+               $this->assertThat(
+                       $file,
+                       $this->isInstanceOf( 'LocalFile' ),
+                       'wfLocalFile() returns LocalFile for valid Titles'
+               );
+       }
+}
diff --git a/tests/phpunit/includes/libs/ArrayUtilsTest.php b/tests/phpunit/includes/libs/ArrayUtilsTest.php
new file mode 100644 (file)
index 0000000..7bdb1ca
--- /dev/null
@@ -0,0 +1,311 @@
+<?php
+/**
+ * Test class for ArrayUtils class
+ *
+ * @group Database
+ */
+
+class ArrayUtilsTest extends MediaWikiTestCase {
+       private $search;
+
+       /**
+        * @covers ArrayUtils::findLowerBound
+        * @dataProvider provideFindLowerBound
+        */
+       function testFindLowerBound(
+               $valueCallback, $valueCount, $comparisonCallback, $target, $expected
+       ) {
+               $this->assertSame(
+                       ArrayUtils::findLowerBound(
+                               $valueCallback, $valueCount, $comparisonCallback, $target
+                       ), $expected
+               );
+       }
+
+       function provideFindLowerBound() {
+               $self = $this;
+               $indexValueCallback = function ( $size ) use ( $self ) {
+                       return function ( $val ) use ( $self, $size ) {
+                               $self->assertTrue( $val >= 0 );
+                               $self->assertTrue( $val < $size );
+                               return $val;
+                       };
+               };
+               $comparisonCallback = function ( $a, $b ) {
+                       return $a - $b;
+               };
+
+               return array(
+                       array(
+                               $indexValueCallback( 0 ),
+                               0,
+                               $comparisonCallback,
+                               1,
+                               false,
+                       ),
+                       array(
+                               $indexValueCallback( 1 ),
+                               1,
+                               $comparisonCallback,
+                               -1,
+                               false,
+                       ),
+                       array(
+                               $indexValueCallback( 1 ),
+                               1,
+                               $comparisonCallback,
+                               0,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 1 ),
+                               1,
+                               $comparisonCallback,
+                               1,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               -1,
+                               false,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               0,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               0.5,
+                               0,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               1,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 2 ),
+                               2,
+                               $comparisonCallback,
+                               1.5,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               1,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               1.5,
+                               1,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               2,
+                               2,
+                       ),
+                       array(
+                               $indexValueCallback( 3 ),
+                               3,
+                               $comparisonCallback,
+                               3,
+                               2,
+                       ),
+               );
+       }
+
+       /**
+        * @covers ArrayUtils::arrayDiffAssocRecursive
+        * @dataProvider provideArrayDiffAssocRecursive
+        */
+       function testArrayDiffAssocRecursive( $expected ) {
+               $args = func_get_args();
+               array_shift( $args );
+               $this->assertEquals( call_user_func_array(
+                       'ArrayUtils::arrayDiffAssocRecursive', $args
+               ), $expected );
+       }
+
+       function provideArrayDiffAssocRecursive() {
+               return array(
+                       array(
+                               array(),
+                               array(),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array(),
+                               array(),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1 ),
+                               array(),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1 ),
+                               array(),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array( 1 ),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array( 1 ),
+                               array( 2 ),
+                       ),
+                       array(
+                               array( '' => 1 ),
+                               array( '' => 1 ),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array(),
+                               array( '' => 1 ),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1 ),
+                               array( 2 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1 ),
+                               array( 2 ),
+                               array( 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1 ),
+                               array( 1, 2 ),
+                       ),
+                       array(
+                               array( 1 => 1 ),
+                               array( 1 => 1 ),
+                               array( 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1 => 1 ),
+                               array( 1 ),
+                               array( 1 => 1),
+                       ),
+                       array(
+                               array(),
+                               array( 1 => 1 ),
+                               array( 1, 1, 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( array() ),
+                               array(),
+                       ),
+                       array(
+                               array(),
+                               array( array( array() ) ),
+                               array(),
+                       ),
+                       array(
+                               array( 1, array( 1 ) ),
+                               array( 1, array( 1 ) ),
+                               array(),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1, array( 1 ) ),
+                               array( 2, array( 1 ) ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array( 1 ) ),
+                               array( 2, array( 1 ) ),
+                               array( 1, array( 2 ) ),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1, array() ),
+                               array( 2 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array() ),
+                               array( 2 ),
+                               array( 1 ),
+                       ),
+                       array(
+                               array( 1, array( 1 => 2 ) ),
+                               array( 1, array( 1, 2 ) ),
+                               array( 2, array( 1 ) ),
+                       ),
+                       array(
+                               array( 1 ),
+                               array( 1, array( 1, 2 ) ),
+                               array( 2, array( 1 ) ),
+                               array( 2, array( 1 => 2 ) ),
+                       ),
+                       array(
+                               array( 1 => array( 1, 2 ) ),
+                               array( 1, array( 1, 2 ) ),
+                               array( 1, array( 2 ) ),
+                       ),
+                       array(
+                               array( 1 => array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( 2 ) ),
+                       ),
+                       array(
+                               array( 1 => array( array( 2 ), 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 1 => 3 ) ) ),
+                       ),
+                       array(
+                               array( 1 => array( 1 => 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 1 => 3, 0 => 2 ) ) ),
+                       ),
+                       array(
+                               array( 1 => array( 1 => 2 ) ),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1, array( array( 1 => 3 ) ) ),
+                               array( 1 => array( array( 2 ) ) ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1 => array( 1 => 2, 0 => array( 1 => 3, 0 => 2 ) ), 0 => 1 ),
+                       ),
+                       array(
+                               array(),
+                               array( 1, array( array( 2, 3 ), 2 ) ),
+                               array( 1 => array( 1 => 2 ) ),
+                               array( 1 => array( array( 1 => 3 ) ) ),
+                               array( 1 => array( array( 2 ) ) ),
+                               array( 1 ),
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/libs/XmlTypeCheckTest.php b/tests/phpunit/includes/libs/XmlTypeCheckTest.php
new file mode 100644 (file)
index 0000000..8d6f1ed
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+/**
+ * PHPUnit tests for XMLTypeCheck.
+ * @author physikerwelt
+ * @group Xml
+ * @covers XMLTypeCheck
+ */
+class XmlTypeCheckTest extends MediaWikiTestCase {
+       const WELL_FORMED_XML = "<root><child /></root>";
+       const MAL_FORMED_XML = "<root><child /></error>";
+
+       /**
+        * @covers XMLTypeCheck::newFromString
+        * @covers XMLTypeCheck::getRootElement
+        */
+       public function testWellFormedXML() {
+               $testXML = XmlTypeCheck::newFromString( self::WELL_FORMED_XML );
+               $this->assertTrue( $testXML->wellFormed );
+               $this->assertEquals( 'root', $testXML->getRootElement() );
+       }
+
+       /**
+        * @covers XMLTypeCheck::newFromString
+        */
+       public function testMalFormedXML() {
+               $testXML = XmlTypeCheck::newFromString( self::MAL_FORMED_XML );
+               $this->assertFalse( $testXML->wellFormed );
+       }
+
+}
diff --git a/tests/phpunit/includes/page/ArticleTablesTest.php b/tests/phpunit/includes/page/ArticleTablesTest.php
new file mode 100644 (file)
index 0000000..9f2b7a0
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @group Database
+ */
+class ArticleTablesTest extends MediaWikiLangTestCase {
+       /**
+        * Make sure that bug 14404 doesn't strike again. We don't want
+        * templatelinks based on the user language when {{int:}} is used, only the
+        * content language.
+        *
+        * @covers Title::getTemplateLinksFrom
+        * @covers Title::getLinksFrom
+        */
+       public function testTemplatelinksUsesContentLanguage() {
+               $title = Title::newFromText( 'Bug 14404' );
+               $page = WikiPage::factory( $title );
+               $user = new User();
+               $user->mRights = array( 'createpage', 'edit', 'purge' );
+               $this->setMwGlobals( 'wgLanguageCode', 'es' );
+               $this->setMwGlobals( 'wgContLang', Language::factory( 'es' ) );
+               $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
+
+               $page->doEditContent(
+                       new WikitextContent( '{{:{{int:history}}}}' ),
+                       'Test code for bug 14404',
+                       0,
+                       false,
+                       $user
+               );
+               $templates1 = $title->getTemplateLinksFrom();
+
+               $this->setMwGlobals( 'wgLang', Language::factory( 'de' ) );
+               $page = WikiPage::factory( $title ); // In order to force the re-rendering of the same wikitext
+
+               // We need an edit, a purge is not enough to regenerate the tables
+               $page->doEditContent(
+                       new WikitextContent( '{{:{{int:history}}}}' ),
+                       'Test code for bug 14404',
+                       EDIT_UPDATE,
+                       false,
+                       $user
+               );
+               $templates2 = $title->getTemplateLinksFrom();
+
+               /**
+                * @var Title[] $templates1
+                * @var Title[] $templates2
+                */
+               $this->assertEquals( $templates1, $templates2 );
+               $this->assertEquals( $templates1[0]->getFullText(), 'Historial' );
+       }
+}
diff --git a/tests/phpunit/includes/page/ArticleTest.php b/tests/phpunit/includes/page/ArticleTest.php
new file mode 100644 (file)
index 0000000..ae069ea
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+
+class ArticleTest extends MediaWikiTestCase {
+
+       /**
+        * @var Title
+        */
+       private $title;
+       /**
+        * @var Article
+        */
+       private $article;
+
+       /** creates a title object and its article object */
+       protected function setUp() {
+               parent::setUp();
+               $this->title = Title::makeTitle( NS_MAIN, 'SomePage' );
+               $this->article = new Article( $this->title );
+       }
+
+       /** cleanup title object and its article object */
+       protected function tearDown() {
+               parent::tearDown();
+               $this->title = null;
+               $this->article = null;
+       }
+
+       /**
+        * @covers Article::__get
+        */
+       public function testImplementsGetMagic() {
+               $this->assertEquals( false, $this->article->mLatest, "Article __get magic" );
+       }
+
+       /**
+        * @depends testImplementsGetMagic
+        * @covers Article::__set
+        */
+       public function testImplementsSetMagic() {
+               $this->article->mLatest = 2;
+               $this->assertEquals( 2, $this->article->mLatest, "Article __set magic" );
+       }
+
+       /**
+        * @depends testImplementsSetMagic
+        * @covers Article::__call
+        */
+       public function testImplementsCallMagic() {
+               $this->article->mLatest = 33;
+               $this->article->mDataLoaded = true;
+               $this->assertEquals( 33, $this->article->getLatest(), "Article __call magic" );
+       }
+
+       /**
+        * @covers Article::__get
+        * @covers Article::__set
+        */
+       public function testGetOrSetOnNewProperty() {
+               $this->article->ext_someNewProperty = 12;
+               $this->assertEquals( 12, $this->article->ext_someNewProperty,
+                       "Article get/set magic on new field" );
+
+               $this->article->ext_someNewProperty = -8;
+               $this->assertEquals( -8, $this->article->ext_someNewProperty,
+                       "Article get/set magic on update to new field" );
+       }
+
+       /**
+        * Checks for the existence of the backwards compatibility static functions
+        * (forwarders to WikiPage class)
+        *
+        * @covers Article::selectFields
+        * @covers Article::onArticleCreate
+        * @covers Article::onArticleDelete
+        * @covers Article::onArticleEdit
+        * @covers Article::getAutosummary
+        */
+       public function testStaticFunctions() {
+               $this->hideDeprecated( 'Article::selectFields' );
+               $this->hideDeprecated( 'Article::getAutosummary' );
+               $this->hideDeprecated( 'WikiPage::getAutosummary' );
+               $this->hideDeprecated( 'CategoryPage::getAutosummary' ); // Inherited from Article
+
+               $this->assertEquals( WikiPage::selectFields(), Article::selectFields(),
+                       "Article static functions" );
+               $this->assertEquals( true, is_callable( "Article::onArticleCreate" ),
+                       "Article static functions" );
+               $this->assertEquals( true, is_callable( "Article::onArticleDelete" ),
+                       "Article static functions" );
+               $this->assertEquals( true, is_callable( "ImagePage::onArticleEdit" ),
+                       "Article static functions" );
+               $this->assertTrue( is_string( CategoryPage::getAutosummary( '', '', 0 ) ),
+                       "Article static functions" );
+       }
+}
diff --git a/tests/phpunit/includes/page/ImagePage404Test.php b/tests/phpunit/includes/page/ImagePage404Test.php
new file mode 100644 (file)
index 0000000..197a2b3
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+/**
+ * For doing Image Page tests that rely on 404 thumb handling
+ */
+class ImagePage404Test extends MediaWikiMediaTestCase {
+
+       protected function getRepoOptions() {
+               return parent::getRepoOptions() + array( 'transformVia404' => true );
+       }
+
+       function setUp() {
+               $this->setMwGlobals( 'wgImageLimits', array(
+                       array( 320, 240 ),
+                       array( 640, 480 ),
+                       array( 800, 600 ),
+                       array( 1024, 768 ),
+                       array( 1280, 1024 )
+               ) );
+               parent::setUp();
+       }
+
+       function getImagePage( $filename ) {
+               $title = Title::makeTitleSafe( NS_FILE, $filename );
+               $file = $this->dataFile( $filename );
+               $iPage = new ImagePage( $title );
+               $iPage->setFile( $file );
+               return $iPage;
+       }
+
+       /**
+        * @dataProvider providerGetThumbSizes
+        * @param string $filename
+        * @param int $expectedNumberThumbs How many thumbnails to show
+        */
+       function testGetThumbSizes( $filename, $expectedNumberThumbs ) {
+               $iPage = $this->getImagePage( $filename );
+               $reflection = new ReflectionClass( $iPage );
+               $reflMethod = $reflection->getMethod( 'getThumbSizes' );
+               $reflMethod->setAccessible( true );
+
+               $actual = $reflMethod->invoke( $iPage, 545, 700 );
+               $this->assertEquals( count( $actual ), $expectedNumberThumbs );
+       }
+
+       function providerGetThumbSizes() {
+               return array(
+                       array( 'animated.gif', 6 ),
+                       array( 'Toll_Texas_1.svg', 6 ),
+                       array( '80x60-Greyscale.xcf', 6 ),
+                       array( 'jpeg-comment-binary.jpg', 6 ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/page/ImagePageTest.php b/tests/phpunit/includes/page/ImagePageTest.php
new file mode 100644 (file)
index 0000000..3c255b5
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+class ImagePageTest extends MediaWikiMediaTestCase {
+
+       function setUp() {
+               $this->setMwGlobals( 'wgImageLimits', array(
+                       array( 320, 240 ),
+                       array( 640, 480 ),
+                       array( 800, 600 ),
+                       array( 1024, 768 ),
+                       array( 1280, 1024 )
+               ) );
+               parent::setUp();
+       }
+
+       function getImagePage( $filename ) {
+               $title = Title::makeTitleSafe( NS_FILE, $filename );
+               $file = $this->dataFile( $filename );
+               $iPage = new ImagePage( $title );
+               $iPage->setFile( $file );
+               return $iPage;
+       }
+
+       /**
+        * @dataProvider providerGetDisplayWidthHeight
+        * @param array $dim Array [maxWidth, maxHeight, width, height]
+        * @param array $expected Array [width, height] The width and height we expect to display at
+        */
+       function testGetDisplayWidthHeight( $dim, $expected ) {
+               $iPage = $this->getImagePage( 'animated.gif' );
+               $reflection = new ReflectionClass( $iPage );
+               $reflMethod = $reflection->getMethod( 'getDisplayWidthHeight' );
+               $reflMethod->setAccessible( true );
+
+               $actual = $reflMethod->invoke( $iPage, $dim[0], $dim[1], $dim[2], $dim[3] );
+               $this->assertEquals( $actual, $expected );
+       }
+
+       function providerGetDisplayWidthHeight() {
+               return array(
+                       array(
+                               array( 1024.0, 768.0, 600.0, 600.0 ),
+                               array( 600.0, 600.0 )
+                       ),
+                       array(
+                               array( 1024.0, 768.0, 1600.0, 600.0 ),
+                               array( 1024.0, 384.0 )
+                       ),
+                       array(
+                               array( 1024.0, 768.0, 1024.0, 768.0 ),
+                               array( 1024.0, 768.0 )
+                       ),
+                       array(
+                               array( 1024.0, 768.0, 800.0, 1000.0 ),
+                               array( 614.0, 768.0 )
+                       ),
+                       array(
+                               array( 1024.0, 768.0, 0, 1000 ),
+                               array( 0, 0 )
+                       ),
+                       array(
+                               array( 1024.0, 768.0, 2000, 0 ),
+                               array( 0, 0 )
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider providerGetThumbSizes
+        * @param string $filename
+        * @param int $expectedNumberThumbs How many thumbnails to show
+        */
+       function testGetThumbSizes( $filename, $expectedNumberThumbs ) {
+               $iPage = $this->getImagePage( $filename );
+               $reflection = new ReflectionClass( $iPage );
+               $reflMethod = $reflection->getMethod( 'getThumbSizes' );
+               $reflMethod->setAccessible( true );
+
+               $actual = $reflMethod->invoke( $iPage, 545, 700 );
+               $this->assertEquals( count( $actual ), $expectedNumberThumbs );
+       }
+
+       function providerGetThumbSizes() {
+               return array(
+                       array( 'animated.gif', 2 ),
+                       array( 'Toll_Texas_1.svg', 1 ),
+                       array( '80x60-Greyscale.xcf', 1 ),
+                       array( 'jpeg-comment-binary.jpg', 2 ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/page/WikiPageTest.php b/tests/phpunit/includes/page/WikiPageTest.php
new file mode 100644 (file)
index 0000000..c011e9a
--- /dev/null
@@ -0,0 +1,1301 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ * @group medium
+ **/
+class WikiPageTest extends MediaWikiLangTestCase {
+
+       protected $pages_to_delete;
+
+       function __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->tablesUsed = array_merge(
+                       $this->tablesUsed,
+                       array( 'page',
+                               'revision',
+                               'text',
+
+                               'recentchanges',
+                               'logging',
+
+                               'page_props',
+                               'pagelinks',
+                               'categorylinks',
+                               'langlinks',
+                               'externallinks',
+                               'imagelinks',
+                               'templatelinks',
+                               'iwlinks' ) );
+       }
+
+       protected function setUp() {
+               parent::setUp();
+               $this->pages_to_delete = array();
+
+               LinkCache::singleton()->clear(); # avoid cached redirect status, etc
+       }
+
+       protected function tearDown() {
+               foreach ( $this->pages_to_delete as $p ) {
+                       /* @var $p WikiPage */
+
+                       try {
+                               if ( $p->exists() ) {
+                                       $p->doDeleteArticle( "testing done." );
+                               }
+                       } catch ( MWException $ex ) {
+                               // fail silently
+                       }
+               }
+               parent::tearDown();
+       }
+
+       /**
+        * @param Title|string $title
+        * @param string|null $model
+        * @return WikiPage
+        */
+       protected function newPage( $title, $model = null ) {
+               if ( is_string( $title ) ) {
+                       $ns = $this->getDefaultWikitextNS();
+                       $title = Title::newFromText( $title, $ns );
+               }
+
+               $p = new WikiPage( $title );
+
+               $this->pages_to_delete[] = $p;
+
+               return $p;
+       }
+
+       /**
+        * @param string|Title|WikiPage $page
+        * @param string $text
+        * @param int $model
+        *
+        * @return WikiPage
+        */
+       protected function createPage( $page, $text, $model = null ) {
+               if ( is_string( $page ) || $page instanceof Title ) {
+                       $page = $this->newPage( $page, $model );
+               }
+
+               $content = ContentHandler::makeContent( $text, $page->getTitle(), $model );
+               $page->doEditContent( $content, "testing", EDIT_NEW );
+
+               return $page;
+       }
+
+       /**
+        * @covers WikiPage::doEditContent
+        */
+       public function testDoEditContent() {
+               $page = $this->newPage( "WikiPageTest_testDoEditContent" );
+               $title = $page->getTitle();
+
+               $content = ContentHandler::makeContent(
+                       "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
+                               . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
+                       $title,
+                       CONTENT_MODEL_WIKITEXT
+               );
+
+               $page->doEditContent( $content, "[[testing]] 1" );
+
+               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
+               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
+               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
+               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
+
+               $id = $page->getId();
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getContent();
+               $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
+
+               # ------------------------
+               $content = ContentHandler::makeContent(
+                       "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
+                               . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.",
+                       $title,
+                       CONTENT_MODEL_WIKITEXT
+               );
+
+               $page->doEditContent( $content, "testing 2" );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getContent();
+               $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
+       }
+
+       /**
+        * @covers WikiPage::doEdit
+        */
+       public function testDoEdit() {
+               $this->hideDeprecated( "WikiPage::doEdit" );
+               $this->hideDeprecated( "WikiPage::getText" );
+               $this->hideDeprecated( "Revision::getText" );
+
+               //NOTE: assume help namespace will default to wikitext
+               $title = Title::newFromText( "Help:WikiPageTest_testDoEdit" );
+
+               $page = $this->newPage( $title );
+
+               $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
+                       . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
+
+               $page->doEdit( $text, "[[testing]] 1" );
+
+               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
+               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
+               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
+               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
+
+               $id = $page->getId();
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getText();
+               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
+
+               # ------------------------
+               $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
+                       . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
+
+               $page->doEdit( $text, "testing 2" );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getText();
+               $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
+       }
+
+       /**
+        * @covers WikiPage::doQuickEdit
+        */
+       public function testDoQuickEdit() {
+               global $wgUser;
+
+               $this->hideDeprecated( "WikiPage::doQuickEdit" );
+
+               //NOTE: assume help namespace will default to wikitext
+               $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" );
+
+               $text = "quick text";
+               $page->doQuickEdit( $text, $wgUser, "testing q" );
+
+               # ---------------------
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $text, $page->getText() );
+       }
+
+       /**
+        * @covers WikiPage::doQuickEditContent
+        */
+       public function testDoQuickEditContent() {
+               global $wgUser;
+
+               $page = $this->createPage(
+                       "WikiPageTest_testDoQuickEditContent",
+                       "original text",
+                       CONTENT_MODEL_WIKITEXT
+               );
+
+               $content = ContentHandler::makeContent(
+                       "quick text",
+                       $page->getTitle(),
+                       CONTENT_MODEL_WIKITEXT
+               );
+               $page->doQuickEditContent( $content, $wgUser, "testing q" );
+
+               # ---------------------
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertTrue( $content->equals( $page->getContent() ) );
+       }
+
+       /**
+        * @covers WikiPage::doDeleteArticle
+        */
+       public function testDoDeleteArticle() {
+               $page = $this->createPage(
+                       "WikiPageTest_testDoDeleteArticle",
+                       "[[original text]] foo",
+                       CONTENT_MODEL_WIKITEXT
+               );
+               $id = $page->getId();
+
+               $page->doDeleteArticle( "testing deletion" );
+
+               $this->assertFalse(
+                       $page->getTitle()->getArticleID() > 0,
+                       "Title object should now have page id 0"
+               );
+               $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
+               $this->assertFalse(
+                       $page->exists(),
+                       "WikiPage::exists should return false after page was deleted"
+               );
+               $this->assertNull(
+                       $page->getContent(),
+                       "WikiPage::getContent should return null after page was deleted"
+               );
+               $this->assertFalse(
+                       $page->getText(),
+                       "WikiPage::getText should return false after page was deleted"
+               );
+
+               $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
+               $this->assertFalse(
+                       $t->exists(),
+                       "Title::exists should return false after page was deleted"
+               );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
+       }
+
+       /**
+        * @covers WikiPage::doDeleteUpdates
+        */
+       public function testDoDeleteUpdates() {
+               $page = $this->createPage(
+                       "WikiPageTest_testDoDeleteArticle",
+                       "[[original text]] foo",
+                       CONTENT_MODEL_WIKITEXT
+               );
+               $id = $page->getId();
+
+               $page->doDeleteUpdates( $id );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
+       }
+
+       /**
+        * @covers WikiPage::getRevision
+        */
+       public function testGetRevision() {
+               $page = $this->newPage( "WikiPageTest_testGetRevision" );
+
+               $rev = $page->getRevision();
+               $this->assertNull( $rev );
+
+               # -----------------
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+
+               $rev = $page->getRevision();
+
+               $this->assertEquals( $page->getLatest(), $rev->getId() );
+               $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
+       }
+
+       /**
+        * @covers WikiPage::getContent
+        */
+       public function testGetContent() {
+               $page = $this->newPage( "WikiPageTest_testGetContent" );
+
+               $content = $page->getContent();
+               $this->assertNull( $content );
+
+               # -----------------
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+
+               $content = $page->getContent();
+               $this->assertEquals( "some text", $content->getNativeData() );
+       }
+
+       /**
+        * @covers WikiPage::getText
+        */
+       public function testGetText() {
+               $this->hideDeprecated( "WikiPage::getText" );
+
+               $page = $this->newPage( "WikiPageTest_testGetText" );
+
+               $text = $page->getText();
+               $this->assertFalse( $text );
+
+               # -----------------
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+
+               $text = $page->getText();
+               $this->assertEquals( "some text", $text );
+       }
+
+       /**
+        * @covers WikiPage::getRawText
+        */
+       public function testGetRawText() {
+               $this->hideDeprecated( "WikiPage::getRawText" );
+
+               $page = $this->newPage( "WikiPageTest_testGetRawText" );
+
+               $text = $page->getRawText();
+               $this->assertFalse( $text );
+
+               # -----------------
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+
+               $text = $page->getRawText();
+               $this->assertEquals( "some text", $text );
+       }
+
+       /**
+        * @covers WikiPage::getContentModel
+        */
+       public function testGetContentModel() {
+               global $wgContentHandlerUseDB;
+
+               if ( !$wgContentHandlerUseDB ) {
+                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
+               }
+
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentModel",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
+       }
+
+       /**
+        * @covers WikiPage::getContentHandler
+        */
+       public function testGetContentHandler() {
+               global $wgContentHandlerUseDB;
+
+               if ( !$wgContentHandlerUseDB ) {
+                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
+               }
+
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentHandler",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
+       }
+
+       /**
+        * @covers WikiPage::exists
+        */
+       public function testExists() {
+               $page = $this->newPage( "WikiPageTest_testExists" );
+               $this->assertFalse( $page->exists() );
+
+               # -----------------
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+               $this->assertTrue( $page->exists() );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertTrue( $page->exists() );
+
+               # -----------------
+               $page->doDeleteArticle( "done testing" );
+               $this->assertFalse( $page->exists() );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertFalse( $page->exists() );
+       }
+
+       public static function provideHasViewableContent() {
+               return array(
+                       array( 'WikiPageTest_testHasViewableContent', false, true ),
+                       array( 'Special:WikiPageTest_testHasViewableContent', false ),
+                       array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
+                       array( 'Special:Userlogin', true ),
+                       array( 'MediaWiki:help', true ),
+               );
+       }
+
+       /**
+        * @dataProvider provideHasViewableContent
+        * @covers WikiPage::hasViewableContent
+        */
+       public function testHasViewableContent( $title, $viewable, $create = false ) {
+               $page = $this->newPage( $title );
+               $this->assertEquals( $viewable, $page->hasViewableContent() );
+
+               if ( $create ) {
+                       $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+                       $this->assertTrue( $page->hasViewableContent() );
+
+                       $page = new WikiPage( $page->getTitle() );
+                       $this->assertTrue( $page->hasViewableContent() );
+               }
+       }
+
+       public static function provideGetRedirectTarget() {
+               return array(
+                       array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT, "hello world", null ),
+                       array(
+                               'WikiPageTest_testGetRedirectTarget_2',
+                               CONTENT_MODEL_WIKITEXT,
+                               "#REDIRECT [[hello world]]",
+                               "Hello world"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetRedirectTarget
+        * @covers WikiPage::getRedirectTarget
+        */
+       public function testGetRedirectTarget( $title, $model, $text, $target ) {
+               $this->setMwGlobals( array(
+                       'wgCapitalLinks' => true,
+               ) );
+
+               $page = $this->createPage( $title, $text, $model );
+
+               # sanity check, because this test seems to fail for no reason for some people.
+               $c = $page->getContent();
+               $this->assertEquals( 'WikitextContent', get_class( $c ) );
+
+               # now, test the actual redirect
+               $t = $page->getRedirectTarget();
+               $this->assertEquals( $target, is_null( $t ) ? null : $t->getPrefixedText() );
+       }
+
+       /**
+        * @dataProvider provideGetRedirectTarget
+        * @covers WikiPage::isRedirect
+        */
+       public function testIsRedirect( $title, $model, $text, $target ) {
+               $page = $this->createPage( $title, $text, $model );
+               $this->assertEquals( !is_null( $target ), $page->isRedirect() );
+       }
+
+       public static function provideIsCountable() {
+               return array(
+
+                       // any
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               '',
+                               'any',
+                               true
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo',
+                               'any',
+                               true
+                       ),
+
+                       // comma
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo',
+                               'comma',
+                               false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo, bar',
+                               'comma',
+                               true
+                       ),
+
+                       // link
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo',
+                               'link',
+                               false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo [[bar]]',
+                               'link',
+                               true
+                       ),
+
+                       // redirects
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               '#REDIRECT [[bar]]',
+                               'any',
+                               false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               '#REDIRECT [[bar]]',
+                               'comma',
+                               false
+                       ),
+                       array( 'WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               '#REDIRECT [[bar]]',
+                               'link',
+                               false
+                       ),
+
+                       // not a content namespace
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo',
+                               'any',
+                               false
+                       ),
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo, bar',
+                               'comma',
+                               false
+                       ),
+                       array( 'Talk:WikiPageTest_testIsCountable',
+                               CONTENT_MODEL_WIKITEXT,
+                               'Foo [[bar]]',
+                               'link',
+                               false
+                       ),
+
+                       // not a content namespace, different model
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                               null,
+                               'Foo',
+                               'any',
+                               false
+                       ),
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                               null,
+                               'Foo, bar',
+                               'comma',
+                               false
+                       ),
+                       array( 'MediaWiki:WikiPageTest_testIsCountable.js',
+                               null,
+                               'Foo [[bar]]',
+                               'link',
+                               false
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideIsCountable
+        * @covers WikiPage::isCountable
+        */
+       public function testIsCountable( $title, $model, $text, $mode, $expected ) {
+               global $wgContentHandlerUseDB;
+
+               $this->setMwGlobals( 'wgArticleCountMethod', $mode );
+
+               $title = Title::newFromText( $title );
+
+               if ( !$wgContentHandlerUseDB
+                       && $model
+                       && ContentHandler::getDefaultModelFor( $title ) != $model
+               ) {
+                       $this->markTestSkipped( "Can not use non-default content model $model for "
+                               . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." );
+               }
+
+               $page = $this->createPage( $title, $text, $model );
+
+               $editInfo = $page->prepareContentForEdit( $page->getContent() );
+
+               $v = $page->isCountable();
+               $w = $page->isCountable( $editInfo );
+
+               $this->assertEquals(
+                       $expected,
+                       $v,
+                       "isCountable( null ) returned unexpected value " . var_export( $v, true )
+                               . " instead of " . var_export( $expected, true )
+                       . " in mode `$mode` for text \"$text\""
+               );
+
+               $this->assertEquals(
+                       $expected,
+                       $w,
+                       "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
+                               . " instead of " . var_export( $expected, true )
+                       . " in mode `$mode` for text \"$text\""
+               );
+       }
+
+       public static function provideGetParserOutput() {
+               return array(
+                       array( CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>" ),
+                       // @todo more...?
+               );
+       }
+
+       /**
+        * @dataProvider provideGetParserOutput
+        * @covers WikiPage::getParserOutput
+        */
+       public function testGetParserOutput( $model, $text, $expectedHtml ) {
+               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
+
+               $opt = $page->makeParserOptions( 'canonical' );
+               $po = $page->getParserOutput( $opt );
+               $text = $po->getText();
+
+               $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
+               $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
+
+               $this->assertEquals( $expectedHtml, $text );
+
+               return $po;
+       }
+
+       /**
+        * @covers WikiPage::getParserOutput
+        */
+       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." );
+       }
+
+       /**
+        * @covers WikiPage::getParserOutput
+        */
+       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." );
+       }
+
+       public static $sections =
+
+               "Intro
+
+== stuff ==
+hello world
+
+== test ==
+just a test
+
+== foo ==
+more stuff
+";
+
+       public function dataReplaceSection() {
+               //NOTE: assume the Help namespace to contain wikitext
+               return array(
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                               CONTENT_MODEL_WIKITEXT,
+                               WikiPageTest::$sections,
+                               "0",
+                               "No more",
+                               null,
+                               trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) )
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                               CONTENT_MODEL_WIKITEXT,
+                               WikiPageTest::$sections,
+                               "",
+                               "No more",
+                               null,
+                               "No more"
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                               CONTENT_MODEL_WIKITEXT,
+                               WikiPageTest::$sections,
+                               "2",
+                               "== TEST ==\nmore fun",
+                               null,
+                               trim( preg_replace( '/^== test ==.*== foo ==/sm',
+                                       "== TEST ==\nmore fun\n\n== foo ==",
+                                       WikiPageTest::$sections ) )
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                               CONTENT_MODEL_WIKITEXT,
+                               WikiPageTest::$sections,
+                               "8",
+                               "No more",
+                               null,
+                               trim( WikiPageTest::$sections )
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                               CONTENT_MODEL_WIKITEXT,
+                               WikiPageTest::$sections,
+                               "new",
+                               "No more",
+                               "New",
+                               trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataReplaceSection
+        * @covers WikiPage::replaceSection
+        */
+       public function testReplaceSection( $title, $model, $text, $section, $with,
+               $sectionTitle, $expected
+       ) {
+               $this->hideDeprecated( "WikiPage::replaceSection" );
+
+               $page = $this->createPage( $title, $text, $model );
+               $text = $page->replaceSection( $section, $with, $sectionTitle );
+               $text = trim( $text );
+
+               $this->assertEquals( $expected, $text );
+       }
+
+       /**
+        * @dataProvider dataReplaceSection
+        * @covers WikiPage::replaceSectionContent
+        */
+       public function testReplaceSectionContent( $title, $model, $text, $section,
+               $with, $sectionTitle, $expected
+       ) {
+               $page = $this->createPage( $title, $text, $model );
+
+               $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
+               $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
+
+               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
+       }
+
+       /**
+        * @dataProvider dataReplaceSection
+        * @covers WikiPage::replaceSectionAtRev
+        */
+       public function testReplaceSectionAtRev( $title, $model, $text, $section,
+               $with, $sectionTitle, $expected
+       ) {
+               $page = $this->createPage( $title, $text, $model );
+               $baseRevId = $page->getLatest();
+
+               $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
+               $c = $page->replaceSectionAtRev( $section, $content, $sectionTitle, $baseRevId );
+
+               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
+       }
+
+       /* @todo FIXME: fix this!
+       public function testGetUndoText() {
+       $this->checkHasDiff3();
+
+       $text = "one";
+       $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
+       $rev1 = $page->getRevision();
+
+       $text .= "\n\ntwo";
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section two"
+       );
+       $rev2 = $page->getRevision();
+
+       $text .= "\n\nthree";
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section three"
+       );
+       $rev3 = $page->getRevision();
+
+       $text .= "\n\nfour";
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section four"
+       );
+       $rev4 = $page->getRevision();
+
+       $text .= "\n\nfive";
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section five"
+       );
+       $rev5 = $page->getRevision();
+
+       $text .= "\n\nsix";
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section six"
+       );
+       $rev6 = $page->getRevision();
+
+       $undo6 = $page->getUndoText( $rev6 );
+       if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
+       $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
+
+       $undo3 = $page->getUndoText( $rev4, $rev2 );
+       if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
+       $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
+
+       $undo2 = $page->getUndoText( $rev2 );
+       if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
+       $this->assertEquals( "one\n\nfive", $undo2 );
+       }
+        */
+
+       /**
+        * @todo FIXME: this is a better rollback test than the one below, but it
+        * keeps failing in jenkins for some reason.
+        */
+       public function broken_testDoRollback() {
+               $admin = new User();
+               $admin->setName( "Admin" );
+
+               $text = "one";
+               $page = $this->newPage( "WikiPageTest_testDoRollback" );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
+                       "section one", EDIT_NEW, false, $admin );
+
+               $user1 = new User();
+               $user1->setName( "127.0.1.11" );
+               $text .= "\n\ntwo";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
+                       "adding section two", 0, false, $user1 );
+
+               $user2 = new User();
+               $user2->setName( "127.0.2.13" );
+               $text .= "\n\nthree";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
+                       "adding section three", 0, false, $user2 );
+
+               # we are having issues with doRollback spuriously failing. Apparently
+               # the last revision somehow goes missing or not committed under some
+               # circumstances. So, make sure the last revision has the right user name.
+               $dbr = wfGetDB( DB_SLAVE );
+               $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) );
+
+               $page = new WikiPage( $page->getTitle() );
+               $rev3 = $page->getRevision();
+               $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
+
+               $rev2 = $rev3->getPrevious();
+               $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
+
+               $rev1 = $rev2->getPrevious();
+               $this->assertEquals( 'Admin', $rev1->getUserText() );
+
+               # now, try the actual rollback
+               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user2->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user2->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $details,
+                       $admin
+               );
+
+               if ( $errors ) {
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
+                               . ";\n" . print_r( $details, true ) );
+               }
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
+                       "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
+       }
+
+       /**
+        * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
+        * @covers WikiPage::doRollback
+        */
+       public function testDoRollback() {
+               $admin = new User();
+               $admin->setName( "Admin" );
+
+               $text = "one";
+               $page = $this->newPage( "WikiPageTest_testDoRollback" );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "section one",
+                       EDIT_NEW,
+                       false,
+                       $admin
+               );
+               $rev1 = $page->getRevision();
+
+               $user1 = new User();
+               $user1->setName( "127.0.1.11" );
+               $text .= "\n\ntwo";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "adding section two",
+                       0,
+                       false,
+                       $user1
+               );
+
+               # now, try the rollback
+               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $details,
+                       $admin
+               );
+
+               if ( $errors ) {
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
+                               . ";\n" . print_r( $details, true ) );
+               }
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
+                       "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one", $page->getContent()->getNativeData() );
+       }
+
+       /**
+        * @covers WikiPage::doRollback
+        */
+       public function testDoRollbackFailureSameContent() {
+               $admin = new User();
+               $admin->setName( "Admin" );
+               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+
+               $text = "one";
+               $page = $this->newPage( "WikiPageTest_testDoRollback" );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "section one",
+                       EDIT_NEW,
+                       false,
+                       $admin
+               );
+               $rev1 = $page->getRevision();
+
+               $user1 = new User();
+               $user1->setName( "127.0.1.11" );
+               $user1->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $text .= "\n\ntwo";
+               $page = new WikiPage( $page->getTitle() );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "adding section two",
+                       0,
+                       false,
+                       $user1
+               );
+
+               # now, do a the rollback from the same user was doing the edit before
+               $resultDetails = array();
+               $token = $user1->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert same user",
+                       $token,
+                       false,
+                       $resultDetails,
+                       $admin
+               );
+
+               $this->assertEquals( array(), $errors, "Rollback failed same user" );
+
+               # now, try the rollback
+               $resultDetails = array();
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $resultDetails,
+                       $admin
+               );
+
+               $this->assertEquals( array( array( 'alreadyrolled', 'WikiPageTest testDoRollback',
+                       '127.0.1.11', 'Admin' ) ), $errors, "Rollback not failed" );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
+                       "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one", $page->getContent()->getNativeData() );
+       }
+
+       public static function provideGetAutosummary() {
+               return array(
+                       array(
+                               'Hello there, world!',
+                               '#REDIRECT [[Foo]]',
+                               0,
+                               '/^Redirected page .*Foo/'
+                       ),
+
+                       array(
+                               null,
+                               'Hello world!',
+                               EDIT_NEW,
+                               '/^Created page .*Hello/'
+                       ),
+
+                       array(
+                               'Hello there, world!',
+                               '',
+                               0,
+                               '/^Blanked/'
+                       ),
+
+                       array(
+                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+                               eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+                               voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
+                               clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
+                               'Hello world!',
+                               0,
+                               '/^Replaced .*Hello/'
+                       ),
+
+                       array(
+                               'foo',
+                               'bar',
+                               0,
+                               '/^$/'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetAutoSummary
+        * @covers WikiPage::getAutosummary
+        */
+       public function testGetAutosummary( $old, $new, $flags, $expected ) {
+               $this->hideDeprecated( "WikiPage::getAutosummary" );
+
+               $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
+
+               $summary = $page->getAutosummary( $old, $new, $flags );
+
+               $this->assertTrue( (bool)preg_match( $expected, $summary ),
+                       "Autosummary didn't match expected pattern $expected: $summary" );
+       }
+
+       public static function provideGetAutoDeleteReason() {
+               return array(
+                       array(
+                               array(),
+                               false,
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", null ),
+                               ),
+                               "/first edit.*only contributor/",
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", null ),
+                                       array( "second edit", null ),
+                               ),
+                               "/second edit.*only contributor/",
+                               true
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", "127.0.2.22" ),
+                                       array( "second edit", "127.0.3.33" ),
+                               ),
+                               "/second edit/",
+                               true
+                       ),
+
+                       array(
+                               array(
+                                       array(
+                                               "first edit: "
+                                                       . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
+                                                       . " nonumy eirmod tempor invidunt ut labore et dolore magna "
+                                                       . "aliquyam erat, sed diam voluptua. At vero eos et accusam "
+                                                       . "et justo duo dolores et ea rebum. Stet clita kasd gubergren, "
+                                                       . "no sea  takimata sanctus est Lorem ipsum dolor sit amet.'",
+                                               null
+                                       ),
+                               ),
+                               '/first edit:.*\.\.\."/',
+                               false
+                       ),
+
+                       array(
+                               array(
+                                       array( "first edit", "127.0.2.22" ),
+                                       array( "", "127.0.3.33" ),
+                               ),
+                               "/before blanking.*first edit/",
+                               true
+                       ),
+
+               );
+       }
+
+       /**
+        * @dataProvider provideGetAutoDeleteReason
+        * @covers WikiPage::getAutoDeleteReason
+        */
+       public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
+               global $wgUser;
+
+               //NOTE: assume Help namespace to contain wikitext
+               $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
+
+               $c = 1;
+
+               foreach ( $edits as $edit ) {
+                       $user = new User();
+
+                       if ( !empty( $edit[1] ) ) {
+                               $user->setName( $edit[1] );
+                       } else {
+                               $user = $wgUser;
+                       }
+
+                       $content = ContentHandler::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() );
+
+                       $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user );
+
+                       $c += 1;
+               }
+
+               $reason = $page->getAutoDeleteReason( $hasHistory );
+
+               if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) {
+                       $this->assertEquals( $expectedResult, $reason );
+               } else {
+                       $this->assertTrue( (bool)preg_match( $expectedResult, $reason ),
+                               "Autosummary didn't match expected pattern $expectedResult: $reason" );
+               }
+
+               $this->assertEquals( $expectedHistory, $hasHistory,
+                       "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
+
+               $page->doDeleteArticle( "done" );
+       }
+
+       public static function providePreSaveTransform() {
+               return array(
+                       array( 'hello this is ~~~',
+                               "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
+                       ),
+                       array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+                               'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider providePreSaveTransform
+        * @covers WikiPage::preSaveTransform
+        */
+       public function testPreSaveTransform( $text, $expected ) {
+               $this->hideDeprecated( 'WikiPage::preSaveTransform' );
+               $user = new User();
+               $user->setName( "127.0.0.1" );
+
+               //NOTE: assume Help namespace to contain wikitext
+               $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" );
+               $text = $page->preSaveTransform( $text, $user );
+
+               $this->assertEquals( $expected, $text );
+       }
+
+       /**
+        * @covers WikiPage::factory
+        */
+       public function testWikiPageFactory() {
+               $title = Title::makeTitle( NS_FILE, 'Someimage.png' );
+               $page = WikiPage::factory( $title );
+               $this->assertEquals( 'WikiFilePage', get_class( $page ) );
+
+               $title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' );
+               $page = WikiPage::factory( $title );
+               $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
+
+               $title = Title::makeTitle( NS_MAIN, 'SomePage' );
+               $page = WikiPage::factory( $title );
+               $this->assertEquals( 'WikiPage', get_class( $page ) );
+       }
+}
diff --git a/tests/phpunit/includes/page/WikiPageTestContentHandlerUseDB.php b/tests/phpunit/includes/page/WikiPageTestContentHandlerUseDB.php
new file mode 100644 (file)
index 0000000..3db7628
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ */
+class WikiPageTestContentHandlerUseDB extends WikiPageTest {
+
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $page_table = $dbw->tableName( 'page' );
+               $revision_table = $dbw->tableName( 'revision' );
+               $archive_table = $dbw->tableName( 'archive' );
+
+               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
+                       $dbw->query( "alter table $page_table drop column page_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
+               }
+       }
+
+       /**
+        * @covers WikiPage::getContentModel
+        */
+       public function testGetContentModel() {
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentModel",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               $page = new WikiPage( $page->getTitle() );
+
+               // NOTE: since the content model is not recorded in the database,
+               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
+               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
+       }
+
+       /**
+        * @covers WikiPage::getContentHandler
+        */
+       public function testGetContentHandler() {
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentHandler",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               // NOTE: since the content model is not recorded in the database,
+               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
+       }
+}
diff --git a/tests/phpunit/includes/password/PasswordTest.php b/tests/phpunit/includes/password/PasswordTest.php
new file mode 100644 (file)
index 0000000..5ad8aca
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Testing framework for the Password infrastructure
+ *
+ * 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
+ */
+
+class PasswordTest extends MediaWikiTestCase {
+       /**
+        * @covers InvalidPassword::equals
+        */
+       public function testInvalidUnequalInvalid() {
+               $invalid1 = User::getPasswordFactory()->newFromCiphertext( null );
+               $invalid2 = User::getPasswordFactory()->newFromCiphertext( null );
+
+               $this->assertFalse( $invalid1->equals( $invalid2 ) );
+       }
+
+       public function testInvalidPlaintext() {
+               $invalid = User::getPasswordFactory()->newFromPlaintext( null );
+
+               $this->assertInstanceOf( 'InvalidPassword', $invalid );
+       }
+}
index 95da847..9afc54d 100644 (file)
@@ -148,8 +148,7 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
         */
        public function testGetModifiedTime( $module, $expected ) {
                $rl = new ResourceLoaderFileModule( $module );
-               $ts = $rl->getModifiedTime( new ResourceLoaderContext(
-                       new ResourceLoader, new FauxRequest() ) );
+               $ts = $rl->getModifiedTime( $this->getResourceLoaderContext() );
                $this->assertEquals( $ts, $expected );
        }
 }
index b25e9b0..6d1ed4e 100644 (file)
@@ -7,7 +7,7 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
         * @covers ResourceLoaderFileModule::getDefinitionSummary
         */
        public function testDefinitionSummary() {
-               $context = self::getResourceLoaderContext();
+               $context = $this->getResourceLoaderContext();
 
                $baseParams = array(
                        'scripts' => array( 'foo.js', 'bar.js' ),
index 3fddc1e..69854d5 100644 (file)
@@ -300,7 +300,7 @@ mw.loader.addSource( {
                        $this->setMwGlobals( 'wgResourceLoaderSources', $case['sources'] );
                }
 
-               $context = self::getResourceLoaderContext();
+               $context = $this->getResourceLoaderContext();
                $rl = $context->getResourceLoader();
 
                $rl->register( $case['modules'] );
@@ -337,7 +337,7 @@ mw.loader.addSource( {
        public function testRegistrationsMinified( $modules ) {
                $this->setMwGlobals( 'wgResourceLoaderDebug', false );
 
-               $context = self::getResourceLoaderContext();
+               $context = $this->getResourceLoaderContext();
                $rl = $context->getResourceLoader();
                $rl->register( $modules );
                $module = new ResourceLoaderStartUpModule();
@@ -357,7 +357,7 @@ mw.loader.addSource( {
         * @dataProvider provideRegistrations
         */
        public function testRegistrationsUnminified( $modules ) {
-               $context = self::getResourceLoaderContext();
+               $context = $this->getResourceLoaderContext();
                $rl = $context->getResourceLoader();
                $rl->register( $modules );
                $module = new ResourceLoaderStartUpModule();
index 5cdfa77..4fc7378 100644 (file)
@@ -79,7 +79,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
         * @covers ResourceLoaderFileModule::compileLessFile
         */
        public function testLessFileCompilation() {
-               $context = self::getResourceLoaderContext();
+               $context = $this->getResourceLoaderContext();
                $basePath = __DIR__ . '/../../data/less/module';
                $module = new ResourceLoaderFileModule( array(
                        'localBasePath' => $basePath,
@@ -113,8 +113,8 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                        'styles' => array( 'expected.css' ),
                ) );
 
-               $contextLtr = self::getResourceLoaderContext( 'en' );
-               $contextRtl = self::getResourceLoaderContext( 'he' );
+               $contextLtr = $this->getResourceLoaderContext( 'en', 'ltr' );
+               $contextRtl = $this->getResourceLoaderContext( 'he', 'rtl' );
 
                // Since we want to compare the effect of @noflip+@embed against the effect of just @embed, and
                // the @noflip annotations are always preserved, we need to strip them first.
diff --git a/tests/phpunit/includes/search/SearchUpdateTest.php b/tests/phpunit/includes/search/SearchUpdateTest.php
deleted file mode 100644 (file)
index c627537..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-class MockSearch extends SearchEngine {
-       public static $id;
-       public static $title;
-       public static $text;
-
-       public function __construct( $db ) {
-       }
-
-       public function update( $id, $title, $text ) {
-               self::$id = $id;
-               self::$title = $title;
-               self::$text = $text;
-       }
-}
-
-/**
- * @group Search
- * @group Database
- */
-class SearchUpdateTest extends MediaWikiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-               $this->setMwGlobals( 'wgSearchType', 'MockSearch' );
-       }
-
-       public function updateText( $text ) {
-               return trim( SearchUpdate::updateText( $text ) );
-       }
-
-       /**
-        * @covers SearchUpdate::updateText
-        */
-       public function testUpdateText() {
-               $this->assertEquals(
-                       'test',
-                       $this->updateText( '<div>TeSt</div>' ),
-                       'HTML stripped, text lowercased'
-               );
-
-               $this->assertEquals(
-                       'foo bar boz quux',
-                       $this->updateText( <<<EOT
-<table style="color:red; font-size:100px">
-       <tr class="scary"><td><div>foo</div></td><tr>bar</td></tr>
-       <tr><td>boz</td><tr>quux</td></tr>
-</table>
-EOT
-                       ), 'Stripping HTML tables' );
-
-               $this->assertEquals(
-                       'a b',
-                       $this->updateText( 'a > b' ),
-                       'Handle unclosed tags'
-               );
-
-               $text = str_pad( "foo <barbarbar \n", 10000, 'x' );
-
-               $this->assertNotEquals(
-                       '',
-                       $this->updateText( $text ),
-                       'Bug 18609'
-               );
-       }
-
-       /**
-        * @covers SearchUpdate::updateText
-        * @todo give this test a real name explaining what is being tested here
-        */
-       public function testBug32712() {
-               $text = "text „http://example.com“ text";
-               $result = $this->updateText( $text );
-               $processed = preg_replace( '/Q/u', 'Q', $result );
-               $this->assertTrue(
-                       $processed != '',
-                       'Link surrounded by unicode quotes should not fail UTF-8 validation'
-               );
-       }
-}
diff --git a/tests/phpunit/includes/specialpage/SpecialPageTest.php b/tests/phpunit/includes/specialpage/SpecialPageTest.php
new file mode 100644 (file)
index 0000000..245cdff
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * @covers SpecialPage
+ *
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.wiki@gmail.com >
+ */
+class SpecialPageTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgScript' => '/index.php',
+                       'wgContLang' => Language::factory( 'en' )
+               ) );
+       }
+
+       /**
+        * @dataProvider getTitleForProvider
+        */
+       public function testGetTitleFor( $expectedName, $name ) {
+               $title = SpecialPage::getTitleFor( $name );
+               $expected = Title::makeTitle( NS_SPECIAL, $expectedName );
+               $this->assertEquals( $expected, $title );
+       }
+
+       public function getTitleForProvider() {
+               return array(
+                       array( 'UserLogin', 'Userlogin' )
+               );
+       }
+
+       /**
+        * @expectedException PHPUnit_Framework_Error_Notice
+        */
+       public function testInvalidGetTitleFor() {
+               $title = SpecialPage::getTitleFor( 'cat' );
+               $expected = Title::makeTitle( NS_SPECIAL, 'Cat' );
+               $this->assertEquals( $expected, $title );
+       }
+
+       /**
+        * @expectedException PHPUnit_Framework_Error_Notice
+        * @dataProvider getTitleForWithWarningProvider
+        */
+       public function testGetTitleForWithWarning( $expected, $name ) {
+               $title = SpecialPage::getTitleFor( $name );
+               $this->assertEquals( $expected, $title );
+       }
+
+       public function getTitleForWithWarningProvider() {
+               return array(
+                       array( Title::makeTitle( NS_SPECIAL, 'UserLogin' ), 'UserLogin' )
+               );
+       }
+
+       /**
+        * @dataProvider requireLoginAnonProvider
+        */
+       public function testRequireLoginAnon( $expected, $reason, $title ) {
+               $specialPage = new SpecialPage( 'Watchlist', 'viewmywatchlist' );
+
+               $user = User::newFromId( 0 );
+               $specialPage->getContext()->setUser( $user );
+               $specialPage->getContext()->setLanguage( Language::factory( 'en' ) );
+
+               $this->setExpectedException( 'UserNotLoggedIn', $expected );
+
+               // $specialPage->requireLogin( [ $reason [, $title ] ] )
+               call_user_func_array(
+                       array( $specialPage, 'requireLogin' ),
+                       array_filter( array( $reason, $title ) )
+               );
+       }
+
+       public function requireLoginAnonProvider() {
+               $lang = 'en';
+
+               $expected1 = wfMessage( 'exception-nologin-text' )->inLanguage( $lang )->text();
+               $expected2 = wfMessage( 'about' )->inLanguage( $lang )->text();
+
+               return array(
+                       array( $expected1, null, null ),
+                       array( $expected2, 'about', null ),
+                       array( $expected2, 'about', 'about' ),
+               );
+       }
+
+       public function testRequireLoginNotAnon() {
+               $specialPage = new SpecialPage( 'Watchlist', 'viewmywatchlist' );
+
+               $user = User::newFromName( "UTSysop" );
+               $specialPage->getContext()->setUser( $user );
+
+               $specialPage->requireLogin();
+
+               // no exception thrown, logged in use can access special page
+               $this->assertTrue( true );
+       }
+
+}
index d341ccf..69485a0 100644 (file)
@@ -27,10 +27,10 @@ class SpecialBooksourcesTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers SpecialBooksources::isValidISBN
+        * @covers SpecialBookSources::isValidISBN
         * @dataProvider provideISBNs
         */
        public function testIsValidISBN( $isbn, $isValid ) {
-               $this->assertSame( $isValid, SpecialBooksources::isValidISBN( $isbn ) );
+               $this->assertSame( $isValid, SpecialBookSources::isValidISBN( $isbn ) );
        }
 }
index 14d1968..fe1c9e8 100644 (file)
@@ -5,11 +5,11 @@
 
 class SpecialMIMESearchTest extends MediaWikiTestCase {
 
-       /** @var MIMESearchPage */
+       /** @var MIMEsearchPage */
        private $page;
 
        function setUp() {
-               $this->page = new MIMESearchPage;
+               $this->page = new MIMEsearchPage;
                $context = new RequestContext();
                $context->setTitle( Title::makeTitle( NS_SPECIAL, 'MIMESearch' ) );
                $context->setRequest( new FauxRequest() );
diff --git a/tests/phpunit/includes/utils/MWFunctionTest.php b/tests/phpunit/includes/utils/MWFunctionTest.php
new file mode 100644 (file)
index 0000000..f4d1799
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @covers MWFunction
+ */
+class MWFunctionTest extends MediaWikiTestCase {
+       public function testNewObjFunction() {
+               $arg1 = 'Foo';
+               $arg2 = 'Bar';
+               $arg3 = array( 'Baz' );
+               $arg4 = new ExampleObject;
+
+               $args = array( $arg1, $arg2, $arg3, $arg4 );
+
+               $newObject = new MWBlankClass( $arg1, $arg2, $arg3, $arg4 );
+               $this->hideDeprecated( 'MWFunction::newObj' );
+               $this->assertEquals(
+                       MWFunction::newObj( 'MWBlankClass', $args )->args,
+                       $newObject->args
+               );
+       }
+}
+
+class MWBlankClass {
+
+       public $args = array();
+
+       function __construct( $arg1, $arg2, $arg3, $arg4 ) {
+               $this->args = array( $arg1, $arg2, $arg3, $arg4 );
+       }
+}
+
+class ExampleObject {
+}
index 9e62751..8c76397 100644 (file)
@@ -19,7 +19,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
        protected $exceptionFromAddDBData = null;
 
        /**
-        * Holds the xmlreader used for analyzing an xml dump
+        * Holds the XMLReader used for analyzing an XML dump
         *
         * @var XMLReader|null
         */
index 574c11e..860408f 100644 (file)
@@ -39,6 +39,7 @@ phpunit.php enables colors for other OSs at runtime
                        <file>suites/UploadFromUrlTestSuite.php</file>
                </testsuite>
                <testsuite name="extensions">
+                       <directory>structure</directory>
                        <file>suites/ExtensionsTestSuite.php</file>
                        <file>suites/ExtensionsParserTestSuite.php</file>
                        <file>suites/LessTestSuite.php</file>
index b800bc2..7294d62 100644 (file)
@@ -30,6 +30,8 @@
        // and assuming failure.
        QUnit.config.testTimeout = 30 * 1000;
 
+       QUnit.config.requireExpects = true;
+
        // Add a checkbox to QUnit header to toggle MediaWiki ResourceLoader debug mode.
        QUnit.config.urlConfig.push( {
                id: 'debug',
                tooltip: 'Enable debug mode in ResourceLoader'
        } );
 
-       QUnit.config.requireExpects = true;
-
-       /**
-        * Load TestSwarm agent
-        */
-       // Only if the current url indicates that there is a TestSwarm instance watching us
-       // (TestSwarm appends swarmURL to the test suites url it loads in iframes).
-       // Otherwise this is just a simple view of Special:JavaScriptTest/qunit directly,
-       // no point in loading inject.js in that case. Also, make sure that this instance
-       // of MediaWiki has actually been configured with the required url to that inject.js
-       // script. By default it is false.
-       if ( QUnit.urlParams.swarmURL && mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) {
-               jQuery.getScript( QUnit.fixurl( mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) );
-       }
-
        /**
         * CompletenessTest
         *
index b5fc800..bc02d0f 100644 (file)
@@ -805,7 +805,7 @@ class TidySupport {
                global $wgTidyBin;
 
                $this->internalTidy = extension_loaded( 'tidy' ) &&
-                       class_exists( 'tidy' );
+                       class_exists( 'tidy' ) && !wfIsHHVM();
 
                $this->externalTidy = is_executable( $wgTidyBin ) ||
                        Installer::locateExecutableInDefaultPaths( array( $wgTidyBin ) )
index 3d8612d..a972b21 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -135,12 +135,12 @@ function wfStreamThumb( array $params ) {
                // Format is <timestamp>!<name>
                $bits = explode( '!', $fileName, 2 );
                if ( count( $bits ) != 2 ) {
-                       wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
+                       wfThumbError( 404, wfMessage( 'badtitletext' )->parse() );
                        return;
                }
                $title = Title::makeTitleSafe( NS_FILE, $bits[1] );
                if ( !$title ) {
-                       wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
+                       wfThumbError( 404, wfMessage( 'badtitletext' )->parse() );
                        return;
                }
                $img = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $title, $fileName );
@@ -150,7 +150,7 @@ function wfStreamThumb( array $params ) {
 
        // Check the source file title
        if ( !$img ) {
-               wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
+               wfThumbError( 404, wfMessage( 'badtitletext' )->parse() );
                return;
        }
 
@@ -262,7 +262,7 @@ function wfStreamThumb( array $params ) {
                return;
        }
 
-       // For 404 handled thumbnails, we only use the the base name of the URI
+       // For 404 handled thumbnails, we only use the base name of the URI
        // for the thumb params and the parent directory for the source file name.
        // Check that the zone relative path matches up so squid caches won't pick
        // up thumbs that would not be purged on source file deletion (bug 34231).
@@ -310,10 +310,10 @@ function wfStreamThumb( array $params ) {
 
        $user = RequestContext::getMain()->getUser();
        if ( !wfThumbIsStandard( $img, $params ) && $user->pingLimiter( 'renderfile-nonstandard' ) ) {
-               wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
+               wfThumbError( 500, wfMessage( 'actionthrottledtext' )->parse() );
                return;
        } elseif ( $user->pingLimiter( 'renderfile' ) ) {
-               wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
+               wfThumbError( 500, wfMessage( 'actionthrottledtext' )->parse() );
                return;
        }
 
@@ -598,7 +598,7 @@ function wfExtractThumbParams( $file, $params ) {
  * Output a thumbnail generation error message
  *
  * @param int $status
- * @param string $msg
+ * @param string $msg HTML
  * @return void
  */
 function wfThumbError( $status, $msg ) {