Merge "Align mediawiki.ui vars with CSS color guidelines"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 29 Dec 2015 00:33:35 +0000 (00:33 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 29 Dec 2015 00:33:35 +0000 (00:33 +0000)
147 files changed:
HISTORY
autoload.php
includes/DefaultSettings.php
includes/Export.php [deleted file]
includes/Import.php
includes/Sanitizer.php
includes/Setup.php
includes/WebStart.php
includes/api/ApiBase.php
includes/api/ApiFormatRaw.php
includes/api/ApiMain.php
includes/api/i18n/ko.json
includes/api/i18n/lb.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hant.json
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RecentChange.php
includes/compat/normal/UtfNormalUtil.php
includes/context/ContextSource.php
includes/db/DBConnRef.php
includes/db/Database.php
includes/db/IDatabase.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/LegacySpi.php
includes/debug/logger/LoggerFactory.php
includes/debug/logger/MonologSpi.php
includes/debug/logger/NullSpi.php
includes/debug/logger/monolog/AvroFormatter.php
includes/debug/logger/monolog/LegacyHandler.php
includes/debug/logger/monolog/LineFormatter.php
includes/debug/logger/monolog/SyslogHandler.php
includes/diff/DairikiDiff.php
includes/exception/MWExceptionHandler.php
includes/export/Dump7ZipOutput.php [new file with mode: 0644]
includes/export/DumpBZip2Output.php [new file with mode: 0644]
includes/export/DumpFileOutput.php [new file with mode: 0644]
includes/export/DumpFilter.php [new file with mode: 0644]
includes/export/DumpGZipOutput.php [new file with mode: 0644]
includes/export/DumpLatestFilter.php [new file with mode: 0644]
includes/export/DumpMultiWriter.php [new file with mode: 0644]
includes/export/DumpNamespaceFilter.php [new file with mode: 0644]
includes/export/DumpNotalkFilter.php [new file with mode: 0644]
includes/export/DumpOutput.php [new file with mode: 0644]
includes/export/DumpPipeOutput.php [new file with mode: 0644]
includes/export/WikiExporter.php [new file with mode: 0644]
includes/export/XmlDumpWriter.php [new file with mode: 0644]
includes/installer/i18n/uk.json
includes/libs/objectcache/WANObjectCache.php
includes/parser/Parser.php
includes/parser/Preprocessor_Hash.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/specialpage/QueryPage.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialPreferences.php
includes/templates/EnhancedChangesListGroup.mustache [new file with mode: 0644]
includes/user/User.php
includes/utils/MWCryptHKDF.php
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bho.json
languages/i18n/br.json
languages/i18n/cs.json
languages/i18n/cv.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/eu.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/nah.json
languages/i18n/ne.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/rm.json
languages/i18n/sgs.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesGlk.php
languages/messages/MessagesJbo.php [new file with mode: 0644]
load.php
maintenance/benchmarks/Benchmarker.php
maintenance/cleanupTable.inc
maintenance/commandLine.inc
maintenance/findDeprecated.php
maintenance/generateLocalAutoload.php
maintenance/importDump.php
maintenance/importImages.inc
maintenance/importSites.php
maintenance/pageExists.php
maintenance/storage/blob_tracking.sql
resources/Resources.php
resources/src/jquery.tipsy/jquery.tipsy.js
resources/src/jquery/jquery.farbtastic.css
resources/src/mediawiki.action/mediawiki.action.view.filepage.css
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.special/mediawiki.special.preferences.styles.css
resources/src/mediawiki.ui/components/forms.less
resources/src/mediawiki.ui/components/icons.less
resources/src/mediawiki/bookletlayout/option2/ccbysa.svg
resources/src/mediawiki/bookletlayout/option2/noderiv.svg
resources/src/mediawiki/bookletlayout/option2/ownwork.svg
resources/src/mediawiki/bookletlayout/option2/useful.svg
resources/src/mediawiki/bookletlayout/option4/camera.svg
resources/src/mediawiki/bookletlayout/option4/graphics.svg
resources/src/mediawiki/bookletlayout/option4/search-ltr.svg
resources/src/mediawiki/bookletlayout/option4/search-rtl.svg
resources/src/mediawiki/bookletlayout/option4/website-ltr.svg
resources/src/mediawiki/bookletlayout/option4/website-rtl.svg
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.Title.js
tests/phpunit/includes/ExportTest.php [new file with mode: 0644]
tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
tests/phpunit/includes/exception/HttpErrorTest.php
tests/phpunit/includes/libs/MemoizedCallableTest.php
tests/phpunit/includes/logging/ProtectLogFormatterTest.php
tests/phpunit/includes/media/MediaWikiMediaTestCase.php
tests/phpunit/includes/media/XCFTest.php
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/utils/BatchRowUpdateTest.php
tests/phpunit/includes/utils/MWCryptHKDFTest.php
tests/phpunit/phpunit.php
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
thumb.php

diff --git a/HISTORY b/HISTORY
index 0410bd5..e57d346 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,6 +1,14 @@
 Change notes from older releases. For current info see RELEASE-NOTES-1.27.
 
-== MediaWiki 1.26 ==
+= MediaWiki 1.26 =
+
+== MediaWiki 1.26.2 ==
+
+This is a maintenance release of the MediaWiki 1.26 branch.
+
+=== Changes since 1.26.1 ===
+* (T121892) Fix fatal error on some Special pages, introduced in 1.26.1.
+
 == MediaWiki 1.26.1 ==
 
 This is a maintenance release of the MediaWiki 1.26 branch.
@@ -26,6 +34,8 @@ This is a maintenance release of the MediaWiki 1.26 branch.
 * Fix issue that breaks HHVM Repo Authorative mode.
 * (T120267) Work around APCu memory corruption bug
 
+== MediaWiki 1.26.0 ==
+
 === Configuration changes in 1.26 ===
 * $wgPasswordResetRoutes['email'] = true by default.
 * $wgEnableParserCache was deprecated, set $wgParserCacheType to CACHE_NONE
@@ -115,7 +125,7 @@ This is a maintenance release of the MediaWiki 1.26 branch.
   documentation for mw.Upload.Dialog, mw.Upload.BookletLayout and its
   subclasses for more information.
 
-== extension.json changes in 1.26 ==
+=== extension.json changes in 1.26 ===
 * (T99344) The extension.json schema is now versioned. All extensions
   and skins should set a "manifest_version" property corresponding to
   the schema version they were written for. The only supported version
@@ -268,7 +278,14 @@ changes to languages because of Phabricator reports.
 * $wgDeferredUpdateList was removed.
 * DeferredUpdates::addHTMLCacheUpdate() was removed.
 
-== MediaWiki 1.25 ==
+= MediaWiki 1.25 =
+
+== MediaWiki 1.25.5 ==
+
+This is a maintenance release of the MediaWiki 1.25 branch.
+
+=== Changes since 1.25.4 ===
+* (T121892) Fix fatal error on some Special pages, introduced in 1.25.4.
 
 == MediaWiki 1.25.4 ==
 
@@ -348,6 +365,8 @@ This is a bug fix release of the MediaWiki 1.25 branch.
 === Changes since 1.25 ===
 * (T100351) Fix syntax errors in extension.json of ConfirmEdit extension
 
+== MediaWiki 1.25.0 ==
+
 === Configuration changes in 1.25 ===
 * $wgPageShowWatchingUsers was removed.
 * $wgLocalVirtualHosts has been added to replace $wgConf->localVHosts.
@@ -850,55 +869,20 @@ changes to languages because of Bugzilla reports.
   loadedScripts object, from wikibits.js (deprecated since 1.17) now emit
   warnings through mw.log.warn when accessed.
 
+= MediaWiki 1.24 =
 
-== Compatibility ==
-
-MediaWiki 1.25 requires PHP 5.3.3 or later. There is experimental support for
-HHVM 3.3.0.
-
-MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for
-Oracle and Microsoft SQL Server.
+== MediaWiki 1.24.6 ==
 
-The supported versions are:
+This is a maintenance release of the MediaWiki 1.24 branch.
 
-* MySQL 5.0.3 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-* Microsoft SQL Server 2005 (9.00.1399)
-
-== Upgrading ==
-
-1.25 has several database changes since 1.24, and will not work without schema
-updates. Note that due to changes to some very large tables like the revision
-table, the schema update may take quite long (minutes on a medium sized site,
-many hours on a large site).
-
-If upgrading from before 1.11, and you are using a wiki as a commons
-repository, make sure that it is updated as well. Otherwise, errors may arise
-due to database schema changes.
-
-If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
-1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
-with MediaWiki 1.21.
-
-Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.24.x and older releases, see HISTORY.
-
-== MediaWiki 1.24 ==
+=== Changes since 1.24.5 ===
+* (T121892) Fix fatal error on some Special pages, introduced in 1.24.5.
 
 == MediaWiki 1.24.5 ==
 
 This is a security and maintenance release of the MediaWiki 1.23 branch.
 
-== Changes since 1.24.4 ==
+=== Changes since 1.24.4 ===
 * (T117899) SECURITY: $wgArticlePath can no longer be set to relative paths
   that do not begin with a slash. This enabled trivial XSS attacks.
   Configuration values such as "http://my.wiki.com/wiki/$1" are fine, as are
@@ -920,7 +904,7 @@ This is a security and maintenance release of the MediaWiki 1.23 branch.
 
 This is a security and maintenance release of the MediaWiki 1.24 branch.
 
-== Changes since 1.24.3 ==
+=== Changes since 1.24.3 ===
 
 * (T91653) Minimal PSR-3 debug logger to support backports from 1.25+.
 * (T68650) Fix indexing of moved pages with PostgreSQL. Requires running
@@ -935,7 +919,7 @@ This is a security and maintenance release of the MediaWiki 1.24 branch.
 
 This is a security and maintenance release of the MediaWiki 1.24 branch.
 
-== Changes since 1.24.2 ==
+=== Changes since 1.24.2 ===
 
 * (T94116) SECURITY: Compare API watchlist token in constant time
 * (T97391) SECURITY: Escape error message strings in thumb.php
@@ -949,7 +933,7 @@ This is a security and maintenance release of the MediaWiki 1.24 branch.
 
 This is a security and maintenance release of the MediaWiki 1.24 branch.
 
-== Changes since 1.24.1 ==
+=== Changes since 1.24.1 ===
 
 * (T85848, T71210) SECURITY: Don't parse XMP blocks that contain XML entities,
   to prevent various DoS attacks.
@@ -973,7 +957,7 @@ This is a security and maintenance release of the MediaWiki 1.24 branch.
 
 This is a security and maintenance release of the MediaWiki 1.24 branch.
 
-== Changes since 1.24.0 ==
+=== Changes since 1.24.0 ===
 
 * (bug T76686) [SECURITY] thumb.php outputs wikitext message as raw HTML, which
   could lead to xss. Permission to edit MediaWiki namespace is required to
@@ -986,6 +970,8 @@ This is a security and maintenance release of the MediaWiki 1.24 branch.
 * (bug T76168) OutputPage: Add accessors for some protected properties.
 * (bug T74834) Make 1.24 branch directly installable under PostgreSQL.
 
+== MediaWiki 1.24.0 ==
+
 === Configuration changes in 1.24 ===
 * MediaWiki will no longer run if register_globals is enabled. It has been
   deprecated for 5 years now, and was removed in PHP 5.4. For more information
@@ -1678,14 +1664,20 @@ of files that are no longer available follows.
 * skins/common/images/icons/fileicon.png
 * skins/common/images/ksh/button_S_italic.png
 
+= MediaWiki 1.23 =
+
+== MediaWiki 1.23.13 ==
 
-== MediaWiki 1.23 ==
+This is a maintenance release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.12 ===
+* (T121892) Fix fatal errors on some Special pages, introduced in 1.23.12.
 
 == MediaWiki 1.23.12 ==
 
 This is a security and maintenance release of the MediaWiki 1.23 branch.
 
-== Changes since 1.23.11 ==
+=== Changes since 1.23.11 ===
 * (T117899) SECURITY: $wgArticlePath can no longer be set to relative paths
   that do not begin with a slash. This enabled trivial XSS attacks.
   Configuration values such as "http://my.wiki.com/wiki/$1" are fine, as are
@@ -1706,7 +1698,7 @@ This is a security and maintenance release of the MediaWiki 1.23 branch.
 
 This is a security and maintenance release of the MediaWiki 1.23 branch.
 
-== Changes since 1.23.10 ==
+=== Changes since 1.23.10 ===
 
 * (T91850) SECURITY: Add throttle check in ApiUpload and SpecialUpload
 * (T91203, T91205) SECURITY: API: Improve validation in chunked uploading
@@ -1716,7 +1708,7 @@ This is a security and maintenance release of the MediaWiki 1.23 branch.
 
 This is a security and maintenance release of the MediaWiki 1.23 branch.
 
-== Changes since 1.23.9 ==
+=== Changes since 1.23.9 ===
 
 * (T94116) SECURITY: Compare API watchlist token in constant time
 * (T97391) SECURITY: Escape error message strings in thumb.php
@@ -1731,7 +1723,7 @@ This is a security and maintenance release of the MediaWiki 1.23 branch.
 
 This is a security and maintenance release of the MediaWiki 1.23 branch.
 
-== Changes since 1.23.8 ==
+=== Changes since 1.23.8 ===
 
 * (T85848, T71210) SECURITY: Don't parse XMP blocks that contain XML entities,
   to prevent various DoS attacks.
@@ -1744,14 +1736,14 @@ This is a security and maintenance release of the MediaWiki 1.23 branch.
   prevent XSS and protect viewer's privacy.
 * (bug T68650) Fix indexing of moved pages with PostgreSQL. Requires running
   update.php to fix.
-* (bug T70087) Fix Special:ActiveUsers page for installations using 
+* (bug T70087) Fix Special:ActiveUsers page for installations using
   PostgreSQL.
 
 == MediaWiki 1.23.8 ==
 
 This is a security and maintenance release of the MediaWiki 1.23 branch.
 
-== Changes since 1.23.7 ==
+=== Changes since 1.23.7 ===
 
 * (bug T76686) [SECURITY] thumb.php outputs wikitext message as raw HTML, which
   could lead to xss. Permission to edit MediaWiki namespace is required to
@@ -1765,7 +1757,7 @@ This is a security and maintenance release of the MediaWiki 1.23 branch.
 
 This is a security and maintenance release of the MediaWiki 1.23 branch.
 
-== Changes since 1.23.6 ==
+=== Changes since 1.23.6 ===
 
 * (bugs 66776, 71478) SECURITY:  User PleaseStand reported a way to inject code
   into API clients that used format=php to process pages that underwent flash
@@ -1869,6 +1861,7 @@ This is a security and maintenance release of the MediaWiki 1.23 branch.
   like only extracting the tail of the file partially or not at all.
 * (bug 66182) Removed -x flag on some php files.
 
+== MediaWiki 1.23.0 ==
 
 === Configuration changes in 1.23 ===
 * (bug 13250) Restored method for clearing a watchlist in web UI
@@ -2337,7 +2330,7 @@ changes to languages because of Bugzilla reports.
 ==== Removed globals ====
 * $wgBetterDirectionality (deprecated in 1.18)
 
-== MediaWiki 1.22 ==
+= MediaWiki 1.22 =
 
 == MediaWiki 1.22.15 ==
 
@@ -2493,6 +2486,8 @@ This is a security and maintenance release of the MediaWiki 1.22 branch.
 * (bug 47055) Changed FOR UPDATE handling in Postgresql
 * (bug 57026) Avoid extra parsing in prepareContentForEdit()
 
+== MediaWiki 1.22.0 ==
+
 === Configuration changes in 1.22 ===
 * $wgRedirectScript was removed. It was unused.
 * Removed $wgLocalMessageCacheSerialized, it is now always true.
@@ -2902,7 +2897,7 @@ This is a security and maintenance release of the MediaWiki 1.22 branch.
   file repositories, and related ForeignAPIRepo methods getInfo and getApiUrl.
 * The new query module list=allfileusages to enumerate file usages was added.
 
-=== Languages updated in 1.22===
+=== Languages updated in 1.22 ===
 
 MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
@@ -3020,7 +3015,7 @@ changes to languages because of Bugzilla reports.
 * mediawiki.util: mw.util.wikiGetlink has been renamed to getUrl. (The old name
   still works, but is deprecated.)
 
-== MediaWiki 1.21 ==
+= MediaWiki 1.21 =
 
 == MediaWiki 1.21.11 ==
 This is a security and maintenance release of the MediaWiki 1.21 branch.
@@ -3108,6 +3103,8 @@ This is a maintenance release of the MediaWiki 1.21 branch.
 * A problem with the Oracle SQL table creation was fixed.
 * (PdfHandler extension) Fix warning if pdfinfo fails but pdftext succeeds.
 
+== MediaWiki 1.21.0 ==
+
 === Configuration changes in 1.21 ===
 * (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
 * Deprecated $wgAllowRealName is removed. Use $wgHiddenPrefs[] = 'realname'
@@ -3436,7 +3433,7 @@ changes to languages because of Bugzilla reports.
 * BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
   and moved it to the TitleBlacklist extension.
 
-== MediaWiki 1.20 ==
+= MediaWiki 1.20 =
 
 == MediaWiki 1.20.8 ==
 This is a security release of the MediaWiki 1.20 branch.
@@ -3489,7 +3486,7 @@ This is a security release of the MediaWiki 1.20 branch.
 == MediaWiki 1.20.3 ==
 This is a security and maintenance release of the MediaWiki 1.20 branch.
 
-== MediaWiki 1.20.2 ==
+=== Changes since MediaWiki 1.20.2 ===
 * New preference type - 'api'. Preferences of this type are not shown on Special:Preferences, but are still available via the action=options API. (Unbreaks MLEB.)
 * (bug 44010) Context is passed to UserGetLanguageObject.
 * The recursion guard on RequestContext::getLanguage() was weakened.
@@ -3503,14 +3500,14 @@ This is a security and maintenance release of the MediaWiki 1.20 branch.
 == MediaWiki 1.20.2 ==
 This is a maintenance release of the MediaWiki 1.20 branch
 
-== MediaWiki 1.20.1 ==
+=== Changes since MediaWiki 1.20.1 ===
 * (bug 42638) Fix API action=options&reset=1 & unit tests.
 * (bug 42370) Fixed backport of 60cc060 to use mDoneWrites — caused * (bug 42592) User rights, preferences and other things are not saving in 1.20.1.
 
 == MediaWiki 1.20.1 ==
 This is a security release of the MediaWiki 1.20 branch
 
-Changes since 1.20
+=== Changes since 1.20.0 ===
 * (bug 42202) Validate options to prevent html injection
 * (bug 40995) Prevent session fixation in Special:UserLogin (CVE-2012-5391)
 * (bug 41400) Prevent linker regex from exceeding PCRE backtrack limit
@@ -3518,9 +3515,7 @@ Changes since 1.20
 * (bug 40632) Remove CleanupPresentationalAttributes feature
 * [Database] Fixed case where trx idle callbacks might be lost.
 
-
-
-== MediaWiki 1.20 ==
+== MediaWiki 1.20.0 ==
 
 === PHP 5.3 now required ===
 Since 1.20, the lowest supported version of PHP is now 5.3.2. Please
@@ -3887,7 +3882,7 @@ changes to languages because of Bugzilla reports.
 == MediaWiki 1.19.21 ==
 This is a maintenance release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.20===
+=== Changes since 1.19.20 ===
 * (bug 67440) Allow classes to be registered properly from installer.
 * (bug 47281) Fixed a dumpBackup.php error with --uploads --include-filesoptions: Unable to find the wrapper "mwstore". * System administrators are encouraged to upgrade to this release or 1.22+ and produce a full data dump. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Backing_up_a_wiki
 * (bug 63049) Removed anonymous functions from ApiFormatBase, added in1.19.13 as part of the fix for bug 61362, for PHP 5.2 compatibility.
@@ -3895,73 +3890,73 @@ This is a maintenance release of the MediaWiki 1.19 branch.
 == MediaWiki 1.19.20 ==
 This is a security release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.19===
+=== Changes since 1.19.19 ===
 * (bug 70672) SECURITY: OutputPage: Remove separation of css and js module allowance.
 
 == MediaWiki 1.19.19 ==
 This is a security release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.18===
+=== Changes since 1.19.18 ===
 * (bug 69008) SECURITY: Enhance CSS filtering in SVG files. Filter <style> elements; normalize style elements and attributes before filtering; add checks for attributes that contain css; add unit tests for html5sec and reported bugs.
 
 == MediaWiki 1.19.18 ==
 This is a security release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.17===
+=== Changes since 1.19.17 ===
 * (bug 68187) SECURITY: Prepend jsonp callback with comment.
 * (bug 65778) SECURITY: Copy prevent-clickjacking between OutputPage and ParserOutput.
 
 == MediaWiki 1.19.17 ==
 This is a security and maintenance release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.16===
+=== Changes since 1.19.16 ===
 * (bug 65839) SECURITY: Prevent external resources in SVG files.
 * (bug 66428) MimeMagic: Don't seek before BOF. This has weird side effects like only extracting the tail of the file partially or not at all.
 
 == MediaWiki 1.19.16 ==
 This is a security release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.15===
+=== Changes since 1.19.15 ===
 * (bug 65501) SECURITY: Don't parse usernames as wikitext on Special:PasswordReset.
 
 == MediaWiki 1.19.15 ==
 This is a security and maintenance release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.14===
+=== Changes since 1.19.14 ===
 Fixed resetting passwords.
 * (bug 58640) Fixed a compatibility issue with PCRE 8.34 that caused pages to appear blank or with missing text.
 
 == MediaWiki 1.19.14 ==
 This is a security and maintenance release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.13===
+=== Changes since 1.19.13 ===
 * (bug 62497) SECURITY: Add CSRF token on Special:ChangePassword.
 * (bug 62467) Set a title for the context during import on the cli.
 
 == MediaWiki 1.19.13 ==
 This is a security and maintenance release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.12===
+=== Changes since 1.19.12 ===
 * (bug 61362) SECURITY: API: Don't find links in the middle of api.php links.
 * Use the correct branch of the extensions' git repositories.
 
 == MediaWiki 1.19.12 ==
 This is a security release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.11===
+=== Changes since 1.19.11 ===
 * (bug 60771) SECURITY: Disallow uploading SVG files using non-whitelisted namespaces. Also disallow iframe elements. * User will get an error including the namespace name if they use a non- whitelisted namespace.
 * (bug 61346) SECURITY: Make token comparison use constant time. It seems like our token comparison would be vulnerable to timing attacks. This will take constant time.
 
 == MediaWiki 1.19.11 ==
 This is a security release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.10===
+=== Changes since 1.19.10 ===
 * (bug 60339) SECURITY: Sanitize shell arguments to DjVu files, and other media formats
 
 == MediaWiki 1.19.10 ==
 This is a security release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.9===
+=== Changes since 1.19.9 ===
 * (bug 57550) SECURITY: Disallow stylesheets in SVG Uploads
 * (bug 58088) SECURITY: Don't normalize U+FF3C to \ in CSS Checks
 * (bug 58472) SECURITY: Disallow -o-link in styles
@@ -3971,7 +3966,7 @@ This is a security release of the MediaWiki 1.19 branch.
 == MediaWiki 1.19.9 ==
 This is a security and maintenance release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.8===
+=== Changes since 1.19.8 ===
 * (bug 53032) SECURITY: Don't cache when a call could autocreate
 * (bug 55332) SECURITY: Improve css javascript detection
 * (bug 49717) Fix behaviour $wgVerifyMimeType = false; in Upload
@@ -3982,7 +3977,7 @@ This is a security and maintenance release of the MediaWiki 1.19 branch.
 
 This is a security and maintenance release of the MediaWiki 1.19 branch.
 
-=== Changes since 1.19.7===
+=== Changes since 1.19.7 ===
 * SECURITY: Sanitize ResourceLoader exception messages
 * SECURITY: Token-getting functions will fail when using jsonp callbacks.
 * SECURITY: Fix extension detection with 2 .'s
@@ -3995,7 +3990,7 @@ This is a security and maintenance release of the MediaWiki 1.19 branch.
 
 This is a security release of the MediaWiki 1.19 branch
 
-=== Changes since 1.19.6===
+=== Changes since 1.19.6 ===
 * (bug 48306) SECURITY: Run file validation checks on chunked uploads, and chunks of upload, during the upload process.
 
 == MediaWiki 1.19.6 ==
@@ -4003,7 +3998,7 @@ This is a security release of the MediaWiki 1.19 branch
 
 This is a security and maintenance release of the MediaWiki 1.19 branch
 
-=== Changes since 1.19.5===
+=== Changes since 1.19.5 ===
 * (bug 47304) SECURITY: Check SVG xml encoding against whitelist
 * (bug 46590) Added AbortChangePassword hook to allow extensions to abort password changes from Special:ChangePassword
 * Localisation updates from http://translatewiki.net.
@@ -4016,7 +4011,7 @@ This is a security and maintenance release of the MediaWiki 1.19 branch
 
 This is a security and maintenance release of the MediaWiki 1.19 branch
 
-=== Changes since 1.19.4===
+=== Changes since 1.19.4 ===
 * (bug 47251) SECURITY: Disable external entities in Import
 * (bug 46859) SECURITY: Disable external entities in XMLReader
 * (bug 46084) SECURITY: Sanitize $limitReport before outputting
@@ -4028,7 +4023,7 @@ This is a security and maintenance release of the MediaWiki 1.19 branch
 
 This is a security release of the MediaWiki 1.19 branch
 
-=== Changes since 1.19.3===
+=== Changes since 1.19.3 ===
 * New preference type - 'api'. Preferences of this type are not shown on Special:Preferences, but are still available via the action=options API.
 * (bug 44010) Context is passed to UserGetLanguageObject.
 * The recursion guard on RequestContext::getLanguage() was weakened.
@@ -4040,7 +4035,7 @@ This is a security release of the MediaWiki 1.19 branch
 
 This is a security release of the MediaWiki 1.19 branch
 
-=== Changes since 1.19.2===
+=== Changes since 1.19.2 ===
 * (bug 40995) Prevent session fixation in Special:UserLogin (CVE-2012-5391)
 * (bug 41400) Prevent linker regex from exceeding PCRE backtrack limit
 * Increase permitted runtime for testParserTest (only used for continuous integration).
index 8c5ec81..4d7ed5b 100644 (file)
@@ -352,21 +352,21 @@ $wgAutoloadLocalClasses = array(
        'DoubleReplacer' => __DIR__ . '/includes/libs/replacers/DoubleReplacer.php',
        'DummyLinker' => __DIR__ . '/includes/Linker.php',
        'DummyTermColorer' => __DIR__ . '/maintenance/term/MWTerm.php',
-       'Dump7ZipOutput' => __DIR__ . '/includes/Export.php',
-       'DumpBZip2Output' => __DIR__ . '/includes/Export.php',
+       'Dump7ZipOutput' => __DIR__ . '/includes/export/Dump7ZipOutput.php',
+       'DumpBZip2Output' => __DIR__ . '/includes/export/DumpBZip2Output.php',
        'DumpDBZip2Output' => __DIR__ . '/maintenance/backup.inc',
-       'DumpFileOutput' => __DIR__ . '/includes/Export.php',
-       'DumpFilter' => __DIR__ . '/includes/Export.php',
-       'DumpGZipOutput' => __DIR__ . '/includes/Export.php',
+       'DumpFileOutput' => __DIR__ . '/includes/export/DumpFileOutput.php',
+       'DumpFilter' => __DIR__ . '/includes/export/DumpFilter.php',
+       'DumpGZipOutput' => __DIR__ . '/includes/export/DumpGZipOutput.php',
        'DumpIterator' => __DIR__ . '/maintenance/dumpIterator.php',
-       'DumpLatestFilter' => __DIR__ . '/includes/Export.php',
+       'DumpLatestFilter' => __DIR__ . '/includes/export/DumpLatestFilter.php',
        'DumpLinks' => __DIR__ . '/maintenance/dumpLinks.php',
        'DumpMessages' => __DIR__ . '/maintenance/language/dumpMessages.php',
-       'DumpMultiWriter' => __DIR__ . '/includes/Export.php',
-       'DumpNamespaceFilter' => __DIR__ . '/includes/Export.php',
-       'DumpNotalkFilter' => __DIR__ . '/includes/Export.php',
-       'DumpOutput' => __DIR__ . '/includes/Export.php',
-       'DumpPipeOutput' => __DIR__ . '/includes/Export.php',
+       'DumpMultiWriter' => __DIR__ . '/includes/export/DumpMultiWriter.php',
+       'DumpNamespaceFilter' => __DIR__ . '/includes/export/DumpNamespaceFilter.php',
+       'DumpNotalkFilter' => __DIR__ . '/includes/export/DumpNotalkFilter.php',
+       'DumpOutput' => __DIR__ . '/includes/export/DumpOutput.php',
+       'DumpPipeOutput' => __DIR__ . '/includes/export/DumpPipeOutput.php',
        'DumpRenderer' => __DIR__ . '/maintenance/renderDump.php',
        'DumpRev' => __DIR__ . '/maintenance/storage/dumpRev.php',
        'DuplicateJob' => __DIR__ . '/includes/jobqueue/jobs/DuplicateJob.php',
@@ -1386,7 +1386,7 @@ $wgAutoloadLocalClasses = array(
        'WebResponse' => __DIR__ . '/includes/WebResponse.php',
        'WikiCategoryPage' => __DIR__ . '/includes/page/WikiCategoryPage.php',
        'WikiDiff3' => __DIR__ . '/includes/diff/WikiDiff3.php',
-       'WikiExporter' => __DIR__ . '/includes/Export.php',
+       'WikiExporter' => __DIR__ . '/includes/export/WikiExporter.php',
        'WikiFilePage' => __DIR__ . '/includes/page/WikiFilePage.php',
        'WikiImporter' => __DIR__ . '/includes/Import.php',
        'WikiMap' => __DIR__ . '/includes/WikiMap.php',
@@ -1408,7 +1408,7 @@ $wgAutoloadLocalClasses = array(
        'XMPValidate' => __DIR__ . '/includes/media/XMPValidate.php',
        'Xhprof' => __DIR__ . '/includes/libs/Xhprof.php',
        'Xml' => __DIR__ . '/includes/Xml.php',
-       'XmlDumpWriter' => __DIR__ . '/includes/Export.php',
+       'XmlDumpWriter' => __DIR__ . '/includes/export/XmlDumpWriter.php',
        'XmlJsCode' => __DIR__ . '/includes/Xml.php',
        'XmlSelect' => __DIR__ . '/includes/XmlSelect.php',
        'XmlTypeCheck' => __DIR__ . '/includes/libs/XmlTypeCheck.php',
index 76309b9..a6d34b0 100644 (file)
@@ -1003,7 +1003,6 @@ $wgJpegTran = '/usr/bin/jpegtran';
  */
 $wgExiv2Command = '/usr/bin/exiv2';
 
-
 /**
  * Path to exiftool binary. Used for lossless ICC profile swapping.
  *
@@ -1470,7 +1469,6 @@ $wgDjvuOutputExtension = 'jpg';
  * @{
  */
 
-
 /**
  * Site admin email address.
  *
@@ -4434,7 +4432,6 @@ $wgPasswordPolicy = array(
        ),
 );
 
-
 /**
  * For compatibility with old installations set to false
  * @deprecated since 1.24 will be removed in future
@@ -5559,6 +5556,11 @@ $wgTrxProfilerLimits = array(
                'writeQueryTime' => 1,
                'maxAffected' => 500
        ),
+       'POST-nonwrite' => array(
+               'masterConns' => 0,
+               'writes' => 0,
+               'readQueryTime' => 5
+       ),
        // Background job runner
        'JobRunner' => array(
                'readQueryTime' => 30,
diff --git a/includes/Export.php b/includes/Export.php
deleted file mode 100644 (file)
index b4d7737..0000000
+++ /dev/null
@@ -1,1549 +0,0 @@
-<?php
-/**
- * Base classes for dumps and export
- *
- * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * @defgroup Dump Dump
- */
-
-/**
- * @ingroup SpecialPage Dump
- */
-class WikiExporter {
-       /** @var bool Return distinct author list (when not returning full history) */
-       public $list_authors = false;
-
-       /** @var bool */
-       public $dumpUploads = false;
-
-       /** @var bool */
-       public $dumpUploadFileContents = false;
-
-       /** @var string */
-       public $author_list = "";
-
-       const FULL = 1;
-       const CURRENT = 2;
-       const STABLE = 4; // extension defined
-       const LOGS = 8;
-       const RANGE = 16;
-
-       const BUFFER = 0;
-       const STREAM = 1;
-
-       const TEXT = 0;
-       const STUB = 1;
-
-       /** @var int */
-       public $buffer;
-
-       /** @var int */
-       public $text;
-
-       /** @var DumpOutput */
-       public $sink;
-
-       /**
-        * Returns the export schema version.
-        * @return string
-        */
-       public static function schemaVersion() {
-               return "0.10";
-       }
-
-       /**
-        * If using WikiExporter::STREAM to stream a large amount of data,
-        * provide a database connection which is not managed by
-        * LoadBalancer to read from: some history blob types will
-        * make additional queries to pull source data while the
-        * main query is still running.
-        *
-        * @param IDatabase $db
-        * @param int|array $history One of WikiExporter::FULL, WikiExporter::CURRENT,
-        *   WikiExporter::RANGE or WikiExporter::STABLE, or an associative array:
-        *   - offset: non-inclusive offset at which to start the query
-        *   - limit: maximum number of rows to return
-        *   - dir: "asc" or "desc" timestamp order
-        * @param int $buffer One of WikiExporter::BUFFER or WikiExporter::STREAM
-        * @param int $text One of WikiExporter::TEXT or WikiExporter::STUB
-        */
-       function __construct( $db, $history = WikiExporter::CURRENT,
-                       $buffer = WikiExporter::BUFFER, $text = WikiExporter::TEXT ) {
-               $this->db = $db;
-               $this->history = $history;
-               $this->buffer = $buffer;
-               $this->writer = new XmlDumpWriter();
-               $this->sink = new DumpOutput();
-               $this->text = $text;
-       }
-
-       /**
-        * Set the DumpOutput or DumpFilter object which will receive
-        * various row objects and XML output for filtering. Filters
-        * can be chained or used as callbacks.
-        *
-        * @param DumpOutput $sink
-        */
-       public function setOutputSink( &$sink ) {
-               $this->sink =& $sink;
-       }
-
-       public function openStream() {
-               $output = $this->writer->openStream();
-               $this->sink->writeOpenStream( $output );
-       }
-
-       public function closeStream() {
-               $output = $this->writer->closeStream();
-               $this->sink->writeCloseStream( $output );
-       }
-
-       /**
-        * Dumps a series of page and revision records for all pages
-        * in the database, either including complete history or only
-        * the most recent version.
-        */
-       public function allPages() {
-               $this->dumpFrom( '' );
-       }
-
-       /**
-        * Dumps a series of page and revision records for those pages
-        * in the database falling within the page_id range given.
-        * @param int $start Inclusive lower limit (this id is included)
-        * @param int $end Exclusive upper limit (this id is not included)
-        *   If 0, no upper limit.
-        */
-       public function pagesByRange( $start, $end ) {
-               $condition = 'page_id >= ' . intval( $start );
-               if ( $end ) {
-                       $condition .= ' AND page_id < ' . intval( $end );
-               }
-               $this->dumpFrom( $condition );
-       }
-
-       /**
-        * Dumps a series of page and revision records for those pages
-        * in the database with revisions falling within the rev_id range given.
-        * @param int $start Inclusive lower limit (this id is included)
-        * @param int $end Exclusive upper limit (this id is not included)
-        *   If 0, no upper limit.
-        */
-       public function revsByRange( $start, $end ) {
-               $condition = 'rev_id >= ' . intval( $start );
-               if ( $end ) {
-                       $condition .= ' AND rev_id < ' . intval( $end );
-               }
-               $this->dumpFrom( $condition );
-       }
-
-       /**
-        * @param Title $title
-        */
-       public function pageByTitle( $title ) {
-               $this->dumpFrom(
-                       'page_namespace=' . $title->getNamespace() .
-                       ' AND page_title=' . $this->db->addQuotes( $title->getDBkey() ) );
-       }
-
-       /**
-        * @param string $name
-        * @throws MWException
-        */
-       public function pageByName( $name ) {
-               $title = Title::newFromText( $name );
-               if ( is_null( $title ) ) {
-                       throw new MWException( "Can't export invalid title" );
-               } else {
-                       $this->pageByTitle( $title );
-               }
-       }
-
-       /**
-        * @param array $names
-        */
-       public function pagesByName( $names ) {
-               foreach ( $names as $name ) {
-                       $this->pageByName( $name );
-               }
-       }
-
-       public function allLogs() {
-               $this->dumpFrom( '' );
-       }
-
-       /**
-        * @param int $start
-        * @param int $end
-        */
-       public function logsByRange( $start, $end ) {
-               $condition = 'log_id >= ' . intval( $start );
-               if ( $end ) {
-                       $condition .= ' AND log_id < ' . intval( $end );
-               }
-               $this->dumpFrom( $condition );
-       }
-
-       /**
-        * Generates the distinct list of authors of an article
-        * Not called by default (depends on $this->list_authors)
-        * Can be set by Special:Export when not exporting whole history
-        *
-        * @param array $cond
-        */
-       protected function do_list_authors( $cond ) {
-               $this->author_list = "<contributors>";
-               // rev_deleted
-
-               $res = $this->db->select(
-                       array( 'page', 'revision' ),
-                       array( 'DISTINCT rev_user_text', 'rev_user' ),
-                       array(
-                               $this->db->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0',
-                               $cond,
-                               'page_id = rev_id',
-                       ),
-                       __METHOD__
-               );
-
-               foreach ( $res as $row ) {
-                       $this->author_list .= "<contributor>" .
-                               "<username>" .
-                               htmlentities( $row->rev_user_text ) .
-                               "</username>" .
-                               "<id>" .
-                               $row->rev_user .
-                               "</id>" .
-                               "</contributor>";
-               }
-               $this->author_list .= "</contributors>";
-       }
-
-       /**
-        * @param string $cond
-        * @throws MWException
-        * @throws Exception
-        */
-       protected function dumpFrom( $cond = '' ) {
-               # For logging dumps...
-               if ( $this->history & self::LOGS ) {
-                       $where = array( 'user_id = log_user' );
-                       # Hide private logs
-                       $hideLogs = LogEventsList::getExcludeClause( $this->db );
-                       if ( $hideLogs ) {
-                               $where[] = $hideLogs;
-                       }
-                       # Add on any caller specified conditions
-                       if ( $cond ) {
-                               $where[] = $cond;
-                       }
-                       # Get logging table name for logging.* clause
-                       $logging = $this->db->tableName( 'logging' );
-
-                       if ( $this->buffer == WikiExporter::STREAM ) {
-                               $prev = $this->db->bufferResults( false );
-                       }
-                       $result = null; // Assuring $result is not undefined, if exception occurs early
-                       try {
-                               $result = $this->db->select( array( 'logging', 'user' ),
-                                       array( "{$logging}.*", 'user_name' ), // grab the user name
-                                       $where,
-                                       __METHOD__,
-                                       array( 'ORDER BY' => 'log_id', 'USE INDEX' => array( 'logging' => 'PRIMARY' ) )
-                               );
-                               $this->outputLogStream( $result );
-                               if ( $this->buffer == WikiExporter::STREAM ) {
-                                       $this->db->bufferResults( $prev );
-                               }
-                       } catch ( Exception $e ) {
-                               // Throwing the exception does not reliably free the resultset, and
-                               // would also leave the connection in unbuffered mode.
-
-                               // Freeing result
-                               try {
-                                       if ( $result ) {
-                                               $result->free();
-                                       }
-                               } catch ( Exception $e2 ) {
-                                       // Already in panic mode -> ignoring $e2 as $e has
-                                       // higher priority
-                               }
-
-                               // Putting database back in previous buffer mode
-                               try {
-                                       if ( $this->buffer == WikiExporter::STREAM ) {
-                                               $this->db->bufferResults( $prev );
-                                       }
-                               } catch ( Exception $e2 ) {
-                                       // Already in panic mode -> ignoring $e2 as $e has
-                                       // higher priority
-                               }
-
-                               // Inform caller about problem
-                               throw $e;
-                       }
-               # For page dumps...
-               } else {
-                       $tables = array( 'page', 'revision' );
-                       $opts = array( 'ORDER BY' => 'page_id ASC' );
-                       $opts['USE INDEX'] = array();
-                       $join = array();
-                       if ( is_array( $this->history ) ) {
-                               # Time offset/limit for all pages/history...
-                               $revJoin = 'page_id=rev_page';
-                               # Set time order
-                               if ( $this->history['dir'] == 'asc' ) {
-                                       $op = '>';
-                                       $opts['ORDER BY'] = 'rev_timestamp ASC';
-                               } else {
-                                       $op = '<';
-                                       $opts['ORDER BY'] = 'rev_timestamp DESC';
-                               }
-                               # Set offset
-                               if ( !empty( $this->history['offset'] ) ) {
-                                       $revJoin .= " AND rev_timestamp $op " .
-                                               $this->db->addQuotes( $this->db->timestamp( $this->history['offset'] ) );
-                               }
-                               $join['revision'] = array( 'INNER JOIN', $revJoin );
-                               # Set query limit
-                               if ( !empty( $this->history['limit'] ) ) {
-                                       $opts['LIMIT'] = intval( $this->history['limit'] );
-                               }
-                       } elseif ( $this->history & WikiExporter::FULL ) {
-                               # Full history dumps...
-                               $join['revision'] = array( 'INNER JOIN', 'page_id=rev_page' );
-                       } elseif ( $this->history & WikiExporter::CURRENT ) {
-                               # Latest revision dumps...
-                               if ( $this->list_authors && $cond != '' ) { // List authors, if so desired
-                                       $this->do_list_authors( $cond );
-                               }
-                               $join['revision'] = array( 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' );
-                       } elseif ( $this->history & WikiExporter::STABLE ) {
-                               # "Stable" revision dumps...
-                               # Default JOIN, to be overridden...
-                               $join['revision'] = array( 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' );
-                               # One, and only one hook should set this, and return false
-                               if ( Hooks::run( 'WikiExporter::dumpStableQuery', array( &$tables, &$opts, &$join ) ) ) {
-                                       throw new MWException( __METHOD__ . " given invalid history dump type." );
-                               }
-                       } elseif ( $this->history & WikiExporter::RANGE ) {
-                               # Dump of revisions within a specified range
-                               $join['revision'] = array( 'INNER JOIN', 'page_id=rev_page' );
-                               $opts['ORDER BY'] = array( 'rev_page ASC', 'rev_id ASC' );
-                       } else {
-                               # Unknown history specification parameter?
-                               throw new MWException( __METHOD__ . " given invalid history dump type." );
-                       }
-                       # Query optimization hacks
-                       if ( $cond == '' ) {
-                               $opts[] = 'STRAIGHT_JOIN';
-                               $opts['USE INDEX']['page'] = 'PRIMARY';
-                       }
-                       # Build text join options
-                       if ( $this->text != WikiExporter::STUB ) { // 1-pass
-                               $tables[] = 'text';
-                               $join['text'] = array( 'INNER JOIN', 'rev_text_id=old_id' );
-                       }
-
-                       if ( $this->buffer == WikiExporter::STREAM ) {
-                               $prev = $this->db->bufferResults( false );
-                       }
-
-                       $result = null; // Assuring $result is not undefined, if exception occurs early
-                       try {
-                               Hooks::run( 'ModifyExportQuery',
-                                               array( $this->db, &$tables, &$cond, &$opts, &$join ) );
-
-                               # Do the query!
-                               $result = $this->db->select( $tables, '*', $cond, __METHOD__, $opts, $join );
-                               # Output dump results
-                               $this->outputPageStream( $result );
-
-                               if ( $this->buffer == WikiExporter::STREAM ) {
-                                       $this->db->bufferResults( $prev );
-                               }
-                       } catch ( Exception $e ) {
-                               // Throwing the exception does not reliably free the resultset, and
-                               // would also leave the connection in unbuffered mode.
-
-                               // Freeing result
-                               try {
-                                       if ( $result ) {
-                                               $result->free();
-                                       }
-                               } catch ( Exception $e2 ) {
-                                       // Already in panic mode -> ignoring $e2 as $e has
-                                       // higher priority
-                               }
-
-                               // Putting database back in previous buffer mode
-                               try {
-                                       if ( $this->buffer == WikiExporter::STREAM ) {
-                                               $this->db->bufferResults( $prev );
-                                       }
-                               } catch ( Exception $e2 ) {
-                                       // Already in panic mode -> ignoring $e2 as $e has
-                                       // higher priority
-                               }
-
-                               // Inform caller about problem
-                               throw $e;
-                       }
-               }
-       }
-
-       /**
-        * Runs through a query result set dumping page and revision records.
-        * The result set should be sorted/grouped by page to avoid duplicate
-        * page records in the output.
-        *
-        * Should be safe for
-        * streaming (non-buffered) queries, as long as it was made on a
-        * separate database connection not managed by LoadBalancer; some
-        * blob storage types will make queries to pull source data.
-        *
-        * @param ResultWrapper $resultset
-        */
-       protected function outputPageStream( $resultset ) {
-               $last = null;
-               foreach ( $resultset as $row ) {
-                       if ( $last === null ||
-                               $last->page_namespace != $row->page_namespace ||
-                               $last->page_title != $row->page_title ) {
-                               if ( $last !== null ) {
-                                       $output = '';
-                                       if ( $this->dumpUploads ) {
-                                               $output .= $this->writer->writeUploads( $last, $this->dumpUploadFileContents );
-                                       }
-                                       $output .= $this->writer->closePage();
-                                       $this->sink->writeClosePage( $output );
-                               }
-                               $output = $this->writer->openPage( $row );
-                               $this->sink->writeOpenPage( $row, $output );
-                               $last = $row;
-                       }
-                       $output = $this->writer->writeRevision( $row );
-                       $this->sink->writeRevision( $row, $output );
-               }
-               if ( $last !== null ) {
-                       $output = '';
-                       if ( $this->dumpUploads ) {
-                               $output .= $this->writer->writeUploads( $last, $this->dumpUploadFileContents );
-                       }
-                       $output .= $this->author_list;
-                       $output .= $this->writer->closePage();
-                       $this->sink->writeClosePage( $output );
-               }
-       }
-
-       /**
-        * @param ResultWrapper $resultset
-        */
-       protected function outputLogStream( $resultset ) {
-               foreach ( $resultset as $row ) {
-                       $output = $this->writer->writeLogItem( $row );
-                       $this->sink->writeLogItem( $row, $output );
-               }
-       }
-}
-
-/**
- * @ingroup Dump
- */
-class XmlDumpWriter {
-       /**
-        * Opens the XML output stream's root "<mediawiki>" element.
-        * This does not include an xml directive, so is safe to include
-        * as a subelement in a larger XML stream. Namespace and XML Schema
-        * references are included.
-        *
-        * Output will be encoded in UTF-8.
-        *
-        * @return string
-        */
-       function openStream() {
-               global $wgLanguageCode;
-               $ver = WikiExporter::schemaVersion();
-               return Xml::element( 'mediawiki', array(
-                       'xmlns'              => "http://www.mediawiki.org/xml/export-$ver/",
-                       'xmlns:xsi'          => "http://www.w3.org/2001/XMLSchema-instance",
-                       /*
-                        * When a new version of the schema is created, it needs staging on mediawiki.org.
-                        * This requires a change in the operations/mediawiki-config git repo.
-                        *
-                        * Create a changeset like https://gerrit.wikimedia.org/r/#/c/149643/ in which
-                        * you copy in the new xsd file.
-                        *
-                        * After it is reviewed, merged and deployed (sync-docroot), the index.html needs purging.
-                        * echo "http://www.mediawiki.org/xml/index.html" | mwscript purgeList.php --wiki=aawiki
-                        */
-                       'xsi:schemaLocation' => "http://www.mediawiki.org/xml/export-$ver/ " .
-                               "http://www.mediawiki.org/xml/export-$ver.xsd",
-                       'version'            => $ver,
-                       'xml:lang'           => $wgLanguageCode ),
-                       null ) .
-                       "\n" .
-                       $this->siteInfo();
-       }
-
-       /**
-        * @return string
-        */
-       function siteInfo() {
-               $info = array(
-                       $this->sitename(),
-                       $this->dbname(),
-                       $this->homelink(),
-                       $this->generator(),
-                       $this->caseSetting(),
-                       $this->namespaces() );
-               return "  <siteinfo>\n    " .
-                       implode( "\n    ", $info ) .
-                       "\n  </siteinfo>\n";
-       }
-
-       /**
-        * @return string
-        */
-       function sitename() {
-               global $wgSitename;
-               return Xml::element( 'sitename', array(), $wgSitename );
-       }
-
-       /**
-        * @return string
-        */
-       function dbname() {
-               global $wgDBname;
-               return Xml::element( 'dbname', array(), $wgDBname );
-       }
-
-       /**
-        * @return string
-        */
-       function generator() {
-               global $wgVersion;
-               return Xml::element( 'generator', array(), "MediaWiki $wgVersion" );
-       }
-
-       /**
-        * @return string
-        */
-       function homelink() {
-               return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalURL() );
-       }
-
-       /**
-        * @return string
-        */
-       function caseSetting() {
-               global $wgCapitalLinks;
-               // "case-insensitive" option is reserved for future
-               $sensitivity = $wgCapitalLinks ? 'first-letter' : 'case-sensitive';
-               return Xml::element( 'case', array(), $sensitivity );
-       }
-
-       /**
-        * @return string
-        */
-       function namespaces() {
-               global $wgContLang;
-               $spaces = "<namespaces>\n";
-               foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
-                       $spaces .= '      ' .
-                               Xml::element( 'namespace',
-                                       array(
-                                               'key' => $ns,
-                                               'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
-                                       ), $title ) . "\n";
-               }
-               $spaces .= "    </namespaces>";
-               return $spaces;
-       }
-
-       /**
-        * Closes the output stream with the closing root element.
-        * Call when finished dumping things.
-        *
-        * @return string
-        */
-       function closeStream() {
-               return "</mediawiki>\n";
-       }
-
-       /**
-        * Opens a "<page>" section on the output stream, with data
-        * from the given database row.
-        *
-        * @param object $row
-        * @return string
-        */
-       public function openPage( $row ) {
-               $out = "  <page>\n";
-               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-               $out .= '    ' . Xml::elementClean( 'title', array(), self::canonicalTitle( $title ) ) . "\n";
-               $out .= '    ' . Xml::element( 'ns', array(), strval( $row->page_namespace ) ) . "\n";
-               $out .= '    ' . Xml::element( 'id', array(), strval( $row->page_id ) ) . "\n";
-               if ( $row->page_is_redirect ) {
-                       $page = WikiPage::factory( $title );
-                       $redirect = $page->getRedirectTarget();
-                       if ( $redirect instanceof Title && $redirect->isValidRedirectTarget() ) {
-                               $out .= '    ';
-                               $out .= Xml::element( 'redirect', array( 'title' => self::canonicalTitle( $redirect ) ) );
-                               $out .= "\n";
-                       }
-               }
-
-               if ( $row->page_restrictions != '' ) {
-                       $out .= '    ' . Xml::element( 'restrictions', array(),
-                               strval( $row->page_restrictions ) ) . "\n";
-               }
-
-               Hooks::run( 'XmlDumpWriterOpenPage', array( $this, &$out, $row, $title ) );
-
-               return $out;
-       }
-
-       /**
-        * Closes a "<page>" section on the output stream.
-        *
-        * @access private
-        * @return string
-        */
-       function closePage() {
-               return "  </page>\n";
-       }
-
-       /**
-        * Dumps a "<revision>" section on the output stream, with
-        * data filled in from the given database row.
-        *
-        * @param object $row
-        * @return string
-        * @access private
-        */
-       function writeRevision( $row ) {
-
-               $out = "    <revision>\n";
-               $out .= "      " . Xml::element( 'id', null, strval( $row->rev_id ) ) . "\n";
-               if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
-                       $out .= "      " . Xml::element( 'parentid', null, strval( $row->rev_parent_id ) ) . "\n";
-               }
-
-               $out .= $this->writeTimestamp( $row->rev_timestamp );
-
-               if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_USER ) ) {
-                       $out .= "      " . Xml::element( 'contributor', array( 'deleted' => 'deleted' ) ) . "\n";
-               } else {
-                       $out .= $this->writeContributor( $row->rev_user, $row->rev_user_text );
-               }
-
-               if ( isset( $row->rev_minor_edit ) && $row->rev_minor_edit ) {
-                       $out .= "      <minor/>\n";
-               }
-               if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_COMMENT ) ) {
-                       $out .= "      " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
-               } elseif ( $row->rev_comment != '' ) {
-                       $out .= "      " . Xml::elementClean( 'comment', array(), strval( $row->rev_comment ) ) . "\n";
-               }
-
-               if ( isset( $row->rev_content_model ) && !is_null( $row->rev_content_model ) ) {
-                       $content_model = strval( $row->rev_content_model );
-               } else {
-                       // probably using $wgContentHandlerUseDB = false;
-                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                       $content_model = ContentHandler::getDefaultModelFor( $title );
-               }
-
-               $content_handler = ContentHandler::getForModelID( $content_model );
-
-               if ( isset( $row->rev_content_format ) && !is_null( $row->rev_content_format ) ) {
-                       $content_format = strval( $row->rev_content_format );
-               } else {
-                       // probably using $wgContentHandlerUseDB = false;
-                       $content_format = $content_handler->getDefaultFormat();
-               }
-
-               $out .= "      " . Xml::element( 'model', null, strval( $content_model ) ) . "\n";
-               $out .= "      " . Xml::element( 'format', null, strval( $content_format ) ) . "\n";
-
-               $text = '';
-               if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
-                       $out .= "      " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
-               } elseif ( isset( $row->old_text ) ) {
-                       // Raw text from the database may have invalid chars
-                       $text = strval( Revision::getRevisionText( $row ) );
-                       $text = $content_handler->exportTransform( $text, $content_format );
-                       $out .= "      " . Xml::elementClean( 'text',
-                               array( 'xml:space' => 'preserve', 'bytes' => intval( $row->rev_len ) ),
-                               strval( $text ) ) . "\n";
-               } else {
-                       // Stub output
-                       $out .= "      " . Xml::element( 'text',
-                               array( 'id' => $row->rev_text_id, 'bytes' => intval( $row->rev_len ) ),
-                               "" ) . "\n";
-               }
-
-               if ( isset( $row->rev_sha1 )
-                       && $row->rev_sha1
-                       && !( $row->rev_deleted & Revision::DELETED_TEXT )
-               ) {
-                       $out .= "      " . Xml::element( 'sha1', null, strval( $row->rev_sha1 ) ) . "\n";
-               } else {
-                       $out .= "      <sha1/>\n";
-               }
-
-               Hooks::run( 'XmlDumpWriterWriteRevision', array( &$this, &$out, $row, $text ) );
-
-               $out .= "    </revision>\n";
-
-               return $out;
-       }
-
-       /**
-        * Dumps a "<logitem>" section on the output stream, with
-        * data filled in from the given database row.
-        *
-        * @param object $row
-        * @return string
-        * @access private
-        */
-       function writeLogItem( $row ) {
-
-               $out = "  <logitem>\n";
-               $out .= "    " . Xml::element( 'id', null, strval( $row->log_id ) ) . "\n";
-
-               $out .= $this->writeTimestamp( $row->log_timestamp, "    " );
-
-               if ( $row->log_deleted & LogPage::DELETED_USER ) {
-                       $out .= "    " . Xml::element( 'contributor', array( 'deleted' => 'deleted' ) ) . "\n";
-               } else {
-                       $out .= $this->writeContributor( $row->log_user, $row->user_name, "    " );
-               }
-
-               if ( $row->log_deleted & LogPage::DELETED_COMMENT ) {
-                       $out .= "    " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
-               } elseif ( $row->log_comment != '' ) {
-                       $out .= "    " . Xml::elementClean( 'comment', null, strval( $row->log_comment ) ) . "\n";
-               }
-
-               $out .= "    " . Xml::element( 'type', null, strval( $row->log_type ) ) . "\n";
-               $out .= "    " . Xml::element( 'action', null, strval( $row->log_action ) ) . "\n";
-
-               if ( $row->log_deleted & LogPage::DELETED_ACTION ) {
-                       $out .= "    " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
-               } else {
-                       $title = Title::makeTitle( $row->log_namespace, $row->log_title );
-                       $out .= "    " . Xml::elementClean( 'logtitle', null, self::canonicalTitle( $title ) ) . "\n";
-                       $out .= "    " . Xml::elementClean( 'params',
-                               array( 'xml:space' => 'preserve' ),
-                               strval( $row->log_params ) ) . "\n";
-               }
-
-               $out .= "  </logitem>\n";
-
-               return $out;
-       }
-
-       /**
-        * @param string $timestamp
-        * @param string $indent Default to six spaces
-        * @return string
-        */
-       function writeTimestamp( $timestamp, $indent = "      " ) {
-               $ts = wfTimestamp( TS_ISO_8601, $timestamp );
-               return $indent . Xml::element( 'timestamp', null, $ts ) . "\n";
-       }
-
-       /**
-        * @param int $id
-        * @param string $text
-        * @param string $indent Default to six spaces
-        * @return string
-        */
-       function writeContributor( $id, $text, $indent = "      " ) {
-               $out = $indent . "<contributor>\n";
-               if ( $id || !IP::isValid( $text ) ) {
-                       $out .= $indent . "  " . Xml::elementClean( 'username', null, strval( $text ) ) . "\n";
-                       $out .= $indent . "  " . Xml::element( 'id', null, strval( $id ) ) . "\n";
-               } else {
-                       $out .= $indent . "  " . Xml::elementClean( 'ip', null, strval( $text ) ) . "\n";
-               }
-               $out .= $indent . "</contributor>\n";
-               return $out;
-       }
-
-       /**
-        * Warning! This data is potentially inconsistent. :(
-        * @param object $row
-        * @param bool $dumpContents
-        * @return string
-        */
-       function writeUploads( $row, $dumpContents = false ) {
-               if ( $row->page_namespace == NS_FILE ) {
-                       $img = wfLocalFile( $row->page_title );
-                       if ( $img && $img->exists() ) {
-                               $out = '';
-                               foreach ( array_reverse( $img->getHistory() ) as $ver ) {
-                                       $out .= $this->writeUpload( $ver, $dumpContents );
-                               }
-                               $out .= $this->writeUpload( $img, $dumpContents );
-                               return $out;
-                       }
-               }
-               return '';
-       }
-
-       /**
-        * @param File $file
-        * @param bool $dumpContents
-        * @return string
-        */
-       function writeUpload( $file, $dumpContents = false ) {
-               if ( $file->isOld() ) {
-                       $archiveName = "      " .
-                               Xml::element( 'archivename', null, $file->getArchiveName() ) . "\n";
-               } else {
-                       $archiveName = '';
-               }
-               if ( $dumpContents ) {
-                       $be = $file->getRepo()->getBackend();
-                       # Dump file as base64
-                       # Uses only XML-safe characters, so does not need escaping
-                       # @todo Too bad this loads the contents into memory (script might swap)
-                       $contents = '      <contents encoding="base64">' .
-                               chunk_split( base64_encode(
-                                       $be->getFileContents( array( 'src' => $file->getPath() ) ) ) ) .
-                               "      </contents>\n";
-               } else {
-                       $contents = '';
-               }
-               if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
-                       $comment = Xml::element( 'comment', array( 'deleted' => 'deleted' ) );
-               } else {
-                       $comment = Xml::elementClean( 'comment', null, $file->getDescription() );
-               }
-               return "    <upload>\n" .
-                       $this->writeTimestamp( $file->getTimestamp() ) .
-                       $this->writeContributor( $file->getUser( 'id' ), $file->getUser( 'text' ) ) .
-                       "      " . $comment . "\n" .
-                       "      " . Xml::element( 'filename', null, $file->getName() ) . "\n" .
-                       $archiveName .
-                       "      " . Xml::element( 'src', null, $file->getCanonicalURL() ) . "\n" .
-                       "      " . Xml::element( 'size', null, $file->getSize() ) . "\n" .
-                       "      " . Xml::element( 'sha1base36', null, $file->getSha1() ) . "\n" .
-                       "      " . Xml::element( 'rel', null, $file->getRel() ) . "\n" .
-                       $contents .
-                       "    </upload>\n";
-       }
-
-       /**
-        * Return prefixed text form of title, but using the content language's
-        * canonical namespace. This skips any special-casing such as gendered
-        * user namespaces -- which while useful, are not yet listed in the
-        * XML "<siteinfo>" data so are unsafe in export.
-        *
-        * @param Title $title
-        * @return string
-        * @since 1.18
-        */
-       public static function canonicalTitle( Title $title ) {
-               if ( $title->isExternal() ) {
-                       return $title->getPrefixedText();
-               }
-
-               global $wgContLang;
-               $prefix = $wgContLang->getFormattedNsText( $title->getNamespace() );
-
-               if ( $prefix !== '' ) {
-                       $prefix .= ':';
-               }
-
-               return $prefix . $title->getText();
-       }
-}
-
-/**
- * Base class for output stream; prints to stdout or buffer or wherever.
- * @ingroup Dump
- */
-class DumpOutput {
-
-       /**
-        * @param string $string
-        */
-       function writeOpenStream( $string ) {
-               $this->write( $string );
-       }
-
-       /**
-        * @param string $string
-        */
-       function writeCloseStream( $string ) {
-               $this->write( $string );
-       }
-
-       /**
-        * @param object $page
-        * @param string $string
-        */
-       function writeOpenPage( $page, $string ) {
-               $this->write( $string );
-       }
-
-       /**
-        * @param string $string
-        */
-       function writeClosePage( $string ) {
-               $this->write( $string );
-       }
-
-       /**
-        * @param object $rev
-        * @param string $string
-        */
-       function writeRevision( $rev, $string ) {
-               $this->write( $string );
-       }
-
-       /**
-        * @param object $rev
-        * @param string $string
-        */
-       function writeLogItem( $rev, $string ) {
-               $this->write( $string );
-       }
-
-       /**
-        * Override to write to a different stream type.
-        * @param string $string
-        * @return bool
-        */
-       function write( $string ) {
-               print $string;
-       }
-
-       /**
-        * Close the old file, move it to a specified name,
-        * and reopen new file with the old name. Use this
-        * for writing out a file in multiple pieces
-        * at specified checkpoints (e.g. every n hours).
-        * @param string|array $newname File name. May be a string or an array with one element
-        */
-       function closeRenameAndReopen( $newname ) {
-       }
-
-       /**
-        * Close the old file, and move it to a specified name.
-        * Use this for the last piece of a file written out
-        * at specified checkpoints (e.g. every n hours).
-        * @param string|array $newname File name. May be a string or an array with one element
-        * @param bool $open If true, a new file with the old filename will be opened
-        *   again for writing (default: false)
-        */
-       function closeAndRename( $newname, $open = false ) {
-       }
-
-       /**
-        * Returns the name of the file or files which are
-        * being written to, if there are any.
-        * @return null
-        */
-       function getFilenames() {
-               return null;
-       }
-}
-
-/**
- * Stream outputter to send data to a file.
- * @ingroup Dump
- */
-class DumpFileOutput extends DumpOutput {
-       protected $handle = false, $filename;
-
-       /**
-        * @param string $file
-        */
-       function __construct( $file ) {
-               $this->handle = fopen( $file, "wt" );
-               $this->filename = $file;
-       }
-
-       /**
-        * @param string $string
-        */
-       function writeCloseStream( $string ) {
-               parent::writeCloseStream( $string );
-               if ( $this->handle ) {
-                       fclose( $this->handle );
-                       $this->handle = false;
-               }
-       }
-
-       /**
-        * @param string $string
-        */
-       function write( $string ) {
-               fputs( $this->handle, $string );
-       }
-
-       /**
-        * @param string $newname
-        */
-       function closeRenameAndReopen( $newname ) {
-               $this->closeAndRename( $newname, true );
-       }
-
-       /**
-        * @param string $newname
-        * @throws MWException
-        */
-       function renameOrException( $newname ) {
-                       if ( !rename( $this->filename, $newname ) ) {
-                               throw new MWException( __METHOD__ . ": rename of file {$this->filename} to $newname failed\n" );
-                       }
-       }
-
-       /**
-        * @param array $newname
-        * @return string
-        * @throws MWException
-        */
-       function checkRenameArgCount( $newname ) {
-               if ( is_array( $newname ) ) {
-                       if ( count( $newname ) > 1 ) {
-                               throw new MWException( __METHOD__ . ": passed multiple arguments for rename of single file\n" );
-                       } else {
-                               $newname = $newname[0];
-                       }
-               }
-               return $newname;
-       }
-
-       /**
-        * @param string $newname
-        * @param bool $open
-        */
-       function closeAndRename( $newname, $open = false ) {
-               $newname = $this->checkRenameArgCount( $newname );
-               if ( $newname ) {
-                       if ( $this->handle ) {
-                               fclose( $this->handle );
-                               $this->handle = false;
-                       }
-                       $this->renameOrException( $newname );
-                       if ( $open ) {
-                               $this->handle = fopen( $this->filename, "wt" );
-                       }
-               }
-       }
-
-       /**
-        * @return string|null
-        */
-       function getFilenames() {
-               return $this->filename;
-       }
-}
-
-/**
- * Stream outputter to send data to a file via some filter program.
- * Even if compression is available in a library, using a separate
- * program can allow us to make use of a multi-processor system.
- * @ingroup Dump
- */
-class DumpPipeOutput extends DumpFileOutput {
-       protected $command, $filename;
-       protected $procOpenResource = false;
-
-       /**
-        * @param string $command
-        * @param string $file
-        */
-       function __construct( $command, $file = null ) {
-               if ( !is_null( $file ) ) {
-                       $command .= " > " . wfEscapeShellArg( $file );
-               }
-
-               $this->startCommand( $command );
-               $this->command = $command;
-               $this->filename = $file;
-       }
-
-       /**
-        * @param string $string
-        */
-       function writeCloseStream( $string ) {
-               parent::writeCloseStream( $string );
-               if ( $this->procOpenResource ) {
-                       proc_close( $this->procOpenResource );
-                       $this->procOpenResource = false;
-               }
-       }
-
-       /**
-        * @param string $command
-        */
-       function startCommand( $command ) {
-               $spec = array(
-                       0 => array( "pipe", "r" ),
-               );
-               $pipes = array();
-               $this->procOpenResource = proc_open( $command, $spec, $pipes );
-               $this->handle = $pipes[0];
-       }
-
-       /**
-        * @param string $newname
-        */
-       function closeRenameAndReopen( $newname ) {
-               $this->closeAndRename( $newname, true );
-       }
-
-       /**
-        * @param string $newname
-        * @param bool $open
-        */
-       function closeAndRename( $newname, $open = false ) {
-               $newname = $this->checkRenameArgCount( $newname );
-               if ( $newname ) {
-                       if ( $this->handle ) {
-                               fclose( $this->handle );
-                               $this->handle = false;
-                       }
-                       if ( $this->procOpenResource ) {
-                               proc_close( $this->procOpenResource );
-                               $this->procOpenResource = false;
-                       }
-                       $this->renameOrException( $newname );
-                       if ( $open ) {
-                               $command = $this->command;
-                               $command .= " > " . wfEscapeShellArg( $this->filename );
-                               $this->startCommand( $command );
-                       }
-               }
-       }
-}
-
-/**
- * Sends dump output via the gzip compressor.
- * @ingroup Dump
- */
-class DumpGZipOutput extends DumpPipeOutput {
-       /**
-        * @param string $file
-        */
-       function __construct( $file ) {
-               parent::__construct( "gzip", $file );
-       }
-}
-
-/**
- * Sends dump output via the bgzip2 compressor.
- * @ingroup Dump
- */
-class DumpBZip2Output extends DumpPipeOutput {
-       /**
-        * @param string $file
-        */
-       function __construct( $file ) {
-               parent::__construct( "bzip2", $file );
-       }
-}
-
-/**
- * Sends dump output via the p7zip compressor.
- * @ingroup Dump
- */
-class Dump7ZipOutput extends DumpPipeOutput {
-       /**
-        * @param string $file
-        */
-       function __construct( $file ) {
-               $command = $this->setup7zCommand( $file );
-               parent::__construct( $command );
-               $this->filename = $file;
-       }
-
-       /**
-        * @param string $file
-        * @return string
-        */
-       function setup7zCommand( $file ) {
-               $command = "7za a -bd -si -mx=4 " . wfEscapeShellArg( $file );
-               // Suppress annoying useless crap from p7zip
-               // Unfortunately this could suppress real error messages too
-               $command .= ' >' . wfGetNull() . ' 2>&1';
-               return $command;
-       }
-
-       /**
-        * @param string $newname
-        * @param bool $open
-        */
-       function closeAndRename( $newname, $open = false ) {
-               $newname = $this->checkRenameArgCount( $newname );
-               if ( $newname ) {
-                       fclose( $this->handle );
-                       proc_close( $this->procOpenResource );
-                       $this->renameOrException( $newname );
-                       if ( $open ) {
-                               $command = $this->setup7zCommand( $this->filename );
-                               $this->startCommand( $command );
-                       }
-               }
-       }
-}
-
-/**
- * Dump output filter class.
- * This just does output filtering and streaming; XML formatting is done
- * higher up, so be careful in what you do.
- * @ingroup Dump
- */
-class DumpFilter {
-       /**
-        * @var DumpOutput
-        * FIXME will need to be made protected whenever legacy code
-        * is updated.
-        */
-       public $sink;
-
-       /**
-        * @var bool
-        */
-       protected $sendingThisPage;
-
-       /**
-        * @param DumpOutput $sink
-        */
-       function __construct( &$sink ) {
-               $this->sink =& $sink;
-       }
-
-       /**
-        * @param string $string
-        */
-       function writeOpenStream( $string ) {
-               $this->sink->writeOpenStream( $string );
-       }
-
-       /**
-        * @param string $string
-        */
-       function writeCloseStream( $string ) {
-               $this->sink->writeCloseStream( $string );
-       }
-
-       /**
-        * @param object $page
-        * @param string $string
-        */
-       function writeOpenPage( $page, $string ) {
-               $this->sendingThisPage = $this->pass( $page, $string );
-               if ( $this->sendingThisPage ) {
-                       $this->sink->writeOpenPage( $page, $string );
-               }
-       }
-
-       /**
-        * @param string $string
-        */
-       function writeClosePage( $string ) {
-               if ( $this->sendingThisPage ) {
-                       $this->sink->writeClosePage( $string );
-                       $this->sendingThisPage = false;
-               }
-       }
-
-       /**
-        * @param object $rev
-        * @param string $string
-        */
-       function writeRevision( $rev, $string ) {
-               if ( $this->sendingThisPage ) {
-                       $this->sink->writeRevision( $rev, $string );
-               }
-       }
-
-       /**
-        * @param object $rev
-        * @param string $string
-        */
-       function writeLogItem( $rev, $string ) {
-               $this->sink->writeRevision( $rev, $string );
-       }
-
-       /**
-        * @param string $newname
-        */
-       function closeRenameAndReopen( $newname ) {
-               $this->sink->closeRenameAndReopen( $newname );
-       }
-
-       /**
-        * @param string $newname
-        * @param bool $open
-        */
-       function closeAndRename( $newname, $open = false ) {
-               $this->sink->closeAndRename( $newname, $open );
-       }
-
-       /**
-        * @return array
-        */
-       function getFilenames() {
-               return $this->sink->getFilenames();
-       }
-
-       /**
-        * Override for page-based filter types.
-        * @param object $page
-        * @return bool
-        */
-       function pass( $page ) {
-               return true;
-       }
-}
-
-/**
- * Simple dump output filter to exclude all talk pages.
- * @ingroup Dump
- */
-class DumpNotalkFilter extends DumpFilter {
-       /**
-        * @param object $page
-        * @return bool
-        */
-       function pass( $page ) {
-               return !MWNamespace::isTalk( $page->page_namespace );
-       }
-}
-
-/**
- * Dump output filter to include or exclude pages in a given set of namespaces.
- * @ingroup Dump
- */
-class DumpNamespaceFilter extends DumpFilter {
-       /** @var bool */
-       public $invert = false;
-
-       /** @var array */
-       public $namespaces = array();
-
-       /**
-        * @param DumpOutput $sink
-        * @param array $param
-        * @throws MWException
-        */
-       function __construct( &$sink, $param ) {
-               parent::__construct( $sink );
-
-               $constants = array(
-                       "NS_MAIN"           => NS_MAIN,
-                       "NS_TALK"           => NS_TALK,
-                       "NS_USER"           => NS_USER,
-                       "NS_USER_TALK"      => NS_USER_TALK,
-                       "NS_PROJECT"        => NS_PROJECT,
-                       "NS_PROJECT_TALK"   => NS_PROJECT_TALK,
-                       "NS_FILE"           => NS_FILE,
-                       "NS_FILE_TALK"      => NS_FILE_TALK,
-                       "NS_IMAGE"          => NS_IMAGE, // NS_IMAGE is an alias for NS_FILE
-                       "NS_IMAGE_TALK"     => NS_IMAGE_TALK,
-                       "NS_MEDIAWIKI"      => NS_MEDIAWIKI,
-                       "NS_MEDIAWIKI_TALK" => NS_MEDIAWIKI_TALK,
-                       "NS_TEMPLATE"       => NS_TEMPLATE,
-                       "NS_TEMPLATE_TALK"  => NS_TEMPLATE_TALK,
-                       "NS_HELP"           => NS_HELP,
-                       "NS_HELP_TALK"      => NS_HELP_TALK,
-                       "NS_CATEGORY"       => NS_CATEGORY,
-                       "NS_CATEGORY_TALK"  => NS_CATEGORY_TALK );
-
-               if ( $param { 0 } == '!' ) {
-                       $this->invert = true;
-                       $param = substr( $param, 1 );
-               }
-
-               foreach ( explode( ',', $param ) as $key ) {
-                       $key = trim( $key );
-                       if ( isset( $constants[$key] ) ) {
-                               $ns = $constants[$key];
-                               $this->namespaces[$ns] = true;
-                       } elseif ( is_numeric( $key ) ) {
-                               $ns = intval( $key );
-                               $this->namespaces[$ns] = true;
-                       } else {
-                               throw new MWException( "Unrecognized namespace key '$key'\n" );
-                       }
-               }
-       }
-
-       /**
-        * @param object $page
-        * @return bool
-        */
-       function pass( $page ) {
-               $match = isset( $this->namespaces[$page->page_namespace] );
-               return $this->invert xor $match;
-       }
-}
-
-/**
- * Dump output filter to include only the last revision in each page sequence.
- * @ingroup Dump
- */
-class DumpLatestFilter extends DumpFilter {
-       public $page;
-
-       public $pageString;
-
-       public $rev;
-
-       public $revString;
-
-       /**
-        * @param object $page
-        * @param string $string
-        */
-       function writeOpenPage( $page, $string ) {
-               $this->page = $page;
-               $this->pageString = $string;
-       }
-
-       /**
-        * @param string $string
-        */
-       function writeClosePage( $string ) {
-               if ( $this->rev ) {
-                       $this->sink->writeOpenPage( $this->page, $this->pageString );
-                       $this->sink->writeRevision( $this->rev, $this->revString );
-                       $this->sink->writeClosePage( $string );
-               }
-               $this->rev = null;
-               $this->revString = null;
-               $this->page = null;
-               $this->pageString = null;
-       }
-
-       /**
-        * @param object $rev
-        * @param string $string
-        */
-       function writeRevision( $rev, $string ) {
-               if ( $rev->rev_id == $this->page->page_latest ) {
-                       $this->rev = $rev;
-                       $this->revString = $string;
-               }
-       }
-}
-
-/**
- * Base class for output stream; prints to stdout or buffer or wherever.
- * @ingroup Dump
- */
-class DumpMultiWriter {
-
-       /**
-        * @param array $sinks
-        */
-       function __construct( $sinks ) {
-               $this->sinks = $sinks;
-               $this->count = count( $sinks );
-       }
-
-       /**
-        * @param string $string
-        */
-       function writeOpenStream( $string ) {
-               for ( $i = 0; $i < $this->count; $i++ ) {
-                       $this->sinks[$i]->writeOpenStream( $string );
-               }
-       }
-
-       /**
-        * @param string $string
-        */
-       function writeCloseStream( $string ) {
-               for ( $i = 0; $i < $this->count; $i++ ) {
-                       $this->sinks[$i]->writeCloseStream( $string );
-               }
-       }
-
-       /**
-        * @param object $page
-        * @param string $string
-        */
-       function writeOpenPage( $page, $string ) {
-               for ( $i = 0; $i < $this->count; $i++ ) {
-                       $this->sinks[$i]->writeOpenPage( $page, $string );
-               }
-       }
-
-       /**
-        * @param string $string
-        */
-       function writeClosePage( $string ) {
-               for ( $i = 0; $i < $this->count; $i++ ) {
-                       $this->sinks[$i]->writeClosePage( $string );
-               }
-       }
-
-       /**
-        * @param object $rev
-        * @param string $string
-        */
-       function writeRevision( $rev, $string ) {
-               for ( $i = 0; $i < $this->count; $i++ ) {
-                       $this->sinks[$i]->writeRevision( $rev, $string );
-               }
-       }
-
-       /**
-        * @param array $newnames
-        */
-       function closeRenameAndReopen( $newnames ) {
-               $this->closeAndRename( $newnames, true );
-       }
-
-       /**
-        * @param array $newnames
-        * @param bool $open
-        */
-       function closeAndRename( $newnames, $open = false ) {
-               for ( $i = 0; $i < $this->count; $i++ ) {
-                       $this->sinks[$i]->closeAndRename( $newnames[$i], $open );
-               }
-       }
-
-       /**
-        * @return array
-        */
-       function getFilenames() {
-               $filenames = array();
-               for ( $i = 0; $i < $this->count; $i++ ) {
-                       $filenames[] = $this->sinks[$i]->getFilenames();
-               }
-               return $filenames;
-       }
-}
index 67f7ba5..f59cf47 100644 (file)
@@ -1654,7 +1654,7 @@ class WikiRevision {
                $prevId = $dbw->selectField( 'revision', 'rev_id',
                        array(
                                'rev_page' => $pageId,
-                               'rev_timestamp <= ' . $dbw->timestamp( $this->timestamp ),
+                               'rev_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $this->timestamp ) ),
                        ),
                        __METHOD__,
                        array( 'ORDER BY' => array(
index 5242856..d41e559 100644 (file)
@@ -950,7 +950,6 @@ class Sanitizer {
                return $value;
        }
 
-
        /**
         * Pick apart some CSS and check it for forbidden or unsafe structures.
         * Returns a sanitized string. This sanitized string will have
index e22184f..c863722 100644 (file)
@@ -509,7 +509,6 @@ MWExceptionHandler::installHandler();
 
 require_once "$IP/includes/compat/normal/UtfNormalUtil.php";
 
-
 $ps_validation = Profiler::instance()->scopedProfileIn( $fname . '-validation' );
 
 // T48998: Bail out early if $wgArticlePath is non-absolute
@@ -734,4 +733,3 @@ $wgFullyInitialised = true;
 
 Profiler::instance()->scopedProfileOut( $ps_extensions );
 Profiler::instance()->scopedProfileOut( $ps_setup );
-
index c5e7457..fb6c3e6 100644 (file)
@@ -40,7 +40,6 @@ if ( function_exists( 'get_magic_quotes_gpc' ) && get_magic_quotes_gpc() ) {
                . 'for help on how to disable magic quotes.' );
 }
 
-
 # bug 15461: Make IE8 turn off content sniffing. Everybody else should ignore this
 # We're adding it here so that it's *always* set, even for alternate entry
 # points and when $wgOut gets disabled or overridden.
@@ -91,7 +90,6 @@ if ( file_exists( "$IP/StartProfiler.php" ) ) {
        require "$IP/StartProfiler.php";
 }
 
-
 # Load default settings
 require_once "$IP/includes/DefaultSettings.php";
 
@@ -141,7 +139,6 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
        require_once MW_CONFIG_FILE;
 }
 
-
 # Initialise output buffering
 # Check that there is no previous output or previously set up buffers, because
 # that would cause us to potentially mix gzip and non-gzip output, creating a
index cb74ae1..56a8a7a 100644 (file)
@@ -214,7 +214,6 @@ abstract class ApiBase extends ContextSource {
                }
        }
 
-
        /************************************************************************//**
         * @name   Methods to implement
         * @{
index b1a9c98..9da040c 100644 (file)
@@ -33,7 +33,6 @@ class ApiFormatRaw extends ApiFormatBase {
        private $errorFallback;
        private $mFailWithHTTPError = false;
 
-
        /**
         * @param ApiMain $main
         * @param ApiFormatBase|null $errorFallback Object to fall back on for errors
index 49b9786..89ff19a 100644 (file)
@@ -1253,6 +1253,8 @@ class ApiMain extends ApiBase {
                $module = $this->setupModule();
                $this->mModule = $module;
 
+               $this->setRequestExpectations( $module );
+
                $this->checkExecutePermissions( $module );
 
                if ( !$this->checkMaxLag( $module, $params ) ) {
@@ -1284,6 +1286,24 @@ class ApiMain extends ApiBase {
                }
        }
 
+       /**
+        * Set database connection, query, and write expectations given this module request
+        * @param ApiBase $module
+        */
+       protected function setRequestExpectations( ApiBase $module ) {
+               $limits = $this->getConfig()->get( 'TrxProfilerLimits' );
+               $trxProfiler = Profiler::instance()->getTransactionProfiler();
+               if ( $this->getRequest()->wasPosted() ) {
+                       if ( $module->isWriteMode() ) {
+                               $trxProfiler->setExpectations( $limits['POST'], __METHOD__ );
+                       } else {
+                               $trxProfiler->setExpectations( $limits['POST-nonwrite'], __METHOD__ );
+                       }
+               } else {
+                       $trxProfiler->setExpectations( $limits['GET'], __METHOD__ );
+               }
+       }
+
        /**
         * Log the preceding request
         * @param float $time Time in seconds
index cf45cae..1497e34 100644 (file)
@@ -10,7 +10,8 @@
                        "Hwangjy9",
                        "Kurousagi",
                        "Revi",
-                       "Yearning"
+                       "Yearning",
+                       "Priviet"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|설명문서]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [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\" 키를 보내고, 헤더 값과 오류 코드가 같게 설정됩니다. 자세한 정보에 대해서는 [[mw:API:Errors_and_warnings|API:오류와 경고]]를 참조하십시오.",
        "apihelp-query+pageswithprop-param-limit": "나타낼 문서의 최대 수입니다.",
        "apihelp-query+pageswithprop-param-dir": "정렬 순서",
        "apihelp-query+prefixsearch-param-search": "문자열 검색",
+       "apihelp-rollback-param-tags": "되돌리기를 적용하기 위해 태그합니다.",
        "apihelp-unblock-description": "사용자를 차단 해제합니다.",
        "apihelp-rawfm-description": "출력 데이터, 디버깅 요소를 포함, (HTML에 포함된)JSON형식.",
        "api-help-title": "미디어위키 API 도움말",
index c334d38..e7bfbe1 100644 (file)
@@ -5,6 +5,7 @@
                        "Macofe"
                ]
        },
+       "apihelp-main-param-curtimestamp": "Den aktuellen Zäitstempel an d'Resultat integréieren.",
        "apihelp-block-description": "E Benotzer spären.",
        "apihelp-block-param-user": "Benotzernumm, IP-Adress oder IP-Beräich deen Dir späre wëllt.",
        "apihelp-block-param-reason": "Grond fir ze spären.",
@@ -13,6 +14,8 @@
        "apihelp-block-param-reblock": "Wann de Benotzer scho gespaart ass, déi aktuell Spär iwwerschreiwen.",
        "apihelp-block-param-watchuser": "Dem Benotzer oder der IP-Adress hier Benotzer- an Diskussiouns-Säiten iwwerwaachen.",
        "apihelp-compare-param-fromtitle": "Éischten Titel fir ze vergläichen.",
+       "apihelp-compare-param-fromrev": "Éischt Versioun fir ze vergläichen.",
+       "apihelp-compare-param-totitle": "Zweeten Titel fir ze vergläichen.",
        "apihelp-compare-param-torev": "Zweet Versioun fir ze vergläichen.",
        "apihelp-createaccount-description": "En neie Benotzerkont uleeën.",
        "apihelp-createaccount-param-name": "Benotzernumm.",
        "apihelp-createaccount-param-realname": "Richtegen Numm vum Benotzer (fakultativ).",
        "apihelp-delete-description": "Eng Säit läschen.",
        "apihelp-delete-param-watch": "D'Säit op dem aktuelle Benotzer seng Iwwerwaachungslëscht dobäisetzen.",
+       "apihelp-delete-param-unwatch": "D'Säit vun der Iwwerwaachungslëscht vum aktuelle Benotzer erofhuelen.",
        "apihelp-delete-example-simple": "D'<kbd>Main Page</kbd> läschen.",
        "apihelp-disabled-description": "Dëse Modul gouf ausgeschalt.",
        "apihelp-edit-param-sectiontitle": "Den Titel fir en neien Abschnitt.",
        "apihelp-edit-param-text": "Säiteninhalt.",
        "apihelp-edit-param-minor": "Kleng Ännerung.",
+       "apihelp-edit-param-notminor": "Keng kleng Ännerung",
        "apihelp-edit-param-bot": "Dës Ännerung als Bot-Ännerung markéieren.",
+       "apihelp-edit-param-createonly": "D'Säit net ännere wann et se scho gëtt.",
        "apihelp-edit-param-watch": "D'Säit op dem aktuelle Benotzer seng Iwwerwaachungslëscht dobäisetzen.",
        "apihelp-edit-example-edit": "Eng Säit änneren",
        "apihelp-emailuser-example-email": "Dem Benotzer <kbd>WikiSysop</kbd> eng E-Mail mam Text <kbd>Content</kbd> schécken.",
@@ -33,6 +39,9 @@
        "apihelp-expandtemplates-paramvalue-prop-ttl": "D'Maximalzäit no där den Tëschespäicher vum Resultat net méi valabel si soll.",
        "apihelp-feedcontributions-param-year": "Vum Joer (a virdrun).",
        "apihelp-feedcontributions-param-month": "Vum Mount (a virdrun).",
+       "apihelp-feedcontributions-param-deletedonly": "Nëmme geläscht Kontributioune weisen.",
+       "apihelp-feedcontributions-param-toponly": "Nëmmen Ännerunge weisen déi déi lescht Versioun sinn.",
+       "apihelp-feedrecentchanges-param-days": "Deeg, op déi d'Resultater limitéiert gi sollen",
        "apihelp-feedrecentchanges-param-hideminor": "Kleng Ännerunge verstoppen.",
        "apihelp-feedrecentchanges-param-hidebots": "Ännerunge vu Botte verstoppen.",
        "apihelp-feedrecentchanges-param-hideanons": "Ännerunge vun anonyme Benotzer verstoppen.",
@@ -42,6 +51,7 @@
        "apihelp-feedrecentchanges-param-categories": "Nëmmen Ännerunge vu Säiten aus all dëse Kategorië weisen.",
        "apihelp-feedrecentchanges-param-categories_any": "Nëmmen Ännerunge vu Säiten aus enger vun dëse Kategorië weisen.",
        "apihelp-feedrecentchanges-example-simple": "Rezent Ännerunge weisen",
+       "apihelp-filerevert-param-comment": "Bemierkung eroplueden.",
        "apihelp-help-example-main": "Hëllef fir den Haaptmodul.",
        "apihelp-help-example-recursive": "All Hëllef op enger Säit",
        "apihelp-imagerotate-description": "Eent oder méi Biller dréinen.",
        "apihelp-login-param-name": "Benotzernumm.",
        "apihelp-login-param-password": "Passwuert.",
        "apihelp-login-example-login": "Aloggen.",
+       "apihelp-logout-example-logout": "Den aktuelle Benotzer ausloggen.",
        "apihelp-move-description": "Eng Säit réckelen.",
+       "apihelp-move-param-reason": "Grond fir d'Ëmbenennen.",
        "apihelp-move-param-movetalk": "D'Diskussiounssäit ëmbenennen, wann et se gëtt.",
+       "apihelp-move-param-noredirect": "Keng Viruleedung uleeën.",
        "apihelp-move-param-ignorewarnings": "All Warnungen ignoréieren.",
        "apihelp-options-description": "Astellunge fir den aktuelle Benotzer änneren.\n\nNëmmen Optiounen aus dem Haaptdeel (core) oder aus enger vun den installéierten Erweiderunge, oder Optioune mat Schlësselen déi viragestallt si mat <code>userjs-</code> (geduecht fir mat Benotzer-Scripte benotzt ze ginn), kënnen agestallt ginn.",
        "apihelp-options-param-optionname": "Den Numm vun der Optioun deen op de Wäert vun <var>$1optionvalue</var> gesat gi muss",
index ef69eda..ebe0571 100644 (file)
@@ -8,7 +8,8 @@
                        "Dars",
                        "Umherirrender",
                        "Macofe",
-                       "Mix Gerder"
+                       "Mix Gerder",
+                       "Piramidion"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документація]]\n* [[mw:API:FAQ|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», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
        "apihelp-xml-param-includexmlnamespace": "Якщо вказано, додає простір назв XML.",
        "apihelp-xmlfm-description": "Вивести дані у форматі XML (вивід відформатованого коду за допомогою HTML).",
        "api-format-title": "Результат запиту до API MediaWiki",
-       "api-format-prettyprint-header": "Це HTML-представлення формату $1. HTML є гарним для налагодження, однак не придатний для прикладного використання.\n\nУкажіть значення для параметру <var>format</var>, для того щоб змінити формат. Для перегляду не-HTML-представлення формату, $1, вкажіть <kbd>format=$2</kbd>.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
+       "api-format-prettyprint-header": "Це HTML-представлення формату $1. HTML є гарним для налагодження, однак не придатний для прикладного використання.\n\nУкажіть значення для параметра <var>format</var>, для того щоб змінити формат. Для перегляду не-HTML-представлення формату, $1, вкажіть <kbd>format=$2</kbd>.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
        "api-format-prettyprint-header-only-html": "Це HTML-представлення призначене для налагодження, однак не придатне для прикладного використання.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
        "api-pageset-param-titles": "Список назв над якими працювати.",
        "api-pageset-param-pageids": "Список ідентифікаторів сторінок над якими працювати.",
index 4b0a81c..8b3147e 100644 (file)
        "apihelp-feedrecentchanges-param-hideanons": "隱藏匿名使用者做的變更。",
        "apihelp-feedrecentchanges-param-hideliu": "隱藏已註冊使用者做的變更。",
        "apihelp-feedrecentchanges-param-hidepatrolled": "隱藏已巡查的變更。",
-       "apihelp-feedrecentchanges-example-simple": "顯示最近變更。",
+       "apihelp-feedrecentchanges-example-simple": "顯示近期變更。",
        "apihelp-feedrecentchanges-example-30days": "顯示近期30天內的變動",
        "apihelp-feedwatchlist-description": "返回監視清單 feed。",
        "apihelp-feedwatchlist-param-feedformat": "Feed 的格式。",
        "apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。",
        "apihelp-query+contributors-param-limit": "要回傳的貢獻人員數量。",
        "apihelp-query+duplicatefiles-param-limit": "要回傳的重複檔案數量。",
-       "apihelp-query+embeddedin-param-filterredir": "如何過濾重向。",
+       "apihelp-query+embeddedin-param-filterredir": "如何過濾重新導向。",
        "apihelp-query+embeddedin-param-limit": "要回傳的頁面總數。",
        "apihelp-query+extlinks-description": "回傳所有指定頁面的外部 URL (非 interwiki)。",
        "apihelp-query+extlinks-param-limit": "要回傳的連結數量。",
index 2494ef1..9567700 100644 (file)
@@ -364,12 +364,24 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * @param string $s HTML to update
+        * @param string $s Article link will be appended to this string, in place.
         * @param RecentChange $rc
         * @param bool $unpatrolled
         * @param bool $watched
+        * @deprecated since 1.27, use getArticleLink instead.
         */
-       public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
+       public function insertArticleLink( &$s, RecentChange $rc, $unpatrolled, $watched ) {
+               $s .= $this->getArticleLink( $rc, $unpatrolled, $watched );
+       }
+
+       /**
+        * @param RecentChange $rc
+        * @param bool $unpatrolled
+        * @param bool $watched
+        * @return string HTML
+        * @since 1.26
+        */
+       public function getArticleLink( &$rc, $unpatrolled, $watched ) {
                $params = array();
                if ( $rc->getTitle()->isRedirect() ) {
                        $params = array( 'redirect' => 'no' );
@@ -389,23 +401,12 @@ class ChangesList extends ContextSource {
                # RTL/LTR marker
                $articlelink .= $this->getLanguage()->getDirMark();
 
+               # TODO: Deprecate the $s argument, it seems happily unused.
+               $s = '';
                Hooks::run( 'ChangesListInsertArticleLink',
                        array( &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ) );
 
-               $s .= " $articlelink";
-       }
-
-       /**
-        * @param RecentChange $rc
-        * @param bool $unpatrolled
-        * @param bool $watched
-        * @return string
-        * @since 1.26
-        */
-       public function getArticleLink( RecentChange $rc, $unpatrolled, $watched ) {
-               $s = '';
-               $this->insertArticleLink( $s, $rc, $unpatrolled, $watched );
-               return $s;
+               return "{$s} {$articlelink}";
        }
 
        /**
index ed374b0..1c49545 100644 (file)
@@ -161,19 +161,22 @@ class EnhancedChangesList extends ChangesList {
        protected function recentChangesBlockGroup( $block ) {
 
                # Add the namespace and title of the block as part of the class
-               $classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' );
+               $tableClasses = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' );
                if ( $block[0]->mAttribs['rc_log_type'] ) {
                        # Log entry
-                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
+                       $tableClasses[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
                                . $block[0]->mAttribs['rc_log_type'] );
                } else {
-                       $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
+                       $tableClasses[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
                                . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
                }
-               $classes[] = $block[0]->watched && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
-                       ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
-               $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
-                       Html::openElement( 'tr' );
+               if ( $block[0]->watched
+                       && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
+               ) {
+                       $tableClasses[] = 'mw-changeslist-line-watched';
+               } else {
+                       $tableClasses[] = 'mw-changeslist-line-not-watched';
+               }
 
                # Collate list of users
                $userlinks = array();
@@ -243,61 +246,44 @@ class EnhancedChangesList extends ChangesList {
                        array_push( $users, $text );
                }
 
-               $users = ' <span class="changedby">'
-                       . $this->msg( 'brackets' )->rawParams(
-                               implode( $this->message['semicolon-separator'], $users )
-                       )->escaped() . '</span>';
-
-               $tl = '<span class="mw-collapsible-toggle mw-collapsible-arrow ' .
-                       'mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
-               $r .= "<td>$tl</td>";
-
-               # Main line
-               $r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags(
-                       $collectedRcFlags
-               );
-
-               # Timestamp
-               $r .= '&#160;' . $block[0]->timestamp . '&#160;</td><td>';
-
                # Article link
+               $articleLink = '';
+               $revDeletedMsg = false;
                if ( $namehidden ) {
-                       $r .= ' <span class="history-deleted">' .
-                               $this->msg( 'rev-deleted-event' )->escaped() . '</span>';
+                       $revDeletedMsg = $this->msg( 'rev-deleted-event' )->escaped();
                } elseif ( $allLogs ) {
-                       $r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
+                       $articleLink = $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
                } else {
-                       $this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched );
+                       $articleLink = $this->getArticleLink( $block[0], $block[0]->unpatrolled, $block[0]->watched );
                }
 
-               $r .= $this->getLanguage()->getDirMark();
-
                $queryParams['curid'] = $curId;
 
                # Sub-entries
-               $lines = '';
+               $lines = array();
                foreach ( $block as $i => $rcObj ) {
                        $line = $this->getLineData( $block, $rcObj, $queryParams );
-                       $lines .= $line;
                        if ( !$line ) {
                                // completely ignore this RC entry if we don't want to render it
                                unset( $block[$i] );
                        }
+                       $lines[] = $line;
                }
                // Further down are some assumptions that $block is a 0-indexed array
                // with (count-1) as last key. Let's make sure it is.
                $block = array_values( $block );
-               if ( empty( $block ) ) {
+
+               if ( empty( $block ) || !$lines ) {
                        // if we can't show anything, don't display this block altogether
                        return '';
                }
 
-               $r .= $this->getLogText( $block, $queryParams, $allLogs,
-                       $collectedRcFlags['newpage'], $namehidden );
-
-               $r .= ' <span class="mw-changeslist-separator">. .</span> ';
+               $logText = $this->getLogText( $block, $queryParams, $allLogs,
+                       $collectedRcFlags['newpage'], $namehidden
+               );
 
                # Character difference (does not apply if only log items)
+               $charDifference = false;
                if ( $RCShowChangedSize && !$allLogs ) {
                        $last = 0;
                        $first = count( $block ) - 1;
@@ -309,37 +295,42 @@ class EnhancedChangesList extends ChangesList {
                                $first--;
                        }
                        # Get net change
-                       $chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] );
-
-                       if ( $chardiff == '' ) {
-                               $r .= ' ';
-                       } else {
-                               $r .= ' ' . $chardiff . ' <span class="mw-changeslist-separator">. .</span> ';
-                       }
-               }
-
-               $r .= $users;
-               $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
-               $r .= '</td></tr>';
-
-               if ( !$lines ) {
-                       // if there are no lines to be rendered (all aborted by hook), don't render the block
-                       return '';
-               }
-
-               $r .= $lines;
-               $r .= "</table>\n";
+                       $charDifference = $this->formatCharacterDifference( $block[$first], $block[$last] );
+               }
+
+               $numberofWatchingusers = $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
+               $usersList = $this->msg( 'brackets' )->rawParams(
+                       implode( $this->message['semicolon-separator'], $users )
+               )->escaped();
+
+               $templateParams = array(
+                       'articleLink' => $articleLink,
+                       'charDifference' => $charDifference,
+                       'collectedRcFlags' => $this->recentChangesFlags( $collectedRcFlags ),
+                       'languageDirMark' => $this->getLanguage()->getDirMark(),
+                       'lines' => $lines,
+                       'logText' => $logText,
+                       'numberofWatchingusers' => $numberofWatchingusers,
+                       'rev-deleted-event' => $revDeletedMsg,
+                       'tableClasses' => $tableClasses,
+                       'timestamp' => $block[0]->timestamp,
+                       'users' => $usersList,
+               );
 
                $this->rcCacheIndex++;
 
-               return $r;
+               $templateParser = new TemplateParser();
+               return $templateParser->processTemplate(
+                       'EnhancedChangesListGroup',
+                       $templateParams
+               );
        }
 
        /**
         * @param RCCacheEntry[] $block
         * @param RCCacheEntry $rcObj
         * @param array $queryParams
-        * @return string
+        * @return array
         * @throws Exception
         * @throws FatalError
         * @throws MWException
@@ -351,9 +342,13 @@ class EnhancedChangesList extends ChangesList {
                $classes = array();
                $type = $rcObj->mAttribs['rc_type'];
                $data = array();
+               $lineParams = array();
 
-               $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
-                       ? ' class="mw-enhanced-watched"' : '';
+               if ( $rcObj->watched
+                       && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+               ) {
+                       $lineParams['classes'] = array( 'mw-enhanced-watched' );
+               }
                $separator = ' <span class="mw-changeslist-separator">. .</span> ';
 
                $data['recentChangesFlags'] = array(
@@ -430,27 +425,23 @@ class EnhancedChangesList extends ChangesList {
                        array( $this, &$data, $block, $rcObj ) );
                if ( !$success ) {
                        // skip entry if hook aborted it
-                       return '';
+                       return array();
                }
 
-               $line = '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
                if ( isset( $data['recentChangesFlags'] ) ) {
-                       $line .= $this->recentChangesFlags( $data['recentChangesFlags'] );
+                       $lineParams['recentChangesFlags'] = $this->recentChangesFlags( $data['recentChangesFlags'] );
                        unset( $data['recentChangesFlags'] );
                }
-               $line .= '&#160;</td><td class="mw-enhanced-rc-nested">';
 
                if ( isset( $data['timestampLink'] ) ) {
-                       $line .= '<span class="mw-enhanced-rc-time">' . $data['timestampLink'] . '</span>';
+                       $lineParams['timestampLink'] = $data['timestampLink'];
                        unset( $data['timestampLink'] );
                }
 
                // everything else: makes it easier for extensions to add or remove data
-               $line .= implode( '', $data );
+               $lineParams['data'] = array_values( $data );
 
-               $line .= "</td></tr>\n";
-
-               return $line;
+               return $lineParams;
        }
 
        /**
index 31b355d..58a57a4 100644 (file)
@@ -98,7 +98,7 @@ class OldChangesList extends ChangesList {
                                ),
                                ''
                        );
-                       $this->insertArticleLink( $html, $rc, $unpatrolled, $watched );
+                       $html .= $this->getArticleLink( $rc, $unpatrolled, $watched );
                }
                # Edit/log timestamp
                $this->insertTimestamp( $html, $rc );
index 7c6fbb9..408b5ee 100644 (file)
@@ -960,4 +960,3 @@ class RecentChange {
                return $unserializedParams;
        }
 }
-
index 9ed9bc2..0bc8d0f 100644 (file)
@@ -25,7 +25,6 @@
  * @ingroup UtfNormal
  */
 
-
 use UtfNormal\Utils;
 
 /**
index a8850fc..df5f71c 100644 (file)
@@ -172,7 +172,6 @@ abstract class ContextSource implements IContextSource {
                return $this->getContext()->getStats();
        }
 
-
        /**
         * Get a Message object with context set
         * Parameters are the same as wfMessage()
index 5443eeb..3cac22a 100644 (file)
@@ -429,6 +429,10 @@ class DBConnRef implements IDatabase {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
+       public function doAtomicSection( $fname, $callback ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
        public function begin( $fname = __METHOD__ ) {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
index 31e2653..abd4e3a 100644 (file)
@@ -3446,6 +3446,21 @@ abstract class DatabaseBase implements IDatabase {
                }
        }
 
+       final public function doAtomicSection( $fname, $callback ) {
+               if ( !is_callable( $callback ) ) {
+                       throw new UnexpectedValueException( "Invalid callback." );
+               };
+
+               $this->startAtomic( $fname );
+               try {
+                       call_user_func_array( $callback, array( $this, $fname ) );
+               } catch ( Exception $e ) {
+                       $this->rollback( $fname );
+                       throw $e;
+               }
+               $this->endAtomic( $fname );
+       }
+
        /**
         * Begin a transaction. If a transaction is already in progress,
         * that transaction will be committed before the new transaction is started.
index 4674c17..31b2758 100644 (file)
@@ -1268,6 +1268,34 @@ interface IDatabase {
         */
        public function endAtomic( $fname = __METHOD__ );
 
+       /**
+        * Run a callback to do an atomic set of updates for this database
+        *
+        * The $callback takes the following arguments:
+        *   - This database object
+        *   - The value of $fname
+        *
+        * If any exception occurs in the callback, then rollback() will be called and the error will
+        * be re-thrown. It may also be that the rollback itself fails with an exception before then.
+        * In any case, such errors are expected to terminate the request, without any outside caller
+        * attempting to catch errors and commit anyway. Note that any rollback undoes all prior
+        * atomic section and uncommitted updates, which trashes the current request, requiring an
+        * error to be displayed.
+        *
+        * This can be an alternative to explicit startAtomic()/endAtomic() calls.
+        *
+        * @see DatabaseBase::startAtomic
+        * @see DatabaseBase::endAtomic
+        *
+        * @param string $fname Caller name (usually __METHOD__)
+        * @param callable $callback Callback that issues DB updates
+        * @throws DBError
+        * @throws RuntimeException
+        * @throws UnexpectedValueException
+        * @since 1.27
+        */
+       public function doAtomicSection( $fname, $callback );
+
        /**
         * Begin a transaction. If a transaction is already in progress,
         * that transaction will be committed before the new transaction is started.
index 65719fa..ef7d819 100644 (file)
@@ -70,7 +70,6 @@ class LegacyLogger extends AbstractLogger {
                LogLevel::EMERGENCY => 600,
        );
 
-
        /**
         * @param string $channel
         */
@@ -95,7 +94,6 @@ class LegacyLogger extends AbstractLogger {
                MWDebug::debugMsg( $message, array( 'channel' => $this->channel ) + $context );
        }
 
-
        /**
         * Determine if the given message should be emitted or not.
         *
@@ -154,7 +152,6 @@ class LegacyLogger extends AbstractLogger {
                return $shouldEmit;
        }
 
-
        /**
         * Format a message.
         *
@@ -239,7 +236,6 @@ class LegacyLogger extends AbstractLogger {
                return self::interpolate( $text, $context );
        }
 
-
        /**
         * Format a message as `wfDebug()` would have formatted it.
         *
@@ -261,7 +257,6 @@ class LegacyLogger extends AbstractLogger {
                return "{$text}\n";
        }
 
-
        /**
         * Format a message as `wfLogDBError()` would have formatted it.
         *
@@ -294,7 +289,6 @@ class LegacyLogger extends AbstractLogger {
                return $text;
        }
 
-
        /**
         * Format a message as `wfDebugLog() would have formatted it.
         *
@@ -310,7 +304,6 @@ class LegacyLogger extends AbstractLogger {
                return $text;
        }
 
-
        /**
         * Interpolate placeholders in logging message.
         *
@@ -329,7 +322,6 @@ class LegacyLogger extends AbstractLogger {
                return $message;
        }
 
-
        /**
         * Convert a logging context element to a string suitable for
         * interpolation.
@@ -389,7 +381,6 @@ class LegacyLogger extends AbstractLogger {
                return '[Unknown ' . gettype( $item ) . ']';
        }
 
-
        /**
         * Select the appropriate log output destination for the given log event.
         *
@@ -430,7 +421,6 @@ class LegacyLogger extends AbstractLogger {
                return $destination;
        }
 
-
        /**
        * Log to a file without getting "file size exceeded" signals.
        *
index 1bf39e4..1bb779d 100644 (file)
@@ -42,7 +42,6 @@ class LegacySpi implements Spi {
         */
        protected $singletons = array();
 
-
        /**
         * Get a logger instance.
         *
index e0c4989..ce92dbd 100644 (file)
@@ -51,7 +51,6 @@ class LoggerFactory {
         */
        private static $spi;
 
-
        /**
         * Register a service provider to create new \Psr\Log\LoggerInterface
         * instances.
@@ -62,7 +61,6 @@ class LoggerFactory {
                self::$spi = $provider;
        }
 
-
        /**
         * Get the registered service provider.
         *
@@ -86,7 +84,6 @@ class LoggerFactory {
                return self::$spi;
        }
 
-
        /**
         * Get a named logger instance from the currently configured logger factory.
         *
@@ -97,7 +94,6 @@ class LoggerFactory {
                return self::getProvider()->getLogger( $channel );
        }
 
-
        /**
         * Construction of utility class is not allowed.
         */
index eea9adc..4b9c3f5 100644 (file)
@@ -126,7 +126,6 @@ class MonologSpi implements Spi {
         */
        protected $config;
 
-
        /**
         * @param array $config Configuration data.
         */
@@ -135,7 +134,6 @@ class MonologSpi implements Spi {
                $this->mergeConfig( $config );
        }
 
-
        /**
         * Merge additional configuration data into the configuration.
         *
@@ -153,7 +151,6 @@ class MonologSpi implements Spi {
                $this->reset();
        }
 
-
        /**
         * Reset internal caches.
         *
@@ -169,7 +166,6 @@ class MonologSpi implements Spi {
                );
        }
 
-
        /**
         * Get a logger instance.
         *
@@ -195,7 +191,6 @@ class MonologSpi implements Spi {
                return $this->singletons['loggers'][$channel];
        }
 
-
        /**
         * Create a logger.
         * @param string $channel Logger channel
@@ -225,7 +220,6 @@ class MonologSpi implements Spi {
                return $obj;
        }
 
-
        /**
         * Create or return cached processor.
         * @param string $name Processor name
@@ -240,7 +234,6 @@ class MonologSpi implements Spi {
                return $this->singletons['processors'][$name];
        }
 
-
        /**
         * Create or return cached handler.
         * @param string $name Processor name
@@ -263,7 +256,6 @@ class MonologSpi implements Spi {
                return $this->singletons['handlers'][$name];
        }
 
-
        /**
         * Create or return cached formatter.
         * @param string $name Formatter name
index 8ae34e8..f92ff7d 100644 (file)
@@ -44,12 +44,10 @@ class NullSpi implements Spi {
         */
        protected $singleton;
 
-
        public function __construct() {
                $this->singleton = new NullLogger();
        }
 
-
        /**
         * Get a logger instance.
         *
index 510d42a..fc24e82 100644 (file)
@@ -171,7 +171,6 @@ class AvroFormatter implements FormatterInterface {
                return null;
        }
 
-
        /**
         * convert an integer to a 64bits big endian long (Java compatible)
         * NOTE: certainly only compatible with PHP 64bits
index a4bb172..7c75a7d 100644 (file)
@@ -87,7 +87,6 @@ class LegacyHandler extends AbstractProcessingHandler {
         */
        protected $prefix;
 
-
        /**
         * @param string $stream Stream URI
         * @param bool $useLegacyFilter Filter log events using legacy rules
@@ -160,7 +159,6 @@ class LegacyHandler extends AbstractProcessingHandler {
                }
        }
 
-
        /**
         * Custom error handler.
         * @param int $code Error number
@@ -170,7 +168,6 @@ class LegacyHandler extends AbstractProcessingHandler {
                $this->error = $msg;
        }
 
-
        /**
         * Should we use UDP to send messages to the sink?
         * @return bool
@@ -179,7 +176,6 @@ class LegacyHandler extends AbstractProcessingHandler {
                return $this->host !== null;
        }
 
-
        protected function write( array $record ) {
                if ( $this->useLegacyFilter &&
                        !LegacyLogger::shouldEmit(
@@ -228,7 +224,6 @@ class LegacyHandler extends AbstractProcessingHandler {
                }
        }
 
-
        public function close() {
                if ( is_resource( $this->sink ) ) {
                        if ( $this->useUdp() ) {
index 2ba7a53..acc2b30 100644 (file)
@@ -60,7 +60,6 @@ class LineFormatter extends MonologLineFormatter {
                $this->includeStacktraces( $includeStacktraces );
        }
 
-
        /**
         * {@inheritdoc}
         */
@@ -94,7 +93,6 @@ class LineFormatter extends MonologLineFormatter {
                return $output;
        }
 
-
        /**
         * Convert an Exception to a string.
         *
@@ -105,7 +103,6 @@ class LineFormatter extends MonologLineFormatter {
                return $this->normalizeExceptionArray( $this->exceptionAsArray( $e ) );
        }
 
-
        /**
         * Convert an exception to an array of structured data.
         *
@@ -130,7 +127,6 @@ class LineFormatter extends MonologLineFormatter {
                return $out;
        }
 
-
        /**
         * Convert an array of Exception data to a string.
         *
index 2614b16..104ee58 100644 (file)
@@ -58,7 +58,6 @@ class SyslogHandler extends SyslogUdpHandler {
         */
        private $hostname;
 
-
        /**
         * @param string $appname Application name to report to syslog
         * @param string $host Syslog host
index 7401992..ad6e81e 100644 (file)
  */
 
 /**
- * @todo document
+ * The base class for all other DiffOp classes.
+ *
+ * The classes that extend DiffOp are: DiffOpCopy, DiffOpDelete, DiffOpAdd and
+ * DiffOpChange. FakeDiffOp also extends DiffOp, but it is not located in this file.
+ *
  * @private
  * @ingroup DifferenceEngine
  */
@@ -93,7 +97,9 @@ abstract class DiffOp {
 }
 
 /**
- * @todo document
+ * Extends DiffOp. Used to mark strings that have been
+ * copied from one string array to the other.
+ *
  * @private
  * @ingroup DifferenceEngine
  */
@@ -117,7 +123,9 @@ class DiffOpCopy extends DiffOp {
 }
 
 /**
- * @todo document
+ * Extends DiffOp. Used to mark strings that have been
+ * deleted from the first string array.
+ *
  * @private
  * @ingroup DifferenceEngine
  */
@@ -138,7 +146,9 @@ class DiffOpDelete extends DiffOp {
 }
 
 /**
- * @todo document
+ * Extends DiffOp. Used to mark strings that have been
+ * added from the first string array.
+ *
  * @private
  * @ingroup DifferenceEngine
  */
@@ -159,7 +169,9 @@ class DiffOpAdd extends DiffOp {
 }
 
 /**
- * @todo document
+ * Extends DiffOp. Used to mark strings that have been
+ * changed from the first string array (both added and subtracted).
+ *
  * @private
  * @ingroup DifferenceEngine
  */
index 88d94f1..d653dd0 100644 (file)
@@ -246,7 +246,6 @@ class MWExceptionHandler {
                return false;
        }
 
-
        /**
         * Dual purpose callback used as both a set_error_handler() callback and
         * a registered shutdown function. Receive a callback from the interpreter
diff --git a/includes/export/Dump7ZipOutput.php b/includes/export/Dump7ZipOutput.php
new file mode 100644 (file)
index 0000000..ec7a6b2
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Sends dump output via the p7zip compressor.
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class Dump7ZipOutput extends DumpPipeOutput {
+       /**
+        * @param string $file
+        */
+       function __construct( $file ) {
+               $command = $this->setup7zCommand( $file );
+               parent::__construct( $command );
+               $this->filename = $file;
+       }
+
+       /**
+        * @param string $file
+        * @return string
+        */
+       function setup7zCommand( $file ) {
+               $command = "7za a -bd -si -mx=4 " . wfEscapeShellArg( $file );
+               // Suppress annoying useless crap from p7zip
+               // Unfortunately this could suppress real error messages too
+               $command .= ' >' . wfGetNull() . ' 2>&1';
+               return $command;
+       }
+
+       /**
+        * @param string $newname
+        * @param bool $open
+        */
+       function closeAndRename( $newname, $open = false ) {
+               $newname = $this->checkRenameArgCount( $newname );
+               if ( $newname ) {
+                       fclose( $this->handle );
+                       proc_close( $this->procOpenResource );
+                       $this->renameOrException( $newname );
+                       if ( $open ) {
+                               $command = $this->setup7zCommand( $this->filename );
+                               $this->startCommand( $command );
+                       }
+               }
+       }
+}
diff --git a/includes/export/DumpBZip2Output.php b/includes/export/DumpBZip2Output.php
new file mode 100644 (file)
index 0000000..8767b92
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Sends dump output via the bgzip2 compressor.
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class DumpBZip2Output extends DumpPipeOutput {
+       /**
+        * @param string $file
+        */
+       function __construct( $file ) {
+               parent::__construct( "bzip2", $file );
+       }
+}
diff --git a/includes/export/DumpFileOutput.php b/includes/export/DumpFileOutput.php
new file mode 100644 (file)
index 0000000..de1c0a5
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Stream outputter to send data to a file.
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class DumpFileOutput extends DumpOutput {
+       protected $handle = false, $filename;
+
+       /**
+        * @param string $file
+        */
+       function __construct( $file ) {
+               $this->handle = fopen( $file, "wt" );
+               $this->filename = $file;
+       }
+
+       /**
+        * @param string $string
+        */
+       function writeCloseStream( $string ) {
+               parent::writeCloseStream( $string );
+               if ( $this->handle ) {
+                       fclose( $this->handle );
+                       $this->handle = false;
+               }
+       }
+
+       /**
+        * @param string $string
+        */
+       function write( $string ) {
+               fputs( $this->handle, $string );
+       }
+
+       /**
+        * @param string $newname
+        */
+       function closeRenameAndReopen( $newname ) {
+               $this->closeAndRename( $newname, true );
+       }
+
+       /**
+        * @param string $newname
+        * @throws MWException
+        */
+       function renameOrException( $newname ) {
+                       if ( !rename( $this->filename, $newname ) ) {
+                               throw new MWException( __METHOD__ . ": rename of file {$this->filename} to $newname failed\n" );
+                       }
+       }
+
+       /**
+        * @param array $newname
+        * @return string
+        * @throws MWException
+        */
+       function checkRenameArgCount( $newname ) {
+               if ( is_array( $newname ) ) {
+                       if ( count( $newname ) > 1 ) {
+                               throw new MWException( __METHOD__ . ": passed multiple arguments for rename of single file\n" );
+                       } else {
+                               $newname = $newname[0];
+                       }
+               }
+               return $newname;
+       }
+
+       /**
+        * @param string $newname
+        * @param bool $open
+        */
+       function closeAndRename( $newname, $open = false ) {
+               $newname = $this->checkRenameArgCount( $newname );
+               if ( $newname ) {
+                       if ( $this->handle ) {
+                               fclose( $this->handle );
+                               $this->handle = false;
+                       }
+                       $this->renameOrException( $newname );
+                       if ( $open ) {
+                               $this->handle = fopen( $this->filename, "wt" );
+                       }
+               }
+       }
+
+       /**
+        * @return string|null
+        */
+       function getFilenames() {
+               return $this->filename;
+       }
+}
diff --git a/includes/export/DumpFilter.php b/includes/export/DumpFilter.php
new file mode 100644 (file)
index 0000000..224262d
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+/**
+ * Dump output filter class.
+ * This just does output filtering and streaming; XML formatting is done
+ * higher up, so be careful in what you do.
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class DumpFilter {
+       /**
+        * @var DumpOutput
+        * FIXME will need to be made protected whenever legacy code
+        * is updated.
+        */
+       public $sink;
+
+       /**
+        * @var bool
+        */
+       protected $sendingThisPage;
+
+       /**
+        * @param DumpOutput $sink
+        */
+       function __construct( &$sink ) {
+               $this->sink =& $sink;
+       }
+
+       /**
+        * @param string $string
+        */
+       function writeOpenStream( $string ) {
+               $this->sink->writeOpenStream( $string );
+       }
+
+       /**
+        * @param string $string
+        */
+       function writeCloseStream( $string ) {
+               $this->sink->writeCloseStream( $string );
+       }
+
+       /**
+        * @param object $page
+        * @param string $string
+        */
+       function writeOpenPage( $page, $string ) {
+               $this->sendingThisPage = $this->pass( $page, $string );
+               if ( $this->sendingThisPage ) {
+                       $this->sink->writeOpenPage( $page, $string );
+               }
+       }
+
+       /**
+        * @param string $string
+        */
+       function writeClosePage( $string ) {
+               if ( $this->sendingThisPage ) {
+                       $this->sink->writeClosePage( $string );
+                       $this->sendingThisPage = false;
+               }
+       }
+
+       /**
+        * @param object $rev
+        * @param string $string
+        */
+       function writeRevision( $rev, $string ) {
+               if ( $this->sendingThisPage ) {
+                       $this->sink->writeRevision( $rev, $string );
+               }
+       }
+
+       /**
+        * @param object $rev
+        * @param string $string
+        */
+       function writeLogItem( $rev, $string ) {
+               $this->sink->writeRevision( $rev, $string );
+       }
+
+       /**
+        * @param string $newname
+        */
+       function closeRenameAndReopen( $newname ) {
+               $this->sink->closeRenameAndReopen( $newname );
+       }
+
+       /**
+        * @param string $newname
+        * @param bool $open
+        */
+       function closeAndRename( $newname, $open = false ) {
+               $this->sink->closeAndRename( $newname, $open );
+       }
+
+       /**
+        * @return array
+        */
+       function getFilenames() {
+               return $this->sink->getFilenames();
+       }
+
+       /**
+        * Override for page-based filter types.
+        * @param object $page
+        * @return bool
+        */
+       function pass( $page ) {
+               return true;
+       }
+}
diff --git a/includes/export/DumpGZipOutput.php b/includes/export/DumpGZipOutput.php
new file mode 100644 (file)
index 0000000..3f0333e
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Sends dump output via the gzip compressor.
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class DumpGZipOutput extends DumpPipeOutput {
+       /**
+        * @param string $file
+        */
+       function __construct( $file ) {
+               parent::__construct( "gzip", $file );
+       }
+}
diff --git a/includes/export/DumpLatestFilter.php b/includes/export/DumpLatestFilter.php
new file mode 100644 (file)
index 0000000..d21dfa9
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Dump output filter to include only the last revision in each page sequence.
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class DumpLatestFilter extends DumpFilter {
+       public $page;
+
+       public $pageString;
+
+       public $rev;
+
+       public $revString;
+
+       /**
+        * @param object $page
+        * @param string $string
+        */
+       function writeOpenPage( $page, $string ) {
+               $this->page = $page;
+               $this->pageString = $string;
+       }
+
+       /**
+        * @param string $string
+        */
+       function writeClosePage( $string ) {
+               if ( $this->rev ) {
+                       $this->sink->writeOpenPage( $this->page, $this->pageString );
+                       $this->sink->writeRevision( $this->rev, $this->revString );
+                       $this->sink->writeClosePage( $string );
+               }
+               $this->rev = null;
+               $this->revString = null;
+               $this->page = null;
+               $this->pageString = null;
+       }
+
+       /**
+        * @param object $rev
+        * @param string $string
+        */
+       function writeRevision( $rev, $string ) {
+               if ( $rev->rev_id == $this->page->page_latest ) {
+                       $this->rev = $rev;
+                       $this->revString = $string;
+               }
+       }
+}
diff --git a/includes/export/DumpMultiWriter.php b/includes/export/DumpMultiWriter.php
new file mode 100644 (file)
index 0000000..2f5a782
--- /dev/null
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Base class for output stream; prints to stdout or buffer or wherever.
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class DumpMultiWriter {
+
+       /**
+        * @param array $sinks
+        */
+       function __construct( $sinks ) {
+               $this->sinks = $sinks;
+               $this->count = count( $sinks );
+       }
+
+       /**
+        * @param string $string
+        */
+       function writeOpenStream( $string ) {
+               for ( $i = 0; $i < $this->count; $i++ ) {
+                       $this->sinks[$i]->writeOpenStream( $string );
+               }
+       }
+
+       /**
+        * @param string $string
+        */
+       function writeCloseStream( $string ) {
+               for ( $i = 0; $i < $this->count; $i++ ) {
+                       $this->sinks[$i]->writeCloseStream( $string );
+               }
+       }
+
+       /**
+        * @param object $page
+        * @param string $string
+        */
+       function writeOpenPage( $page, $string ) {
+               for ( $i = 0; $i < $this->count; $i++ ) {
+                       $this->sinks[$i]->writeOpenPage( $page, $string );
+               }
+       }
+
+       /**
+        * @param string $string
+        */
+       function writeClosePage( $string ) {
+               for ( $i = 0; $i < $this->count; $i++ ) {
+                       $this->sinks[$i]->writeClosePage( $string );
+               }
+       }
+
+       /**
+        * @param object $rev
+        * @param string $string
+        */
+       function writeRevision( $rev, $string ) {
+               for ( $i = 0; $i < $this->count; $i++ ) {
+                       $this->sinks[$i]->writeRevision( $rev, $string );
+               }
+       }
+
+       /**
+        * @param array $newnames
+        */
+       function closeRenameAndReopen( $newnames ) {
+               $this->closeAndRename( $newnames, true );
+       }
+
+       /**
+        * @param array $newnames
+        * @param bool $open
+        */
+       function closeAndRename( $newnames, $open = false ) {
+               for ( $i = 0; $i < $this->count; $i++ ) {
+                       $this->sinks[$i]->closeAndRename( $newnames[$i], $open );
+               }
+       }
+
+       /**
+        * @return array
+        */
+       function getFilenames() {
+               $filenames = array();
+               for ( $i = 0; $i < $this->count; $i++ ) {
+                       $filenames[] = $this->sinks[$i]->getFilenames();
+               }
+               return $filenames;
+       }
+}
diff --git a/includes/export/DumpNamespaceFilter.php b/includes/export/DumpNamespaceFilter.php
new file mode 100644 (file)
index 0000000..c7d1b2e
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Dump output filter to include or exclude pages in a given set of namespaces.
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class DumpNamespaceFilter extends DumpFilter {
+       /** @var bool */
+       public $invert = false;
+
+       /** @var array */
+       public $namespaces = array();
+
+       /**
+        * @param DumpOutput $sink
+        * @param array $param
+        * @throws MWException
+        */
+       function __construct( &$sink, $param ) {
+               parent::__construct( $sink );
+
+               $constants = array(
+                       "NS_MAIN"           => NS_MAIN,
+                       "NS_TALK"           => NS_TALK,
+                       "NS_USER"           => NS_USER,
+                       "NS_USER_TALK"      => NS_USER_TALK,
+                       "NS_PROJECT"        => NS_PROJECT,
+                       "NS_PROJECT_TALK"   => NS_PROJECT_TALK,
+                       "NS_FILE"           => NS_FILE,
+                       "NS_FILE_TALK"      => NS_FILE_TALK,
+                       "NS_IMAGE"          => NS_IMAGE, // NS_IMAGE is an alias for NS_FILE
+                       "NS_IMAGE_TALK"     => NS_IMAGE_TALK,
+                       "NS_MEDIAWIKI"      => NS_MEDIAWIKI,
+                       "NS_MEDIAWIKI_TALK" => NS_MEDIAWIKI_TALK,
+                       "NS_TEMPLATE"       => NS_TEMPLATE,
+                       "NS_TEMPLATE_TALK"  => NS_TEMPLATE_TALK,
+                       "NS_HELP"           => NS_HELP,
+                       "NS_HELP_TALK"      => NS_HELP_TALK,
+                       "NS_CATEGORY"       => NS_CATEGORY,
+                       "NS_CATEGORY_TALK"  => NS_CATEGORY_TALK );
+
+               if ( $param { 0 } == '!' ) {
+                       $this->invert = true;
+                       $param = substr( $param, 1 );
+               }
+
+               foreach ( explode( ',', $param ) as $key ) {
+                       $key = trim( $key );
+                       if ( isset( $constants[$key] ) ) {
+                               $ns = $constants[$key];
+                               $this->namespaces[$ns] = true;
+                       } elseif ( is_numeric( $key ) ) {
+                               $ns = intval( $key );
+                               $this->namespaces[$ns] = true;
+                       } else {
+                               throw new MWException( "Unrecognized namespace key '$key'\n" );
+                       }
+               }
+       }
+
+       /**
+        * @param object $page
+        * @return bool
+        */
+       function pass( $page ) {
+               $match = isset( $this->namespaces[$page->page_namespace] );
+               return $this->invert xor $match;
+       }
+}
diff --git a/includes/export/DumpNotalkFilter.php b/includes/export/DumpNotalkFilter.php
new file mode 100644 (file)
index 0000000..9974d67
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Simple dump output filter to exclude all talk pages.
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class DumpNotalkFilter extends DumpFilter {
+       /**
+        * @param object $page
+        * @return bool
+        */
+       function pass( $page ) {
+               return !MWNamespace::isTalk( $page->page_namespace );
+       }
+}
diff --git a/includes/export/DumpOutput.php b/includes/export/DumpOutput.php
new file mode 100644 (file)
index 0000000..bdcaf35
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Base class for output stream; prints to stdout or buffer or wherever.
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class DumpOutput {
+
+       /**
+        * @param string $string
+        */
+       function writeOpenStream( $string ) {
+               $this->write( $string );
+       }
+
+       /**
+        * @param string $string
+        */
+       function writeCloseStream( $string ) {
+               $this->write( $string );
+       }
+
+       /**
+        * @param object $page
+        * @param string $string
+        */
+       function writeOpenPage( $page, $string ) {
+               $this->write( $string );
+       }
+
+       /**
+        * @param string $string
+        */
+       function writeClosePage( $string ) {
+               $this->write( $string );
+       }
+
+       /**
+        * @param object $rev
+        * @param string $string
+        */
+       function writeRevision( $rev, $string ) {
+               $this->write( $string );
+       }
+
+       /**
+        * @param object $rev
+        * @param string $string
+        */
+       function writeLogItem( $rev, $string ) {
+               $this->write( $string );
+       }
+
+       /**
+        * Override to write to a different stream type.
+        * @param string $string
+        * @return bool
+        */
+       function write( $string ) {
+               print $string;
+       }
+
+       /**
+        * Close the old file, move it to a specified name,
+        * and reopen new file with the old name. Use this
+        * for writing out a file in multiple pieces
+        * at specified checkpoints (e.g. every n hours).
+        * @param string|array $newname File name. May be a string or an array with one element
+        */
+       function closeRenameAndReopen( $newname ) {
+       }
+
+       /**
+        * Close the old file, and move it to a specified name.
+        * Use this for the last piece of a file written out
+        * at specified checkpoints (e.g. every n hours).
+        * @param string|array $newname File name. May be a string or an array with one element
+        * @param bool $open If true, a new file with the old filename will be opened
+        *   again for writing (default: false)
+        */
+       function closeAndRename( $newname, $open = false ) {
+       }
+
+       /**
+        * Returns the name of the file or files which are
+        * being written to, if there are any.
+        * @return null
+        */
+       function getFilenames() {
+               return null;
+       }
+}
diff --git a/includes/export/DumpPipeOutput.php b/includes/export/DumpPipeOutput.php
new file mode 100644 (file)
index 0000000..b4ad672
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Stream outputter to send data to a file via some filter program.
+ * Even if compression is available in a library, using a separate
+ * program can allow us to make use of a multi-processor system.
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class DumpPipeOutput extends DumpFileOutput {
+       protected $command, $filename;
+       protected $procOpenResource = false;
+
+       /**
+        * @param string $command
+        * @param string $file
+        */
+       function __construct( $command, $file = null ) {
+               if ( !is_null( $file ) ) {
+                       $command .= " > " . wfEscapeShellArg( $file );
+               }
+
+               $this->startCommand( $command );
+               $this->command = $command;
+               $this->filename = $file;
+       }
+
+       /**
+        * @param string $string
+        */
+       function writeCloseStream( $string ) {
+               parent::writeCloseStream( $string );
+               if ( $this->procOpenResource ) {
+                       proc_close( $this->procOpenResource );
+                       $this->procOpenResource = false;
+               }
+       }
+
+       /**
+        * @param string $command
+        */
+       function startCommand( $command ) {
+               $spec = array(
+                       0 => array( "pipe", "r" ),
+               );
+               $pipes = array();
+               $this->procOpenResource = proc_open( $command, $spec, $pipes );
+               $this->handle = $pipes[0];
+       }
+
+       /**
+        * @param string $newname
+        */
+       function closeRenameAndReopen( $newname ) {
+               $this->closeAndRename( $newname, true );
+       }
+
+       /**
+        * @param string $newname
+        * @param bool $open
+        */
+       function closeAndRename( $newname, $open = false ) {
+               $newname = $this->checkRenameArgCount( $newname );
+               if ( $newname ) {
+                       if ( $this->handle ) {
+                               fclose( $this->handle );
+                               $this->handle = false;
+                       }
+                       if ( $this->procOpenResource ) {
+                               proc_close( $this->procOpenResource );
+                               $this->procOpenResource = false;
+                       }
+                       $this->renameOrException( $newname );
+                       if ( $open ) {
+                               $command = $this->command;
+                               $command .= " > " . wfEscapeShellArg( $this->filename );
+                               $this->startCommand( $command );
+                       }
+               }
+       }
+}
diff --git a/includes/export/WikiExporter.php b/includes/export/WikiExporter.php
new file mode 100644 (file)
index 0000000..a24418c
--- /dev/null
@@ -0,0 +1,469 @@
+<?php
+/**
+ * Base class for exporting
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @defgroup Dump Dump
+ */
+
+/**
+ * @ingroup SpecialPage Dump
+ */
+class WikiExporter {
+       /** @var bool Return distinct author list (when not returning full history) */
+       public $list_authors = false;
+
+       /** @var bool */
+       public $dumpUploads = false;
+
+       /** @var bool */
+       public $dumpUploadFileContents = false;
+
+       /** @var string */
+       public $author_list = "";
+
+       const FULL = 1;
+       const CURRENT = 2;
+       const STABLE = 4; // extension defined
+       const LOGS = 8;
+       const RANGE = 16;
+
+       const BUFFER = 0;
+       const STREAM = 1;
+
+       const TEXT = 0;
+       const STUB = 1;
+
+       /** @var int */
+       public $buffer;
+
+       /** @var int */
+       public $text;
+
+       /** @var DumpOutput */
+       public $sink;
+
+       /**
+        * Returns the export schema version.
+        * @return string
+        */
+       public static function schemaVersion() {
+               return "0.10";
+       }
+
+       /**
+        * If using WikiExporter::STREAM to stream a large amount of data,
+        * provide a database connection which is not managed by
+        * LoadBalancer to read from: some history blob types will
+        * make additional queries to pull source data while the
+        * main query is still running.
+        *
+        * @param IDatabase $db
+        * @param int|array $history One of WikiExporter::FULL, WikiExporter::CURRENT,
+        *   WikiExporter::RANGE or WikiExporter::STABLE, or an associative array:
+        *   - offset: non-inclusive offset at which to start the query
+        *   - limit: maximum number of rows to return
+        *   - dir: "asc" or "desc" timestamp order
+        * @param int $buffer One of WikiExporter::BUFFER or WikiExporter::STREAM
+        * @param int $text One of WikiExporter::TEXT or WikiExporter::STUB
+        */
+       function __construct( $db, $history = WikiExporter::CURRENT,
+                       $buffer = WikiExporter::BUFFER, $text = WikiExporter::TEXT ) {
+               $this->db = $db;
+               $this->history = $history;
+               $this->buffer = $buffer;
+               $this->writer = new XmlDumpWriter();
+               $this->sink = new DumpOutput();
+               $this->text = $text;
+       }
+
+       /**
+        * Set the DumpOutput or DumpFilter object which will receive
+        * various row objects and XML output for filtering. Filters
+        * can be chained or used as callbacks.
+        *
+        * @param DumpOutput $sink
+        */
+       public function setOutputSink( &$sink ) {
+               $this->sink =& $sink;
+       }
+
+       public function openStream() {
+               $output = $this->writer->openStream();
+               $this->sink->writeOpenStream( $output );
+       }
+
+       public function closeStream() {
+               $output = $this->writer->closeStream();
+               $this->sink->writeCloseStream( $output );
+       }
+
+       /**
+        * Dumps a series of page and revision records for all pages
+        * in the database, either including complete history or only
+        * the most recent version.
+        */
+       public function allPages() {
+               $this->dumpFrom( '' );
+       }
+
+       /**
+        * Dumps a series of page and revision records for those pages
+        * in the database falling within the page_id range given.
+        * @param int $start Inclusive lower limit (this id is included)
+        * @param int $end Exclusive upper limit (this id is not included)
+        *   If 0, no upper limit.
+        */
+       public function pagesByRange( $start, $end ) {
+               $condition = 'page_id >= ' . intval( $start );
+               if ( $end ) {
+                       $condition .= ' AND page_id < ' . intval( $end );
+               }
+               $this->dumpFrom( $condition );
+       }
+
+       /**
+        * Dumps a series of page and revision records for those pages
+        * in the database with revisions falling within the rev_id range given.
+        * @param int $start Inclusive lower limit (this id is included)
+        * @param int $end Exclusive upper limit (this id is not included)
+        *   If 0, no upper limit.
+        */
+       public function revsByRange( $start, $end ) {
+               $condition = 'rev_id >= ' . intval( $start );
+               if ( $end ) {
+                       $condition .= ' AND rev_id < ' . intval( $end );
+               }
+               $this->dumpFrom( $condition );
+       }
+
+       /**
+        * @param Title $title
+        */
+       public function pageByTitle( $title ) {
+               $this->dumpFrom(
+                       'page_namespace=' . $title->getNamespace() .
+                       ' AND page_title=' . $this->db->addQuotes( $title->getDBkey() ) );
+       }
+
+       /**
+        * @param string $name
+        * @throws MWException
+        */
+       public function pageByName( $name ) {
+               $title = Title::newFromText( $name );
+               if ( is_null( $title ) ) {
+                       throw new MWException( "Can't export invalid title" );
+               } else {
+                       $this->pageByTitle( $title );
+               }
+       }
+
+       /**
+        * @param array $names
+        */
+       public function pagesByName( $names ) {
+               foreach ( $names as $name ) {
+                       $this->pageByName( $name );
+               }
+       }
+
+       public function allLogs() {
+               $this->dumpFrom( '' );
+       }
+
+       /**
+        * @param int $start
+        * @param int $end
+        */
+       public function logsByRange( $start, $end ) {
+               $condition = 'log_id >= ' . intval( $start );
+               if ( $end ) {
+                       $condition .= ' AND log_id < ' . intval( $end );
+               }
+               $this->dumpFrom( $condition );
+       }
+
+       /**
+        * Generates the distinct list of authors of an article
+        * Not called by default (depends on $this->list_authors)
+        * Can be set by Special:Export when not exporting whole history
+        *
+        * @param array $cond
+        */
+       protected function do_list_authors( $cond ) {
+               $this->author_list = "<contributors>";
+               // rev_deleted
+
+               $res = $this->db->select(
+                       array( 'page', 'revision' ),
+                       array( 'DISTINCT rev_user_text', 'rev_user' ),
+                       array(
+                               $this->db->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0',
+                               $cond,
+                               'page_id = rev_id',
+                       ),
+                       __METHOD__
+               );
+
+               foreach ( $res as $row ) {
+                       $this->author_list .= "<contributor>" .
+                               "<username>" .
+                               htmlentities( $row->rev_user_text ) .
+                               "</username>" .
+                               "<id>" .
+                               $row->rev_user .
+                               "</id>" .
+                               "</contributor>";
+               }
+               $this->author_list .= "</contributors>";
+       }
+
+       /**
+        * @param string $cond
+        * @throws MWException
+        * @throws Exception
+        */
+       protected function dumpFrom( $cond = '' ) {
+               # For logging dumps...
+               if ( $this->history & self::LOGS ) {
+                       $where = array( 'user_id = log_user' );
+                       # Hide private logs
+                       $hideLogs = LogEventsList::getExcludeClause( $this->db );
+                       if ( $hideLogs ) {
+                               $where[] = $hideLogs;
+                       }
+                       # Add on any caller specified conditions
+                       if ( $cond ) {
+                               $where[] = $cond;
+                       }
+                       # Get logging table name for logging.* clause
+                       $logging = $this->db->tableName( 'logging' );
+
+                       if ( $this->buffer == WikiExporter::STREAM ) {
+                               $prev = $this->db->bufferResults( false );
+                       }
+                       $result = null; // Assuring $result is not undefined, if exception occurs early
+                       try {
+                               $result = $this->db->select( array( 'logging', 'user' ),
+                                       array( "{$logging}.*", 'user_name' ), // grab the user name
+                                       $where,
+                                       __METHOD__,
+                                       array( 'ORDER BY' => 'log_id', 'USE INDEX' => array( 'logging' => 'PRIMARY' ) )
+                               );
+                               $this->outputLogStream( $result );
+                               if ( $this->buffer == WikiExporter::STREAM ) {
+                                       $this->db->bufferResults( $prev );
+                               }
+                       } catch ( Exception $e ) {
+                               // Throwing the exception does not reliably free the resultset, and
+                               // would also leave the connection in unbuffered mode.
+
+                               // Freeing result
+                               try {
+                                       if ( $result ) {
+                                               $result->free();
+                                       }
+                               } catch ( Exception $e2 ) {
+                                       // Already in panic mode -> ignoring $e2 as $e has
+                                       // higher priority
+                               }
+
+                               // Putting database back in previous buffer mode
+                               try {
+                                       if ( $this->buffer == WikiExporter::STREAM ) {
+                                               $this->db->bufferResults( $prev );
+                                       }
+                               } catch ( Exception $e2 ) {
+                                       // Already in panic mode -> ignoring $e2 as $e has
+                                       // higher priority
+                               }
+
+                               // Inform caller about problem
+                               throw $e;
+                       }
+               # For page dumps...
+               } else {
+                       $tables = array( 'page', 'revision' );
+                       $opts = array( 'ORDER BY' => 'page_id ASC' );
+                       $opts['USE INDEX'] = array();
+                       $join = array();
+                       if ( is_array( $this->history ) ) {
+                               # Time offset/limit for all pages/history...
+                               $revJoin = 'page_id=rev_page';
+                               # Set time order
+                               if ( $this->history['dir'] == 'asc' ) {
+                                       $op = '>';
+                                       $opts['ORDER BY'] = 'rev_timestamp ASC';
+                               } else {
+                                       $op = '<';
+                                       $opts['ORDER BY'] = 'rev_timestamp DESC';
+                               }
+                               # Set offset
+                               if ( !empty( $this->history['offset'] ) ) {
+                                       $revJoin .= " AND rev_timestamp $op " .
+                                               $this->db->addQuotes( $this->db->timestamp( $this->history['offset'] ) );
+                               }
+                               $join['revision'] = array( 'INNER JOIN', $revJoin );
+                               # Set query limit
+                               if ( !empty( $this->history['limit'] ) ) {
+                                       $opts['LIMIT'] = intval( $this->history['limit'] );
+                               }
+                       } elseif ( $this->history & WikiExporter::FULL ) {
+                               # Full history dumps...
+                               $join['revision'] = array( 'INNER JOIN', 'page_id=rev_page' );
+                       } elseif ( $this->history & WikiExporter::CURRENT ) {
+                               # Latest revision dumps...
+                               if ( $this->list_authors && $cond != '' ) { // List authors, if so desired
+                                       $this->do_list_authors( $cond );
+                               }
+                               $join['revision'] = array( 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' );
+                       } elseif ( $this->history & WikiExporter::STABLE ) {
+                               # "Stable" revision dumps...
+                               # Default JOIN, to be overridden...
+                               $join['revision'] = array( 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' );
+                               # One, and only one hook should set this, and return false
+                               if ( Hooks::run( 'WikiExporter::dumpStableQuery', array( &$tables, &$opts, &$join ) ) ) {
+                                       throw new MWException( __METHOD__ . " given invalid history dump type." );
+                               }
+                       } elseif ( $this->history & WikiExporter::RANGE ) {
+                               # Dump of revisions within a specified range
+                               $join['revision'] = array( 'INNER JOIN', 'page_id=rev_page' );
+                               $opts['ORDER BY'] = array( 'rev_page ASC', 'rev_id ASC' );
+                       } else {
+                               # Unknown history specification parameter?
+                               throw new MWException( __METHOD__ . " given invalid history dump type." );
+                       }
+                       # Query optimization hacks
+                       if ( $cond == '' ) {
+                               $opts[] = 'STRAIGHT_JOIN';
+                               $opts['USE INDEX']['page'] = 'PRIMARY';
+                       }
+                       # Build text join options
+                       if ( $this->text != WikiExporter::STUB ) { // 1-pass
+                               $tables[] = 'text';
+                               $join['text'] = array( 'INNER JOIN', 'rev_text_id=old_id' );
+                       }
+
+                       if ( $this->buffer == WikiExporter::STREAM ) {
+                               $prev = $this->db->bufferResults( false );
+                       }
+
+                       $result = null; // Assuring $result is not undefined, if exception occurs early
+                       try {
+                               Hooks::run( 'ModifyExportQuery',
+                                               array( $this->db, &$tables, &$cond, &$opts, &$join ) );
+
+                               # Do the query!
+                               $result = $this->db->select( $tables, '*', $cond, __METHOD__, $opts, $join );
+                               # Output dump results
+                               $this->outputPageStream( $result );
+
+                               if ( $this->buffer == WikiExporter::STREAM ) {
+                                       $this->db->bufferResults( $prev );
+                               }
+                       } catch ( Exception $e ) {
+                               // Throwing the exception does not reliably free the resultset, and
+                               // would also leave the connection in unbuffered mode.
+
+                               // Freeing result
+                               try {
+                                       if ( $result ) {
+                                               $result->free();
+                                       }
+                               } catch ( Exception $e2 ) {
+                                       // Already in panic mode -> ignoring $e2 as $e has
+                                       // higher priority
+                               }
+
+                               // Putting database back in previous buffer mode
+                               try {
+                                       if ( $this->buffer == WikiExporter::STREAM ) {
+                                               $this->db->bufferResults( $prev );
+                                       }
+                               } catch ( Exception $e2 ) {
+                                       // Already in panic mode -> ignoring $e2 as $e has
+                                       // higher priority
+                               }
+
+                               // Inform caller about problem
+                               throw $e;
+                       }
+               }
+       }
+
+       /**
+        * Runs through a query result set dumping page and revision records.
+        * The result set should be sorted/grouped by page to avoid duplicate
+        * page records in the output.
+        *
+        * Should be safe for
+        * streaming (non-buffered) queries, as long as it was made on a
+        * separate database connection not managed by LoadBalancer; some
+        * blob storage types will make queries to pull source data.
+        *
+        * @param ResultWrapper $resultset
+        */
+       protected function outputPageStream( $resultset ) {
+               $last = null;
+               foreach ( $resultset as $row ) {
+                       if ( $last === null ||
+                               $last->page_namespace != $row->page_namespace ||
+                               $last->page_title != $row->page_title ) {
+                               if ( $last !== null ) {
+                                       $output = '';
+                                       if ( $this->dumpUploads ) {
+                                               $output .= $this->writer->writeUploads( $last, $this->dumpUploadFileContents );
+                                       }
+                                       $output .= $this->writer->closePage();
+                                       $this->sink->writeClosePage( $output );
+                               }
+                               $output = $this->writer->openPage( $row );
+                               $this->sink->writeOpenPage( $row, $output );
+                               $last = $row;
+                       }
+                       $output = $this->writer->writeRevision( $row );
+                       $this->sink->writeRevision( $row, $output );
+               }
+               if ( $last !== null ) {
+                       $output = '';
+                       if ( $this->dumpUploads ) {
+                               $output .= $this->writer->writeUploads( $last, $this->dumpUploadFileContents );
+                       }
+                       $output .= $this->author_list;
+                       $output .= $this->writer->closePage();
+                       $this->sink->writeClosePage( $output );
+               }
+       }
+
+       /**
+        * @param ResultWrapper $resultset
+        */
+       protected function outputLogStream( $resultset ) {
+               foreach ( $resultset as $row ) {
+                       $output = $this->writer->writeLogItem( $row );
+                       $this->sink->writeLogItem( $row, $output );
+               }
+       }
+}
diff --git a/includes/export/XmlDumpWriter.php b/includes/export/XmlDumpWriter.php
new file mode 100644 (file)
index 0000000..3bd4c96
--- /dev/null
@@ -0,0 +1,440 @@
+<?php
+/**
+ * XmlDumpWriter
+ *
+ * Copyright © 2003, 2005, 2006 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ */
+class XmlDumpWriter {
+       /**
+        * Opens the XML output stream's root "<mediawiki>" element.
+        * This does not include an xml directive, so is safe to include
+        * as a subelement in a larger XML stream. Namespace and XML Schema
+        * references are included.
+        *
+        * Output will be encoded in UTF-8.
+        *
+        * @return string
+        */
+       function openStream() {
+               global $wgLanguageCode;
+               $ver = WikiExporter::schemaVersion();
+               return Xml::element( 'mediawiki', array(
+                       'xmlns'              => "http://www.mediawiki.org/xml/export-$ver/",
+                       'xmlns:xsi'          => "http://www.w3.org/2001/XMLSchema-instance",
+                       /*
+                        * When a new version of the schema is created, it needs staging on mediawiki.org.
+                        * This requires a change in the operations/mediawiki-config git repo.
+                        *
+                        * Create a changeset like https://gerrit.wikimedia.org/r/#/c/149643/ in which
+                        * you copy in the new xsd file.
+                        *
+                        * After it is reviewed, merged and deployed (sync-docroot), the index.html needs purging.
+                        * echo "http://www.mediawiki.org/xml/index.html" | mwscript purgeList.php --wiki=aawiki
+                        */
+                       'xsi:schemaLocation' => "http://www.mediawiki.org/xml/export-$ver/ " .
+                               "http://www.mediawiki.org/xml/export-$ver.xsd",
+                       'version'            => $ver,
+                       'xml:lang'           => $wgLanguageCode ),
+                       null ) .
+                       "\n" .
+                       $this->siteInfo();
+       }
+
+       /**
+        * @return string
+        */
+       function siteInfo() {
+               $info = array(
+                       $this->sitename(),
+                       $this->dbname(),
+                       $this->homelink(),
+                       $this->generator(),
+                       $this->caseSetting(),
+                       $this->namespaces() );
+               return "  <siteinfo>\n    " .
+                       implode( "\n    ", $info ) .
+                       "\n  </siteinfo>\n";
+       }
+
+       /**
+        * @return string
+        */
+       function sitename() {
+               global $wgSitename;
+               return Xml::element( 'sitename', array(), $wgSitename );
+       }
+
+       /**
+        * @return string
+        */
+       function dbname() {
+               global $wgDBname;
+               return Xml::element( 'dbname', array(), $wgDBname );
+       }
+
+       /**
+        * @return string
+        */
+       function generator() {
+               global $wgVersion;
+               return Xml::element( 'generator', array(), "MediaWiki $wgVersion" );
+       }
+
+       /**
+        * @return string
+        */
+       function homelink() {
+               return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalURL() );
+       }
+
+       /**
+        * @return string
+        */
+       function caseSetting() {
+               global $wgCapitalLinks;
+               // "case-insensitive" option is reserved for future
+               $sensitivity = $wgCapitalLinks ? 'first-letter' : 'case-sensitive';
+               return Xml::element( 'case', array(), $sensitivity );
+       }
+
+       /**
+        * @return string
+        */
+       function namespaces() {
+               global $wgContLang;
+               $spaces = "<namespaces>\n";
+               foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
+                       $spaces .= '      ' .
+                               Xml::element( 'namespace',
+                                       array(
+                                               'key' => $ns,
+                                               'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
+                                       ), $title ) . "\n";
+               }
+               $spaces .= "    </namespaces>";
+               return $spaces;
+       }
+
+       /**
+        * Closes the output stream with the closing root element.
+        * Call when finished dumping things.
+        *
+        * @return string
+        */
+       function closeStream() {
+               return "</mediawiki>\n";
+       }
+
+       /**
+        * Opens a "<page>" section on the output stream, with data
+        * from the given database row.
+        *
+        * @param object $row
+        * @return string
+        */
+       public function openPage( $row ) {
+               $out = "  <page>\n";
+               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+               $out .= '    ' . Xml::elementClean( 'title', array(), self::canonicalTitle( $title ) ) . "\n";
+               $out .= '    ' . Xml::element( 'ns', array(), strval( $row->page_namespace ) ) . "\n";
+               $out .= '    ' . Xml::element( 'id', array(), strval( $row->page_id ) ) . "\n";
+               if ( $row->page_is_redirect ) {
+                       $page = WikiPage::factory( $title );
+                       $redirect = $page->getRedirectTarget();
+                       if ( $redirect instanceof Title && $redirect->isValidRedirectTarget() ) {
+                               $out .= '    ';
+                               $out .= Xml::element( 'redirect', array( 'title' => self::canonicalTitle( $redirect ) ) );
+                               $out .= "\n";
+                       }
+               }
+
+               if ( $row->page_restrictions != '' ) {
+                       $out .= '    ' . Xml::element( 'restrictions', array(),
+                               strval( $row->page_restrictions ) ) . "\n";
+               }
+
+               Hooks::run( 'XmlDumpWriterOpenPage', array( $this, &$out, $row, $title ) );
+
+               return $out;
+       }
+
+       /**
+        * Closes a "<page>" section on the output stream.
+        *
+        * @access private
+        * @return string
+        */
+       function closePage() {
+               return "  </page>\n";
+       }
+
+       /**
+        * Dumps a "<revision>" section on the output stream, with
+        * data filled in from the given database row.
+        *
+        * @param object $row
+        * @return string
+        * @access private
+        */
+       function writeRevision( $row ) {
+
+               $out = "    <revision>\n";
+               $out .= "      " . Xml::element( 'id', null, strval( $row->rev_id ) ) . "\n";
+               if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
+                       $out .= "      " . Xml::element( 'parentid', null, strval( $row->rev_parent_id ) ) . "\n";
+               }
+
+               $out .= $this->writeTimestamp( $row->rev_timestamp );
+
+               if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_USER ) ) {
+                       $out .= "      " . Xml::element( 'contributor', array( 'deleted' => 'deleted' ) ) . "\n";
+               } else {
+                       $out .= $this->writeContributor( $row->rev_user, $row->rev_user_text );
+               }
+
+               if ( isset( $row->rev_minor_edit ) && $row->rev_minor_edit ) {
+                       $out .= "      <minor/>\n";
+               }
+               if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_COMMENT ) ) {
+                       $out .= "      " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
+               } elseif ( $row->rev_comment != '' ) {
+                       $out .= "      " . Xml::elementClean( 'comment', array(), strval( $row->rev_comment ) ) . "\n";
+               }
+
+               if ( isset( $row->rev_content_model ) && !is_null( $row->rev_content_model ) ) {
+                       $content_model = strval( $row->rev_content_model );
+               } else {
+                       // probably using $wgContentHandlerUseDB = false;
+                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                       $content_model = ContentHandler::getDefaultModelFor( $title );
+               }
+
+               $content_handler = ContentHandler::getForModelID( $content_model );
+
+               if ( isset( $row->rev_content_format ) && !is_null( $row->rev_content_format ) ) {
+                       $content_format = strval( $row->rev_content_format );
+               } else {
+                       // probably using $wgContentHandlerUseDB = false;
+                       $content_format = $content_handler->getDefaultFormat();
+               }
+
+               $out .= "      " . Xml::element( 'model', null, strval( $content_model ) ) . "\n";
+               $out .= "      " . Xml::element( 'format', null, strval( $content_format ) ) . "\n";
+
+               $text = '';
+               if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
+                       $out .= "      " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
+               } elseif ( isset( $row->old_text ) ) {
+                       // Raw text from the database may have invalid chars
+                       $text = strval( Revision::getRevisionText( $row ) );
+                       $text = $content_handler->exportTransform( $text, $content_format );
+                       $out .= "      " . Xml::elementClean( 'text',
+                               array( 'xml:space' => 'preserve', 'bytes' => intval( $row->rev_len ) ),
+                               strval( $text ) ) . "\n";
+               } else {
+                       // Stub output
+                       $out .= "      " . Xml::element( 'text',
+                               array( 'id' => $row->rev_text_id, 'bytes' => intval( $row->rev_len ) ),
+                               "" ) . "\n";
+               }
+
+               if ( isset( $row->rev_sha1 )
+                       && $row->rev_sha1
+                       && !( $row->rev_deleted & Revision::DELETED_TEXT )
+               ) {
+                       $out .= "      " . Xml::element( 'sha1', null, strval( $row->rev_sha1 ) ) . "\n";
+               } else {
+                       $out .= "      <sha1/>\n";
+               }
+
+               Hooks::run( 'XmlDumpWriterWriteRevision', array( &$this, &$out, $row, $text ) );
+
+               $out .= "    </revision>\n";
+
+               return $out;
+       }
+
+       /**
+        * Dumps a "<logitem>" section on the output stream, with
+        * data filled in from the given database row.
+        *
+        * @param object $row
+        * @return string
+        * @access private
+        */
+       function writeLogItem( $row ) {
+
+               $out = "  <logitem>\n";
+               $out .= "    " . Xml::element( 'id', null, strval( $row->log_id ) ) . "\n";
+
+               $out .= $this->writeTimestamp( $row->log_timestamp, "    " );
+
+               if ( $row->log_deleted & LogPage::DELETED_USER ) {
+                       $out .= "    " . Xml::element( 'contributor', array( 'deleted' => 'deleted' ) ) . "\n";
+               } else {
+                       $out .= $this->writeContributor( $row->log_user, $row->user_name, "    " );
+               }
+
+               if ( $row->log_deleted & LogPage::DELETED_COMMENT ) {
+                       $out .= "    " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
+               } elseif ( $row->log_comment != '' ) {
+                       $out .= "    " . Xml::elementClean( 'comment', null, strval( $row->log_comment ) ) . "\n";
+               }
+
+               $out .= "    " . Xml::element( 'type', null, strval( $row->log_type ) ) . "\n";
+               $out .= "    " . Xml::element( 'action', null, strval( $row->log_action ) ) . "\n";
+
+               if ( $row->log_deleted & LogPage::DELETED_ACTION ) {
+                       $out .= "    " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
+               } else {
+                       $title = Title::makeTitle( $row->log_namespace, $row->log_title );
+                       $out .= "    " . Xml::elementClean( 'logtitle', null, self::canonicalTitle( $title ) ) . "\n";
+                       $out .= "    " . Xml::elementClean( 'params',
+                               array( 'xml:space' => 'preserve' ),
+                               strval( $row->log_params ) ) . "\n";
+               }
+
+               $out .= "  </logitem>\n";
+
+               return $out;
+       }
+
+       /**
+        * @param string $timestamp
+        * @param string $indent Default to six spaces
+        * @return string
+        */
+       function writeTimestamp( $timestamp, $indent = "      " ) {
+               $ts = wfTimestamp( TS_ISO_8601, $timestamp );
+               return $indent . Xml::element( 'timestamp', null, $ts ) . "\n";
+       }
+
+       /**
+        * @param int $id
+        * @param string $text
+        * @param string $indent Default to six spaces
+        * @return string
+        */
+       function writeContributor( $id, $text, $indent = "      " ) {
+               $out = $indent . "<contributor>\n";
+               if ( $id || !IP::isValid( $text ) ) {
+                       $out .= $indent . "  " . Xml::elementClean( 'username', null, strval( $text ) ) . "\n";
+                       $out .= $indent . "  " . Xml::element( 'id', null, strval( $id ) ) . "\n";
+               } else {
+                       $out .= $indent . "  " . Xml::elementClean( 'ip', null, strval( $text ) ) . "\n";
+               }
+               $out .= $indent . "</contributor>\n";
+               return $out;
+       }
+
+       /**
+        * Warning! This data is potentially inconsistent. :(
+        * @param object $row
+        * @param bool $dumpContents
+        * @return string
+        */
+       function writeUploads( $row, $dumpContents = false ) {
+               if ( $row->page_namespace == NS_FILE ) {
+                       $img = wfLocalFile( $row->page_title );
+                       if ( $img && $img->exists() ) {
+                               $out = '';
+                               foreach ( array_reverse( $img->getHistory() ) as $ver ) {
+                                       $out .= $this->writeUpload( $ver, $dumpContents );
+                               }
+                               $out .= $this->writeUpload( $img, $dumpContents );
+                               return $out;
+                       }
+               }
+               return '';
+       }
+
+       /**
+        * @param File $file
+        * @param bool $dumpContents
+        * @return string
+        */
+       function writeUpload( $file, $dumpContents = false ) {
+               if ( $file->isOld() ) {
+                       $archiveName = "      " .
+                               Xml::element( 'archivename', null, $file->getArchiveName() ) . "\n";
+               } else {
+                       $archiveName = '';
+               }
+               if ( $dumpContents ) {
+                       $be = $file->getRepo()->getBackend();
+                       # Dump file as base64
+                       # Uses only XML-safe characters, so does not need escaping
+                       # @todo Too bad this loads the contents into memory (script might swap)
+                       $contents = '      <contents encoding="base64">' .
+                               chunk_split( base64_encode(
+                                       $be->getFileContents( array( 'src' => $file->getPath() ) ) ) ) .
+                               "      </contents>\n";
+               } else {
+                       $contents = '';
+               }
+               if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+                       $comment = Xml::element( 'comment', array( 'deleted' => 'deleted' ) );
+               } else {
+                       $comment = Xml::elementClean( 'comment', null, $file->getDescription() );
+               }
+               return "    <upload>\n" .
+                       $this->writeTimestamp( $file->getTimestamp() ) .
+                       $this->writeContributor( $file->getUser( 'id' ), $file->getUser( 'text' ) ) .
+                       "      " . $comment . "\n" .
+                       "      " . Xml::element( 'filename', null, $file->getName() ) . "\n" .
+                       $archiveName .
+                       "      " . Xml::element( 'src', null, $file->getCanonicalURL() ) . "\n" .
+                       "      " . Xml::element( 'size', null, $file->getSize() ) . "\n" .
+                       "      " . Xml::element( 'sha1base36', null, $file->getSha1() ) . "\n" .
+                       "      " . Xml::element( 'rel', null, $file->getRel() ) . "\n" .
+                       $contents .
+                       "    </upload>\n";
+       }
+
+       /**
+        * Return prefixed text form of title, but using the content language's
+        * canonical namespace. This skips any special-casing such as gendered
+        * user namespaces -- which while useful, are not yet listed in the
+        * XML "<siteinfo>" data so are unsafe in export.
+        *
+        * @param Title $title
+        * @return string
+        * @since 1.18
+        */
+       public static function canonicalTitle( Title $title ) {
+               if ( $title->isExternal() ) {
+                       return $title->getPrefixedText();
+               }
+
+               global $wgContLang;
+               $prefix = $wgContLang->getFormattedNsText( $title->getNamespace() );
+
+               if ( $prefix !== '' ) {
+                       $prefix .= ':';
+               }
+
+               return $prefix . $title->getText();
+       }
+}
index b4a03cb..ebd99ba 100644 (file)
@@ -10,7 +10,8 @@
                        "Ата",
                        "Тест",
                        "아라",
-                       "Amire80"
+                       "Amire80",
+                       "Piramidion"
                ]
        },
        "config-desc": "Інсталятор MediaWiki",
        "config-header-oracle": "Налаштування Oracle",
        "config-header-mssql": "Параметри Microsoft SQL Server",
        "config-invalid-db-type": "Невірний тип бази даних",
-       "config-missing-db-name": "Ви повинні ввести значення параметру  \"{{int:config-db-name}}\".",
-       "config-missing-db-host": "Ви повинні ввести значення параметру \"{{int:config-db-host}}\".",
-       "config-missing-db-server-oracle": "Ви повинні ввести значення параметру  \"{{int:config-db-host-oracle}}\".",
+       "config-missing-db-name": "Ви повинні ввести значення параметра «{{int:config-db-name}}».",
+       "config-missing-db-host": "Ви повинні ввести значення параметра «{{int:config-db-host}}».",
+       "config-missing-db-server-oracle": "Ви повинні ввести значення параметра «{{int:config-db-host-oracle}}».",
        "config-invalid-db-server-oracle": "Неприпустиме TNS бази даних \"$1\".\nВикористовуйте \"TNS Name\" або рядок \"Easy Connect\"  ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи найменування Oracle])",
        "config-invalid-db-name": "Неприпустима назва бази даних \"$1\".\nВикористовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреслення (_) і дефіси (-).",
        "config-invalid-db-prefix": "Неприпустимий префікс бази даних \"$1\".\nВикористовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреслення (_) і дефіси (-).",
index 01f8ccc..4aa868e 100644 (file)
@@ -450,7 +450,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *
         * Example usage:
         * @code
-        *     $dbw->begin(); // start of request
+        *     $dbw->begin( __METHOD__ ); // start of request
         *     ... <execute some stuff> ...
         *     // Update the row in the DB
         *     $dbw->update( ... );
@@ -460,7 +460,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *         $cache->delete( $key );
         *     } );
         *     ... <execute some stuff> ...
-        *     $dbw->commit(); // end of request
+        *     $dbw->commit( __METHOD__ ); // end of request
         * @endcode
         *
         * The $ttl parameter can be used when purging values that have not actually changed
index cfbf0b4..eaecedd 100644 (file)
@@ -3752,7 +3752,6 @@ class Parser {
        public function callParserFunction( $frame, $function, array $args = array() ) {
                global $wgContLang;
 
-
                # Case sensitive functions
                if ( isset( $this->mFunctionSynonyms[1][$function] ) ) {
                        $function = $this->mFunctionSynonyms[1][$function];
index 14292a5..50eaefb 100644 (file)
@@ -88,7 +88,6 @@ class Preprocessor_Hash extends Preprocessor {
                return $node;
        }
 
-
        /**
         * Preprocess some wikitext and return the document tree.
         * This is the ghost of Parser::replace_variables().
index fc128fb..4a68f8e 100644 (file)
@@ -178,7 +178,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                }
        }
 
-
        /**
         * Get registration code for all modules.
         *
index 9755e8e..2d25710 100644 (file)
@@ -325,25 +325,39 @@ abstract class QueryPage extends SpecialPage {
                                                $value = 0;
                                        }
 
-                                       $vals[] = array( 'qc_type' => $this->getName(),
-                                                       'qc_namespace' => $row->namespace,
-                                                       'qc_title' => $row->title,
-                                                       'qc_value' => $value );
+                                       $vals[] = array(
+                                               'qc_type' => $this->getName(),
+                                               'qc_namespace' => $row->namespace,
+                                               'qc_title' => $row->title,
+                                               'qc_value' => $value
+                                       );
                                }
 
-                               $dbw->startAtomic( __METHOD__ );
-                               # Clear out any old cached data
-                               $dbw->delete( 'querycache', array( 'qc_type' => $this->getName() ), $fname );
-                               # Save results into the querycache table on the master
-                               if ( count( $vals ) ) {
-                                       $dbw->insert( 'querycache', $vals, __METHOD__ );
-                               }
-                               # Update the querycache_info record for the page
-                               $dbw->delete( 'querycache_info', array( 'qci_type' => $this->getName() ), $fname );
-                               $dbw->insert( 'querycache_info',
-                                       array( 'qci_type' => $this->getName(), 'qci_timestamp' => $dbw->timestamp() ),
-                                       $fname );
-                               $dbw->endAtomic( __METHOD__ );
+                               $that = $this;
+                               $dbw->doAtomicSection(
+                                       __METHOD__,
+                                       function ( IDatabase $dbw, $fname ) use ( $that, $vals ) {
+                                               # Clear out any old cached data
+                                               $dbw->delete( 'querycache',
+                                                       array( 'qc_type' => $that->getName() ),
+                                                       $fname
+                                               );
+                                               # Save results into the querycache table on the master
+                                               if ( count( $vals ) ) {
+                                                       $dbw->insert( 'querycache', $vals, $fname );
+                                               }
+                                               # Update the querycache_info record for the page
+                                               $dbw->delete( 'querycache_info',
+                                                       array( 'qci_type' => $that->getName() ),
+                                                       $fname
+                                               );
+                                               $dbw->insert( 'querycache_info',
+                                                       array( 'qci_type' => $that->getName(),
+                                                               'qci_timestamp' => $dbw->timestamp() ),
+                                                       $fname
+                                               );
+                                       }
+                               );
                        }
                } catch ( DBError $e ) {
                        if ( !$ignoreErrors ) {
index 70c7a8b..1f369d8 100644 (file)
@@ -318,5 +318,3 @@ class SpecialActiveUsers extends SpecialPage {
                return 'users';
        }
 }
-
-
index 9ea18da..71616fa 100644 (file)
@@ -164,7 +164,6 @@ class BrokenRedirectsPage extends QueryPage {
                return $out;
        }
 
-
        /**
         * Cache page content model for performance
         *
index bb57ee0..323903e 100644 (file)
@@ -241,7 +241,7 @@ class FileDuplicateSearchPage extends QueryPage {
         * @return string[] Matching subpages
         */
        public function prefixSearchSubpages( $search, $limit, $offset ) {
-               $title = Title::newFromText( $search );
+               $title = Title::newFromText( $search, NS_FILE );
                if ( !$title || $title->getNamespace() !== NS_FILE ) {
                        // No prefix suggestion outside of file namespace
                        return array();
index 317b62f..3f47f91 100644 (file)
@@ -87,7 +87,6 @@ class ListDuplicatedFilesPage extends QueryPage {
                }
        }
 
-
        /**
         * @param Skin $skin
         * @param object $result Result row
index 6e67df0..fb78a40 100644 (file)
@@ -144,6 +144,7 @@ class MediaStatisticsPage extends QueryPage {
                        $this->getOutput()->addWikiText(
                                $this->msg( 'mediastatistics-allbytes' )
                                        ->numParams( $this->totalSize )
+                                       ->sizeParams( $this->totalSize )
                                        ->text()
                        );
                }
@@ -157,6 +158,8 @@ class MediaStatisticsPage extends QueryPage {
                $this->getOutput()->addWikiText(
                                $this->msg( 'mediastatistics-bytespertype' )
                                        ->numParams( $this->totalPerType )
+                                       ->sizeParams( $this->totalPerType )
+                                       ->numParams( $this->makePercentPretty( $this->totalPerType / $this->totalBytes ) )
                                        ->text()
                );
                $this->totalSize += $this->totalPerType;
index a1bd2fa..0c0d929 100644 (file)
@@ -33,7 +33,6 @@ class MovePageForm extends UnlistedSpecialPage {
        /** @var Title */
        protected $newTitle;
 
-
        /** @var string Text input */
        protected $reason;
 
index 49ab6d5..b45946f 100644 (file)
@@ -128,7 +128,7 @@ class SpecialPreferences extends SpecialPage {
                        throw new PermissionsError( 'editmyoptions' );
                }
 
-               $user = $this->getUser();
+               $user = $this->getUser()->getInstanceForUpdate();
                $user->resetOptions( 'all', $this->getContext() );
                $user->saveSettings();
 
diff --git a/includes/templates/EnhancedChangesListGroup.mustache b/includes/templates/EnhancedChangesListGroup.mustache
new file mode 100644 (file)
index 0000000..352eb17
--- /dev/null
@@ -0,0 +1,28 @@
+<table class="{{# tableClasses }}{{ . }} {{/ tableClasses }}">
+       <tr>
+               <td>
+                       <span class="mw-collapsible-toggle mw-collapsible-arrow mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>
+               </td>
+               <td class="mw-enhanced-rc">{{{ collectedRcFlags }}}&#160;{{ timestamp }}&#160;</td>
+               <td>
+                       {{# rev-deleted-event }}<span class="history-deleted">{{{ . }}}</span>{{/ rev-deleted-event }}
+                       {{{ articleLink }}}{{{ languageDirMark }}}{{{ logText }}}
+                       <span class="mw-changeslist-separator">. .</span>
+                       {{# charDifference }}{{{ . }}} <span class="mw-changeslist-separator">. .</span>{{/ charDifference }}
+                       <span class="changedby">{{{ users }}}</span>
+                       {{ numberofWatchingusers }}
+               </td>
+       </tr>
+       {{# lines }}
+       <tr class="{{# classes }}{{ . }} {{/ classes }}">
+               <td></td>
+               <td class="mw-enhanced-rc">{{{ recentChangesFlags }}}&#160;</td>
+               <td class="mw-enhanced-rc-nested">
+                       {{# timestampLink }}
+                       <span class="mw-enhanced-rc-time">{{{ . }}}</span>
+                       {{/ timestampLink }}
+                       {{# data }}{{{ . }}}{{/ data }}
+               </td>
+       </tr>
+       {{/ lines }}
+</table>
index fed9664..8fa430f 100644 (file)
@@ -895,7 +895,6 @@ class User implements IDBAccessObject {
                return $this->getPasswordValidity( $password ) === true;
        }
 
-
        /**
         * Given unvalidated password input, return error message on failure.
         *
index 2dfc902..f5d7828 100644 (file)
@@ -97,7 +97,6 @@ class MWCryptHKDF {
                'whirlpool' => 64,
        );
 
-
        /**
         * @param string $secretKeyMaterial
         * @param string $algorithm Name of hashing algorithm
@@ -214,7 +213,6 @@ class MWCryptHKDF {
                );
        }
 
-
        /**
         * RFC5869 defines HKDF in 2 steps, extraction and expansion.
         * From http://eprint.iacr.org/2010/264.pdf:
index 3a18c0d..0b8ce7d 100644 (file)
        "aboutpage": "Project:گؤره",
        "copyright": "ایچینده‌کیلر $1 لیسانسی احاطه‌سینده‌دیلر.",
        "copyrightpage": "{{ns:project}}:کوْپی حاقلاری",
-       "currentevents": "اÛ\8cÙ\86دÛ\8cÚ©Û\8c Ø§Ù\88Ù\84اÛ\8cÙ\84ار",
+       "currentevents": "اÛ\8cÙ\86دÛ\8cÚ©Û\8c Ø­Ø§Ø¯Û\8cØ«Ù\87â\80\8cÙ\84ر",
        "currentevents-url": "Project:ایندیکی اولایلار",
        "disclaimers": "یالانلامالار",
        "disclaimerpage": "Project:گنل یالانلاما",
        "password-change-forbidden": "بو ویکی‌ده رمزلری دَییشه بیلنمه‌سینیز.",
        "externaldberror": "بیر دیتابیس دوغرولاما خطاسی اولدو، یوخسا سیزین ائشیک حسابینیزی گونجل‌لدمگه ایجازه‌نیز یوخدور.",
        "login": "گیریش",
-       "nav-login-createaccount": "Ú¯Û\8cرÛ\8cØ´ / Ø­Ø³Ø§Ø¨ Û\8cاراد",
-       "userlogin": "Ú¯Û\8cرÛ\8cØ´ / Ø­Ø³Ø§Ø¨ Û\8cاراد",
+       "nav-login-createaccount": "Ú¯Û\8cرÛ\8cØ´ / Ø­Ø³Ø§Ø¨ Û\8cارات",
+       "userlogin": "Ú¯Û\8cرÛ\8cØ´ / Ø­Ø³Ø§Ø¨ Û\8cارات",
        "userloginnocreate": "گیریش",
        "logout": "چیخیش",
        "userlogout": "چیخیش",
        "fileduplicatesearch-noresults": "\"$1\" آدیندا فایل تاپیلمادی.",
        "specialpages": "اؤزل صفحه‌لر",
        "specialpages-note": "* نورمال اؤزل صفحه‌لر.\n* <span class=\"mw-specialpagerestricted\">محدودلاشدیریلمیش اؤزل صفحه‌لر.</span>",
-       "specialpages-group-maintenance": "جارÛ\8c Ù\85رÙ\88زÙ\87â\80\8cÙ\84ر",
+       "specialpages-group-maintenance": "ساخÙ\84اÙ\86Û\8cØ´ Ø±Ø§Ù¾Ù\88رتÙ\84ارÛ\8c",
        "specialpages-group-other": "آیری اؤزل صفحه‌لر",
-       "specialpages-group-login": "Ú¯Û\8cرÛ\8cØ´ / Ø­Ø³Ø§Ø¨ Û\8cاراد",
+       "specialpages-group-login": "Ú¯Û\8cرÛ\8cØ´ / Ø­Ø³Ø§Ø¨ Û\8cارات",
        "specialpages-group-changes": "سون دییشیک‌لیک‌لر و قئیدلر",
        "specialpages-group-media": "مئدیا مروزه‌لری و یوکلمه‌لر",
-       "specialpages-group-users": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c‌لر و حاقلار",
+       "specialpages-group-users": "اÛ\8cØ´Ù\84دÙ\86‌لر و حاقلار",
        "specialpages-group-highuse": "ان چوْخ ایشله‌نن صفحه‌لر",
-       "specialpages-group-pages": "صحیفه‌لرین سیاهی‌لاری",
+       "specialpages-group-pages": "صفحه‌لرین لیست‌لری",
        "specialpages-group-pagetools": "صفحه آلتلری",
        "specialpages-group-wiki": "بیلگیلر و آلتلر",
        "specialpages-group-redirects": "خصوصی ایستیقامتلندیرمه صحیفه‌لری",
index c61dc64..664b941 100644 (file)
        "passwordreset-emailtext-ip": "Нехта (магчыма Вы, з IP-адрасу $1) зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|1=Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|1=Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:$5|дзень|дні|дзён}}.\nЦяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт, ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць, Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.",
        "passwordreset-emailtext-user": "Удзельнік $1 зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|1=Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|1=Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:$5|дзень|дні|дзён}}.\nЦяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт, ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць, Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.",
        "passwordreset-emailelement": "Імя ўдзельніка: \n$1\n\nЧасовы пароль: \n$2",
-       "passwordreset-emailsentemail": "Ð\9aалÑ\96 Ð³Ñ\8dÑ\82Ñ\8b Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ð·Ð°Ñ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8b Ð´Ð»Ñ\8f вашага рахунку, тады будзе дасланы ліст пра скідваньне паролю.",
-       "passwordreset-emailsentusername": "Калі зарэгістраваны адпаведны адрас электроннай пошты, тады будзе дасланы ліст пра скідваньне паролю.",
+       "passwordreset-emailsentemail": "Ð\9aалÑ\96 Ð³Ñ\8dÑ\82Ñ\8b Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ð´Ð°Ð»Ñ\83Ñ\87анÑ\8b Ð´Ð° вашага рахунку, тады будзе дасланы ліст пра скідваньне паролю.",
+       "passwordreset-emailsentusername": "Калі ёсьць адрас электроннай пошты, злучаны з гэтым імем удзельніка, тады будзе дасланы ліст пра скідваньне паролю.",
        "passwordreset-emailsent-capture": "Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.",
        "passwordreset-emailerror-capture": "Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1",
        "changeemail": "Зьмяніць або выдаліць адрас электроннай пошты",
        "foreign-structured-upload-form-3-label-question-website": "Вы спампавалі гэтую выяву зь нейкага сайту або знайшлі яе праз пошук выяваў?",
        "foreign-structured-upload-form-3-label-question-ownwork": "Вы стварылі гэтую выяву (зрабілі фота, накід малюнку і г. д.) самі?",
        "foreign-structured-upload-form-3-label-question-noderiv": "Ці ўтрымлівае яна або яна натхнёная працай, якой валодае нехта іншы, як прыклад, лягатып?",
+       "foreign-structured-upload-form-3-label-yes": "Так",
+       "foreign-structured-upload-form-3-label-no": "Не",
        "backend-fail-stream": "Немагчыма накіраваць файл $1.",
        "backend-fail-backup": "Немагчыма зрабіць рэзэрвовую копію файла $1.",
        "backend-fail-notexists": "Файл $1 не існуе.",
index 32101b5..2633e0b 100644 (file)
@@ -39,6 +39,7 @@
        "tog-hideminor": "Скриване на малки редакции в последните промени",
        "tog-hidepatrolled": "Скриване на патрулираните редакции от списъка с последните промени",
        "tog-newpageshidepatrolled": "Скриване на патрулираните редакции от списъка на новите страници",
+       "tog-hidecategorization": "Скриване на категоризацията на статии",
        "tog-extendwatchlist": "Разширяване на списъка за наблюдение, така че да показва всички промени, не само последните",
        "tog-usenewrc": "Групиране по страници на промените на Последни промени и в списъка за наблюдение",
        "tog-numberheadings": "Автоматично номериране на заглавията",
        "tog-watchlisthidebots": "Скриване на редакциите на ботове в списъка ми за наблюдение",
        "tog-watchlisthideminor": "Скриване на малките промени в списъка ми за наблюдение",
        "tog-watchlisthideliu": "Скриване на редакциите от влезли потребители от списъка за наблюдение",
+       "tog-watchlistreloadautomatically": "Обновяване на списъка за наблюдение всеки път, когато е сменен филтър (изисква се JavaScript)",
        "tog-watchlisthideanons": "Скриване на редакциите от анонимни потребители в списъка за наблюдение",
        "tog-watchlisthidepatrolled": "Скриване на патрулираните редакции от списъка за наблюдение",
+       "tog-watchlisthidecategorization": "Скриване на категоризацията на статии",
        "tog-ccmeonemails": "Получаване на копия на писмата, които пращам на другите потребители",
        "tog-diffonly": "Без показване на съдържанието на страницата при преглед на разлики",
        "tog-showhiddencats": "Показване на скритите категории",
        "morenotlisted": "Този списък не е пълен.",
        "mypage": "Страница",
        "mytalk": "Беседа",
-       "anontalk": "Беседа за адреса",
+       "anontalk": "Беседа",
        "navigation": "Навигация",
        "and": "&#32;и",
        "qbfind": "Търсене",
        "no-null-revision": "Не може да бъде създадена празна версия на страницата „$1“",
        "badtitle": "Невалидно заглавие",
        "badtitletext": "Желаното заглавие на страница е невалидно, празно или неправилна препратка към друго уики. Възможно е да съдържа знаци, които не са позволени в заглавия.",
+       "title-invalid-empty": "Желаното заглавие на статия е празно или съдържа единствено името на именното пространство.",
        "title-invalid-utf8": "Желаната страница съдържа невалиден низ с кодиране UTF-8",
        "title-invalid-interwiki": "Желаното заглавие на страница съдържа препратка към друго уики, което не може да бъде ползвано в заглавия.",
        "title-invalid-talk-namespace": "Желаното заглавие на страница се отнася към беседа, която не съществува",
        "title-invalid-relative": "Заглавието съдържа относителен път. Относителни заглавия на статии (./,../) са невалидни, защото често ще са недостижимо, когато биват извиквани от браузъра на потребителя.",
        "title-invalid-magic-tilde": "Желаното заглавие на статия съдържа невалидна поредица от вълчнички (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Желаното заглавие на статия е твърде дълго. Трябва да е не по-дълго от $1 {{PLURAL:$1|байт|байта}} в кодиране UTF-8.",
+       "title-invalid-leading-colon": "Желаното заглавие на статия съдържа невалидно двоеточие в началото.",
        "perfcached": "Следните данни са извлечени от склада и затова може да не отговарят на текущото състояние. В складираното копие {{PLURAL:$1|е допустим най-много един резултат|са допустими най-много $1 резултата}}.",
        "perfcachedts": "Данните са складирани и обновени за последно на $1. Най-много {{PLURAL:$4|един резултат е допустим и наличен|$4 резултата са допустими и налични}} в складираното копие.",
        "querypage-no-updates": "Обновяването на тази страница в момента е изключено. Засега данните тук няма да бъдат обновявани.",
        "actionthrottled": "Ограничение в скоростта",
        "actionthrottledtext": "Като част от защитата против спам, многократното повтаряне на това действие за кратък период от време е ограничено и вие вече сте надвишили лимита си. Опитайте отново след няколко минути.",
        "protectedpagetext": "Тази страница е защитена, за да се предотвратят редактиране или други действия.",
-       "viewsourcetext": "Можете да разгледате и да копирате кодa на страницата:",
-       "viewyourtext": "Можете да прегледате и копирате изходния код на '''вашите редакции''' на тази страница:",
+       "viewsourcetext": "Можете да разгледате и да копирате кодa на страницата.",
+       "viewyourtext": "Можете да прегледате и копирате изходния код на <strong>вашите редакции</strong> на тази страница.",
        "protectedinterface": "Тази страница съдържа текст, нужен за работата на системата. Тя е защитена против редактиране, за да се предотвратят възможни злоупотреби.\nЗа извършване на промяна за всички уикита, посетете [//translatewiki.net/ translatewiki.net], проектът за локализация на MediaWiki.",
        "editinginterface": "<strong>Внимание:</strong> Редактирате страница, която се използва за текстовия интерфейс на софтуера. Промяната й ще повлияе на външния вид на уикито.",
        "translateinterface": "За да добавите или промените преводи за всички уикита, моля, използвайте [//translatewiki.net/ translatewiki.net], локализиращия проект на МедияУики.",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Защо създавате друга сметка",
        "createacct-submit": "Създаване на сметката",
-       "createacct-another-submit": "Създаване на друга сметка",
+       "createacct-another-submit": "Създаване на сметка",
        "createacct-benefit-heading": "{{SITENAME}} се създава от хора като вас.",
        "createacct-benefit-body1": "{{PLURAL:$1|редакция|редакции}}",
        "createacct-benefit-body2": "{{PLURAL:$1|страница|страници}}",
        "wrongpassword": "Въведената парола е невалидна. Опитайте отново.",
        "wrongpasswordempty": "Не е въведена парола. Опитайте отново.",
        "passwordtooshort": "Необходимо е паролата да съдържа поне {{PLURAL:$1|1 знак|$1 знака}}.",
+       "passwordtoopopular": "Често използвани пароли не могат да бъдат ползвани. Моля, изберете по-уникална парола.",
        "password-name-match": "Паролата ви трябва да се различава от потребителското ви име.",
        "password-login-forbidden": "Използването на това потребителско име и парола е забранено.",
        "mailmypassword": "Възстановяване на парола",
        "passwordreset-emailtext-ip": "Някой (вероятно вие, от IP адрес $1) поиска възстановяване на паролата за сметката в {{SITENAME}} ($4). За {{PLURAL:$3|следната сметка|следните сметки}}\nе посочен този адрес за електронна поща:\n\n$2\n\n{{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.\nСега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.",
        "passwordreset-emailtext-user": "Потребител $1 от {{SITENAME}} поиска възстановяване на паролата за сметката в {{SITENAME}}\n($4). За {{PLURAL:$3|следната сметка|следните сметки}} е посочен този адрес за електронна поща:\n\n$2\n\n{{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.\nСега би трябвало да влезете в системата и да изберете нова парола. Ако заявката е направена \nот друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете \nтова съобщение и да продължите да използвате старата си парола.",
        "passwordreset-emailelement": "Потребителско име: \n$1\n\nВременна парола: \n$2",
-       "passwordreset-emailsentemail": "На електронната поща беше изпратено писмо за възстановяване на паролата.",
+       "passwordreset-emailsentemail": "Ако електронната Ви поща е свързана със сметката Ви, на нея е изпратено писмо за възстановяване на паролата.",
+       "passwordreset-emailsentusername": "Ако това потребителско име е свързано с електронна поща, е изпратено писмо за възстановяване на паролата.",
        "passwordreset-emailsent-capture": "По-долу е показано електронното писмо за възстановяване на паролата, което беше изпратено.",
        "passwordreset-emailerror-capture": "По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на {{GENDER:$2|потребителя}}: $1",
-       "changeemail": "Промяна на адреса за е-поща",
+       "changeemail": "Ð\9fÑ\80омÑ\8fна Ð¸Ð»Ð¸ Ð¿Ñ\80емаÑ\85ване Ð½Ð° Ð°Ð´Ñ\80еÑ\81а Ð·Ð° Ðµ-поÑ\89а",
        "changeemail-header": "Промяна на адреса за е-поща на сметката",
+       "changeemail-passwordrequired": "Трябва да въведете паролата си, за да потвърдите тази промяна.",
        "changeemail-no-info": "За да достъпвате тази страница директно, необходимо е да влезете в системата.",
        "changeemail-oldemail": "Текущ адрес за е-поща:",
        "changeemail-newemail": "Нов адрес за е-поща:",
        "changeemail-password": "Парола за {{SITENAME}}:",
        "changeemail-submit": "Промяна на е-пощата",
        "changeemail-throttled": "Направили сте твърде много опити за влизане в системата. \nМоля, изчакайте $1 преди следващия опит.",
+       "changeemail-nochange": "Моля, въведете различен нов адрес на електронна поща.",
        "resettokens": "Изчистване на маркерите",
        "resettokens-no-tokens": "Няма маркери за изчистване.",
        "resettokens-tokens": "Маркери:",
        "preview": "Предварителен преглед",
        "showpreview": "Предварителен преглед",
        "showdiff": "Показване на промените",
+       "blankarticle": "<strong>Предупреждение:</strong> Статията, която създавате е празна.\nАко щракнете на „\"{{int:savearticle}}“ отново, статията ще бъде създадена без никакво съдържание.",
        "anoneditwarning": "<strong>Внимание:</strong> Не сте влезли в системата. Ако направите редакция IP-адресът Ви ще бъде публично видим. Ако <strong>[$1 влезете]</strong> или си <strong>[$2 създадете акаунт]</strong>, редакциите Ви ще бъдат свързани с потребителското Ви име, заедно с други преимущества.",
        "anonpreviewwarning": "Внимание: Не сте влезли в системата. Ако съхраните редакцията си, тя ще бъде записана в историята на страницата с вашият IP-адрес.",
        "missingsummary": "'''Напомняне:''' Не е въведено кратко описание на промените. При повторно натискане на бутона „Съхраняване“, редакцията ще бъде съхранена без резюме.",
index 7aaaff9..a46373b 100644 (file)
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "रउआ एगो अन्य खाता काहे बना रहल बानी",
-       "createacct-captcha": "सुरक्षा जाँच",
-       "createacct-imgcaptcha-ph": "उपर लिखल पाठ लिखीं",
        "createacct-submit": "आपन खाता बनाईं",
        "createacct-another-submit": "एगो दोसर खाता बनाईं",
        "createacct-benefit-heading": "{{SITENAME}} रउआ जइसन लोगन द्वारा बनावल गईल बा।",
        "passwordreset-emailtext-ip": "केहु (शायद रउए, $1 आइ॰पी पता से) {{SITENAME}} ($4) पर आपन {{PLURAL:$3|गुप्तशब्द}} के रीसेट करे के अनुरोध कईले बानी। इ ई-मेल पता से निम्न {{PLURAL:$3|खाता जुड़ल बा}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्तशब्द {{PLURAL:$5|एक दिन|$5 दिन}} के बाद काम ना करी। रउआ खाता में प्रवेश करके एगो नया गुप्तशब्द अभी चुन लेवे के चाहीं। यदि इ अनुरोध केहु अउर कइले बा, या फिर रउआ आपन मूल गुप्तशब्द याद आ गईल बा, अउर आप {{PLURAL:$3|आपन}} गुप्तशब्द नइखी बदले के चाहत त, रउआ इ संदेश के अनदेखा कर के आपन पुरानका गुप्तशब्द के प्रयोग जारी रख सकत बानी।",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4) पर सदस्य $1 राउर {{PLURAL:$3|खाता}} के गुप्तशब्द के पुनर्स्थापित करे के अनुरोध कइले बानी। इ ई-मेल पता से निम्न {{PLURAL:$3|खाता जुड़ल बा}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्तशब्द {{PLURAL:$5|एक दिन|$5 दिन}} के बाद काम ना करी।\nरउआ खाता में प्रवेश करके एगो नया गुप्तशब्द अभीये चुन लेवे के चाहीं। यदि इ अनुरोध केहु अउर कइले बा, या फिर रउआ आपन मूल गुप्तशब्द याद आ गईल बा, अउर रउआ {{PLURAL:$3|आपन}} गुप्तशब्द नईखीं बदले के चाहत त, रउआ इ संदेश के अनदेखा कर के आपन पुरनका गुप्तशब्द के प्रयोग जारी रख सकत बानीं।",
        "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी गुप्तशब्द: \n$2",
-       "passwordreset-emailsent": "एगो गुप्तशब्द रिसेट ई-मेल भेजल जा चुकल बा।",
+       "passwordreset-emailsentemail": "एगो गुप्तशब्द रिसेट ई-मेल भेजल जा चुकल बा।",
        "passwordreset-emailsent-capture": "नीचे दिखावल गईल गुप्तशब्द पुनर्स्थापना ई-मेल भेज दिहल गईल बा।",
        "passwordreset-emailerror-capture": "नीचे दिखावल गईल गुप्तशब्द पुनर्स्थापना ई-मेल उत्पन्न करल गईल रहल, परंतु उ के {{GENDER:$2|सदस्य}} के भेजे के क्रिया असफल रहल।\nत्रुटि: $1",
        "changeemail": "ई-मेल पता बदलीं",
-       "changeemail-text": "आपन ई-मेल पता बदले खातिर इ फॉर्म के भरीं। इ बदलाव के पुष्टे करे खातिर रउआ आपन गुप्तशब्द पुनः लिखे के पड़ी।",
+       "changeemail-header": "खाता के ई-मेल पता बदलीं",
        "changeemail-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआ पहिले खाता में प्रवेश करे के पड़ी।",
        "changeemail-oldemail": "वर्तमान ई-मेल पता:",
        "changeemail-newemail": "नया ई-मेल पता:",
        "content-json-empty-object": "खाली चीज (Empty object)",
        "content-json-empty-array": "खाली अरे (Empty array)",
        "duplicate-args-warning": "<strong>चेतावनी:</strong> [[:$1]], [[:$2]] के \"$3\" पैरामीटर खातिर एक से अधिका वैल्यू की संघे काल करत बाटे। दिहल गइल वैल्यू में से खाली सबसे आखिरी वैल्यू के प्रयोग कइल जाई।",
-       "duplicate-args-category": "à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f à¤\95à¥\89ल à¤®à¥\87à¤\82 à¤¡à¥\81पà¥\8dलिà¤\95à¥\87à¤\9f à¤¤à¤°à¥\8dà¤\95 à¤\95à¥\87 à¤\89पयà¥\8bà¤\97 à¤\95रतà¥\87 à¤¹à¥\81à¤\8f à¤ªà¤¨à¥\8dनासभ",
+       "duplicate-args-category": "à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f à¤\95à¥\89ल à¤®à¥\87à¤\82 à¤¡à¥\81पà¥\8dलिà¤\95à¥\87à¤\9f à¤¤à¤°à¥\8dà¤\95 à¤\87सà¥\8dतà¥\87माल à¤µà¤¾à¤²à¤¾ à¤ªà¤¨à¥\8dना",
        "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 {{PLURAL:$2|काल|काल कुल}} से कम संख्या में काल होखे के चाहीं, बाकी इहाँ ए समय {{PLURAL:$1|$1 काल बा|$1 काल कुल बाड़ी}}।",
        "expensive-parserfunction-category": "बहुत ढेर खर्चीला पार्सर फंक्शन काल वाला पन्ना सभ",
        "upload-dialog-button-done": "पूरा भइल",
        "upload-dialog-button-save": "सहेजीं",
        "upload-dialog-button-upload": "अपलोड",
-       "upload-process-error": "कौनो खराबी आ गइल",
-       "upload-process-warning": "कौनो चेतावनी बा",
        "upload-form-label-select-file": "फाइल चुनीं",
        "upload-form-label-infoform-title": "डिटेल जानकारी",
        "upload-form-label-infoform-name": "नाँव",
index f45e43c..b00dab0 100644 (file)
        "passwordreset-emailtext-ip": "Unan bennak (c'hwi moarvat gant ar chomlec'h IP $1) en deus goulennet ma vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
        "passwordreset-emailtext-user": "Goulennet en deus an implijer $1 war  {{SITENAME}} e vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
        "passwordreset-emailelement": "Anv implijer :           \n$1\n\nGer-tremen da c'hortoz : \n$2",
-       "passwordreset-emailsent": "Kaset ez eus bet ur postel deoc'h da adderaouekaat ho ker-tremen.",
+       "passwordreset-emailsentemail": "Kaset ez eus bet ur postel deoc'h da adderaouekaat ho ker-tremen.",
        "passwordreset-emailsent-capture": "Ur postel evit aderaouekaat ho ker-tremen, evel diskouezet amañ dindan, zo bet kaset.",
        "passwordreset-emailerror-capture": "Kaset ez eus bet ur postel degas da soñj evel m'emañ diskouezet amañ dindan met c'hwitet eo bet ar gasadenn d'an {{GENDER:$2|implijer|implijerez}} : $1",
        "changeemail": "Kemmañ ar chomlec'h postel",
        "prefs-diffs": "Diforc'hioù",
        "prefs-help-prefershttps": "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
        "prefs-tabs-navigation-hint": "Titourig : Gallout a rit implijout an touchennoù bir kleiz ha bir dehoù evit merdeiñ etre an ivinelloù e roll an ivinelloù.",
-       "email-address-validity-valid": "Reizh eo ar chomlec'h postel war a seblant",
-       "email-address-validity-invalid": "Ebarzhit ur chomlec'h postel reizh",
        "userrights": "Merañ statud an implijerien",
        "userrights-lookup-user": "Merañ strolladoù an implijer",
        "userrights-user-editname": "Lakait un anv implijer :",
        "contributions": "Degasadennoù an {{GENDER:$1|implijer|implijerez}}",
        "contributions-title": "Degasadennoù an implijer evit $1",
        "mycontris": "Ma degasadennoù",
+       "anoncontribs": "Ma degasadennoù",
        "contribsub2": "Evit {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
        "nocontribs": "N'eus bet kavet kemm ebet o klotañ gant an dezverkoù-se.",
        "movenosubpage": "Ispajenn ebet d'ar bajenn-mañ.",
        "movereason": "Abeg :",
        "revertmove": "nullañ",
-       "delete_and_move": "Diverkañ ha sevel adkas",
        "delete_and_move_text": "==Ezhomm diverkañ==\n\nSavet eo ar pennad tal \"[[:$1]]\" c'hoazh.\nDiverkañ anezhañ a fell deoc'h ober evit reiñ lec'h d'an adkas ?",
        "delete_and_move_confirm": "Ya, diverkañ ar bajenn",
        "delete_and_move_reason": "Diverket evit ober lec'h d'an adkas \"[[$1]]\"",
index 431f680..aaf599d 100644 (file)
        "passwordreset-emailtext-ip": "Někdo (patrně vy, z IP adresy $1) zažádal na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu účtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší za {{PLURAL:$5|jeden den|$5 dny|$5 dnů}}.\nNyní byste se měli přihlásit a zvolit si nové heslo. Pokud tento požadavek poslal někdo jiný nebo jste si na své staré heslo vzpomněli, a nechcete ho tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
        "passwordreset-emailtext-user": "{{gender:$1|Uživatel|Uživatelka}} $1 na {{grammar:6sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala}} na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu\núčtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší {{PLURAL:$5|za jeden den|za $5 dny|za $5 dnů}}.\nNyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek\nposlal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete ho\ntedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
        "passwordreset-emailelement": "Uživatelské jméno: \n$1\n\nDočasné heslo: \n$2",
-       "passwordreset-emailsentemail": "Pokud je to registrovaná e-mailová adresa k vašemu účtu, bude vám zaslán e-mail pro získání nového hesla.",
-       "passwordreset-emailsentusername": "Pokud existuje odpovídající registrovaná e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
+       "passwordreset-emailsentemail": "Pokud je u vašeho účtu nastavena tato e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
+       "passwordreset-emailsentusername": "Pokud je u tohoto účtu nastavena e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
        "passwordreset-emailsent-capture": "Byl odeslán e-mail pro získání nového hesla, který je zobrazen níže.",
        "passwordreset-emailerror-capture": "Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale {{GENDER:$2|uživateli|uživatelce}} se ho nepodařilo odeslat: $1",
        "changeemail": "Změna nebo odstranění e-mailové adresy",
        "wlshowhideanons": "anonymní uživatele",
        "wlshowhidepatr": "prověřené editace",
        "wlshowhidemine": "moje editace",
+       "wlshowhidecategorization": "kategorizaci stránek",
        "watchlist-options": "Možnosti sledovaných stránek",
        "watching": "Přidávám na seznam sledovaných stránek…",
        "unwatching": "Odebírám ze seznamu sledovaných stránek…",
        "pagelang-language": "Jazyk",
        "pagelang-use-default": "Použít implicitní jazyk",
        "pagelang-select-lang": "Vybrat jazyk",
+       "pagelang-submit": "Odeslat",
        "right-pagelang": "Změnit jazyk stránky",
        "action-pagelang": "měnit jazyk stránky",
        "log-name-pagelang": "Kniha změn jazyků",
        "mediastatistics-summary": "Statistika o typech načtených souborů. Zahrnuje vždy jen nejnovější verzi souboru. Staré nebo smazané verze se nezapočítávají.",
        "mediastatistics-nfiles": "$1 ($2 %)",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajty|$1 bajtů}} ($2; $3 %)",
+       "mediastatistics-bytespertype": "Celková velikost souborů v této sekci: $1 bajtů.",
+       "mediastatistics-allbytes": "Celková velikost všech souborů: $1 bajtů.",
        "mediastatistics-table-mimetype": "MIME typ",
        "mediastatistics-table-extensions": "Možné přípony",
        "mediastatistics-table-count": "Počet souborů",
        "mediastatistics-header-text": "Text",
        "mediastatistics-header-executable": "Spustitelné soubory",
        "mediastatistics-header-archive": "Komprimované formáty",
+       "mediastatistics-header-total": "Všechny soubory",
        "json-warn-trailing-comma": "Z JSONu {{PLURAL:$1|byla odstraněna 1 koncová čárka|byly odstraněny $1 koncové čárky|bylo odstraněno $1 koncových čárek}}",
        "json-error-unknown": "Došlo k potížím s JSONem. Chyba: $1",
        "json-error-depth": "Byla překročena maximální hloubka zásobníku",
index 7cc7bed..f47d451 100644 (file)
        "unusedtemplateswlh": "ытти каçăсем",
        "randompage": "Ăнсăртран лекнĕ страница",
        "randomincategory-category": "Категори:",
+       "randomincategory-submit": "Куç",
        "randomredirect": "Ăнсăртран илнĕ куçару",
        "statistics": "Статистика",
        "statistics-header-users": "Хутшăнакансен статистики",
        "whatlinkshere-hideredirs": "куçарнисене $1",
        "whatlinkshere-hidelinks": "Каçаканнисене $1",
        "whatlinkshere-filters": "Аласем",
+       "whatlinkshere-submit": "Ту",
        "blockip": "{{GENDER:$1|хутшăнакана}} чар",
        "ipaddressorusername": "IP адрес е усă куракан ят:",
        "ipbreason": "Сăлтавĕ",
        "allmessages": "Система пĕлтерĕвĕсем",
        "allmessagesname": "Пĕлтерӳ",
        "allmessagescurrent": "Хальхи текст",
+       "allmessages-filter-submit": "Куç",
        "allmessages-filter-translate": "Куçар",
        "thumbnail-more": "Пысăклатмалли",
        "filemissing": "Файл тупăнмарĕ",
        "watchlisttools-view": "Ку тӳрлетӳпе çыхăннăскерсем",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|сӳтсе явни]])",
        "version": "Верси",
+       "redirect-submit": "Куç",
        "fileduplicatesearch": "Пĕр пек файлсен шыравĕ",
        "fileduplicatesearch-legend": "Дубликатсен шыравĕ",
        "fileduplicatesearch-filename": "Файл ячĕ:",
index 3647fd0..ae89893 100644 (file)
        "passwordreset-emailtext-ip": "Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat eine Zurücksetzung deines Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:\n\n$2\n\n{{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab.\nDu solltest dich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder du dich wieder an dein ursprüngliches Passwort erinnern kannst und es nicht länger ändern möchtest, kannst du diese Nachricht ignorieren und weiterhin dein altes Passwort benutzen.",
        "passwordreset-emailtext-user": "Benutzer $1 bei {{SITENAME}} hat eine Zurücksetzung deines Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:\n\n$2\n\n{{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab. Du solltest dich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder du dich wieder an dein ursprüngliches Passwort erinnern kannst und es nicht ändern möchtest, kannst du diese Nachricht ignorieren und weiterhin dein altes Passwort benutzen.",
        "passwordreset-emailelement": "Benutzername: \n$1\n\nTemporäres Passwort: \n$2",
-       "passwordreset-emailsentemail": "Falls dies eine registrierte E-Mail-Adresse für dein Benutzerkonto ist, wird eine Passwortzurücksetzungs-E-Mail an diese Adresse versandt.",
-       "passwordreset-emailsentusername": "Falls es eine dazugehörige registrierte E-Mail-Adresse gibt, wird eine Passwort-Zurücksetzungs-E-Mail versandt.",
+       "passwordreset-emailsentemail": "Falls diese E-Mail-Adresse mit deinem Benutzerkonto verknüpft ist, wird eine Passwort-Zurücksetzungs-E-Mail versandt.",
+       "passwordreset-emailsentusername": "Falls es eine E-Mail-Adresse gibt, die mit diesem Benutzernamen verknüpft ist, wird eine Passwort-Zurücksetzungs-E-Mail versandt.",
        "passwordreset-emailsent-capture": "Eine Passwortzurücksetzungs-E-Mail wurde versandt, die unten angezeigt wird.",
        "passwordreset-emailerror-capture": "Die unten angezeigte Passwortzurücksetzungs-E-Mail wurde generiert, allerdings ist der Versand an {{GENDER:$2|den Benutzer|die Benutzerin}} gescheitert: $1",
        "changeemail": "E-Mail-Adresse ändern oder entfernen",
index 1665e21..688e9b8 100644 (file)
        "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
        "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
        "passwordreset-emailelement": "Username:\n$1\n\nTemporary password:\n$2",
-       "passwordreset-emailsentemail": "If this is a registered email address for your account, then a password reset email will be sent.",
-       "passwordreset-emailsentusername": "If there is a corresponding registered email address, then a password reset email will be sent.",
+       "passwordreset-emailsentemail": "If this email address is associated with your account, then a password reset email will be sent.",
+       "passwordreset-emailsentusername": "If there is an email address associated with this username, then a password reset email will be sent.",
        "passwordreset-emailsent-capture": "A password reset email has been sent, which is shown below.",
        "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
        "changeemail": "Change or remove email address",
        "mediastatistics-summary": "Statistics about uploaded file types. This only includes the most recent version of a file. Old or deleted versions of files are excluded.",
        "mediastatistics-nfiles": "$1 ($2%)",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
-       "mediastatistics-bytespertype": "Total file size for this section: $1 bytes.",
-       "mediastatistics-allbytes": "Total file size for all files: $1 bytes.",
+       "mediastatistics-bytespertype": "Total file size for this section: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
+       "mediastatistics-allbytes": "Total file size for all files: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "MIME type",
        "mediastatistics-table-extensions": "Possible extensions",
        "mediastatistics-table-count": "Number of files",
        "mw-widgets-titleinput-description-redirect": "redirect to $1",
        "api-error-blacklisted": "Please choose a different, descriptive title."
 }
-
-
index baaa4a7..91da6b7 100644 (file)
        "mediastatistics-header-text": "Testuala",
        "mediastatistics-header-executable": "Exekutagarriak",
        "mediastatistics-header-archive": "Formatu konprimatuak",
+       "mediastatistics-header-total": "Fitxategi guztiak",
        "json-error-syntax": "Sintaxi-errorea",
        "headline-anchor-title": "Lotura sekzio honetara",
        "special-characters-group-latin": "Latina",
index c103b04..1962b3f 100644 (file)
        "passwordreset-emailtext-ip": "Joku (todennäköisesti sinä, IP-osoitteesta $1) pyysi salasanasi\nvaihtamista sivustolla {{SITENAME}} ($4). {{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}}\nyhdistettynä tähän sähköpostiosoitteeseen:\n\n$2\n\n{{PLURAL:$3|Tämä väliaikainen salasana vanhentuu|Nämä väliaikaiset salasanat vanhentuvat}} {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.\nKirjaudu sisään nyt ja valitse uusi salasana heti. Jos joku toinen teki tämän pyynnön \ntai jos muistitkin vanhan salasanasi etkä halua enää muuttaa sitä,\nvoit jättää tämän viestin huomiotta ja jatkaa vanhan salasanasi käyttämistä.",
        "passwordreset-emailtext-user": "Käyttäjä $1 pyysi muistutusta tunnuksesi tiedoista sivustolla {{SITENAME}} ($4).\n{{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}} liitetty tähän sähköpostiosoitteeseen:\n\n$2\n\n{{PLURAL:$3|Tämä väliaikainen salasana vanhentuu|Nämä väliaikaiset salasanat vanhentuvat}} {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.\nSinun kannattaa kirjautua sisään ja valita uusi salasana. Jos joku toinen teki tämän\npyynnön, tai muistat sittenkin vanhan salasanasi, etkä halua muuttaa sitä,\nvoit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.",
        "passwordreset-emailelement": "Käyttäjätunnus: \n$1\n\nVäliaikainen salasana: \n$2",
-       "passwordreset-emailsentemail": "Jos tämä on sinun tunnuksellesi rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
-       "passwordreset-emailsentusername": "Jos on olemassa vastaava rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
+       "passwordreset-emailsentemail": "Mikäli tämä sähköpostiosoite on liitetty tiliisi, salasanan nollaamisviesti lähetetään.",
+       "passwordreset-emailsentusername": "Mikäli tähän käyttäjänimeen liitetty sähköpostiosoite löytyy, salasanan nollaamisviesti lähetetään.",
        "passwordreset-emailsent-capture": "Salasanan uudistamisesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.",
        "passwordreset-emailerror-capture": "Allaoleva sähköpostiviesti luotiin, mutta sen lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1",
        "changeemail": "Muuta tai poista sähköpostiosoite",
        "mediastatistics-header-text": "Tekstitiedostot",
        "mediastatistics-header-executable": "Ohjelmatiedostot",
        "mediastatistics-header-archive": "Pakatussa muodossa",
+       "mediastatistics-header-total": "Kaikki tiedostot",
        "json-warn-trailing-comma": "$1 {{PLURAL:$1|jäljelle jäänyt pilkku|jäljelle jäänyttä pilkkua}} poistettiin JSON-tekstistä.",
        "json-error-unknown": "Syntyi ongelma JSONin kanssa. Virhe: $1",
        "json-error-depth": "Suurin mahdollinen pinosyvyys (stack depth) on ylitetty",
index 609c173..9232f26 100644 (file)
        "passwordreset-emailtext-ip": "Quelqu'un (probablement vous, depuis l'adresse IP $1) a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
        "passwordreset-emailtext-user": "L'utilisateur $1 sur {{SITENAME}} a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
        "passwordreset-emailelement": "Nom d'utilisateur : \n$1\n\nMot de passe temporaire : \n$2",
-       "passwordreset-emailsentemail": "Si c’est une adresse de courriel enregistrée pour votre compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
-       "passwordreset-emailsentusername": "S’il y a une adresse de courriel enregistrée pour ce compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
+       "passwordreset-emailsentemail": "Si cette adresse de courriel est associée à votre compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
+       "passwordreset-emailsentusername": "S’il y a une adresse de courriel associée à ce nom d’utilisateur, alors un courriel de réinitialisation de mot de passe sera envoyé.",
        "passwordreset-emailsent-capture": "Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.",
        "passwordreset-emailerror-capture": "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur|utilisatrice}} a échoué : $1",
        "changeemail": "Changer ou supprimer l’adresse de courriel",
        "pagelang-language": "Langue",
        "pagelang-use-default": "Utiliser la langue par défaut",
        "pagelang-select-lang": "Sélectionner la langue",
+       "pagelang-submit": "Envoyer",
        "right-pagelang": "Changer la langue de la page",
        "action-pagelang": "changer la langue de la page",
        "log-name-pagelang": "Tracer les changements de langue",
index 3fe5a72..5ab7fb4 100644 (file)
        "cantrollback": "આ ફેરફારો ઉલટાવી નહી શકાય\nછેલ્લો ફેરફાર આ પાના ના રચયિતા દ્વારા જ થયો હતો",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) દ્વારા થયેલ[[:$1]]ના  ફેરફારો ઉલટાવી ન શકાયા;\nકોઇક અન્ય સભ્યએ આ પાનાપર ફેરફાર કરી દીધા છે.\n\nઆ પાના પર ના છેલ્લા ફેરફારો [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) દ્વારા કરવામાં આવ્યાં હતાં.",
        "editcomment": "ફેરફાર સારાંશ હતી: \"''$1''\".",
-       "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])દ્વારા ફેરફરોને  [[User:$1|$1]] દ્વારા કરેલા છેલ્લા સુધારા સુધી ઉલટાવાયા.",
+       "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) દ્વારા કરેલ ફેરફારોને  [[User:$1|$1]] દ્વારા કરેલા છેલ્લા સુધારા સુધી ઉલટાવાયા.",
        "revertpage-nouser": "ગુપ્ત સભ્ય વડે કરાયેલ ફેરફારને {{GENDER:$1|[[User:$1|$1]]}} વડે કરેલ છેલ્લા પુનરાવર્તન પર પાછા લઇ જવાયું.",
        "rollback-success": "$1 દ્વારા થયેલા ફેરફારો ઉલટાવાયા\nતેને $2 દ્વારા થયેલ સંપાદન સુધી લઇ જવાયું",
        "sessionfailure-title": "સત્ર નિષ્ફળ",
index 93b532d..83dfa37 100644 (file)
        "passwordreset-emailtext-ip": "מישהו (ככל הנראה אתם, מכתובת ה־IP מספר $1) ביקש איפוס של\nהסיסמה שלכם ב{{grammar:תחילית|{{SITENAME}}}} ($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}}\nלכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או שנזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
        "passwordreset-emailtext-user": "{{GENDER:$1|המשתמש|המשתמשת}} $1 ב{{GRAMMAR:תחילית|{{SITENAME}}}} {{GENDER:$1|ביקש|ביקשה}} איפוס של הסיסמה שלכם ב{{GRAMMAR:תחילית|{{SITENAME}}}}\n($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}} לכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או שנזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
        "passwordreset-emailelement": "שם משתמש:\n$1\n\nסיסמה זמנית:\n$2",
-       "passwordreset-emailsentemail": "×\90×\9d ×\96×\95×\94×\99 ×\9bת×\95×\91ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×¨×©×\95×\9e×\94 ×¢×\91×\95ר ×\94חשבון שלך, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
-       "passwordreset-emailsentusername": "×\90×\9d ×¨×©×\95×\9e×\94 ×\9bת×\95×\91ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\9eת×\90×\99×\9eה, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
+       "passwordreset-emailsentemail": "×\90×\9d ×\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×\94×\96×\90ת ×\9eש×\95×\99×\9bת ×\9cחשבון שלך, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
+       "passwordreset-emailsentusername": "×\90×\9d ×\99ש ×\9bת×\95×\91ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×©×\9eש×\95×\99×\9bת ×\9cש×\9d ×\94×\9eשת×\9eש ×\94×\96ה, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
        "passwordreset-emailsent-capture": "נשלח דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן.",
        "passwordreset-emailerror-capture": "נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1",
        "changeemail": "שינוי או הסרת כתובת דוא\"ל",
index 62b9644..1a46b82 100644 (file)
        "rcshowhidemine": "$1 moje promjene",
        "rcshowhidemine-show": "prikaži",
        "rcshowhidemine-hide": "sakrij",
+       "rcshowhidecategorization-show": "Prikaži",
        "rclinks": "Prikaži posljednjih $1 promjena {{PLURAL:$2|prethodni dan|u posljednja $2 dana|u posljednjih $2 dana}}<br />$3",
        "diff": "razl",
        "hist": "pov",
        "mostrevisions": "Popis članaka po broju uređivanja",
        "prefixindex": "Sve stranice prema početku naslova",
        "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
+       "prefixindex-submit": "Prikaži",
        "prefixindex-strip": "Ne prikazuj predmetak u popisu",
        "shortpages": "Kratke stranice",
        "longpages": "Duge stranice",
index 0cbe908..d1e45f7 100644 (file)
        "morenotlisted": "A lista nem teljes.",
        "mypage": "Lapom",
        "mytalk": "Vitalap",
-       "anontalk": "Az IP-címhez tartozó vitalap",
+       "anontalk": "Vitalap",
        "navigation": "Navigáció",
        "and": "&#32;és",
        "qbfind": "Keresés",
        "laggedslavemode": "'''Figyelem:''' Ez a lap nem feltétlenül tartalmazza a legfrissebb változtatásokat!",
        "readonly": "Az adatbázis le van zárva",
        "enterlockreason": "Add meg a lezárás okát, valamint egy becslést, hogy mikor lesz a lezárásnak vége",
-       "readonlytext": "A wiki adatbázisa ideiglenesen le van zárva (valószínűleg adatbázis-karbantartás miatt). A lezárás időtartama alatt a lapok nem szerkeszthetők, és új szócikkek sem hozhatók létre, az oldalakat azonban lehet böngészni.\n\nAz adminisztrátor, aki lezárta az adatbázist, az alábbi indoklást adta: $1",
+       "readonlytext": "A wiki adatbázisa ideiglenesen le van zárva (valószínűleg adatbázis-karbantartás miatt). A lezárás időtartama alatt a lapok nem szerkeszthetők, és új szócikkek sem hozhatók létre, az oldalakat azonban lehet böngészni.\n\nAz rendszeradminisztrátor, aki lezárta az adatbázist, az alábbi indoklást adta: $1",
        "missing-article": "Az adatbázisban nem található meg a(z) „$1” című lap szövege $2.\n\nEnnek az oka általában az, hogy egy olyan lapra vonatkozó linket követtél, amit már töröltek.\n\nHa ez nem így van, lehet, hogy hibát találtál a szoftverben.\nJelezd ezt egy [[Special:ListUsers/sysop|adminiszttrátornak]] az URL megadásával.",
        "missingarticle-rev": "(változat azonosítója: $1)",
        "missingarticle-diff": "(eltérés: $1, $2)",
        "mypreferencesprotected": "Nincs jogod módosítani a beállításaidat.",
        "ns-specialprotected": "A speciális lapok nem szerkeszthetők.",
        "titleprotected": "Ilyen címmel nem lehet szócikket készíteni, [[User:$1|$1]] letiltotta.\nAz indoklás: „''$2''”.",
-       "filereadonlyerror": "A(z) \"$1\" fájl nem módosítható, mert a(z) \"$2\" fájltároló csak olvasható módban üzemel.\n\nA lezárást végrehajtó rendszergazda az alábbi indoklást adta meg: \"$3\".",
+       "filereadonlyerror": "A(z) „$1” fájl nem módosítható, mert a(z) „$2” fájltároló csak olvasható módban üzemel.\n\nA lezárást végrehajtó rendszeradminisztrátor az alábbi indoklást adta meg: „$3”.",
        "invalidtitle-knownnamespace": "Érvénytelen cím \"$2\" névtérrel és \"$3\" szöveggel",
        "invalidtitle-unknownnamespace": "Érvénytelen cím az ismeretlen $1 névtérszámmal és \"$2\" szöveggel",
        "exception-nologin": "Nem vagy bejelentkezve.",
        "passwordreset-emailtext-ip": "Valaki (vélhetően Te, a $1 IP-címről) a jelszavad visszaállítását kérte a {{SITENAME}} ($4) oldalon felvett {{PLURAL:$3|fiókban|fiókokban}}. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:\n\n$2\n\n{{PLURAL:$3|Ez az ideiglenes jelszó|Ezek az ideiglenes jelszavak}} $5 nap múlva {{PLURAL:$3|jár|járnak}} le. Jelentkezz be, és cseréld le a jelszavadat. Ha valaki más kérte az emlékeztetőt, vagy eszedbe jutott a régi jelszó, és nem akarod lecserélni a jelszavadat, hagyd figyelmen kívül ezt az üzenetet, és használd a régi jelszavadat.",
        "passwordreset-emailtext-user": "$1 felhasználó jelszó-visszaállítást kért a {{SITENAME}} ($4) oldalon felvett {{PLURAL:$3|fiókban|fiókokban}}. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:\n\n$2\n\n{{PLURAL:$3|Ez az ideiglenes jelszó|Ezek az ideiglenes jelszavak}} $5 nap múlva {{PLURAL:$3|jár|járnak}} le. Jelentkezz be, és cseréld le a jelszavadat. Ha valaki más kérte az emlékeztetőt, vagy eszedbe jutott a régi jelszó, és nem akarod lecserélni a jelszavadat, hagyd figyelmen kívül ezt az üzenetet, és használd a régi jelszavadat.",
        "passwordreset-emailelement": "Felhasználónév: \n$1\n\nIdeiglenes jelszó: \n$2",
-       "passwordreset-emailsentemail": "Ha ez egy regisztrált e-mail-cím a fiókodhoz, egy jelszó-visszaállító e-mailt küldünk.",
+       "passwordreset-emailsentemail": "Ha ez az e-mail-cím van a fiókodhoz társítva, egy jelszó-visszaállító e-mailt küldünk.",
        "passwordreset-emailsent-capture": "Az alább látható jelszó-visszaállító e-mail lett elküldve.",
        "passwordreset-emailerror-capture": "A jelszó-visszaállító e-mail generálása megtörtént, mint az alább látszik, de elküldése a {{GENDER:$2|szerkesztőnek}} nem sikerült: $1",
        "changeemail": "E-mail cím megváltoztatása vagy eltávolítása",
-       "changeemail-header": "A fiókhoz tartozó e-mail cím megváltoztatása",
+       "changeemail-header": "Töltsd ki ezt az űrlapot az e-mail-címed megváltoztatásához. Ha nem szeretnél semmilyen e-mail-címet kapcsolni a fiókodhoz, hagyd üresen az új e-mail-cím mezőjét az űrlap elküldésekor.",
+       "changeemail-passwordrequired": "Meg kell adnod a jelszavadat ennek a változtatásnak a végrehajtásához.",
        "changeemail-no-info": "A lap közvetlen eléréséhez be kell jelentkezned.",
-       "changeemail-oldemail": "Jelenlegi e-mail cím:",
-       "changeemail-newemail": "Új e-mail cím:",
+       "changeemail-oldemail": "Jelenlegi e-mail-cím:",
+       "changeemail-newemail": "Új e-mail-cím:",
        "changeemail-none": "(nincs)",
        "changeemail-password": "A {{SITENAME}} jelszavad:",
        "changeemail-submit": "E-mail cím megváltoztatása",
        "copyrightwarning2": "Vedd figyelembe, hogy a {{SITENAME}} wikin végzett összes módosítást szerkeszthetik, módosíthatják vagy eltávolíthatják más szerkesztők.\nHa nem akarod, hogy az írásodat módosítsák, akkor ne küldd be.<br />\nAzt is megígéred, hogy ezt magadtól írtad, vagy egy közkincsből vagy más szabad forrásból másoltad (lásd a(z) $1 lapot a részletekért).\n'''NE KÜLDJ BE JOGVÉDETT MUNKÁT ENGEDÉLY NÉLKÜL!'''",
        "editpage-cannot-use-custom-model": "Ennek a lapnak a tartalommodellje nem változtatható.",
        "longpageerror": "'''HIBA: Az általad beküldött szöveg {{PLURAL:$1|egy kilobájt|$1 kilobájt}} hosszú, ami több az engedélyezett {{PLURAL:$2|egy kilobájtnál|$2 kilobájtnál}}.\nA szerkesztést nem lehet elmenteni.'''",
-       "readonlywarning": "FIGYELMEZTETÉS: A wiki adatbázisát karbantartás miatt zárolták, ezért most nem fogod tudni elmenteni a szerkesztéseidet!\nA lap szövegét másold egy szövegfájlba, amit később felhasználhatsz!'''\n\nAz adatbázist lezáró adminisztrátor az alábbi magyarázatot adta: $1",
+       "readonlywarning": "<strong>FIGYELMEZTETÉS: A wiki adatbázisát karbantartás miatt zárolták, ezért most nem fogod tudni elmenteni a szerkesztéseidet!</strong>\nA lap szövegét másold egy szövegfájlba, amit később felhasználhatsz!\n\nAz adatbázist lezáró rendszeradminisztrátor az alábbi magyarázatot adta: $1",
        "protectedpagewarning": "'''Figyelem: Ez a lap le van védve, így csak adminisztrátori jogosultságokkal rendelkező szerkesztők módosíthatják.'''\nA legutolsó ide vonatkozó naplóbejegyzés alább látható:",
        "semiprotectedpagewarning": "'''Megjegyzés:''' ez a lap védett, így regisztrálatlan vagy újonnan regisztrált szerkesztők nem módosíthatják.",
        "cascadeprotectedwarning": "<strong>Figyelem:</strong> ez a lap le van zárva, csak adminisztrátorok szerkeszthetik, mert a következő kaszkádvédelemmel ellátott {{PLURAL:$1|lapon|lapokon}} be van illesztve:",
        "recentchanges-label-plusminus": "Az oldal mérete ennyi bájttal módosult",
        "recentchanges-legend-heading": "Jelmagyarázat:",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lásd még: [[Special:NewPages|új lapok listája]])",
+       "recentchanges-submit": "Megjelenítés",
        "rcnotefrom": "Alább a <strong>$3 $4</strong> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).",
        "rclistfrom": "$3 $2 után történt változtatások megtekintése",
        "rcshowhideminor": "apró szerkesztések $1",
        "filerevert-legend": "Fájl visszaállítása",
        "filerevert-intro": "<span class=\"plainlinks\">A(z) '''[[Media:$1|$1]]''' fájl [$4 verzióját állítod vissza, dátum: $3, $2].</span>",
        "filerevert-comment": "Ok:",
-       "filerevert-defaultcomment": "A $2, $1-i verzió visszaállítása",
+       "filerevert-defaultcomment": "A $1, $2 ($3)-kori verzió visszaállítása",
        "filerevert-submit": "Visszaállítás",
        "filerevert-success": "<span class=\"plainlinks\">A(z) '''[[Media:$1|$1]]''' fájl visszaállítása a(z) [$4 verzióra, $3, $2] sikerült.</span>",
        "filerevert-badversion": "A megadott időbélyegzésű fájlnak nincs helyi változata.",
        "wlshowlast": "Az elmúlt $1 órában | $2 napon történt változtatások legyenek láthatóak",
        "watchlistall2": "bármikor",
        "watchlist-hide": "Elrejtés",
+       "watchlist-submit": "Megjelenítés",
+       "wlshowtime": "Időszak:",
+       "wlshowhideminor": "apró",
+       "wlshowhidebots": "botok",
+       "wlshowhideliu": "bejelentkezett",
+       "wlshowhideanons": "névtelen",
+       "wlshowhidemine": "saját",
        "watchlist-options": "A figyelőlista beállításai",
        "watching": "Figyelés...",
        "unwatching": "Figyelés befejezése...",
        "deletepage": "Lap törlése",
        "confirm": "Megerősítés",
        "excontent": "a lap tartalma: „$1”",
-       "excontentauthor": "a lap tartalma: „$1” (és csak „[[Special:Contributions/$2|$2]]” szerkesztette)",
+       "excontentauthor": "a lap tartalma: „$1”, és csak „[[Special:Contributions/$2|$2]]” ([[User talk:$2|vita]]) szerkesztette",
        "exbeforeblank": "az eltávolítás előtti tartalom: „$1”",
        "delete-confirm": "$1 törlése",
        "delete-legend": "Törlés",
        "undeletepagetext": "Az alábbi {{PLURAL:$1|lapot törölték, de még helyreállítható|$1 lapot törölték, de még helyreállíthatók}} az archívumból.\nAz archívumot időről időre üríthetik!",
        "undelete-fieldset-title": "Változatok helyreállítása",
        "undeleteextrahelp": "A lap teljes helyreállításához ne jelölj be egy jelölőnégyzetet sem, csak kattints a '''''{{int:undeletebtn}}''''' gombra.\nA lap részleges helyreállításához jelöld be a kívánt változatok melletti jelölőnégyzeteket, és kattints a '''''{{int:undeletebtn}}''''' gombra.",
-       "undeleterevisions": "$1 változat archiválva",
+       "undeleterevisions": "$1 változat törölve",
        "undeletehistory": "Ha helyreállítasz egy lapot, azzal visszahozod laptörténet összes változatát.\nHa lap törlése óta azonos néven már létrehoztak egy újabb lapot, a helyreállított\nváltozatok a laptörténet végére kerülnek be, a jelenlegi lapváltozat módosítása nélkül.",
        "undeleterevdel": "A törlés visszavonása nem hajtható végre, ha a legfrissebb lapváltozat részleges törlését eredményezi.\nIlyen esetekben vissza kell vonnod a legújabb törölt változatok kijelölését vagy azok elrejtését.",
        "undeletehistorynoadmin": "Ezt a szócikket törölték. A törlés okát alább az összegzésben\nláthatod, az oldalt a törlés előtt szerkesztő felhasználók részleteivel együtt. Ezeknek\na törölt változatoknak a tényleges szövege csak az adminisztrátorok számára hozzáférhető.",
        "logentry-newusers-create2": "$1 létrehozta $3 felhasználói fiókját",
        "logentry-newusers-byemail": "Szerkesztői lap $3 néven létrehozva $1 által, jelszó kiküldve emailben.",
        "logentry-newusers-autocreate": "$1 felhasználói fiók automatikusan létrehozva",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|áthelyezte}} a védelmi beállításokat a(z) $4 címről a(z) $3 címre",
        "logentry-protect-protect": "$1 {{GENDER:$2|levédte}} a(z) $3 lapot $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|levédte}} a(z) $3 lapot $4 [kaszkádvédelem]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|megváltoztatta}} a(z) $3 lap védelmi szintjét $4",
        "logentry-rights-rights": "$1 megváltoztatta $3 csoporttagságát erről: $4 erre: $5",
        "logentry-rights-rights-legacy": "$1 megváltoztatta $3 csoporttagságát",
        "logentry-rights-autopromote": "$1 automatikusan előléptetve erről: $4 erre: $5",
        "api-error-badaccess-groups": "Nincs jogod fájlokat feltölteni erre a wikire.",
        "api-error-badtoken": "Belső hiba: hibás token.",
        "api-error-copyuploaddisabled": "Az URL-címes feltöltés nem engedélyezett ezen a kiszolgálón.",
-       "api-error-duplicate": "Már van {{PLURAL:$1|egy|néhány}} másik fájl az oldalon ugyanilyen tartalommal",
+       "api-error-duplicate": "Már van {{PLURAL:$1|egy|néhány}} másik fájl az oldalon ugyanilyen tartalommal.",
        "api-error-duplicate-archive": "Az oldalon {{PLURAL:$1|szerepelt|szerepeltek}} más {{PLURAL:$1|fájl|fájlok}} is ugyanezzel a tartalommal, de törölve {{PLURAL:$1|lett|lettek}}.",
        "api-error-empty-file": "Az általad elküldött fájl üres volt.",
        "api-error-emptypage": "Új, üres lap létrehozása nem engedélyezett.",
index a47f3d7..9d213b0 100644 (file)
        "passwordreset-emailtext-ip": "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare ad utilizzare la tua vecchia password.",
        "passwordreset-emailtext-user": "L'utente $1 di {{SITENAME}} ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
        "passwordreset-emailelement": "Nome utente: \n$1\n\nPassword temporanea: \n$2",
-       "passwordreset-emailsentemail": "Se questo è un indirizzo di posta elettronica registrato per la tua utenza, allora verrà inviata una email per reimpostare la password.",
-       "passwordreset-emailsentusername": "Se c'è un corrispondente indirizzo di posta elettronica registrato, allora verrà inviata una email per reimpostare la password.",
+       "passwordreset-emailsentemail": "Se questo indirizzo di posta elettronica è associato con la tua utenza, allora verrà inviata una email per reimpostare la password.",
+       "passwordreset-emailsentusername": "Se c'è un indirizzo di posta elettronica associato con questo nome utente, allora verrà inviata una email per reimpostare la password.",
        "passwordreset-emailsent-capture": "È stata inviata una email di reimpostazione della password, il contenuto è riportato di seguito.",
        "passwordreset-emailerror-capture": "È stata generata una email di reimpostazione della password, riportata di seguito. L'invio {{GENDER:$2|all'utente}} non è riuscito: $1",
        "changeemail": "Modifica o rimuovi indirizzo email",
        "tags-deactivate": "disattiva",
        "tags-hitcount": "$1 {{PLURAL:$1|modifica|modifiche}}",
        "tags-manage-no-permission": "Non hai il permesso di gestire il cambiamento tag.",
+       "tags-manage-blocked": "Non puoi gestire le etichette alle modifiche mentre sei bloccato.",
        "tags-create-heading": "Crea un nuovo tag",
        "tags-create-explanation": "Per impostazione predefinita, i tag appena creati saranno disponibili per l'utilizzo di utenti e bot.",
        "tags-create-tag-name": "Nome del tag:",
        "tags-deactivate-not-allowed": "Non è possibile disattivare il tag \"$1\".",
        "tags-deactivate-submit": "Disattiva",
        "tags-apply-no-permission": "Non disponi dell'autorizzazione per applicare la modifica di tag insieme con le tue modifiche.",
+       "tags-apply-blocked": "Non puoi applicare le etichette alle modifiche mentre sei bloccato.",
        "tags-apply-not-allowed-one": "L'etichetta \"$1\" non può essere applicata manualmente.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|La seguente etichetta non può essere applicata|Le seguenti etichette non possono essere applicate}}  manualmente: $1",
        "tags-update-no-permission": "Non hai il permesso di aggiungere o rimuovere modifiche di tag dalle singole revisioni o voci di registro.",
+       "tags-update-blocked": "Non puoi aggiungere o rimuovere le etichette alle modifiche mentre sei bloccato.",
        "tags-update-add-not-allowed-one": "Il tag \"$1\" non può essere aggiunto manualmente.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Il seguente tag non può essere aggiunto|I seguenti tag non possono essere aggiunti}} manualmente: $1",
        "tags-update-remove-not-allowed-one": "Il tag \"$1\" non può essere rimosso.",
        "mediastatistics": "Statistiche relative ai file multimediali",
        "mediastatistics-summary": "Statistiche sui tipi di file caricati. Sono incluse solo la versione più recente di un file. Versioni vecchie o cancellate dei file sono escluse.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Dimensione totale dei file per questa sezione: $1 byte.",
+       "mediastatistics-allbytes": "Dimensione totale di tutti i file: $1 byte.",
        "mediastatistics-table-mimetype": "Tipo MIME",
        "mediastatistics-table-extensions": "Possibili estensioni",
        "mediastatistics-table-count": "Numero di file",
index 10a4b06..81bfe5f 100644 (file)
        "passwordreset-emailtext-ip": "誰か (おそらくあなた、IP アドレス $1) が {{SITENAME}} ($4)\nでのパスワードを再設定するよう申請しました。\n以下の利用者{{PLURAL:$3|アカウント|アカウント群}}がこのメールアドレスと紐付けられています。\n\n$2\n\n{{PLURAL:$3|この仮パスワード|これらの仮パスワード}}は {{PLURAL:$5|$5 日|$5 日間}}で有効期限が切れます。\nあなたはすぐにログインして新しいパスワードを設定する必要があります。\nこれが他の誰かによる申請である場合、あるいはあなたが自分の元のパスワードを\n覚えていてそれを変更したくない場合には、このメッセージを無視して以前のパスワードを\n使用し続けることができます。",
        "passwordreset-emailtext-user": "{{SITENAME}} の利用者 $1 があなたの {{SITENAME}} ($4)\nでのパスワードを再設定するよう申請しました。\n以下の利用者{{PLURAL:$3|アカウント|アカウント群}}がこのメールアドレスと紐付けられています。\n\n$2\n\n{{PLURAL:$3|この仮パスワード|これらの仮パスワード}}は{{PLURAL:$5|$5日}}で有効期限が切れます。\nあなたは、すぐにログインして新しいパスワードを設定する必要があります。\nこの申請が他の誰かによるものの場合、あるいはあなたが自分の元のパスワードを\n覚えていて、変更したくない場合は、このメッセージを無視して\n以前のパスワードを使い続けることができます。",
        "passwordreset-emailelement": "利用者名: \n$1\n\n仮パスワード: \n$2",
-       "passwordreset-emailsentemail": "ã\82\82ã\81\97ã\80\81ã\81\93ã\82\8cã\81\8cã\81\82ã\81ªã\81\9fã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®ã\81\9fã\82\81ã\81«ç\99»é\8c²ã\81\95ã\82\8cã\81\9fã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81§ã\81\82ã\82\8bå ´å\90\88ã\80\81ã\81\93ã\82\8cã\81\8bã\82\89パスワードリセットのメールが送信されます。",
-       "passwordreset-emailsentusername": "ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81\8cç\99»é\8c²ã\81\95ã\82\8cã\81¦ã\81\84る場合は、パスワードリセットのメールが送信されます。",
+       "passwordreset-emailsentemail": "ã\81\93ã\81®ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81\8cã\81\82ã\81ªã\81\9fã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81«é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81パスワードリセットのメールが送信されます。",
+       "passwordreset-emailsentusername": "ã\81\93ã\81®å\88©ç\94¨è\80\85å\90\8dã\81«é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81\9fã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81\8cã\81\82る場合は、パスワードリセットのメールが送信されます。",
        "passwordreset-emailsent-capture": "下記の内容の、パスワード再設定メールをお送りしました。",
        "passwordreset-emailerror-capture": "以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1",
        "changeemail": "メールアドレスを変更または除去",
        "wlshowhideanons": "IP利用者",
        "wlshowhidepatr": "巡回された編集",
        "wlshowhidemine": "自分の編集",
+       "wlshowhidecategorization": "ページのカテゴリ化",
        "watchlist-options": "ウォッチリストのオプション",
        "watching": "ウォッチリストに追加中...",
        "unwatching": "ウォッチリストから除去中...",
index be67aa4..98c3c68 100644 (file)
@@ -29,7 +29,7 @@
                ]
        },
        "tog-underline": "ಕೊಂಡಿಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
-       "tog-hideminor": "à²\9aಿà²\95à³\8dà²\95ಪà³\81à²\9fà³\8dà²\9f à²¬à²¦à²²à²¾à²µà²£ೆಗಳನ್ನು ಅಡಗಿಸಿ",
+       "tog-hideminor": "à²\87ತà³\8dತà³\80à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86à²\97ಳಲà³\8dಲಿ à²\9aಿà²\95à³\8dà²\95ಪà³\81à²\9fà³\8dà²\9f à²¸à²\82ಪಾದನೆಗಳನ್ನು ಅಡಗಿಸಿ",
        "tog-hidepatrolled": "ಪಹರೆಯಲ್ಲಿ ಆದ ಸಂಪಾದನೆಗಳನ್ನು ಇತ್ತೀಚೆಗಿನ ಬದಲಾವಣೆಗಳಲ್ಲಿ ಅಡಗಿಸು",
        "tog-newpageshidepatrolled": "ಪಹರೆಯಲ್ಲಿ ಆದ ಪುಟಗಳನ್ನು ಹೊಸ ಪುಟಗಳ ಪಟ್ಟಿಯಲ್ಲಿ ಅಡಗಿಸು",
        "tog-extendwatchlist": "ಕೇವಲ ಇತ್ತೀಚೆಗಿನ ಬದಲಾವಣೆಗಳಲ್ಲದೆ, ಸಂಬಂಧಿತ ಎಲ್ಲಾ ಬದಲಾವಣೆಗಳನ್ನು ತೋರುವಂತೆ ಪಟ್ಟಿಯನ್ನು ವಿಸ್ತರಿಸಿ",
        "morenotlisted": "ಈ ಪಟ್ಟಿ ಪೂರ ಇಲ್ಲ.",
        "mypage": "ಪುಟ",
        "mytalk": "ಚರ್ಚೆ",
-       "anontalk": "à²\88 à²\90.ಪಿ à²\97à³\86 à²®à²¾à²¤à²¨à²¾à²¡à²¿",
+       "anontalk": "à²\9aರà³\8dà²\9aà³\86",
        "navigation": "ಸಂಚರಣೆ",
        "and": "&#32;ಮತ್ತು",
        "qbfind": "ಹುಡುಕು",
        "nstab-image": "ಚಿತ್ರ",
        "nstab-mediawiki": "ಸಂದೇಶ",
        "nstab-template": "ಟೆಂಪ್ಲೇಟು",
-       "nstab-help": "ಸಹಾಯ",
+       "nstab-help": "ಸಹಾಯ ಪುಟ",
        "nstab-category": "ವರ್ಗ",
        "mainpage-nstab": "ಮುಖ್ಯ ಪುಟ",
        "nosuchaction": "ಆ ರೀತಿಯ ಕೃತ್ಯ ಯಾವುದೂ ಇಲ್ಲ",
        "missingcommenttext": "ಕೆಳಗೆ ಒಂದು ಟಿಪ್ಪಣಿ ನಮೂದಿಸಿ",
        "missingcommentheader": "'''ಗಮನಿಸಿ:''' ಈ ವ್ಯಾಖ್ಯಾನಕ್ಕೆ ವಿಷಯ ಅಥವ ತಲೆಬರಹ ನೀವು ಸೂಚಿಸಿಲ್ಲ. ನೀವು \"{{int:savearticle}}\"\nಮತ್ತೊಮೆ ಒತ್ತಿದರೆ ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಹಾಗೆಯೇ ಉಳಿಸಲಾಗುವುದು.",
        "summary-preview": "ತಾತ್ಪರ್ಯ ಮುನ್ನೋಟ:",
-       "subject-preview": "ವಿಷಯದ/ತಲೆಬರಹದ ಮುನ್ನೋಟ:",
+       "subject-preview": "ವಿಷಯದ ಮುನ್ನೋಟ:",
        "blockedtitle": "ಈ ಸದಸ್ಯರನ್ನು ತಡೆ ಹಿಡಿಯಲಾಗಿದೆ.",
        "blockedtext": "'''ನಿಮ್ಮ ಸದಸ್ಯತ್ವವನ್ನು ಅಥವ IP ವಿಳಾಸವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.'''\n\n$1 ಅವರು ಈ ನಿರ್ಬಂಧನೆಯನ್ನು ಒಡ್ಡಿರುವರು.\nಇದಕ್ಕೆ ಅವರು ನೀಡಿರುವ ಕಾರಣ: ''$2''.\n\n* ನಿರ್ಬಂಧನೆಯ ಪ್ರಾರಂಭ: $8\n* ನಿರ್ಬಂಧನೆ ಮುಗಿಯುವುದು: $6\n* ನಿರ್ಬಂಧನೆ ಹೇರಲ್ಪಟ್ಟವರು: $7\n\nನೀವು $1 ಅಥವ ಇತರ [[{{MediaWiki:Grouppage-sysop}}|ನಿರ್ವಾಹಕರನ್ನು]] ಈ ನಿರ್ಬಂಧನೆಯನ್ನು ಚರ್ಚಿಸಲು ಸಂಪರ್ಕಿಸಬಹುದು.\nನೀವು 'ಸದಸ್ಯರಿಗೆ ಇ-ಅಂಚೆ ಕಳುಹಿಸಿ' ಸೌಲಭ್ಯವನ್ನು ಉಪಯೋಗಿಸಲು ನಿಮ್ಮ \"[[Special:Preferences|ನನ್ನ ಪ್ರಾಶಸ್ತ್ಯಗಳು]]\" ಪುಟದಲ್ಲಿ ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ನೀಡಿರಬೇಕು. ಈಗ ಆ ಪುಟವನ್ನು ನೀವು ಉಪಯೋಗಿಸದಂತೆ ನಿರ್ಬಂಧಿಸಲಾಗಿಲ್ಲ.\nನಿಮ್ಮ ಪ್ರಸಕ್ತ IP ವಿಳಾಸವು $3, ಮತ್ತು ಈ ನಿರ್ಭಂಧನೆಯ ಕ್ರಮಸಂಖ್ಯೆ (ID) #$5.\nದಯವಿಟ್ಟು ನಿಮ್ಮ ಸಂಪರ್ಕಗಳಲ್ಲಿ ಈ ಸಂಖ್ಯೆಗಳನ್ನು ಸೇರಿಸಿ.",
        "autoblockedtext": "$1 ಅವರಿಂದ ತಡೆಹಿಡಿಯಲ್ಪಟ್ಟ ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರ ನಿಮ್ಮ ಐಪಿ ವಿಳಾಸವನ್ನು ಉಪಯೋಗಿಸುತ್ತಿದ್ದರಿಂದ ಅ ವಿಳಾಸವನ್ನು ಯಾಂತ್ರಿಕವಾಗಿ ತಡೆಹಿಡಿಯಲ್ಪಟ್ಟಿದೆ.\nತಡೆಗೆ ನೀಡಿರುವ ಕಾರಣ:\n\n:''$2''\n\n* ತಡೆಯ ಪ್ರಾರಂಭ: $8\n* ತಡೆಯ ಅಂತ್ಯ: $6\n* ಉದ್ದೇಶಿತ ತಡೆ: $7\n\nನೀವು $1 ಅವರನ್ನು ಅಥವ ಇತರ [[{{MediaWiki:Grouppage-sysop}}|ನಿರ್ವಾಹಕರನ್ನು]] ಈ ತಡೆಯನ್ನು ಚರ್ಚಿಸಲು ಸಂಪರ್ಕಿಸಬಹುದು.\nಗಮನಿಸಿ: ನಿಮ್ಮ [[Special:Preferences|ಬಳಕೆದಾರ ಪ್ರಾಶಸ್ತ್ಯಗಳಲ್ಲಿ]] ಧೃಡೀಕೃತ ಇ-ಅಂಚೆ ವಿಳಾಸ ನೀಡಿದ್ದಲ್ಲಿ ಮತ್ತು ಅದನ್ನು ಉಪಯೋಗಿಸದಂತೆ ತಡೆಹಿಡಿಯಲ್ಪಟ್ಟಿಲ್ಲದಿದ್ದಲ್ಲಿ ಮಾತ್ರ \"ಸದಸ್ಯರಿಗೆ ಇ-ಅಂಚೆ ಕಳಿಸಿ\" ಸೌಲಭ್ಯವನ್ನು ಉಪಯೋಗಿಸಬಹುದು.\n\nನಿಮ್ಮ ಪ್ರಸ್ತಕ ಐಪಿ ವಿಳಾಸ $3, ಮತ್ತು ಈ ತಡೆಯ ಸಂಖ್ಯೆ $5.\nನೀವು ಸಂಪರ್ಕಿಸಿದಾಗ ದಯವಿಟ್ಟು ಈ ವಿವರಣೆಗಳನ್ನು ಸೇರಿಸಿ.",
        "group-user-member": "ಬಳಕೆದಾರ",
        "group-autoconfirmed-member": "ಸ್ವಧೃಡೀಕೃತ ಬಳಕೆದಾರ",
        "group-bot-member": "{{ಲಿಂಗ:$1|ಬೋಟ್}}",
-       "group-sysop-member": "{{ಲಿಂಗ:$1|ಮಾಜಿ ಆಡಳಿತಗಾರ}}",
-       "group-bureaucrat-member": "ಮೇಲ್ವಿಚಾರಕ",
+       "group-sysop-member": "{{GENDER:$1|ನಿರ್ವಾಹಕ}}",
+       "group-bureaucrat-member": "{{GENDER:$1|ಮೇಲ್ವಿಚಾರಕ}}",
        "group-suppress-member": "ನಿಗ ಇಡುವವ",
        "grouppage-user": "{{ns:project}}:ಬಳಕೆದಾರರು",
        "grouppage-autoconfirmed": "{{ns:project}}:ಸ್ವಧೃಡೀಕೃತ ಬಳಕೆದಾರರು",
        "movepagetalktext": "ಜೊತೆಗಿನ ಚರ್ಚೆ ಪುಟವೂ ಸ್ಥಳಾಂತರಿಸಲಾಗುವುದು. ಈ ಸ್ಥಳಾಂತರ '''ಆಗದಿರುವ''' ಪ್ರಸಂಗಗಳು:\n*ಸ್ಥಳಾಂತರಿಕೆಯ ಹೆಸರಿನಲ್ಲಿ ಆಗಲೇ ಖಾಲಿಯಲ್ಲದ ಒಂದು ಪುಟವು ಇದ್ದಲ್ಲಿ, ಅಥವ\n*ಕೆಳಗಿನ ಚೌಕದಲ್ಲಿರುವ tick mark ಅನ್ನು ನೀವು ತಗೆದಲ್ಲಿ.\n\nಈ ಪ್ರಸಂಗಗಳಲ್ಲಿ ನೀವು ಸ್ವತಃ ಚರ್ಚೆ ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಬೇಕು ಅಥವ ಒಂದುಗೂಡಿಸಬೇಕು.",
        "movenologintext": "ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ನೀವು ನೋಂದಾಯಿತ ಸದಸ್ಯರಾಗಿದ್ದು [[Special:UserLogin|ಲಾಗಿನ್]] ಆಗಿರಬೇಕು.",
        "movenotallowed": "ನಿಮಗೆ {{SITENAME}} ಅಲ್ಲಿ ಪುಟಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸುವ ಅನುಮತಿ ಇಲ್ಲ.",
-       "newtitle": "à²\88 à²¹à³\8aಸ à²¶à³\80ರà³\8dಷಿà²\95à³\86à²\97ೆ:",
+       "newtitle": "ಹà³\8aಸ à²¶à³\80ರà³\8dಷಿà²\95ೆ:",
        "move-watch": "ಈ ಪುಟವನ್ನು ವೀಕ್ಷಿಸು",
        "movepagebtn": "ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "pagemovedsub": "ಸ್ಥಳಾಂತರಿಸುವಿಕೆ ಯಶಸ್ವಿಯಾಯಿತು",
index 63f31dd..0d5f011 100644 (file)
        "passwordreset-emailtext-ip": "$1 IP 주소를 사용하는 누군가가 아마 자신이 {{SITENAME}} ($4)의 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4)의 사용자 $1이 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
        "passwordreset-emailelement": "사용자 이름: \n$1\n\n임시 비밀번호: \n$2",
-       "passwordreset-emailsentemail": "당신의 계정에 등록된 이메일 주소가 있다면, 비밀번호 재설정 메일이 전해질 것입니다.",
+       "passwordreset-emailsentemail": "당신의 계정과 연결된 이메일 주소가 있다면, 비밀번호 재설정 메일이 전해질 것입니다.",
+       "passwordreset-emailsentusername": "이 사용자 이름과 연결된 이메일 주소가 있다면 비밀번호 초기화 이메일이 전송됩니다.",
        "passwordreset-emailsent-capture": "비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.",
        "passwordreset-emailerror-capture": "비밀번호 재설정 이메일이 생성되어 아래에 보여져 있지만, {{GENDER:$2|사용자}}에게 발송하는 데에는 실패했습니다: $1",
        "changeemail": "이메일 주소를 바꾸거나 제거하기",
        "mostrevisions": "가장 많이 편집된 문서 목록",
        "prefixindex": "접두어에 따른 문서 목록",
        "prefixindex-namespace": "접두어가 있는 모든 문서 ($1 이름공간)",
+       "prefixindex-submit": "보이기",
        "prefixindex-strip": "목록에서 접두어 생략",
        "shortpages": "짧은 문서 목록",
        "longpages": "긴 문서 목록",
        "protectedpages-performer": "보호한 사용자",
        "protectedpages-params": "보호 변수",
        "protectedpages-reason": "이유",
+       "protectedpages-submit": "문서 보이기",
        "protectedpages-unknown-timestamp": "알 수 없음",
        "protectedpages-unknown-performer": "알 수 없는 사용자",
        "protectedtitles": "만들기 보호된 표제어 목록",
        "protectedtitles-summary": "이 페이지는 현재 만들기 보호가 설정되어 있는 문서 제목을 나열합니다. 보호된 기존 문서들의 목록을 보려면 [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]을 보세요.",
        "protectedtitlesempty": "해당 조건에 맞는 만들기 금지 표제어가 없습니다.",
+       "protectedtitles-submit": "제목 보이기",
        "listusers": "사용자 목록",
        "listusers-editsonly": "기여가 있는 사용자만 보기",
        "listusers-creationsort": "계정을 만든 날짜순으로 정렬",
        "usereditcount": "{{PLURAL:$1|편집}} $1회",
        "usercreated": "$1 $2에 계정이 {{GENDER:$3|만들어짐}}",
        "newpages": "새 문서 목록",
+       "newpages-submit": "보이기",
        "newpages-username": "사용자 이름:",
        "ancientpages": "오래된 문서 목록",
        "move": "이동",
        "cachedspecial-viewing-cached-ts": "현재 이 문서는 캐시 처리된 버전으로 현재 문서 상태를 반영하지 않을 수도 있습니다.",
        "cachedspecial-refresh-now": "최신 버전 보기.",
        "categories": "분류 목록",
+       "categories-submit": "보이기",
        "categoriespagetext": "문서나 자료를 {{PLURAL:$1|포함하고 있는 분류}} 목록입니다.\n[[Special:UnusedCategories|사용되지 않는 분류]]는 여기에 보이지 않습니다.\n[[Special:WantedCategories|필요한 분류]]도 참조하세요.",
        "categoriesfrom": "다음으로 시작하는 분류를 보여주기:",
        "special-categories-sort-count": "갯수 순으로 정렬",
        "activeusers-hidebots": "봇을 숨기기",
        "activeusers-hidesysops": "관리자를 숨기기",
        "activeusers-noresult": "사용자가 없습니다.",
+       "activeusers-submit": "활동하고 있는 사용자 보이기",
        "listgrouprights": "사용자 권한 목록",
        "listgrouprights-summary": "다음은 이 위키에 있는 사용자 권한 그룹의 목록입니다.\n각각의 권한에 대해서는 [[{{MediaWiki:Listgrouprights-helppage}}|추가 정보]]를 참조하세요.",
        "listgrouprights-key": "범례:\n* <span class=\"listgrouprights-granted\">부여된 권한</span>\n* <span class=\"listgrouprights-revoked\">해제된 권한</span>",
        "wlshowhideanons": "익명 사용자",
        "wlshowhidepatr": "순찰한 편집",
        "wlshowhidemine": "내 편집",
+       "wlshowhidecategorization": "문서 분류",
        "watchlist-options": "주시문서 목록 설정",
        "watching": "주시 추가 중…",
        "unwatching": "주시 해제 중…",
        "delete-confirm": "\"$1\" 삭제",
        "delete-legend": "삭제",
        "historywarning": "<strong>경고:</strong> 삭제하려고 하는 문서에 {{PLURAL:$1|판}} $1개의 역사가 있습니다:",
+       "historyaction-submit": "보이기",
        "confirmdeletetext": "문서와 문서 역사를 삭제하려고 합니다.\n삭제하려는 문서가 맞는지, 이 문서를 삭제하는 것이 [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지를 확인해 주세요.",
        "actioncomplete": "동작 완료",
        "actionfailed": "명령 실패",
        "whatlinkshere-hidelinks": "링크를 $1",
        "whatlinkshere-hideimages": "파일 링크를 $1",
        "whatlinkshere-filters": "필터",
+       "whatlinkshere-submit": "계속",
        "autoblockid": "자동 차단 #$1",
        "block": "사용자 차단",
        "unblock": "사용자 차단 해제",
        "pagelang-language": "언어",
        "pagelang-use-default": "기본 언어 사용",
        "pagelang-select-lang": "언어 선택",
+       "pagelang-submit": "제출",
        "right-pagelang": "문서 언어 바꾸기",
        "action-pagelang": "문서 언어 바꾸기",
        "log-name-pagelang": "언어 바꾸기 기록",
        "mediastatistics": "미디어 통계",
        "mediastatistics-summary": "올려진 파일 유형에 대한 통계입니다. 이 통계는 파일의 가장 최신 판만을 포함합니다. 오래되거나 삭제된 파일의 판은 제외됩니다.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 바이트}} ($2; $3%)",
+       "mediastatistics-bytespertype": "이 문단의 총 파일 크기:$1 바이트",
+       "mediastatistics-allbytes": "모든 파일의 총 파일 크기:$1 바이트",
        "mediastatistics-table-mimetype": "MIME 종류",
        "mediastatistics-table-extensions": "가능한 확장 기능",
        "mediastatistics-table-count": "파일 수",
        "mediastatistics-header-text": "텍스트",
        "mediastatistics-header-executable": "실행 파일",
        "mediastatistics-header-archive": "압축 파일",
+       "mediastatistics-header-total": "모든 파일",
        "json-warn-trailing-comma": "뒤 {{PLURAL:$1|쉼표}} $1개가 JSON에서 제거되었습니다",
        "json-error-unknown": "JSON에 문제가 있었습니다. 오류: $1",
        "json-error-depth": "최대 스택 깊이를 초과했습니다",
index cf62305..8e6733a 100644 (file)
@@ -53,7 +53,7 @@
        "tog-shownumberswatching": "Numerum usorum observantium monstrare",
        "tog-oldsig": "Subscriptio, qua nunc uteris:",
        "tog-fancysig": "Subscriptio vicitext (sine nexu automatico)",
-       "tog-uselivepreview": "Praevisum viventem adhibere (experimentalis)",
+       "tog-uselivepreview": "Praevisum viventem adhibere",
        "tog-forceeditsummary": "Si recensionem non summatim descripsero, me roga si continuare velim",
        "tog-watchlisthideown": "Celare recensiones meas in paginarum observatarum indice",
        "tog-watchlisthidebots": "Celare recensiones automatarias in paginarum observatarum indice",
        "tooltip-save": "Servare mutationes tuas",
        "tooltip-preview": "Praevidere mutationes tuas, quaesumus hoc utere antequam servas!",
        "tooltip-diff": "Monstrare mutationes textui tuas",
-       "tooltip-compareselectedversions": "Inspicere, quantum pagina inter versiones selectas distet",
+       "tooltip-compareselectedversions": "Inspicere, quantum contenta inter versiones selectas distent",
        "tooltip-watch": "Addere hanc paginam tuis paginis observatis",
        "tooltip-recreate": "Recreare hanc paginam etiamsi deleta est",
        "tooltip-upload": "Incipere imponere",
index bcfe622..0eaae57 100644 (file)
        "laggedslavemode": "'''Opgepasst:''' Dës Säit ass net onbedéngt um neiste Stand.",
        "readonly": "D'Datebank ass gespaart",
        "enterlockreason": "Gitt w.e.g. e Grond u firwat d'Datebank gespaart ass, a wéi laang dës Spär ongeféier bestoe soll.",
-       "readonlytext": "D'Datebank ass elo fir all Ännerunge gespaart, wahrscheinlech wéinst Maintenance vun der Datebank, duerno ass erëm alles beim alen.\n\nDen Administrateur huet dës Erklärung uginn: $1",
+       "readonlytext": "D'Datebank ass elo fir all Ännerunge gespaart, wahrscheinlech wéinst Maintenance vun der Datebank, duerno ass erëm alles beim Alen.\n\nDe System-Administrateur, deen se gespaart huet, huet dës Erklärung uginn: $1",
        "missing-article": "Den Text „$1“ $2 gouf net an der Datebank fonnt.\n\nDat geschitt normalerweis duerch e Link op eng Säit déi geläscht oder geréckelt gouf.\n\nWann dat net de Fall ass, hutt Dir eventuell e Feeler an der Software fonnt.\nMellt dëst w.e.g. bei engem [[Special:ListUsers/sysop|Administrateur]] a vergiesst net d'URL unzeginn.",
        "missingarticle-rev": "(Versiounsnummer: $1)",
        "missingarticle-diff": "(Ënnerscheed tëscht Versiounen: $1, $2)",
        "wrongpasswordempty": "D'Passwuert dat Dir aginn hutt war eidel.\nProbéiert w.e.g. nach eng Kéier.",
        "passwordtooshort": "Passwierder musse mindestens {{PLURAL:$1|1 Zeeche|$1 Zeeche}} laang sinn.",
        "passwordtoolong": "Passwierder kënnen net méi laang wéi {{PLURAL:$1|1 Zeeche|$1 Zeeche}} sinn.",
+       "passwordtoopopular": "Dacks gewielt Passwierder kënnen net benotzt ginn. Sicht Iech w.e.g. e méi e spezifescht Passwuert.",
        "password-name-match": "Äert Passwuert muss verschidde vun Ärem Benotzernumm sinn.",
        "password-login-forbidden": "D'Benotze vun dësem Benotzernumm a Passwuert gouf verbueden.",
        "mailmypassword": "Passwuert zrécksetzen",
        "passwordreset-emailtext-ip": "Iergendee mat der IP-Adress $1, wahrscheinlech Dir selwer, huet d'Zrécksetze vun Ärem Passwuert op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont ass|D'Benutzerkonte si}} mat dëser E-Mail-Adress verbonn:\n\n$2\n\n{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.\nDir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
        "passwordreset-emailtext-user": "De Benotzer $1 vu(n) {{SITENAME}} huet d'Zrécksetze vun Ärem Passwuert op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont|D'Benutzerkonte}} \n\n$2\n\n{{PLURAL:$3|ass|si}} mat dëser E-Mail-Adress verbonn.\n\n{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.\nDir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
        "passwordreset-emailelement": "Benotzernumm: \n$1\n\nTemporärt Passwuert: \n$2",
-       "passwordreset-emailsentemail": "Wann dëst eng registréiert E-Mailadress vun Ärem benotzerkont ass da gëtt Eng E-Mail fir d'Passwuert zréckzesetze geschéckt.",
+       "passwordreset-emailsentemail": "Wann dës E-Mailadress mat Ärem Benotzerkont assoziéiert ass, da gëtt Eng E-Mail fir d'Passwuert zréckzesetze geschéckt.",
+       "passwordreset-emailsentusername": "Wann eng E-Mailadress mat dësem Benotzernumm associéiert ass, da gëtt Eng E-Mail fir d'Passwuert zeréckzesetze geschéckt.",
        "passwordreset-emailsent-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner.",
        "passwordreset-emailerror-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner, awer de {{GENDER:$2|Benotzer}} konnt se net kréien: $1",
        "changeemail": "E-Mail-Adress änneren oder ewechhuelen",
        "mediastatistics": "Statistike vun de Medien",
        "mediastatistics-summary": "Statistike vun den Type vun den eropgeluedene Fichieren. Dobäi gëtt nëmmen déi lescht Versioun vun engem Fichier gezielt, al oder geläscht Versioune vu Fichiere sinn ausgeschloss.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 Byte|$1 Byten}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Gesamtgréisst vun de Fichiere vun dësem Abschnitt: $1",
        "mediastatistics-table-mimetype": "MIME-Typ",
        "mediastatistics-table-extensions": "Méiglech Erweiderungen",
        "mediastatistics-table-count": "Zuel vun de Fichieren",
index 4fcf27a..b5e5065 100644 (file)
        "passwordreset-emailtext-user": "{{SITENAME}} സംരംഭത്തിലെ ഉപയോക്താവായ $1 {{SITENAME}} സംരംഭത്തിലെ ($4) രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാൻ അഭ്യർത്ഥിച്ചിരിക്കുന്നു. ഈ ഇമെയിൽ വിലാസവുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന {{PLURAL:$3|അംഗത്വം|അംഗത്വങ്ങൾ}} താഴെക്കൊടുത്തിരിക്കുന്നു:\n\n$2\n\n\nഈ {{PLURAL:$3|താത്കാലിക രഹസ്യവാക്ക്|താത്കാലിക രഹസ്യവാക്കുകൾ}} {{PLURAL:$5|ഒരു ദിവസം|$5 ദിവസങ്ങൾ}} കൊണ്ട് കാലഹരണപ്പെട്ട് പോകുന്നവയാണ്.\nതാങ്കൾ ഇപ്പോൾ തന്നെ പ്രവേശിച്ച് രഹസ്യവാക്ക് മാറ്റുന്നതാണ് ഉചിതം. ഈ അഭ്യർത്ഥന മറ്റാരോ ആണ് നടത്തിയത് അല്ലെങ്കിൽ, യഥാർത്ഥ രഹസ്യവാക്ക് താങ്കൾ ഓർമ്മിക്കുകയും അത് മാറ്റാൻ ആഗ്രഹിക്കാതിരിക്കുകയും ആണെങ്കിൽ, ഈ സന്ദേശം അവഗണിച്ച് താങ്കളുടെ പഴയ രഹസ്യവാക്ക് തുടർന്നും ഉപയോഗിക്കാവുന്നതാണ്.",
        "passwordreset-emailelement": "ഉപയോക്തൃനാമം: \n$1\n\nതാത്കാലിക രഹസ്യവാക്ക്: \n$2",
        "passwordreset-emailsentemail": "താങ്കളുടെ അംഗത്വത്തിന് നൽകിയിട്ടുള്ള ഇമെയിൽ വിലാസം ഇതാണെങ്കിൽ,  രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
-       "passwordreset-emailsentusername": "ഒരു ഇമെയിൽ വിലാസം ചേർത്തിട്ടുണ്ടെങ്കിൽ,  രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
+       "passwordreset-emailsentusername": "à´\88 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83നാമതàµ\8dതിനàµ\8d à´\92à´°àµ\81 à´\87à´®àµ\86യിൽ à´µà´¿à´²à´¾à´¸à´\82 à´\9aàµ\87ർതàµ\8dതിà´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9fàµ\86à´\99àµ\8dà´\95ിൽ,  à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ à´\87à´®àµ\86യിൽ à´\85à´¯à´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതാണàµ\8d.",
        "passwordreset-emailsent-capture": "രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്, അത് താഴെക്കൊടുക്കുന്നു.",
        "passwordreset-emailerror-capture": "താഴെക്കൊടുത്തിരിക്കുന്ന, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ സൃഷ്ടിക്കാനായെങ്കിലും, അത് {{GENDER:$2|ഉപയോക്താവിന്}} അയയ്ക്കുന്നത് പരാജയപ്പെട്ടു: $1",
        "changeemail": "ഇമെയിൽ വിലാസം മാറ്റുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
        "foreign-structured-upload-form-label-own-work-message-shared": "ഈ പ്രമാണത്തിന്റെ പകർപ്പവകാശം എനിക്ക് സ്വന്തമാണെന്നും, ഈ പ്രമാണം വിക്കിമീഡിയ കോമൺസിൽ പിന്നീട് മാറ്റാനാവത്തവിധം [https://creativecommons.org/licenses/by-sa/4.0/ ക്രിയേറ്റീവ് കോമൺസ് ആട്രിബ്യൂഷൻ-ഷെയർഎലൈക് 4.0] ഉപയോഗാനുമതിയിൽ പ്രസിദ്ധീകരിക്കാമെന്നും [https://wikimediafoundation.org/wiki/Terms_of_Use/ml ഉപയോഗനിബന്ധനകൾ] അംഗീകരിക്കുന്നുവെന്നും സാക്ഷ്യപ്പെടുത്തുന്നു.",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "ഈ പ്രമാണത്തിന്റെ പകർപ്പവകാശം താങ്കളുടെ സ്വന്തമല്ലെങ്കിൽ അഥവാ മറ്റൊരു ഉപയോഗാനുമതിയിലാണ് പ്രമാണം പ്രസിദ്ധീകരിക്കാൻ ഉദ്ദേശിക്കുന്നതെങ്കിൽ [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=ml കോമൺസിലെ അപ്‌ലോഡ് സഹായി] ഉപയോഗിക്കുന്നത് പരിഗണിക്കുക.",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "ഈ പ്രമാണം അവരുടെ നയങ്ങൾക്കനുസൃതമായി അപ്‌ലോഡ് ചെയ്യാൻ സൈറ്റ് അനുവദിക്കുമെങ്കിൽ [[Special:Upload|{{SITENAME}} സംരംഭത്തിലെ അപ്‌ലോഡ് താൾ]] പരീക്ഷിച്ചു നോക്കാവുന്നതാണ്.",
+       "foreign-structured-upload-form-2-label-intro": "{{SITENAME}} സംരംഭത്തിലേക്ക് ഒരു ചിത്രം സംഭാവന ചെയ്യുന്നതിന് നന്ദി. നിബന്ധനകൾ പാലിക്കുന്നുണ്ടോയെന്ന് പരിശോധിക്കുക:",
+       "foreign-structured-upload-form-2-label-ownwork": "ഇത് <strong>താങ്കളുടെ സ്വന്തം സൃഷ്ടി</strong> ആയിരിക്കണം, ഇന്റർനെറ്റിൽ നിന്ന് സംഘടിപ്പിച്ചത് ആയിരിക്കരുത്",
+       "foreign-structured-upload-form-2-label-noderiv": "ഇതിൽ <strong>മറ്റുള്ളവരുടെ സൃഷ്ടികൾ ഉൾപ്പെടരുത്</strong>, അവയിൽ നിന്ന് പ്രചോദിതമായി സൃഷ്ടിച്ചതും പാടില്ല",
+       "foreign-structured-upload-form-2-label-useful": "ഇത് <strong>വൈജ്ഞാനിക  മൂല്യമുള്ളതും</strong> മറ്റുള്ളവർക്ക് വിദ്യാഭ്യാസാവശ്യങ്ങൾക്ക് ഉപയോഗിക്കാനാകുന്നതുമാവണം",
+       "foreign-structured-upload-form-2-label-ccbysa": "ഇത് ഇന്റർനെറ്റിൽ  [https://creativecommons.org/licenses/by-sa/4.0/ ക്രിയേറ്റീവ് കോമൺസ് ആട്രിബ്യൂഷൻ-ഷെയർഎലൈക് 4.0] ഉപയോഗാനുമതിയിൽ <strong>എന്നെന്നേയ്ക്കുമായി പ്രസിദ്ധീകരിക്കുന്നതുമാവണം</strong>",
+       "foreign-structured-upload-form-2-label-alternative": "മുകളിൽ കൊടുത്തിരിക്കുന്നതത്രയും പാലിക്കുന്നില്ലെങ്കിലും, അതൊരു സ്വതന്ത്ര ഉപയോഗാനുമതിയിൽ ഉള്ളതാണെങ്കിൽ [https://commons.wikimedia.org/wiki/Special:UploadWizard കോമൺസിലെ അപ്‌ലോഡ് സഹായി] ഉപയോഗിച്ച് താങ്കൾക്ക് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യാൻ സാധിച്ചേക്കാം.",
+       "foreign-structured-upload-form-2-label-termsofuse": "ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യുന്നത് വഴി, ഈ പ്രമാണത്തിന്റെ പകർപ്പവകാശം താങ്കൾക്ക് സ്വന്തമാണെന്ന് താങ്കൾ സാക്ഷ്യപ്പെടുത്തുന്നുണ്ട്, അതോടൊപ്പം ഈ പ്രമാണം ഇനി മാറ്റാനാവാത്ത വിധം വിക്കിമീഡിയ കോമൺസിൽ ക്രിയേറ്റീവ് കോമൺസ് ആട്രിബ്യൂഷൻ-ഷെയർഎലൈക് 4.0 ഉപയോഗാനുമതി പ്രകാരമാണ് താങ്കൾ പ്രസിദ്ധീകരിക്കുന്നതെന്നും, [https://wikimediafoundation.org/wiki/Terms_of_Use ഉപയോഗനിബന്ധനകൾക്കും] സമ്മതിക്കുകയും ചെയ്യുന്നുണ്ട്.",
+       "foreign-structured-upload-form-3-label-question-website": "ഈ ചിത്രം ഏതെങ്കിലും വെബ്‌സൈറ്റിൽ നിന്ന് ഡൗൺലോഡ് ചെയ്തതോ, ചിത്രങ്ങൾ തിരഞ്ഞ് ലഭ്യമാക്കിയതോ ആണോ?",
+       "foreign-structured-upload-form-3-label-question-ownwork": "താങ്കൾ ഈ ചിത്രം സ്വന്തമായി (ഫോട്ടോ എടുത്ത്, ചിത്രം വരച്ച് തുടങ്ങിയ രീതികളിൽ) സൃഷ്ടിച്ചതാണോ?",
+       "foreign-structured-upload-form-3-label-question-noderiv": "ഇത് ലോഗോ പോലുള്ള മറ്റാരുടെയെങ്കിലും സൃഷ്ടി ഉൾപ്പെടുന്ന ചിത്രം ആണോ, അല്ലെങ്കിൽ അതിൽ നിന്ന് പ്രചോദനം ഉൾക്കൊണ്ട് സൃഷ്ടിച്ചതാണോ?",
+       "foreign-structured-upload-form-3-label-yes": "അതെ",
+       "foreign-structured-upload-form-3-label-no": "അല്ല",
+       "foreign-structured-upload-form-3-label-alternative": "അങ്ങനെയെങ്കിൽ നിർഭാഗ്യവശാൽ, ഈ ഉപകരണം ഉപയോഗിച്ച് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യുന്നത് പിന്തുണയ്ക്കാനാവില്ല. അതൊരു സ്വതന്ത്ര ഉപയോഗാനുമതിയിൽ ഉള്ളതാണെങ്കിൽ [https://commons.wikimedia.org/wiki/Special:UploadWizard കോമൺസിലെ അപ്‌ലോഡ് സഹായി] ഉപയോഗിച്ച് താങ്കൾക്ക് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യാൻ സാധിച്ചേക്കാം.",
+       "foreign-structured-upload-form-4-label-good": "ഈ ഉപകരണം ഉപയോഗിച്ച്, മറ്റുള്ളവരുടെ സൃഷ്ടികൾ ഉൾപ്പെടാത്ത, വിദ്യാഭ്യാസ ആവശ്യങ്ങൾക്ക് താങ്കൾ സൃഷ്ടിച്ച പടങ്ങളോ, താങ്കൾ എടുത്ത ഫോട്ടോഗ്രാഫുകളോ താങ്കൾക്ക് അപ്‌ലോഡ് ചെയ്യാവുന്നതാണ്.",
+       "foreign-structured-upload-form-4-label-bad": "സേർച്ച് എഞ്ചിനിൽ നിന്ന ലഭിച്ച അല്ലെങ്കിൽ മറ്റ് വെബ്‌സൈറ്റുകളിൽ നിന്ന് അപ്‌ലോഡ് ചെയ്ത ചിത്രങ്ങൾ അപ്‌ലോഡ് ചെയ്യാൻ കഴിയില്ല.",
        "backend-fail-stream": "$1 എന്ന പ്രമാണം സ്ട്രീം ചെയ്യാൻ കഴിഞ്ഞില്ല.",
        "backend-fail-backup": "$1 എന്ന പ്രമാണത്തിന്റെ ബാക്ക്അപ് എടുക്കാൻ കഴിഞ്ഞില്ല.",
        "backend-fail-notexists": "$1 എന്ന പ്രമാണം നിലവിലില്ല.",
index 958abe2..a68a15e 100644 (file)
        "passwordreset-emailtext-ip": "कुणीतरी (कदाचित तुम्ही, अंकपत्ता $1 वरुन) {{SITENAME}}($4) करिता नविन 'परवलीचा शब्द' पुनर्स्थापनेबद्दल विनंती केली आहे.\nखालील{{PLURAL:$3|सदस्यखाते}}या विपत्रपत्त्याशी निगडीत आहे: \n\"$2\"\n{{PLURAL:$3|हा तात्पुरता परवलीचा शब्द|हे तात्पुरते परवलीचे शब्द}}{{PLURAL:$5|एक दिवस|$5 दिवसात}} मुदतबाह्य होतील.आता आपण लॉग-ईन करून  नविन परवलीचा शब्द निवडा.जर ईतर कोणी ही विनंती केली असेल,किंवा जर आपणास परवलीच शब्द आठवला असेल तर,व जर आपण तो बदलु इच्छित नसाल तर आपण हा संदेश टाळा व आपला जुना परवलीचा शब्द वापरणे सुरू ठेवा.",
        "passwordreset-emailtext-user": " {{SITENAME}}वरील सदस्य $1ने {{SITENAME}}($4) करिता नविन 'परवलीचा शब्द' पुनर्स्थापनेबद्दल विनंती केली आहे.\nखालील{{PLURAL:$3|सदस्यखाते}}या विपत्रपत्त्याशी निगडीत आहे: \n\n\"$2\"\n\n{{PLURAL:$3|हा तात्पुरता परवलीचा शब्द|हे तात्पुरते परवलीचे शब्द}}{{PLURAL:$5|एक दिवस|$5 दिवसात}} मुदतबाह्य होतील.आता आपण लॉग-ईन करून  नविन परवलीचा शब्द निवडा.जर ईतर कोणी ही विनंती केली असेल,किंवा जर आपणास परवलीच शब्द आठवला असेल तर,व, जर आपण तो बदलु इच्छित नसाल तर आपण हा संदेश टाळा व आपला जुना परवलीचा शब्द वापरणे सुरू ठेवा.",
        "passwordreset-emailelement": "सदस्यनाव: \n$1\n\nअस्थायी परवलीचा शब्द: \n$2",
-       "passwordreset-emailsentemail": "à¤\9cर à¤¹à¤¾ à¤\86पलà¥\8dया à¤\96ातà¥\8dयाà¤\9aा à¤¨à¥\8bà¤\82दणिà¤\95à¥\83त à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता असेल तर, परवलीच्या शब्दाच्या पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात येईल.",
-       "passwordreset-emailsentusername": "à¤\9cर à¤¤à¤¦à¤¨à¥\81रà¥\82प à¤¨à¥\8bà¤\82दà¥\80à¤\95à¥\83त à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता à¤\85सà¥\87ल à¤¤à¤°, à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤ªà¥\81नरà¥\8dसà¥\8dथापन विपत्र पाठविल्या जाईल.",
+       "passwordreset-emailsentemail": "à¤\9cर à¤¹à¤¾ à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता à¤\86पलà¥\8dया à¤\96ातà¥\8dयाशà¥\80 à¤¸à¤\82लà¤\97à¥\8dन असेल तर, परवलीच्या शब्दाच्या पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात येईल.",
+       "passwordreset-emailsentusername": "à¤\9cर à¤¯à¤¾ à¤¸à¤¦à¤¸à¥\8dयनावाशà¥\80 à¤¸à¤\82लà¤\97à¥\8dन à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता à¤\85सà¥\87ल à¤¤à¤°, à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤ªà¥\81नरà¥\8dसà¥\8dथापनाबाबत विपत्र पाठविल्या जाईल.",
        "passwordreset-emailsent-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात आले आहे जे खाली दर्शविण्यात आले आहे.",
        "passwordreset-emailerror-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र निर्माण करण्यात आले, जे खाली दर्शविण्यात आले आहे.परंतु,{{GENDER:$2|सदस्य}}ला पाठविणे असफल झाले: $1",
        "changeemail": "विपत्रपत्ता बदला किंवा हटवा",
        "pagelang-language": "भाषा",
        "pagelang-use-default": "अविचल भाषा वापरा",
        "pagelang-select-lang": "भाषा निवडा",
+       "pagelang-submit": "सादर करा",
        "right-pagelang": "पानाची भाषा बदला",
        "action-pagelang": "पानाची असलेली भाषा बदला",
        "log-name-pagelang": "भाषा बदल नोंदवही",
        "mediastatistics-table-totalbytes": "एकत्रित आकार",
        "mediastatistics-header-unknown": "अनोळखी",
        "mediastatistics-header-office": "कार्यालय",
+       "mediastatistics-header-total": "सर्व संचिका",
        "json-error-syntax": "वाक्यरचना त्रुटी",
        "headline-anchor-title": "या विभागाचा दुवा",
        "special-characters-group-latin": "लॅटीन",
index 8d21fde..419cd72 100644 (file)
        "createaccount-title": "Cuentah ītlachīhualiz ic {{SITENAME}}",
        "loginlanguagelabel": "Tlahtōlli: $1",
        "pt-login": "Xicalaqui",
+       "pt-login-button": "Xicalaqui",
        "pt-createaccount": "Xicchīhua motlapōhual",
        "changepassword": "Xicpatla motlahtōlichtacāyo",
        "resetpass_header": "Xicpatla motlahtōlichtacāyo",
        "rcshowhideminor": "$1 tlapatlalitzintli",
        "rcshowhideminor-show": "Ticnēxtīz",
        "rcshowhidebots": "$1 tepoztlācah",
+       "rcshowhidebots-show": "Xicnēxti",
        "rcshowhidebots-hide": "Tiquihyānaz",
        "rcshowhideliu": "$1 tēmachiyōmacalli tlatequitiltilīltin",
        "rcshowhideanons": "$1 ahtōcā tlatequitiltilīlli",
        "linksearch-ok": "Tictēmōz",
        "linksearch-line": "$1 tzonhuīlo īxquichca $2",
        "listusers-submit": "Tiquittāz",
+       "activeusers-submit": "Xiquitta",
        "listgrouprights-group": "Olōlli",
        "listgrouprights-rights": "Huelītiliztli",
        "emailuser": "Tiquēhualtlīz maltzinteyōtl netitlaniztli inīn tlatequitiltilīlli",
        "rollback-success": "Ōmotlacuep $1 ītlahcuilōl; āxcān achto $2 ītlahcuilōl.",
        "changecontentmodel-title-label": "Tlaīxtōcāitl",
        "changecontentmodel-reason-label": "Tleīpampa:",
+       "protectlogpage": "Tlapiyaliztlīlmachiyōtīlli",
        "protectedarticle": "ōmoquīxti \"[[$1]]\"",
        "unprotectedarticle": "ōahmoquīxtih «[[$1]]»",
        "prot_1movedto2": "[[$1]] ōmozacac īhuīc [[$2]]",
        "movelogpage": "Tlazacaliztli tlahcuilōlloh",
        "movereason": "Īxtlamatiliztli:",
        "revertmove": "tlacuepāz",
-       "delete_and_move": "Ticpolōz auh ticzacāz",
        "delete_and_move_confirm": "Quēmah, ticpolōz in zāzanilli",
        "immobile-source-namespace": "Ahmo huelīti mozaca zāzanilli tōcātzimpan \"$1\"",
        "immobile-target-namespace": "Ahmo huelīti mozaca zāzanilli tōcātzinhuīc \"$1\"",
        "exif-imagedescription": "Īxiptli ītōcā",
        "exif-software": "Software ōmotēquitilti",
        "exif-artist": "Chīhualōni",
+       "exif-exifversion": "Exif-cuepaliztli",
        "exif-usercomment": "Quihtoa tlatequitiltilīlli",
        "exif-exposuretime": "Cāuhcāyōtl",
        "exif-fnumber": "F Tlapōhualli",
index 4607026..6548aa4 100644 (file)
        "morenotlisted": "यो सूची पूर्ण हैन।",
        "mypage": "पृष्ठ",
        "mytalk": "वार्ता",
-       "anontalk": "यस IP à¤\95à¥\8b à¤µà¤¾à¤°à¥\87मा à¤µà¤¾à¤°à¥\8dतालाप à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d",
+       "anontalk": "वारà¥\8dता",
        "navigation": "अन्वेषण",
        "and": "&#32;र",
        "qbfind": "पत्ता लगाउनु",
        "laggedslavemode": "<strong>चेतावनी:</strong> पृष्ठमा हालका अद्यतनहरू नहुनसक्छन् ।",
        "readonly": "डेटाबेस बन्द गरिएको छ",
        "enterlockreason": "ताल्चा मार्नुको कारण दिनुहोस्, साथै ताल्चा हटाउने समयको अवधि अनुमान लगाउनुहोस्।",
-       "readonlytext": "समà¥\8dभवतà¤\83 à¤¨à¤¿à¤¯à¤®à¤¿à¤¤ à¤¡à¥\87à¤\9fाबà¥\87स à¤°à¤\96-रà¤\96ाà¤\89à¤\95à¥\8b à¤\95ारण à¤\85हिलà¥\87लाà¤\88 à¤¨à¤¯à¤¾à¤\81 à¤¡à¥\87à¤\9fाबà¥\87स à¤ªà¥\8dरविषà¥\8dà¤\9fà¥\80 à¤° à¤\85नà¥\8dय à¤¸à¤\82शà¥\8bधनहरà¥\82  à¤¬à¤¨à¥\8dद à¤°à¤¾à¤\96िà¤\8fà¤\95à¥\8bà¤\9b,, à¤\9cसलाà¤\88 à¤ªà¤\9bिबाà¤\9f à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\97रिनà¥\87à¤\9b। \nपà¥\8dरबनà¥\8dधà¤\95 à¤\9cसलà¥\87 à¤¯à¥\8b à¤¬à¤¨à¥\8dद à¤\97रà¥\87à¤\95ाà¤\9bनà¥\8d, à¤¯à¥\8b à¤¸à¥\8dपषà¥\8dà¤\9fà¥\80à¤\95रण à¤¦à¤¿à¤\8fà¤\95ाछन्: $1",
+       "readonlytext": "समà¥\8dभवतà¤\83 à¤¨à¤¿à¤¯à¤®à¤¿à¤¤ à¤¡à¥\87à¤\9fाबà¥\87स à¤°à¥\87à¤\96दà¥\87à¤\96à¤\95à¥\8b à¤\95ारण à¤\85हिलà¥\87लाà¤\88 à¤¨à¤¯à¤¾à¤\81 à¤¡à¥\87à¤\9fाबà¥\87स à¤ªà¥\8dरविषà¥\8dà¤\9fà¥\80 à¤° à¤\85नà¥\8dय à¤¸à¤\82शà¥\8bधनहरà¥\82 à¤¬à¤¨à¥\8dद à¤°à¤¾à¤\96िà¤\8fà¤\95à¥\8b à¤\9b, à¤\9cसलाà¤\88 à¤ªà¤\9bिबाà¤\9f à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\97रिनà¥\87à¤\9b। \nपà¥\8dरबनà¥\8dधà¤\95 à¤\9cसलà¥\87 à¤¯à¥\8b à¤¬à¤¨à¥\8dद à¤\97रà¥\87à¤\95ा à¤\9bनà¥\8d, à¤¯à¥\8b à¤¸à¥\8dपषà¥\8dà¤\9fà¥\80à¤\95रण à¤¦à¤¿à¤\8fà¤\95ा छन्: $1",
        "missing-article": "नाम \"$1\" $2 भएको भेटिनु पर्ने पृष्ठको पाठ डेटाबेसले  भेटाइएन, \n\nयस्तो प्राय: मिति नाघिसकेको भिन्न वा इतिहास वा कुनै मेटिसकेको पानाको लिंक पहिल्याउनाले हुन्छ ।\n\nयदि यस्तो भएको होइन भने सफ्टवेयरको त्रुटि पनि हुनसक्छ ।\nकृपया यसको url खुलाइ [[Special:ListUsers/sysop|प्रबन्धक]]लाई उजुरी गर्नुहोस्",
        "missingarticle-rev": "(संशोधन #: $1)",
        "missingarticle-diff": "(परि: $1, $2)",
        "watchlist-submit": "देखाउनुहोस्",
        "wlshowhideminor": "सामान्य सम्पादनहरू",
        "wlshowhidebots": "बोटहरू",
+       "wlshowhideliu": "दर्ता गरिएका प्रयोगकर्ताहरू",
+       "wlshowhideanons": "अज्ञात प्रयोगकर्ताहरू",
+       "wlshowhidepatr": "गस्ती गरिएका सम्पादनहरू",
+       "wlshowhidemine": "मेरा सम्पादनहरू",
+       "wlshowhidecategorization": "पृष्ठ श्रेणीकरण",
        "watchlist-options": "निगरानि सूची विकल्प",
        "watching": "निगरानी गर्दै...",
        "unwatching": "निगरानीबाट हटाउँदै...",
index 3ada542..7075c2d 100644 (file)
        "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1) pediu a recuperação da palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
        "passwordreset-emailtext-user": "O utilizador $1 do projeto {{SITENAME}} pediu a recuperação da sua palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este endereço de correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
        "passwordreset-emailelement": "{{GENDER:$1|Utilizador|Utilizadora}}: \n$1\n\nPalavra-passe temporária: \n$2",
-       "passwordreset-emailsentemail": "Se este é o endereço de correio eletrónico registado para a sua conta, então ser-lhe-à enviada uma palavra-passe de reposição.",
+       "passwordreset-emailsentemail": "Se este é o endereço de correio eletrónico associado a esta conta, ser-lhe-á enviada uma palavra-passe de reposição.",
+       "passwordreset-emailsentusername": "Se houver um endereço de correio eletrónico associado a esta conta, ser-lhe-á enviada uma mensagem para redefinir a sua palavra-passe.",
        "passwordreset-emailsent-capture": "Foi enviado um correio eletrónico para recuperação da palavra-passe, que é mostrado abaixo.",
        "passwordreset-emailerror-capture": "Foi gerado um correio eletrónico para redefinição da palavra-passe, mostrado abaixo, mas o seu envio para {{GENDER:$2|o utilizador|a utilizadora}} falhou: $1",
        "changeemail": "Alterar ou remover o endereço de correio eletrónico",
        "logentry-merge-merge": "$1 {{GENDER:$2|fundiu}} $3 com $4 (edições até $5)",
        "logentry-move-move": "$1 moveu a página $3 para $4",
        "logentry-move-move-noredirect": "$1 moveu a página $3 para $4 sem deixar um redirecionamento",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|moveu}} a página $3 para seu redirecionamento $4",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} a página $3 para seu redirecionamento $4 suprimindo o primeiro",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|moveu}} a página $3 para seu redirecionamento $4",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} a página $3 para o seu redirecionamento $4, suprimindo o primeiro",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|marcou}} a revisão $4 da página $3 como patrulhada",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcou}} automaticamente a revisão $4 da página $3 como patrulhada",
        "logentry-newusers-newusers": "A conta de utilizador $1 foi {{GENDER:$2|criada}}",
index 87470bf..0d02549 100644 (file)
        "mediastatistics-summary": "Used to explain that this page only does statistics over current versions of files. \"Old\" versions of files and deleted files are not counted.",
        "mediastatistics-nfiles": "{{optional}}\nEntry in table on [[Special:MediaStatistics]] that gives total number of files. $1 - number of files. $2 - percentage of total files that is this type (percent will be formatted to have about 3 interesting digits. e.g. 0.121 or 10.2)",
        "mediastatistics-nbytes": "Combined space of this type of file. Bytes and \"human units\" are shown so that users can better get a sense of magnitude when making comparisons.\n*$1 - total space in bytes.\n*$2 - total space in \"human units\" (i.e. KB, MB, GB, etc)\n*$3 - What percentage of the space all uploads take up does this file take up.",
-       "mediastatistics-bytespertype": "Combined space of one section of [[Special:MediaStatistics]]. \n*$1 - total space in bytes",
-       "mediastatistics-allbytes": "Combined space of all uploaded files. \n*$1 - total space in bytes",
+       "mediastatistics-bytespertype": "Combined space of one section of [[Special:MediaStatistics]]. \n*$1 - total space in bytes\n*$2 - total space in \"human units\" (i.e. KB, MB, GB, etc)\n*$3 - What percentage of the space all uploads take up does this file take up.",
+       "mediastatistics-allbytes": "Combined space of all uploaded files. \n*$1 - total space in bytes\n*$2 - total space in \"human units\" (i.e. KB, MB, GB, etc)",
        "mediastatistics-table-mimetype": "Header for table on Special:MediaStatistics. Column that lists MIME types (The values in this column will look like 'image/jpeg', and be linked to Special:MIMESearch).",
        "mediastatistics-table-extensions": "Header for column in tables on [[Special:MediaStatistics]] that lists possible extensions for a given file type. (The values in this column will be a comma separated list of file extensions, such as '.webm' or '.png, .apng').",
        "mediastatistics-table-count": "Column header on Special:MediaStatistics for the number of files column. The headers in this column use {{msg-mw|mediastatistics-nfiles}}.",
index c0cb0a8..cab7cf2 100644 (file)
@@ -11,7 +11,8 @@
                        "Davent",
                        "아라",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Translaziuns"
                ]
        },
        "tog-underline": "Suttastritgar colliaziuns:",
        "createaccountreason": "Motiv:",
        "createacct-reason": "Motiv",
        "createacct-reason-ph": "Tes motiv per crear in auter conto",
-       "createacct-captcha": "Controlla da segirezza",
-       "createacct-imgcaptcha-ph": "Endatescha il text che vesas survart",
        "createacct-submit": "Crear tes conto",
        "createacct-another-submit": "Crear in auter conto",
        "createacct-benefit-heading": "{{SITENAME}} exista grazia a persunas sco ti.",
        "passwordreset-emailtext-ip": "Insatgi (probablamain ti, da l'adressa IP $1) ha dumandà da redefinir il pled-clav per la pagina {{SITENAME}} ($4). \n{{PLURAL:$3|Il suandant conto d'utilisader è collià|Ils suandants contos d'utilisader èn colliads}} cun questa adressa d'e-mail:\n\n$2\n\n{{PLURAL:$3|Quest pled-clav temporar|Quests pleds-clav temporars}} èn valids {{PLURAL:$5|in di|$5 dis}}.\nTi duessas t'annunziar ussa e tscherner in nov pled-clav. Sch'enzatgi auter ha empustà quests novs pleds-clav u sche ti ta regordas puspè da tes pled-clav original e na vuls betg pli midar el, pos ti ignorar quest messadi e cuntinuar d'utilisar tes pled-clav original.",
        "passwordreset-emailtext-user": "L'utilisader $1 sin {{SITENAME}} ha dumandà da redefinir il pled-clav per {{SITENAME}} ($4). \n{{PLURAL:$3|Il suandant conto d'utilisader è collià|Ils suandants contos d'utilisader èn colliads}} cun questa adressa dad e-mail:\n\n$2\n\n{{PLURAL:$3|Quest pled-clav temporar|Quests pled-clav temporars}} èn valids {{PLURAL:$5|in di|$5 dis}}.\nTi duessas t'annunziar ussa e tscherner in nov pled-clav. Sche ti na levas betg quests novs pleds-clav u sche ti ta regordas puspè da tes pled-clav original e na vuls betg pli midar il pled-clav pos ti ignorar quest messadi e cuntinuar dad utilisar tes pled-clav original.",
        "passwordreset-emailelement": "Num d'utilisader: \n$1\n\nPled-clav temporar: \n$2",
-       "passwordreset-emailsent": "In e-mail per redefinir il pled-clav è vegnì tramess.",
+       "passwordreset-emailsentemail": "In e-mail per redefinir il pled-clav è vegnì tramess.",
        "passwordreset-emailsent-capture": "In e-mail (sco mussà sutvart) per redefinir il pled-clav è vegnì tramess.",
        "passwordreset-emailerror-capture": "In e-mail (sco mussà sutvart) per redefinir il pled-clav è vegnì generà ma n'ha betg pudì envià a l'{{GENDER:$2|utilisader|utilisadra}}: $1",
        "changeemail": "Midar l'adressa dad e-mail",
        "prefs-displayrc": "Opziuns da visualisar",
        "prefs-displaywatchlist": "Opziuns da visualisar",
        "prefs-diffs": "Cumparegliaziun da versiuns",
-       "email-address-validity-valid": "L'adressa da e-mail para dad esser valida",
-       "email-address-validity-invalid": "Endatescha ina adressa dad e-mail valida",
        "userrights": "Administraziun da dretgs d'utilisaders",
        "userrights-lookup-user": "Administrar gruppas d'utilisaders",
        "userrights-user-editname": "Inditgescha in num d'utilisader:",
        "wlheader-showupdated": "Paginas ch'èn vegnidas modifitgadas suenter che ti has vis els la davosa giada èn mussads '''grass'''",
        "wlnote": "Sutvart {{PLURAL:$1|è l'ultima midada|èn las ultimas '''$1''' midadas}} entaifer {{PLURAL:$2|l'ultima ura|las ultimas '''$2''' uras}}. Actualisà ils $3 las $4.",
        "wlshowlast": "Mussar: las ultimas $1 uras, ils ultims $2 dis u .",
+       "watchlistall2": "tut",
        "watchlist-options": "Opziuns per la glista d'observaziun",
        "watching": "observ...",
        "unwatching": "observ betg pli...",
        "movenosubpage": "Questa pagina n'ha naginas sutpaginas.",
        "movereason": "Motiv:",
        "revertmove": "spustar anavos",
-       "delete_and_move": "Stizzar e spustar",
        "delete_and_move_text": "==Stizzar necessari==\n\nL'artitgel da destinaziun \"[[:$1]]\" exista gia. Vul ti stizzar el per far plaz per spustar?",
        "delete_and_move_confirm": "Gea, stizzar il artitgel da destinaziun per spustar",
        "delete_and_move_reason": "Stizzà per far plaz per spustar da \"[[$1]]\"",
        "api-error-filetype-banned-type": "$1 {{PLURAL:$4|n'è betg in tip da datoteca lubì|n'èn betg tips da datoteca lubids}}. Lubidas èn datotecas {{PLURAL:$3|dal tip|dals tips}} $2.",
        "api-error-filetype-missing": "Il num da datoteca n'ha betg ina finiziun da datoteca.",
        "api-error-hookaborted": "La midada che ti has empruvà da far è vegnida interrutta dad ina extensiun.",
-       "api-error-http": "Errur interna: Betg pussaivel da connectar cun il server.",
+       "api-error-http": "Errur interna: Impussibel da connectar cun il server.",
        "api-error-illegal-filename": "Il num da datoteca n'è betg lubì.",
        "api-error-internal-error": "Errur interna: Insatge n'ha betg funcziunà durant transmetter tia datoteca en la vichi.",
        "api-error-invalid-file-key": "Errur interna: La datoteca n'è betg vegnida chattada en la memoria temporara.",
index 2730515..abbea4e 100644 (file)
        "search-interwiki-caption": "Dokterėnē pruojektā",
        "search-interwiki-default": "Soėiškuota nug $1ː",
        "search-interwiki-more": "(daugiau)",
-       "search-relatedarticle": "Sosėjėn",
-       "searchrelated": "sosėjėn",
+       "search-relatedarticle": "Sosėjė̄",
+       "searchrelated": "sosėjė̄",
        "searchall": "vėsė",
        "showingresults": "Žemiau ruodoma lėgė '''$1''' {{PLURAL:$1|rezoltata|rezoltatu|rezoltatu}} pradedont #'''$2'''.",
        "showingresultsinrange": "Apatiuo ruod lėgė {{PLURAL:$1|<strong>1</strong> gavėnė|<strong>$1</strong> gavėniū}} nug #<strong>$2</strong> lėgė #<strong>$3</strong>.",
        "sp-contributions-toponly": "Ruodītė tėktās paskiausius keitėmus",
        "sp-contributions-newonly": "Ruodītė tėktās tūs keitėmus, katrās padėrbtė straipsnē",
        "sp-contributions-submit": "Ėiškuotė",
-       "whatlinkshere": "Sosėjėn straipsnē",
+       "whatlinkshere": "Sosėjė̄ straipsnē",
        "whatlinkshere-title": "Poslapē, katrėi ruod i \"$1\"",
        "whatlinkshere-page": "Poslapis:",
        "linkshere": "Anėi poslapē ruod i '''[[:$1]]''':",
        "logentry-delete-delete": "$1 ėštrīnė poslapi $3",
        "logentry-delete-restore": "$1 atkūrė poslapi $3",
        "revdelete-content-hid": "torėnīs pakavuots",
-       "logentry-block-block": "ožgīnė „[[$1]]“ nug dėrbėma, tas vēk ton čiesa - $2 $3",
+       "logentry-block-block": "$1 {{GENDER:$2|ožgīnė}} {{GENDER:$4|$3}} nug dėrbėma, tas vēk ton čiesa - $5 $6",
        "logentry-move-move": "$1 {{GENDER:$2|parvadėna}} poslapi $3 i $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|parvadėna}} poslapi nug $3 i $4 nepalinkdoms nusokėma",
        "logentry-move-move_redir": "$1 {{GENDER:$2|parvadėna}} poslapi nog $3 i $4 ont bovosė nusokėma",
index c13da45..a7a2bcf 100644 (file)
        "passwordreset-emailtext-ip": "Nekdo (verjetno vi, z IP-naslova $1) je zahteval ponastavitev vašega\ngesla na {{SITENAME}} ($4). S tem e-poštnim naslovom\n{{PLURAL:$3|je povezan naslednji uporabniški račun|sta povezana naslednja uporabniška računa|so povezani naslednji uporabniški računi}}:\n\n$2\n\n{{PLURAL:$3|Začasno geslo bo poteklo|Začasni gesli bosta potekli|Začasna gesla bodo potekla}} v {{PLURAL:$5|enem dnevu|$5 dneh}}.\nPrijavite se in izberite novo geslo. Če je zahtevo podal\nnekdo drug ali pa ste se spomnili svojega prvotnega gesla in ga več\nne želite spremeniti, lahko to sporočilo prezrete in nadaljujete z uporabo\nsvojega starega gesla.",
        "passwordreset-emailtext-user": "Uporabnik $1 na strani {{SITENAME}} je zahteval ponastavitev vašega gesla na {{SITENAME}}\n($4). S tem e-poštnim naslovom {{PLURAL:$3|je povezan naslednji uporabniški račun|sta povezana naslednja uporabniška računa|so povezani naslednji uporabniški računi}}:\n\n$2\n\n{{PLURAL:$3|Začasno geslo bo poteklo|Začasni gesli bosta potekli|Začasna gesla bodo potekla}} v {{PLURAL:$5|enem dnevu|$5 dneh}}.\nPrijavite se in izberite novo geslo sedaj. Če je zahtevo podal\nnekdo drug ali pa ste se spomnili svojega prvotnega gesla in ga več\nne želite spremeniti, lahko to sporočilo prezrete in nadaljujete z uporabo\nsvojega starega gesla.",
        "passwordreset-emailelement": "Uporabniško ime: \n$1\n\nZačasno geslo: \n$2",
-       "passwordreset-emailsentemail": "Če je to registriran e-poštni naslov za vaš račun, vam bomo poslali e-pošto za postavitev gesla.",
-       "passwordreset-emailsentusername": "Če obstaja pripadajoč registriran e-poštni naslov, vam bomo poslali e-pošto za postavitev gesla.",
+       "passwordreset-emailsentemail": "Če je e-poštni naslov povezan z vašim računom, vam bomo poslali e-pošto za postavitev gesla.",
+       "passwordreset-emailsentusername": "Če obstaja e-poštni naslov, povezan s tem uporabniškim imenom, vam bomo poslali e-pošto za postavitev gesla.",
        "passwordreset-emailsent-capture": "Poslali smo e-pošto za ponastavitev gesla, ki je prikazana spodaj.",
        "passwordreset-emailerror-capture": "Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje {{GENDER:$2|uporabniku|uporabnici}} ni uspelo: $1",
        "changeemail": "Sprememba ali odstranitev e-poštnega naslova",
index 74602f9..5fe178e 100644 (file)
        "pagelang-name": "Страница",
        "pagelang-language": "Језик",
        "pagelang-select-lang": "Изабери језик",
+       "pagelang-submit": "Пошаљи",
        "right-pagelang": "мењање језика странице",
        "action-pagelang": "промену језика странице",
        "logentry-pagelang-pagelang": "$1 је {{GENDER:$2|променио|променила}} језик странице $3 из $4 у $5.",
index c0eaef3..fb26815 100644 (file)
        "hidden-categories": "{{PLURAL:$1|1=Яшерен төркем|Яшерен төркемнәр}}",
        "hidden-category-category": "Яшерен төркемнәр",
        "category-subcat-count": "{{PLURAL:$2|1=Әлеге төркем бары тик бу астөркемне генә үз өченә ала.|Әлеге төркемдә $2 астөркемдән бары тик $1 {{PLURAL:$1|астөркем}} генә күрсәтелгән.}}",
-       "category-subcat-count-limited": "Бу төркемдә {{PLURAL:$1|$1 төркемчә}} бар.",
+       "category-subcat-count-limited": "Бу төркемдә {{PLURAL:$1|$1 төркемчә}}.",
        "category-article-count": "{{PLURAL:$2|1=Әлеге төркемдә бер генә бит бар.|Әлеге төркемнең $2 {{PLURAL:$2|битеннән}} {{PLURAL:$1|$1 бит}} кенә курсәтелгән.}}",
-       "category-article-count-limited": "Бу төркемдә {{PLURAL:$1|$1 бит}} бар.",
+       "category-article-count-limited": "Бу төркемдә {{PLURAL:$1|$1 бит|1=бары тик бер бит}}.",
        "category-file-count": "{{PLURAL:$2|1=Әлеге төркемдә бер генә файл бар.|Әлеге төркемдә $2 {{PLURAL:$2|файлдан}} {{PLURAL:$1|$1 файл}} гына курсәтелгән.}}",
-       "category-file-count-limited": "Бу төркемдә {{PLURAL:$1|$1 файл}} бар.",
+       "category-file-count-limited": "Бу төркемдә {{PLURAL:$1|$1 файл|1=бары тик бер файл}}.",
        "listingcontinuesabbrev": "дәвамы",
        "index-category": "Индексланган битләр",
        "noindex-category": "Индексланмаган битләр",
index f1b0541..62d4875 100644 (file)
@@ -90,8 +90,8 @@
        "tog-enotifminoredits": "Надсилати мені електронного листа навіть при незначних редагуваннях сторінок та файлів",
        "tog-enotifrevealaddr": "Показувати мою поштову адресу в повідомленнях",
        "tog-shownumberswatching": "Показувати число користувачів, які додали сторінку до свого списку спостереження",
-       "tog-oldsig": "Ð\86Ñ\81нÑ\83Ñ\8eÑ\87ий підпис:",
-       "tog-fancysig": "Сприймати підпис як вікі-текст (без автоматичного посилання)",
+       "tog-oldsig": "Ð\9fоÑ\82оÑ\87ний підпис:",
+       "tog-fancysig": "Сприймати підпис як вікітекст (без автоматичного посилання)",
        "tog-uselivepreview": "Використовувати швидкий попередній перегляд",
        "tog-forceeditsummary": "Попереджати, коли не зазначений короткий опис редагування",
        "tog-watchlisthideown": "Приховати мої редагування у списку спостереження",
        "throttled-mailpassword": "Листа для оновлення пароля вже було надіслано електронною поштою протягом {{PLURAL:$1|1=останньої години|останніх $1 годин}}.\nДля попередження зловживань дозволено надсилати тільки одного листа оновлення пароля за {{PLURAL:$1|годину|$1 години|$1 годин}}.",
        "mailerror": "Помилка надсилання пошти: $1",
        "acct_creation_throttle_hit": "Відвідувачі з вашої IP-адреси вже створили $1 {{PLURAL:$1|обліковий запис|облікових записи|облікових записів}} за останню добу, що є максимумом для цього відрізка часу.\nТаким чином, користувачі з цієї IP-адреси не можуть на цей момент створювати нових облікових записів.",
-       "emailauthenticated": "Вашу адресу електронної пошти було підтверджено на  $2  о  $3.",
+       "emailauthenticated": "Вашу адресу електронної пошти було підтверджено $2  о  $3.",
        "emailnotauthenticated": "Адресу вашої електронної пошти ще не підтверджено. Надсилання листів неможливе у жодній з наступних опцій.",
        "noemailprefs": "Вкажіть адресу електронної пошти, щоб уможливити наступні поштові функції вікі.",
        "emailconfirmlink": "Підтвердіть адресу вашої електронної пошти",
        "prefs-custom-js": "Власний JS",
        "prefs-common-css-js": "CSS/JS спільні для всіх тем оформлення:",
        "prefs-reset-intro": "Ця сторінка може бути використана для зміни ваших налаштувань на стандартні.\nПісля виконання цієї дії ви не зможете відкотити зміни.",
-       "prefs-emailconfirm-label": "Ð\9fÑ\96дÑ\82веÑ\80дженнÑ\8f ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\97 Ð¿Ð¾Ñ\88Ñ\82и:",
+       "prefs-emailconfirm-label": "Ð\9fÑ\96дÑ\82веÑ\80дженнÑ\8f Ð°Ð´Ñ\80еÑ\81и:",
        "youremail": "Адреса електронної пошти:",
        "username": "{{GENDER:$1|Ім'я користувача|Ім'я користувачки}}:",
        "prefs-memberingroups": "{{GENDER:$2|Член}} {{PLURAL:$1|1=групи|груп}}:",
        "yourvariant": "Варіант мови вмісту:",
        "prefs-help-variant": "Бажана мова сторінок та інтерфейсу цього вікіпроекту.",
        "yournick": "Підпис:",
-       "prefs-help-signature": "Репліки на сторінках обговорення слід підписувати символами \"<nowiki>~~~~</nowiki>\", які будуть перетворені у ваш підпис і час.",
+       "prefs-help-signature": "Репліки на сторінках обговорення слід підписувати символами «<nowiki>~~~~</nowiki>», які будуть перетворені у Ваш підпис і час.",
        "badsig": "Неправильний підпис.\nПеревірте коректність HTML-тегів.",
        "badsiglength": "Ваш підпис дуже довгий.\nПовинно бути не більше $1 {{PLURAL:$1|символу|символів|символів}}.",
        "yourgender": "Стать:",
        "gender-unknown": "Згадуючи Вас, програмне забезпечення використовуватиме по змозі гендерно нейтральні слова",
        "gender-male": "Чоловіча",
        "gender-female": "Жіноча",
-       "prefs-help-gender": "Задання цього параметру — необов'язкове. Застосовується рушієм у тих звертаннях до користувача, які залежать від статі.\nЦя інформація загальнодоступна.",
+       "prefs-help-gender": "Задання цього параметра — необов'язкове. Застосовується рушієм у тих звертаннях до користувача, які залежать від статі.\nЦя інформація загальнодоступна.",
        "email": "Електронна пошта",
        "prefs-help-realname": "Справжнє ім'я вказувати необов'язково.\nЯкщо ви його зазначите, то саме з ним може бути пов'язаний увесь ваш доробок.",
-       "prefs-help-email": "Ð\90дÑ\80еÑ\81а ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\97 Ð¿Ð¾Ñ\88Ñ\82и Ð½Ðµ Ñ\94 Ð¾Ð±Ð¾Ð²'Ñ\8fзковоÑ\8e, Ð°Ð»Ðµ Ð½ÐµÐ¾Ð±Ñ\85Ñ\96дна Ð´Ð»Ñ\8f Ñ\81киданнÑ\8f Ð¿Ð°Ñ\80олÑ\8f, Ñ\8fкÑ\89о Ð²и його забудете.",
-       "prefs-help-email-others": "Також Ð²Ð¾Ð½Ð° Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ\82Ñ\8c Ñ\96нÑ\88им ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87ам Ð·Ð²'Ñ\8fзаÑ\82иÑ\81Ñ\8f Ð· Ð²Ð°Ð¼Ð¸ Ñ\87еÑ\80ез Ð²Ð°Ñ\88Ñ\83 Ð¾Ñ\81обиÑ\81Ñ\82Ñ\83 Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83 Ð±ÐµÐ· Ð½ÐµÐ¾Ð±Ñ\85Ñ\96дноÑ\81Ñ\82Ñ\96 Ñ\80озкÑ\80иÑ\82Ñ\82Ñ\8f Ð²Ð°Ñ\88оÑ\97 ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\97 Ð°Ð´Ñ\80еÑ\81и.",
+       "prefs-help-email": "Ð\90дÑ\80еÑ\81а ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\97 Ð¿Ð¾Ñ\88Ñ\82и Ð½Ðµ Ñ\94 Ð¾Ð±Ð¾Ð²'Ñ\8fзковоÑ\8e, Ð°Ð»Ðµ Ð½ÐµÐ¾Ð±Ñ\85Ñ\96дна Ð´Ð»Ñ\8f Ñ\81киданнÑ\8f Ð¿Ð°Ñ\80олÑ\8f, Ñ\8fкÑ\89о Ð\92и його забудете.",
+       "prefs-help-email-others": "Також Ð²Ð¾Ð½Ð° Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ\82Ñ\8c Ñ\96нÑ\88им ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87ам Ð·Ð²'Ñ\8fзаÑ\82иÑ\81Ñ\8f Ð· Ð\92ами Ñ\87еÑ\80ез Ð¿Ð¾Ñ\81иланнÑ\8f Ð½Ð° Ð\92аÑ\88Ñ\96й Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\96 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а Ñ\87и Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\96 Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ\80еннÑ\8f. Ð\9fÑ\80и Ñ\86Ñ\8cомÑ\83 Ð\92аÑ\88а ÐµÐ»ÐµÐºÑ\82Ñ\80онна Ð°Ð´Ñ\80еÑ\81а Ð·Ð°Ð»Ð¸Ñ\88иÑ\82Ñ\8cÑ\81Ñ\8f Ð½ÐµÑ\80озкÑ\80иÑ\82оÑ\8e.",
        "prefs-help-email-required": "Потрібно зазначити адресу електронної пошти.",
        "prefs-info": "Основні відомості",
        "prefs-i18n": "Інтернаціоналізація",
index 715bf06..bec3071 100644 (file)
        "passwordreset-emailtext-ip": "有人(可能是您,来自IP地址$1)请求重设{{SITENAME}}($4)上相关账户的密码。以下$3个账户与该电子邮件地址关联:\n\n$2\n\n这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。",
        "passwordreset-emailtext-user": "用户$1请求重设{{SITENAME}}($4)上您的账户的密码。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:\n\n$2\n\n这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。",
        "passwordreset-emailelement": "用户名:\n$1\n\n临时密码:\n$2",
-       "passwordreset-emailsentemail": "å¦\82æ\9e\9cæ\82¨ç\9a\84è´¦æ\88·æ\9c\89ä¸\80个已注å\86\8cç\9a\84ç\94µå­\90é\82®ä»¶å\9c°å\9d\80的话,将发送一封密码重置邮件。",
-       "passwordreset-emailsentusername": "如果有对应注册的电子邮件地址的话,将发送一封密码重置邮件。",
+       "passwordreset-emailsentemail": "å¦\82æ\9e\9cæ­¤é\82®ä»¶å\9c°å\9d\80ä¸\8eæ\82¨ç\9a\84è´¦æ\88·ç\9b¸å\85³è\81\94的话,将发送一封密码重置邮件。",
+       "passwordreset-emailsentusername": "如果有邮件地址与此用户名相关联的话,将发送一封密码重置邮件。",
        "passwordreset-emailsent-capture": "密码重设电子邮件已发送,并在下面显示。",
        "passwordreset-emailerror-capture": "重置密码邮件已生成,但是无法向{{GENDER:$2|下列用户}} 发送:$1",
        "changeemail": "更改或移除电子邮件地址",
        "group-bot": "机器人",
        "group-sysop": "管理员",
        "group-bureaucrat": "行政员",
-       "group-suppress": "监督员",
+       "group-suppress": "Flow监督员",
        "group-all": "(所有)",
        "group-user-member": "{{GENDER:$1|用户}}",
        "group-autoconfirmed-member": "自动确认用户",
        "group-bot-member": "机器人",
        "group-sysop-member": "{{GENDER:$1|管理员}}",
        "group-bureaucrat-member": "行政员",
-       "group-suppress-member": "{{GENDER:$1|监督员}}",
+       "group-suppress-member": "{{GENDER:$1|Flow监督员}}",
        "grouppage-user": "{{ns:project}}:用户",
        "grouppage-autoconfirmed": "{{ns:project}}:自动确认用户",
        "grouppage-bot": "{{ns:project}}:机器人",
index 2d4f455..5230c4a 100644 (file)
                ]
        },
        "tog-underline": "底線標示連結:",
-       "tog-hideminor": "隱藏最近變更中的小修訂",
-       "tog-hidepatrolled": "隱藏最近變更中巡查過的編輯",
+       "tog-hideminor": "隱藏近期變更中的小修訂",
+       "tog-hidepatrolled": "隱藏近期變更中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
        "tog-hidecategorization": "隱藏頁面分類",
        "tog-extendwatchlist": "展開監視清單顯示包含最近以外的所有變更",
-       "tog-usenewrc": "依最近變更與監視清單的頁面分類顯示變更",
+       "tog-usenewrc": "依近期變更與監視清單的頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示編輯工具列",
        "tog-editondblclick": "開啟滑鼠雙擊編輯頁面",
        "tog-watchlisthidebots": "隱藏監視清單中機器人的編輯",
        "tog-watchlisthideminor": "隱藏監視清單中的小修訂",
        "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
+       "tog-watchlistreloadautomatically": "查詢條件變更時自動重新讀取監視清單 (需要使用 JavaScript)",
        "tog-watchlisthideanons": "隱藏監視清單中匿名使用者的編輯",
        "tog-watchlisthidepatrolled": "隱藏監視清單中已巡查的編輯",
        "tog-watchlisthidecategorization": "隱藏頁面分類",
        "site-atom-feed": "$1 的 Atom 摘要",
        "page-rss-feed": "\"$1\" 的 RSS 摘要",
        "page-atom-feed": "\"$1\" 的 Atom 摘要",
-       "red-link-title": "$1(頁面不存在)",
+       "red-link-title": "$1 (頁面不存在)",
        "sort-descending": "降冪排序",
        "sort-ascending": "昇冪排序",
        "nstab-main": "頁面",
        "databaseerror-query": "查詢:$1",
        "databaseerror-function": "功能:$1",
        "databaseerror-error": "錯誤:$1",
+       "transaction-duration-limit-exceeded": "為了避免造成大量備援延遲,因寫入時間 ($1) 已超出了 $2 {{PLURAL:$2|秒|秒}}限制,此次操作已被中止。\n若您一次修改了許多項目,可嘗試分批處理。",
        "laggedslavemode": "<strong>警告:</strong>頁面可能不包含最近的更新。",
        "readonly": "資料庫已鎖定",
        "enterlockreason": "請輸入鎖定的原因,包括估計重新開放的時間",
-       "readonlytext": "資料庫目前已鎖定無法新增或修改資料,\n可能正在進行例行的資料庫維修作業,完成之後即可恢復正常。\n\n鎖定資料庫的管理員說明:$1",
+       "readonlytext": "è³\87æ\96\99庫ç\9b®å\89\8då·²é\8e\96å®\9aç\84¡æ³\95æ\96°å¢\9eæ\88\96ä¿®æ\94¹è³\87æ\96\99ï¼\8c\nå\8f¯è\83½æ­£å\9c¨é\80²è¡\8cä¾\8bè¡\8cç\9a\84è³\87æ\96\99庫維修ä½\9c業ï¼\8cå®\8cæ\88\90ä¹\8bå¾\8cå\8d³å\8f¯æ\81¢å¾©æ­£å¸¸ã\80\82\n\né\8e\96å®\9aè³\87æ\96\99庫ç\9a\84系統管ç\90\86å\93¡èªªæ\98\8eï¼\9a$1",
        "missing-article": "資料庫查無預期的頁面文字,名稱為 \"$1\" $2。\n\n通常是因您連結到了已被刪除的差異或歷史頁面。\n\n若您所遇到的不是這個情況,您可能是發現軟體問題。\n請記錄 URL 位址,並向 [[Special:ListUsers/sysop|管理員]] 回報此問題。",
        "missingarticle-rev": "(修訂#:$1)",
        "missingarticle-diff": "(差異:$1, $2)",
        "mypreferencesprotected": "您沒有權限編輯您的偏好設定。",
        "ns-specialprotected": "特殊頁面無法編輯。",
        "titleprotected": "此標題已經被 [[User:$1|$1]] 保護以防止建立,原因是 \"<em>$2</em>\"。",
-       "filereadonlyerror": "無法修改檔案 \"$1\" 因為檔案庫 \"$2\" 目前處於唯讀模式。\n\n鎖定的管理員說明:\"$3\"。",
+       "filereadonlyerror": "ç\84¡æ³\95ä¿®æ\94¹æª\94æ¡\88 \"$1\" å\9b ç\82ºæª\94æ¡\88庫 \"$2\" ç\9b®å\89\8dè\99\95æ\96¼å\94¯è®\80模å¼\8fã\80\82\n\né\8e\96å®\9aç\9a\84系統管ç\90\86å\93¡èªªæ\98\8eï¼\9a\"$3\"ã\80\82",
        "invalidtitle-knownnamespace": "命名空間 \"$2\" 與名稱 \"$3\" 是無效的標題",
        "invalidtitle-unknownnamespace": "不明的命名空間編號 $1 與名稱 \"$2\" 是無效的標題",
        "exception-nologin": "未登入",
        "wrongpasswordempty": "輸入的密碼是空的。\n請再試一次。",
        "passwordtooshort": "您的密碼至少需要 $1 個字元。",
        "passwordtoolong": "密碼不能超過 {{PLURAL:$1|1 個字元|$1 個字元}}。",
+       "passwordtoopopular": "不能使用常見的密碼,請選擇使用更具獨特性的密碼。",
        "password-name-match": "您的密碼不可以跟使用者名稱相同。",
        "password-login-forbidden": "此使用者名稱和密碼已被禁止使用。",
        "mailmypassword": "重設密碼",
        "activeusers-hidebots": "隱藏機器人",
        "activeusers-hidesysops": "隱藏管理員",
        "activeusers-noresult": "查無使用者。",
+       "activeusers-submit": "顯示活動中的使用者",
        "listgrouprights": "使用者群組權限",
        "listgrouprights-summary": "以下為此 Wiki 的使用者群組清單,以及相關的存取權限。\n您可以在 [[{{MediaWiki:Listgrouprights-helppage}}|詳細資訊]] 找到有關個別權限的資訊。",
        "listgrouprights-key": "說明:\n* <span class=\"listgrouprights-granted\">已授予的權限</span>\n* <span class=\"listgrouprights-revoked\">已撤銷的權限</span>",
        "watchlistall2": "全部",
        "watchlist-hide": "隱藏",
        "watchlist-submit": "顯示",
-       "wlshowtime": "顯示最近:",
+       "wlshowtime": "要顯示的時間長度:",
        "wlshowhideminor": "小編輯",
        "wlshowhidebots": "機器人",
        "wlshowhideliu": "已註冊使用者",
        "wlshowhideanons": "匿名使用者",
        "wlshowhidepatr": "已巡查編輯",
        "wlshowhidemine": "我的編輯",
+       "wlshowhidecategorization": "頁面分類",
        "watchlist-options": "監視清單選項",
        "watching": "正在監視...",
        "unwatching": "正在停止監視...",
        "whatlinkshere-hidelinks": "$1 連結",
        "whatlinkshere-hideimages": "$1 檔案連結",
        "whatlinkshere-filters": "搜尋",
+       "whatlinkshere-submit": "前往",
        "autoblockid": "自動封鎖 #$1",
        "block": "封鎖使用者",
        "unblock": "解除封鎖使用者",
        "tooltip-pt-preferences": "您的偏好設定",
        "tooltip-pt-watchlist": "您正在監視變更的頁面清單",
        "tooltip-pt-mycontris": "您的貢獻清單",
+       "tooltip-pt-anoncontribs": "由此 IP 位址編輯的清單",
        "tooltip-pt-login": "建議您先登入,但並非必要。",
        "tooltip-pt-logout": "登出",
        "tooltip-pt-createaccount": "我們會鼓勵您建立一個帳號並且登入,即使這不是必要的動作。",
        "exif-compression-6": "JPEG (舊)",
        "exif-copyrighted-true": "受版權保護",
        "exif-copyrighted-false": "版權狀態不明",
+       "exif-photometricinterpretation-1": "黑白 (黑為 0)",
        "exif-unknowndate": "日期不明",
        "exif-orientation-1": "標準",
        "exif-orientation-2": "水平翻轉",
        "logentry-suppress-block": "$1 {{GENDER:$2|已封鎖}} {{GENDER:$4|$3}} 期限為 $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|已變更}} {{GENDER:$4|$3}} 的封鎖設定期限為 $5 $6",
        "logentry-import-upload": "$1 已由檔案上傳{{GENDER:$2|匯入}} $3",
+       "logentry-import-upload-details": "$1 已使用檔案上傳{{GENDER:$2|匯入}} $3 ($4 {{PLURAL:$4|修訂|修訂}})",
        "logentry-import-interwiki": "$1 已由其他 wiki {{GENDER:$2|匯入}} $3",
+       "logentry-import-interwiki-details": "$1 已自 $5 {{GENDER:$2|匯入}} $3 ($4 {{PLURAL:$4|修訂|修訂}})",
        "logentry-merge-merge": "$1 將 $3 {{GENDER:$2|合併}}至 $4 (修訂版本至 $5)",
        "logentry-move-move": "$1 {{GENDER:$2|已移動}}頁面 $3 至 $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|已移動}}頁面 $3 至 $4,不留重新導向",
        "mediastatistics": "媒體統計資訊",
        "mediastatistics-summary": "已上傳檔案類型的統計資訊,此報表僅統計檔案的最新版本,不包含舊的或已刪除的版本。",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 位元組|$1 位元組}} ($2; $3%)",
+       "mediastatistics-bytespertype": "此章節總檔案大小:$1 位元組。",
+       "mediastatistics-allbytes": "所有檔案的總檔案大小:$1 位元組。",
        "mediastatistics-table-mimetype": "MIME 類型",
        "mediastatistics-table-extensions": "可用的副檔名",
        "mediastatistics-table-count": "檔案數量",
        "mediastatistics-header-text": "純文字",
        "mediastatistics-header-executable": "可執行",
        "mediastatistics-header-archive": "已壓縮格式",
+       "mediastatistics-header-total": "所有檔案",
        "json-warn-trailing-comma": "已移除 $1 個 JSON 結尾的{{PLURAL:$1|逗號}}",
        "json-error-unknown": "JSON 發生問題。錯誤:$1",
        "json-error-depth": "已超出堆疊深度限制",
index c2e5433..48af44d 100644 (file)
@@ -12,3 +12,39 @@ $fallback = 'fa';
 
 $rtl = true;
 
+$namespaceNames = array(
+       NS_MEDIA            => 'مديا',
+       NS_SPECIAL          => 'خاص',
+       NS_TALK             => 'گب',
+       NS_USER             => 'کارگير',
+       NS_USER_TALK        => 'کارگيرˇ_گب',
+       NS_PROJECT_TALK     => 'مدي_$1',
+       NS_FILE             => 'فاىل',
+       NS_FILE_TALK        => 'فاىلˇ_گب',
+       NS_MEDIAWIKI        => 'مدياويکي',
+       NS_MEDIAWIKI_TALK   => 'مدياويکي_گب',
+       NS_TEMPLATE         => 'قالب',
+       NS_TEMPLATE_TALK    => 'قالبˇ_گب',
+       NS_HELP             => 'رانما',
+       NS_HELP_TALK        => 'رانما_گب',
+       NS_CATEGORY         => 'جرگه',
+       NS_CATEGORY_TALK    => 'جرگه_گب',
+);
+
+$namespaceAliases = array(
+       // Aliases from old Persian (fa) namespace names
+       'ویژه' => NS_SPECIAL,
+       'بحث' => NS_TALK,
+       'کاربر' => NS_USER,
+       'بحث_کاربر' => NS_USER_TALK,
+       'بحث_$1' => NS_PROJECT_TALK,
+       'پرونده' => NS_FILE,
+       'بحث_پرونده' => NS_FILE_TALK,
+       'بحث_مدیاویکی' => NS_MEDIAWIKI_TALK,
+       'الگو' => NS_TEMPLATE,
+       'بحث_الگو' => NS_TEMPLATE_TALK,
+       'راهنما' => NS_HELP,
+       'بحث_راهنما' => NS_HELP_TALK,
+       'رده' => NS_CATEGORY,
+       'بحث_رده' => NS_CATEGORY_TALK,
+);
diff --git a/languages/messages/MessagesJbo.php b/languages/messages/MessagesJbo.php
new file mode 100644 (file)
index 0000000..6a3c573
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+/** Lojban (lojban)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$namespaceNames = array(
+       NS_MEDIA            => 'velsku',
+       NS_SPECIAL          => 'rirci',
+       NS_TALK             => 'casnu',
+       NS_USER             => 'pilno',
+       NS_USER_TALK        => 'casnu_lo_pilno',
+       NS_PROJECT_TALK     => 'casnu_la_.$1.',
+       NS_FILE             => 'datnyvei',
+       NS_FILE_TALK        => 'casnu_lo_datnyvei',
+       NS_MEDIAWIKI        => 'medi\'auikis',
+       NS_MEDIAWIKI_TALK   => 'casnu_la_.medi\'auikis.',
+       NS_TEMPLATE         => 'termo\'a',
+       NS_TEMPLATE_TALK    => 'casnu_lo_termo\'a',
+       NS_HELP             => 'nundju',
+       NS_HELP_TALK        => 'casnu_lo_nundju',
+       NS_CATEGORY         => 'klesi',
+       NS_CATEGORY_TALK    => 'casnu_lo_klesi',
+);
index 43c2faf..1d6a242 100644 (file)
--- a/load.php
+++ b/load.php
@@ -26,7 +26,6 @@ use MediaWiki\Logger\LoggerFactory;
 
 require __DIR__ . '/includes/WebStart.php';
 
-
 // URL safety checks
 if ( !$wgRequest->checkUrlExtension() ) {
        return;
index 3f8a899..f3e2db0 100644 (file)
@@ -22,7 +22,6 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
- * @todo Report PHP version, OS ..
  * @file
  * @ingroup Benchmark
  */
@@ -39,7 +38,7 @@ abstract class Benchmarker extends Maintenance {
 
        public function __construct() {
                parent::__construct();
-               $this->addOption( 'count', "How many time to run a benchmark", false, true );
+               $this->addOption( 'count', "How many times to run a benchmark", false, true );
        }
 
        public function bench( array $benchs ) {
@@ -76,7 +75,13 @@ abstract class Benchmarker extends Maintenance {
        }
 
        public function getFormattedResults() {
-               $ret = '';
+               $ret = sprintf( "Running PHP version %s (%s) on %s %s %s\n\n",
+                       phpversion(),
+                       php_uname( 'm' ),
+                       php_uname( 's' ),
+                       php_uname( 'r' ),
+                       php_uname( 'v' )
+               );
                foreach ( $this->results as $res ) {
                        // show function with args
                        $ret .= sprintf( "%s times: function %s(%s) :\n",
index 8368c84..74073bc 100644 (file)
@@ -172,4 +172,3 @@ class TableCleanup extends Maintenance {
                return sprintf( "\\x%02x", ord( $matches[1] ) );
        }
 }
-
index 88776f4..1a05907 100644 (file)
@@ -63,4 +63,3 @@ class CommandLineInc extends Maintenance {
 
 $maintClass = 'CommandLineInc';
 require RUN_MAINTENANCE_IF_MAIN;
-
index cbb1d5b..8c7e242 100644 (file)
@@ -117,7 +117,6 @@ class DeprecatedInterfaceFinder extends FileAwareNodeVisitor {
        }
 }
 
-
 /**
  * Maintenance task that recursively scans MediaWiki PHP files for deprecated
  * functions and interfaces and produces a report.
index b8caa4d..d3f082d 100644 (file)
@@ -22,4 +22,3 @@ $generator->forceClassPath( 'MyLocalSettingsGenerator', "$base/mw-config/overrid
 
 // Write out the autoload
 $generator->generateAutoload( 'maintenance/generateLocalAutoload.php' );
-
index 6b7cfb6..43e5060 100644 (file)
@@ -68,6 +68,8 @@ TEXT;
                $this->addOption( 'namespaces',
                        'Import only the pages from namespaces belonging to the list of ' .
                        'pipe-separated namespace names or namespace indexes', false, true );
+               $this->addOption( 'rootpage', 'Pages will be imported as subpages of the specified page',
+                       false, true );
                $this->addOption( 'dry-run', 'Parse dump without actually importing pages' );
                $this->addOption( 'debug', 'Output extra verbose debug information' );
                $this->addOption( 'uploads', 'Process file upload data if included (experimental)' );
@@ -285,6 +287,14 @@ TEXT;
                if ( $this->hasOption( 'no-updates' ) ) {
                        $importer->setNoUpdates( true );
                }
+               if ( $this->hasOption( 'rootpage' ) ) {
+                       $statusRootPage = $importer->setTargetRootPage( $this->getOption( 'rootpage' ) );
+                       if ( !$statusRootPage->isGood() ) {
+                               // Die here so that it doesn't print "Done!"
+                               $this->error( $statusRootPage->getMessage()->text(), 1 );
+                               return false;
+                       }
+               }
                $importer->setPageCallback( array( &$this, 'reportPage' ) );
                $this->importCallback = $importer->setRevisionCallback(
                        array( &$this, 'handleRevision' ) );
index 4b839a0..0f69f66 100644 (file)
@@ -135,4 +135,3 @@ function getFileUserFromSourceWiki( $wiki_host, $file ) {
 
        return html_entity_decode( $matches[1] );
 }
-
index 7cd2000..c5c00aa 100644 (file)
@@ -24,7 +24,6 @@ class ImportSites extends Maintenance {
                parent::__construct();
        }
 
-
        /**
         * Do the import.
         */
index 3bde81e..f414383 100644 (file)
@@ -51,4 +51,3 @@ class PageExists extends Maintenance {
 
 $maintClass = "PageExists";
 require_once RUN_MAINTENANCE_IF_MAIN;
-
index 6cac9a3..fbc407c 100644 (file)
@@ -54,4 +54,3 @@ CREATE TABLE /*$wgDBprefix*/blob_orphans (
 
        PRIMARY KEY (bo_cluster, bo_blob_id)
 ) /*$wgDBTableOptions*/;
-
index 1037528..ad2f12c 100644 (file)
@@ -1261,6 +1261,7 @@ return array(
                        'mediawiki.widgets.DateInputWidget',
                        'mediawiki.jqueryMsg',
                        'moment',
+                       'mediawiki.libs.jpegmeta',
                ),
                'messages' => array(
                        'foreign-structured-upload-form-label-own-work',
index 29b7490..2c6a588 100644 (file)
             }
         },
 
-
         fixTitle: function() {
             var $e = this.$element;
             if ($e.attr('title') || typeof($e.attr('original-title')) != 'string') {
index 1c6428f..baba348 100644 (file)
@@ -51,4 +51,3 @@
        /* @embed */
        background: url(images/marker.png) no-repeat;
 }
-
index 06c18e6..457e8c1 100644 (file)
@@ -19,7 +19,6 @@
        background-size: @width @height;
 }
 
-
 .vertical-gradient(@startColor: gray, @endColor: white, @startPos: 0, @endPos: 100%) {
        background-color: @endColor;
        background-image: -moz-linear-gradient( top, @startColor @startPos, @endColor @endPos ); // Firefox 3.6+
index dc49e20..6a5fa96 100644 (file)
@@ -72,7 +72,6 @@
                width: auto;
        }
 
-
        // Styles for information boxes
        //
        // Regular HTMLForm uses .error class, some special pages like
index d9e8c42..c90a6b9 100644 (file)
@@ -64,7 +64,6 @@
                content: '';
        }
 
-
        // Icons with text
        //
        // Markup:
index 13eb85f..605af75 100644 (file)
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">\r
-<style type="text/css">\r
-       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
-       .st1{fill-rule:evenodd;clip-rule:evenodd;}\r
-</style>\r
-<g>\r
-       <circle class="st0" cx="74.9" cy="75.1" r="58.1"/>\r
-       <g>\r
-               <path class="st1" d="M74.1,63.4c-4-7.3-10.8-10.2-18.7-10.2c-11.5,0-20.6,8.1-20.6,21.9c0,14,8.6,21.9,21,21.9\r
-                       c8,0,14.8-4.4,18.5-11l-8.8-4.5c-2,4.7-4.9,6.1-8.7,6.1c-6.5,0-9.5-5.4-9.5-12.5c0-7.1,2.5-12.5,9.5-12.5c1.9,0,5.6,1,7.8,5.7\r
-                       L74.1,63.4z"/>\r
-               <path class="st1" d="M114.8,63.4c-4-7.3-10.8-10.2-18.7-10.2c-11.5,0-20.6,8.1-20.6,21.9c0,14,8.6,21.9,21,21.9\r
-                       c8,0,14.8-4.4,18.5-11l-8.8-4.5c-2,4.7-4.9,6.1-8.7,6.1c-6.5,0-9.5-5.4-9.5-12.5c0-7.1,2.5-12.5,9.5-12.5c1.9,0,5.6,1,7.8,5.7\r
-                       L114.8,63.4z"/>\r
-       </g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
+       .st1{fill-rule:evenodd;clip-rule:evenodd;}
+</style>
+<g>
+       <circle class="st0" cx="74.9" cy="75.1" r="58.1"/>
+       <g>
+               <path class="st1" d="M74.1,63.4c-4-7.3-10.8-10.2-18.7-10.2c-11.5,0-20.6,8.1-20.6,21.9c0,14,8.6,21.9,21,21.9
+                       c8,0,14.8-4.4,18.5-11l-8.8-4.5c-2,4.7-4.9,6.1-8.7,6.1c-6.5,0-9.5-5.4-9.5-12.5c0-7.1,2.5-12.5,9.5-12.5c1.9,0,5.6,1,7.8,5.7
+                       L74.1,63.4z"/>
+               <path class="st1" d="M114.8,63.4c-4-7.3-10.8-10.2-18.7-10.2c-11.5,0-20.6,8.1-20.6,21.9c0,14,8.6,21.9,21,21.9
+                       c8,0,14.8-4.4,18.5-11l-8.8-4.5c-2,4.7-4.9,6.1-8.7,6.1c-6.5,0-9.5-5.4-9.5-12.5c0-7.1,2.5-12.5,9.5-12.5c1.9,0,5.6,1,7.8,5.7
+                       L114.8,63.4z"/>
+       </g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
index c3ee55b..96d8084 100644 (file)
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">\r
-<style type="text/css">\r
-       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
-       .st1{fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
-       .st2{stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
-</style>\r
-<g>\r
-       \r
-               <rect x="7.8" y="34.6" transform="matrix(0.2182 0.9759 -0.9759 0.2182 113.5065 3.8061)" class="st0" width="93.2" height="76.2"/>\r
-       <circle class="st1" cx="54.4" cy="72.7" r="26.1"/>\r
-</g>\r
-<g>\r
-       \r
-               <rect x="51.6" y="41.7" transform="matrix(-0.1524 0.9883 -0.9883 -0.1524 192.0548 -5.1264)" class="st0" width="93.2" height="76.2"/>\r
-       <circle class="st2" cx="98.2" cy="79.8" r="26.1"/>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
+       .st1{fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
+       .st2{stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
+</style>
+<g>
+       
+               <rect x="7.8" y="34.6" transform="matrix(0.2182 0.9759 -0.9759 0.2182 113.5065 3.8061)" class="st0" width="93.2" height="76.2"/>
+       <circle class="st1" cx="54.4" cy="72.7" r="26.1"/>
+</g>
+<g>
+       
+               <rect x="51.6" y="41.7" transform="matrix(-0.1524 0.9883 -0.9883 -0.1524 192.0548 -5.1264)" class="st0" width="93.2" height="76.2"/>
+       <circle class="st2" cx="98.2" cy="79.8" r="26.1"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
index 639775f..dc660c8 100644 (file)
@@ -1,26 +1,26 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">\r
-<style type="text/css">\r
-       .st0{fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
-       .st1{stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
-</style>\r
-<polygon class="st0" points="6.3,43.3 38.4,43.3 46,34.4 78.4,34.4 85.5,42.6 142.6,42.6 142.6,115 6.3,115 "/>\r
-<g>\r
-       <circle class="st0" cx="63.3" cy="78.8" r="25.8"/>\r
-       <circle class="st1" cx="63.3" cy="78.8" r="16.2"/>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
+       .st1{stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
+</style>
+<polygon class="st0" points="6.3,43.3 38.4,43.3 46,34.4 78.4,34.4 85.5,42.6 142.6,42.6 142.6,115 6.3,115 "/>
+<g>
+       <circle class="st0" cx="63.3" cy="78.8" r="25.8"/>
+       <circle class="st1" cx="63.3" cy="78.8" r="16.2"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
index baa982b..2af3f93 100644 (file)
@@ -1,24 +1,24 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">\r
-<style type="text/css">\r
-       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
-</style>\r
-<circle class="st0" cx="72.7" cy="62.5" r="47.1"/>\r
-<path d="M76,128.8c34.8,0,63.2-28.3,63.2-63.2c0-18.3-7.9-34.9-20.4-46.4l11.8-11.8L129.1,6l-11.8,11.8c0,0,0,0,0,0l-1.4,1.4\r
-       c13,11.2,21.3,27.8,21.3,46.4c0,33.7-27.4,61.2-61.2,61.2c-18.5,0-35.1-8.3-46.4-21.3l-0.4,0.4l0,0l-13,13l1.4,1.4l11.9-11.9\r
-       c10.9,11.9,26.4,19.6,43.6,20.4v15.7H49.7v2h48.9v-2H75.1v-15.7C75.4,128.8,75.7,128.8,76,128.8z"/>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
+</style>
+<circle class="st0" cx="72.7" cy="62.5" r="47.1"/>
+<path d="M76,128.8c34.8,0,63.2-28.3,63.2-63.2c0-18.3-7.9-34.9-20.4-46.4l11.8-11.8L129.1,6l-11.8,11.8c0,0,0,0,0,0l-1.4,1.4
+       c13,11.2,21.3,27.8,21.3,46.4c0,33.7-27.4,61.2-61.2,61.2c-18.5,0-35.1-8.3-46.4-21.3l-0.4,0.4l0,0l-13,13l1.4,1.4l11.9-11.9
+       c10.9,11.9,26.4,19.6,43.6,20.4v15.7H49.7v2h48.9v-2H75.1v-15.7C75.4,128.8,75.7,128.8,76,128.8z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
index dc43b5d..b110396 100644 (file)
@@ -1,60 +1,60 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        viewBox="0 0 264 162" height="162" width="264" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
-<style type="text/css">\r
-       .st0{fill:#00AF89;}\r
-       .st1{fill:#FFFFFF;}\r
-       .st2{fill:#FFFFFF;stroke:#E5E5E5;stroke-miterlimit:10;}\r
-       .st3{fill:#E5E5E5;}\r
-       .st4{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
-       .st5{fill:#9B9A9A;}\r
-       .st6{fill:none;stroke:#E5E5E5;stroke-linejoin:round;stroke-miterlimit:10;}\r
-</style>\r
-<rect x="62.3" y="28.1" class="st0" width="137.6" height="105"/>\r
-<g>\r
-       <path class="st1" d="M73.1,57v64.4h45.3V78.5h25.3v42.9h45.3V57H73.1z M94.3,107.6H80.9V94.3h13.3V107.6z M94.3,91.9H80.9V78.5\r
-               h13.3V91.9z M109.9,107.6H96.6V94.3h13.3V107.6z M109.9,91.9H96.6V78.5h13.3V91.9z M164.3,107.6h-13.3V94.3h13.3V107.6z\r
-                M164.3,91.9h-13.3V78.5h13.3V91.9z M179.9,107.6h-13.3V94.3h13.3V107.6z M179.9,91.9h-13.3V78.5h13.3V91.9z"/>\r
-       <rect x="73.1" y="48.5" class="st1" width="116" height="5.7"/>\r
-       <rect x="73.1" y="39.9" class="st1" width="116" height="5.7"/>\r
-</g>\r
-<rect x="62.3" y="124" class="st1" width="137.6" height="1.7"/>\r
-<g>\r
-       <g>\r
-               <rect x="6.7" y="7.4" class="st2" width="35.3" height="12.7"/>\r
-               <rect x="42" y="11.1" class="st3" width="2.3" height="5.7"/>\r
-       </g>\r
-       <rect x="8.2" y="9.1" class="st3" width="5.2" height="9.2"/>\r
-       <rect x="14.5" y="9.1" class="st3" width="5.2" height="9.2"/>\r
-       <rect x="21" y="9.1" class="st3" width="5.2" height="9.2"/>\r
-</g>\r
-<circle class="st3" cx="252.7" cy="12.1" r="6.2"/>\r
-<rect x="239.3" y="9.1" class="st3" width="5.3" height="7.7"/>\r
-<rect x="233" y="9.1" class="st3" width="5.3" height="7.7"/>\r
-<rect x="214" y="143.3" class="st3" width="5.3" height="7.7"/>\r
-<rect x="207.6" y="143.3" class="st3" width="5.3" height="7.7"/>\r
-<rect x="50.4" y="143.3" class="st3" width="5.3" height="7.7"/>\r
-<rect x="39" y="143.3" class="st3" width="5.3" height="7.7"/>\r
-<line class="st4" x1="73.1" y1="148" x2="189.1" y2="148"/>\r
-<line class="st4" x1="132" y1="143.1" x2="132" y2="152.9"/>\r
-<line class="st4" x1="189.1" y1="144.3" x2="189.1" y2="151.7"/>\r
-<line class="st4" x1="73.1" y1="144.3" x2="73.1" y2="151.7"/>\r
-<line class="st4" x1="86" y1="145.5" x2="86" y2="150.5"/>\r
-<line class="st4" x1="100.7" y1="145.5" x2="100.7" y2="150.5"/>\r
-<line class="st4" x1="115.3" y1="145.5" x2="115.3" y2="150.5"/>\r
-<line class="st4" x1="145.8" y1="145.5" x2="145.8" y2="150.5"/>\r
-<line class="st4" x1="160.5" y1="145.5" x2="160.5" y2="150.5"/>\r
-<line class="st4" x1="175.2" y1="145.5" x2="175.2" y2="150.5"/>\r
-<g>\r
-       <rect x="113.8" y="154.1" class="st5" width="3.2" height="4.7"/>\r
-       <polygon class="st5" points="113.8,154.1 115.3,152.3 116.9,154.1        "/>\r
-</g>\r
-<g>\r
-       <g>\r
-               <polyline class="st6" points="34.3,147.1 31.5,147.1 34.3,144.3 31.5,147.1 34.3,147.1 31.5,149.9                 "/>\r
-       </g>\r
-       <polygon class="st3" points="33.9,149.5 32.1,151.7 30.3,149.5   "/>\r
-</g>\r
-<line class="st6" x1="48.9" y1="143.2" x2="45.9" y2="151.1"/>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 264 162" height="162" width="264" style="enable-background:new 0 0 264 162;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#00AF89;}
+       .st1{fill:#FFFFFF;}
+       .st2{fill:#FFFFFF;stroke:#E5E5E5;stroke-miterlimit:10;}
+       .st3{fill:#E5E5E5;}
+       .st4{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
+       .st5{fill:#9B9A9A;}
+       .st6{fill:none;stroke:#E5E5E5;stroke-linejoin:round;stroke-miterlimit:10;}
+</style>
+<rect x="62.3" y="28.1" class="st0" width="137.6" height="105"/>
+<g>
+       <path class="st1" d="M73.1,57v64.4h45.3V78.5h25.3v42.9h45.3V57H73.1z M94.3,107.6H80.9V94.3h13.3V107.6z M94.3,91.9H80.9V78.5
+               h13.3V91.9z M109.9,107.6H96.6V94.3h13.3V107.6z M109.9,91.9H96.6V78.5h13.3V91.9z M164.3,107.6h-13.3V94.3h13.3V107.6z
+                M164.3,91.9h-13.3V78.5h13.3V91.9z M179.9,107.6h-13.3V94.3h13.3V107.6z M179.9,91.9h-13.3V78.5h13.3V91.9z"/>
+       <rect x="73.1" y="48.5" class="st1" width="116" height="5.7"/>
+       <rect x="73.1" y="39.9" class="st1" width="116" height="5.7"/>
+</g>
+<rect x="62.3" y="124" class="st1" width="137.6" height="1.7"/>
+<g>
+       <g>
+               <rect x="6.7" y="7.4" class="st2" width="35.3" height="12.7"/>
+               <rect x="42" y="11.1" class="st3" width="2.3" height="5.7"/>
+       </g>
+       <rect x="8.2" y="9.1" class="st3" width="5.2" height="9.2"/>
+       <rect x="14.5" y="9.1" class="st3" width="5.2" height="9.2"/>
+       <rect x="21" y="9.1" class="st3" width="5.2" height="9.2"/>
+</g>
+<circle class="st3" cx="252.7" cy="12.1" r="6.2"/>
+<rect x="239.3" y="9.1" class="st3" width="5.3" height="7.7"/>
+<rect x="233" y="9.1" class="st3" width="5.3" height="7.7"/>
+<rect x="214" y="143.3" class="st3" width="5.3" height="7.7"/>
+<rect x="207.6" y="143.3" class="st3" width="5.3" height="7.7"/>
+<rect x="50.4" y="143.3" class="st3" width="5.3" height="7.7"/>
+<rect x="39" y="143.3" class="st3" width="5.3" height="7.7"/>
+<line class="st4" x1="73.1" y1="148" x2="189.1" y2="148"/>
+<line class="st4" x1="132" y1="143.1" x2="132" y2="152.9"/>
+<line class="st4" x1="189.1" y1="144.3" x2="189.1" y2="151.7"/>
+<line class="st4" x1="73.1" y1="144.3" x2="73.1" y2="151.7"/>
+<line class="st4" x1="86" y1="145.5" x2="86" y2="150.5"/>
+<line class="st4" x1="100.7" y1="145.5" x2="100.7" y2="150.5"/>
+<line class="st4" x1="115.3" y1="145.5" x2="115.3" y2="150.5"/>
+<line class="st4" x1="145.8" y1="145.5" x2="145.8" y2="150.5"/>
+<line class="st4" x1="160.5" y1="145.5" x2="160.5" y2="150.5"/>
+<line class="st4" x1="175.2" y1="145.5" x2="175.2" y2="150.5"/>
+<g>
+       <rect x="113.8" y="154.1" class="st5" width="3.2" height="4.7"/>
+       <polygon class="st5" points="113.8,154.1 115.3,152.3 116.9,154.1        "/>
+</g>
+<g>
+       <g>
+               <polyline class="st6" points="34.3,147.1 31.5,147.1 34.3,144.3 31.5,147.1 34.3,147.1 31.5,149.9                 "/>
+       </g>
+       <polygon class="st3" points="33.9,149.5 32.1,151.7 30.3,149.5   "/>
+</g>
+<line class="st6" x1="48.9" y1="143.2" x2="45.9" y2="151.1"/>
+</svg>
index ff3d682..c32f79f 100644 (file)
@@ -1,98 +1,98 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
-<style type="text/css">\r
-       .st0{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
-       .st1{fill:none;stroke:#9B9A9A;stroke-miterlimit:10;}\r
-       .st2{fill:#E5E5E5;}\r
-       .st3{fill:#9B9A9A;}\r
-       .st4{fill:#00AF89;}\r
-       .st5{fill:#FFFFFF;}\r
-       .st6{fill:none;stroke:#FFFFFF;stroke-width:5;stroke-miterlimit:10;}\r
-</style>\r
-<line class="st0" x1="2" y1="10.5" x2="262" y2="10.5"/>\r
-<line class="st0" x1="2" y1="24.8" x2="262" y2="24.8"/>\r
-<g>\r
-       <rect x="6.9" y="32.8" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="16.2" y="32.8" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="6.9" y="42.1" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="16.2" y="42.1" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="6.9" y="51.4" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="16.2" y="51.4" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="6.9" y="60.8" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="16.2" y="60.8" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="6.9" y="70.1" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="16.2" y="70.1" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="6.9" y="79.4" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="16.2" y="79.4" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="6.9" y="88.8" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="16.2" y="88.8" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="6.9" y="98.1" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="16.2" y="98.1" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="6.9" y="107.4" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="16.2" y="107.4" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="6.9" y="116.8" class="st1" width="9.3" height="9.3"/>\r
-       <rect x="16.2" y="116.8" class="st1" width="9.3" height="9.3"/>\r
-</g>\r
-<rect x="3.2" y="12.7" class="st2" width="9.3" height="9.3"/>\r
-<rect x="3.2" y="3.4" class="st2" width="4.7" height="4.7"/>\r
-<rect x="10.2" y="3.4" class="st2" width="4.7" height="4.7"/>\r
-<rect x="16.9" y="3.4" class="st2" width="4.7" height="4.7"/>\r
-<rect x="249.2" y="3.4" class="st2" width="4.7" height="4.7"/>\r
-<rect x="255.9" y="3.4" class="st2" width="4.7" height="4.7"/>\r
-<rect x="14.6" y="12.7" class="st2" width="9.3" height="9.3"/>\r
-<rect x="239.9" y="12.7" class="st2" width="9.3" height="9.3"/>\r
-<rect x="228.9" y="12.7" class="st2" width="9.3" height="9.3"/>\r
-<rect x="251.2" y="12.7" class="st2" width="9.3" height="9.3"/>\r
-<g>\r
-       <path class="st2" d="M73.5,13.7V21H26.6v-7.3H73.5 M74.5,12.7H25.6V22h48.9V12.7L74.5,12.7z"/>\r
-</g>\r
-<g>\r
-       <path class="st2" d="M117.8,13.7V21H76.9v-7.3H117.8 M118.8,12.7H75.9V22h42.9V12.7L118.8,12.7z"/>\r
-</g>\r
-<g>\r
-       <path class="st2" d="M162.5,13.7V21h-40.9v-7.3H162.5 M163.5,12.7h-42.9V22h42.9V12.7L163.5,12.7z"/>\r
-</g>\r
-<rect x="209.7" y="30.3" class="st2" width="50.9" height="32.3"/>\r
-<rect x="209.7" y="30.3" class="st3" width="50.9" height="5.7"/>\r
-<g>\r
-       <rect x="212.2" y="38.5" class="st3" width="6.2" height="6.2"/>\r
-       <rect x="239.9" y="38.5" class="st3" width="6.2" height="2.5"/>\r
-       <rect x="239.9" y="42.2" class="st3" width="6.2" height="2.5"/>\r
-       <g>\r
-               <path class="st3" d="M237.2,39.5v4.2H221v-4.2H237.2 M238.2,38.5H220v6.2h18.2V38.5L238.2,38.5z"/>\r
-       </g>\r
-</g>\r
-<g>\r
-       <rect x="212.2" y="46.5" class="st3" width="6.2" height="6.2"/>\r
-       <rect x="239.9" y="46.5" class="st3" width="6.2" height="2.5"/>\r
-       <rect x="239.9" y="50.2" class="st3" width="6.2" height="2.5"/>\r
-       <g>\r
-               <path class="st3" d="M237.2,47.5v4.2H221v-4.2H237.2 M238.2,46.5H220v6.2h18.2V46.5L238.2,46.5z"/>\r
-       </g>\r
-</g>\r
-<rect x="209.7" y="66.6" class="st2" width="50.9" height="32.3"/>\r
-<rect x="209.7" y="66.6" class="st3" width="50.9" height="5.7"/>\r
-<g>\r
-       <path class="st3" d="M257.2,75.8V80h-44.1v-4.2H257.2 M258.2,74.8h-46.1V81h46.1V74.8L258.2,74.8z"/>\r
-</g>\r
-<g>\r
-       <path class="st3" d="M257.2,81v4.2h-44.1V81H257.2 M258.2,80h-46.1v6.2h46.1V80L258.2,80z"/>\r
-</g>\r
-<g>\r
-       <path class="st3" d="M257.2,86.2v4.2h-44.1v-4.2H257.2 M258.2,85.2h-46.1v6.2h46.1V85.2L258.2,85.2z"/>\r
-</g>\r
-<g>\r
-       <path class="st3" d="M257.2,91.3v4.2h-44.1v-4.2H257.2 M258.2,90.3h-46.1v6.2h46.1V90.3L258.2,90.3z"/>\r
-</g>\r
-<ellipse class="st1" cx="218.3" cy="85.7" rx="0" ry="10.2"/>\r
-<rect x="69.5" y="47.5" class="st4" width="108" height="82.4"/>\r
-<circle class="st5" cx="123.5" cy="88.7" r="6.6"/>\r
-<circle class="st5" cx="116.9" cy="106.2" r="6.6"/>\r
-<circle class="st5" cx="154.5" cy="80.3" r="6.6"/>\r
-<circle class="st5" cx="93.1" cy="81.5" r="6.6"/>\r
-<circle class="st5" cx="141.7" cy="114.1" r="6.6"/>\r
-<circle class="st6" cx="123.5" cy="88.7" r="18.2"/>\r
-<circle class="st6" cx="123.5" cy="88.7" r="31.7"/>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
+       .st1{fill:none;stroke:#9B9A9A;stroke-miterlimit:10;}
+       .st2{fill:#E5E5E5;}
+       .st3{fill:#9B9A9A;}
+       .st4{fill:#00AF89;}
+       .st5{fill:#FFFFFF;}
+       .st6{fill:none;stroke:#FFFFFF;stroke-width:5;stroke-miterlimit:10;}
+</style>
+<line class="st0" x1="2" y1="10.5" x2="262" y2="10.5"/>
+<line class="st0" x1="2" y1="24.8" x2="262" y2="24.8"/>
+<g>
+       <rect x="6.9" y="32.8" class="st1" width="9.3" height="9.3"/>
+       <rect x="16.2" y="32.8" class="st1" width="9.3" height="9.3"/>
+       <rect x="6.9" y="42.1" class="st1" width="9.3" height="9.3"/>
+       <rect x="16.2" y="42.1" class="st1" width="9.3" height="9.3"/>
+       <rect x="6.9" y="51.4" class="st1" width="9.3" height="9.3"/>
+       <rect x="16.2" y="51.4" class="st1" width="9.3" height="9.3"/>
+       <rect x="6.9" y="60.8" class="st1" width="9.3" height="9.3"/>
+       <rect x="16.2" y="60.8" class="st1" width="9.3" height="9.3"/>
+       <rect x="6.9" y="70.1" class="st1" width="9.3" height="9.3"/>
+       <rect x="16.2" y="70.1" class="st1" width="9.3" height="9.3"/>
+       <rect x="6.9" y="79.4" class="st1" width="9.3" height="9.3"/>
+       <rect x="16.2" y="79.4" class="st1" width="9.3" height="9.3"/>
+       <rect x="6.9" y="88.8" class="st1" width="9.3" height="9.3"/>
+       <rect x="16.2" y="88.8" class="st1" width="9.3" height="9.3"/>
+       <rect x="6.9" y="98.1" class="st1" width="9.3" height="9.3"/>
+       <rect x="16.2" y="98.1" class="st1" width="9.3" height="9.3"/>
+       <rect x="6.9" y="107.4" class="st1" width="9.3" height="9.3"/>
+       <rect x="16.2" y="107.4" class="st1" width="9.3" height="9.3"/>
+       <rect x="6.9" y="116.8" class="st1" width="9.3" height="9.3"/>
+       <rect x="16.2" y="116.8" class="st1" width="9.3" height="9.3"/>
+</g>
+<rect x="3.2" y="12.7" class="st2" width="9.3" height="9.3"/>
+<rect x="3.2" y="3.4" class="st2" width="4.7" height="4.7"/>
+<rect x="10.2" y="3.4" class="st2" width="4.7" height="4.7"/>
+<rect x="16.9" y="3.4" class="st2" width="4.7" height="4.7"/>
+<rect x="249.2" y="3.4" class="st2" width="4.7" height="4.7"/>
+<rect x="255.9" y="3.4" class="st2" width="4.7" height="4.7"/>
+<rect x="14.6" y="12.7" class="st2" width="9.3" height="9.3"/>
+<rect x="239.9" y="12.7" class="st2" width="9.3" height="9.3"/>
+<rect x="228.9" y="12.7" class="st2" width="9.3" height="9.3"/>
+<rect x="251.2" y="12.7" class="st2" width="9.3" height="9.3"/>
+<g>
+       <path class="st2" d="M73.5,13.7V21H26.6v-7.3H73.5 M74.5,12.7H25.6V22h48.9V12.7L74.5,12.7z"/>
+</g>
+<g>
+       <path class="st2" d="M117.8,13.7V21H76.9v-7.3H117.8 M118.8,12.7H75.9V22h42.9V12.7L118.8,12.7z"/>
+</g>
+<g>
+       <path class="st2" d="M162.5,13.7V21h-40.9v-7.3H162.5 M163.5,12.7h-42.9V22h42.9V12.7L163.5,12.7z"/>
+</g>
+<rect x="209.7" y="30.3" class="st2" width="50.9" height="32.3"/>
+<rect x="209.7" y="30.3" class="st3" width="50.9" height="5.7"/>
+<g>
+       <rect x="212.2" y="38.5" class="st3" width="6.2" height="6.2"/>
+       <rect x="239.9" y="38.5" class="st3" width="6.2" height="2.5"/>
+       <rect x="239.9" y="42.2" class="st3" width="6.2" height="2.5"/>
+       <g>
+               <path class="st3" d="M237.2,39.5v4.2H221v-4.2H237.2 M238.2,38.5H220v6.2h18.2V38.5L238.2,38.5z"/>
+       </g>
+</g>
+<g>
+       <rect x="212.2" y="46.5" class="st3" width="6.2" height="6.2"/>
+       <rect x="239.9" y="46.5" class="st3" width="6.2" height="2.5"/>
+       <rect x="239.9" y="50.2" class="st3" width="6.2" height="2.5"/>
+       <g>
+               <path class="st3" d="M237.2,47.5v4.2H221v-4.2H237.2 M238.2,46.5H220v6.2h18.2V46.5L238.2,46.5z"/>
+       </g>
+</g>
+<rect x="209.7" y="66.6" class="st2" width="50.9" height="32.3"/>
+<rect x="209.7" y="66.6" class="st3" width="50.9" height="5.7"/>
+<g>
+       <path class="st3" d="M257.2,75.8V80h-44.1v-4.2H257.2 M258.2,74.8h-46.1V81h46.1V74.8L258.2,74.8z"/>
+</g>
+<g>
+       <path class="st3" d="M257.2,81v4.2h-44.1V81H257.2 M258.2,80h-46.1v6.2h46.1V80L258.2,80z"/>
+</g>
+<g>
+       <path class="st3" d="M257.2,86.2v4.2h-44.1v-4.2H257.2 M258.2,85.2h-46.1v6.2h46.1V85.2L258.2,85.2z"/>
+</g>
+<g>
+       <path class="st3" d="M257.2,91.3v4.2h-44.1v-4.2H257.2 M258.2,90.3h-46.1v6.2h46.1V90.3L258.2,90.3z"/>
+</g>
+<ellipse class="st1" cx="218.3" cy="85.7" rx="0" ry="10.2"/>
+<rect x="69.5" y="47.5" class="st4" width="108" height="82.4"/>
+<circle class="st5" cx="123.5" cy="88.7" r="6.6"/>
+<circle class="st5" cx="116.9" cy="106.2" r="6.6"/>
+<circle class="st5" cx="154.5" cy="80.3" r="6.6"/>
+<circle class="st5" cx="93.1" cy="81.5" r="6.6"/>
+<circle class="st5" cx="141.7" cy="114.1" r="6.6"/>
+<circle class="st6" cx="123.5" cy="88.7" r="18.2"/>
+<circle class="st6" cx="123.5" cy="88.7" r="31.7"/>
+</svg>
index 7bcf826..67c4ef0 100644 (file)
@@ -1,92 +1,92 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
-<style type="text/css">\r
-       .st0{display:none;}\r
-       .st1{display:inline;}\r
-       .st2{fill:#FFFFFF;}\r
-       .st3{fill:#E5E5E5;}\r
-       .st4{opacity:0.5;fill:#E5E5E5;enable-background:new    ;}\r
-       .st5{fill:#E5E5E5;stroke:#E5E5E5;}\r
-       .st6{fill:#9B9B9B;}\r
-       .st7{fill:#4470B6;}\r
-       .st8{fill:#D0D1D1;}\r
-       .st9{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
-       .st10{fill:none;stroke:#D02227;stroke-miterlimit:10;}\r
-       .st11{fill:#D02227;}\r
-</style>\r
-<g id="Layer_1" class="st0">\r
-       <g class="st1">\r
-               <path class="st2" d="M24.8,151.4l-11.5,10l-12.9-9.6V0.5h263v151.7l-9,6.7V42.5h-39v112.6l-4.4-3.7l-7.6,5.3V42.5h-155v110.8\r
-                       l-9.8,8L24.8,151.4z"/>\r
-               <path class="st3" d="M263,1v151l-8,6V42h-40v112l-3.3-2.8l-0.6-0.5l-0.6,0.4l-6.5,4.6V42H48v111.1l-9.3,7.7l-13.3-9.6l-0.6-0.5\r
-                       l-0.6,0.5l-10.9,9.5L1,151.5V1L263,1L263,1z M264,0H0v152l13.4,10l11.5-10l13.9,10l10.2-8.4V43h154v114.7l8.1-5.7l4.9,4.2V43h38\r
-                       v116.9l10-7.4V0L264,0z M203,43H49v110.6l2.1-1.6l12.6,10l13.8-10l14.2,10l13-10l13,10l13.8-10l12.1,10l13.4-10l14.2,10l13-10\r
-                       l13,10l5.8-4.3L203,43L203,43z"/>\r
-               <path class="st4" d="M254,43h-38v113.2l7.6,5.8l13.8-10l13.9,10l2.7-2.1V43z"/>\r
-               <path class="st5" d="M2,14.5h260"/>\r
-               <path class="st3" d="M232.5,5h26v6h-26V5z M208.5,5h22v6h-22V5z M142,6v4H50V6H142z M143,5H49v6h94V5z M184.5,5h22v6h-22V5z\r
-                        M161.5,5h13v6h-13V5z M176.5,5h6v6h-6V5z M153.5,5h6v6h-6V5z M9,5h32v6H9V5z M52,7h2v2h-2V7z M11,36c0-7.7,6.3-14,14-14\r
-                       s14,6.3,14,14s-6.3,14-14,14S11,43.7,11,36z M38,107V72H13v35H38z M38,59v-5H13v5H38z"/>\r
-       </g>\r
-       <g class="st1">\r
-               <path class="st6" d="M123.8,68H85.6v7.8h38.1L123.8,68L123.8,68z M180.5,103v-8.8h-50.8v8.8H180.5z M90.8,80.6H69.9v8.6h20.8V80.6\r
-                       z M189.3,88.4v-7.8h-37.7v7.8H189.3z M100.7,94.1H75v7.8h25.7V94.1z M175.2,68H129v7.8h46.2V68z"/>\r
-               <path class="st7" d="M94.7,80.6v9.2h51.6v-9.2L94.7,80.6z"/>\r
-       </g>\r
-       <g class="st1">\r
-               <path class="st2" d="M94,94h75v44H94V94z"/>\r
-               <path class="st7" d="M169,94h-31v44h31V94z M150.8,118.1l5.9,9.7l3.2-3l4.8,6.1l-21.1,0l6.2-12.8H150.8z"/>\r
-               <g transform="scale(-1 1)">\r
-                       <path class="st8" d="M-102,100h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0\r
-                               C-101,100.2-101.4,100-102,100z"/>\r
-                       <path class="st8" d="M-102,104h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0\r
-                               C-101,104.2-101.4,104-102,104z"/>\r
-                       <path class="st8" d="M-102,108h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0\r
-                               C-101,108.2-101.4,108-102,108z"/>\r
-                       <path class="st8" d="M-102,112h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0\r
-                               C-101,112.2-101.4,112-102,112z"/>\r
-                       <path class="st8" d="M-102,116h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0\r
-                               C-101,116.2-101.4,116-102,116z"/>\r
-                       <path class="st8" d="M-102,120h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0\r
-                               C-101,120.2-101.4,120-102,120z"/>\r
-                       <path class="st8" d="M-102,124h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0\r
-                               C-101,124.2-101.4,124-102,124z"/>\r
-                       <path class="st8" d="M-102,128h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0\r
-                               C-101,128.2-101.4,128-102,128z"/>\r
-               </g>\r
-       </g>\r
-</g>\r
-<g id="Layer_2">\r
-       <g>\r
-               <rect x="4.8" y="5.5" class="st2" width="93" height="5"/>\r
-               <path class="st3" d="M97.2,6v4h-92V6H97.2 M98.2,5h-94v6h94V5L98.2,5z"/>\r
-       </g>\r
-       <polygon class="st3" points="177.7,8 176.4,8 109.6,8 108.2,8 106,14 111.8,14 174.2,14 180,14    "/>\r
-       <polygon class="st3" points="256.5,8 255.2,8 188.3,8 187,8 184.7,14 190.6,14 252.9,14 258.8,14  "/>\r
-       <line class="st9" x1="2" y1="14.5" x2="262" y2="14.5"/>\r
-       <line class="st9" x1="2" y1="32.8" x2="262" y2="32.8"/>\r
-       <g>\r
-               <circle class="st10" cx="8.9" cy="22.6" r="3.6"/>\r
-               <line class="st10" x1="11.6" y1="25" x2="15" y2="28.5"/>\r
-       </g>\r
-       <rect x="20.9" y="19" class="st3" width="57.6" height="9.5"/>\r
-       <rect x="4.3" y="37" class="st3" width="69.2" height="32.7"/>\r
-       <rect x="4.3" y="72.5" class="st3" width="90.1" height="56.8"/>\r
-       <rect x="97" y="72.5" class="st11" width="106.5" height="56.8"/>\r
-       <rect x="206.3" y="72.5" class="st3" width="52.4" height="56.8"/>\r
-       <rect x="4.3" y="132.2" class="st3" width="36.5" height="25.3"/>\r
-       <rect x="43.7" y="132.2" class="st3" width="62.3" height="25.3"/>\r
-       <rect x="109.3" y="132.2" class="st3" width="18.1" height="25.3"/>\r
-       <rect x="169.1" y="132.2" class="st3" width="18.1" height="25.3"/>\r
-       <rect x="189.8" y="132.2" class="st3" width="18.1" height="25.3"/>\r
-       <rect x="210.6" y="132.2" class="st3" width="48.1" height="25.3"/>\r
-       <rect x="130" y="132.2" class="st3" width="36" height="25.3"/>\r
-       <rect x="115.2" y="37" class="st3" width="36.5" height="32.7"/>\r
-       <rect x="76.1" y="37" class="st3" width="36.5" height="32.7"/>\r
-       <rect x="154.6" y="37" class="st3" width="56" height="32.7"/>\r
-       <rect x="213.3" y="37" class="st3" width="45.4" height="32.7"/>\r
-       <path class="st2" d="M102.4,115.4l9.5-9.5l12.8,12.8l26.1-26.1l31.8,31.8h-80.3L102.4,115.4z"/>\r
-</g>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">
+<style type="text/css">
+       .st0{display:none;}
+       .st1{display:inline;}
+       .st2{fill:#FFFFFF;}
+       .st3{fill:#E5E5E5;}
+       .st4{opacity:0.5;fill:#E5E5E5;enable-background:new    ;}
+       .st5{fill:#E5E5E5;stroke:#E5E5E5;}
+       .st6{fill:#9B9B9B;}
+       .st7{fill:#4470B6;}
+       .st8{fill:#D0D1D1;}
+       .st9{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
+       .st10{fill:none;stroke:#D02227;stroke-miterlimit:10;}
+       .st11{fill:#D02227;}
+</style>
+<g id="Layer_1" class="st0">
+       <g class="st1">
+               <path class="st2" d="M24.8,151.4l-11.5,10l-12.9-9.6V0.5h263v151.7l-9,6.7V42.5h-39v112.6l-4.4-3.7l-7.6,5.3V42.5h-155v110.8
+                       l-9.8,8L24.8,151.4z"/>
+               <path class="st3" d="M263,1v151l-8,6V42h-40v112l-3.3-2.8l-0.6-0.5l-0.6,0.4l-6.5,4.6V42H48v111.1l-9.3,7.7l-13.3-9.6l-0.6-0.5
+                       l-0.6,0.5l-10.9,9.5L1,151.5V1L263,1L263,1z M264,0H0v152l13.4,10l11.5-10l13.9,10l10.2-8.4V43h154v114.7l8.1-5.7l4.9,4.2V43h38
+                       v116.9l10-7.4V0L264,0z M203,43H49v110.6l2.1-1.6l12.6,10l13.8-10l14.2,10l13-10l13,10l13.8-10l12.1,10l13.4-10l14.2,10l13-10
+                       l13,10l5.8-4.3L203,43L203,43z"/>
+               <path class="st4" d="M254,43h-38v113.2l7.6,5.8l13.8-10l13.9,10l2.7-2.1V43z"/>
+               <path class="st5" d="M2,14.5h260"/>
+               <path class="st3" d="M232.5,5h26v6h-26V5z M208.5,5h22v6h-22V5z M142,6v4H50V6H142z M143,5H49v6h94V5z M184.5,5h22v6h-22V5z
+                        M161.5,5h13v6h-13V5z M176.5,5h6v6h-6V5z M153.5,5h6v6h-6V5z M9,5h32v6H9V5z M52,7h2v2h-2V7z M11,36c0-7.7,6.3-14,14-14
+                       s14,6.3,14,14s-6.3,14-14,14S11,43.7,11,36z M38,107V72H13v35H38z M38,59v-5H13v5H38z"/>
+       </g>
+       <g class="st1">
+               <path class="st6" d="M123.8,68H85.6v7.8h38.1L123.8,68L123.8,68z M180.5,103v-8.8h-50.8v8.8H180.5z M90.8,80.6H69.9v8.6h20.8V80.6
+                       z M189.3,88.4v-7.8h-37.7v7.8H189.3z M100.7,94.1H75v7.8h25.7V94.1z M175.2,68H129v7.8h46.2V68z"/>
+               <path class="st7" d="M94.7,80.6v9.2h51.6v-9.2L94.7,80.6z"/>
+       </g>
+       <g class="st1">
+               <path class="st2" d="M94,94h75v44H94V94z"/>
+               <path class="st7" d="M169,94h-31v44h31V94z M150.8,118.1l5.9,9.7l3.2-3l4.8,6.1l-21.1,0l6.2-12.8H150.8z"/>
+               <g transform="scale(-1 1)">
+                       <path class="st8" d="M-102,100h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0
+                               C-101,100.2-101.4,100-102,100z"/>
+                       <path class="st8" d="M-102,104h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0
+                               C-101,104.2-101.4,104-102,104z"/>
+                       <path class="st8" d="M-102,108h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0
+                               C-101,108.2-101.4,108-102,108z"/>
+                       <path class="st8" d="M-102,112h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0
+                               C-101,112.2-101.4,112-102,112z"/>
+                       <path class="st8" d="M-102,116h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0
+                               C-101,116.2-101.4,116-102,116z"/>
+                       <path class="st8" d="M-102,120h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0
+                               C-101,120.2-101.4,120-102,120z"/>
+                       <path class="st8" d="M-102,124h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0
+                               C-101,124.2-101.4,124-102,124z"/>
+                       <path class="st8" d="M-102,128h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0
+                               C-101,128.2-101.4,128-102,128z"/>
+               </g>
+       </g>
+</g>
+<g id="Layer_2">
+       <g>
+               <rect x="4.8" y="5.5" class="st2" width="93" height="5"/>
+               <path class="st3" d="M97.2,6v4h-92V6H97.2 M98.2,5h-94v6h94V5L98.2,5z"/>
+       </g>
+       <polygon class="st3" points="177.7,8 176.4,8 109.6,8 108.2,8 106,14 111.8,14 174.2,14 180,14    "/>
+       <polygon class="st3" points="256.5,8 255.2,8 188.3,8 187,8 184.7,14 190.6,14 252.9,14 258.8,14  "/>
+       <line class="st9" x1="2" y1="14.5" x2="262" y2="14.5"/>
+       <line class="st9" x1="2" y1="32.8" x2="262" y2="32.8"/>
+       <g>
+               <circle class="st10" cx="8.9" cy="22.6" r="3.6"/>
+               <line class="st10" x1="11.6" y1="25" x2="15" y2="28.5"/>
+       </g>
+       <rect x="20.9" y="19" class="st3" width="57.6" height="9.5"/>
+       <rect x="4.3" y="37" class="st3" width="69.2" height="32.7"/>
+       <rect x="4.3" y="72.5" class="st3" width="90.1" height="56.8"/>
+       <rect x="97" y="72.5" class="st11" width="106.5" height="56.8"/>
+       <rect x="206.3" y="72.5" class="st3" width="52.4" height="56.8"/>
+       <rect x="4.3" y="132.2" class="st3" width="36.5" height="25.3"/>
+       <rect x="43.7" y="132.2" class="st3" width="62.3" height="25.3"/>
+       <rect x="109.3" y="132.2" class="st3" width="18.1" height="25.3"/>
+       <rect x="169.1" y="132.2" class="st3" width="18.1" height="25.3"/>
+       <rect x="189.8" y="132.2" class="st3" width="18.1" height="25.3"/>
+       <rect x="210.6" y="132.2" class="st3" width="48.1" height="25.3"/>
+       <rect x="130" y="132.2" class="st3" width="36" height="25.3"/>
+       <rect x="115.2" y="37" class="st3" width="36.5" height="32.7"/>
+       <rect x="76.1" y="37" class="st3" width="36.5" height="32.7"/>
+       <rect x="154.6" y="37" class="st3" width="56" height="32.7"/>
+       <rect x="213.3" y="37" class="st3" width="45.4" height="32.7"/>
+       <path class="st2" d="M102.4,115.4l9.5-9.5l12.8,12.8l26.1-26.1l31.8,31.8h-80.3L102.4,115.4z"/>
+</g>
+</svg>
index 408f9e6..17c54d2 100644 (file)
@@ -1,53 +1,53 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
-<style type="text/css">\r
-       .st0{fill:#FFFFFF;}\r
-       .st1{fill:#E5E5E5;}\r
-       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
-       .st3{fill:none;stroke:#D02227;stroke-miterlimit:10;}\r
-       .st4{fill:#D02227;}\r
-</style>\r
-<g>\r
-       <rect x="166.2" y="5.5" class="st0" width="93" height="5"/>\r
-       <path class="st1" d="M258.8,6v4h-92V6H258.8 M259.8,5h-94v6h94V5L259.8,5z"/>\r
-</g>\r
-<polygon class="st1" points="86.3,8 87.6,8 154.4,8 155.8,8 158,14 152.2,14 89.8,14 84,14 "/>\r
-<polygon class="st1" points="7.5,8 8.8,8 75.7,8 77,8 79.3,14 73.4,14 11.1,14 5.2,14 "/>\r
-<line class="st2" x1="262" y1="14.5" x2="2" y2="14.5"/>\r
-<line class="st2" x1="262" y1="32.8" x2="2" y2="32.8"/>\r
-<g>\r
-       <circle class="st3" cx="255.1" cy="22.6" r="3.6"/>\r
-       <line class="st3" x1="252.4" y1="25" x2="249" y2="28.5"/>\r
-</g>\r
-<rect x="185.5" y="19" class="st1" width="57.6" height="9.5"/>\r
-<rect x="190.5" y="37" class="st1" width="69.2" height="32.7"/>\r
-<rect x="169.7" y="72.5" class="st1" width="90.1" height="56.8"/>\r
-<rect x="60.4" y="72.5" class="st4" width="106.5" height="56.8"/>\r
-<rect x="5.2" y="72.5" class="st1" width="52.4" height="56.8"/>\r
-<rect x="223.3" y="132.2" class="st1" width="36.5" height="25.3"/>\r
-<rect x="158" y="132.2" class="st1" width="62.3" height="25.3"/>\r
-<rect x="136.6" y="132.2" class="st1" width="18.1" height="25.3"/>\r
-<rect x="76.8" y="132.2" class="st1" width="18.1" height="25.3"/>\r
-<rect x="56.1" y="132.2" class="st1" width="18.1" height="25.3"/>\r
-<rect x="5.2" y="132.2" class="st1" width="48.1" height="25.3"/>\r
-<rect x="97.9" y="132.2" class="st1" width="36" height="25.3"/>\r
-<rect x="112.3" y="37" class="st1" width="36.5" height="32.7"/>\r
-<rect x="151.4" y="37" class="st1" width="36.5" height="32.7"/>\r
-<rect x="53.4" y="37" class="st1" width="56" height="32.7"/>\r
-<rect x="5.2" y="37" class="st1" width="45.4" height="32.7"/>\r
-<path class="st0" d="M161.7,124.3H81.4l31.8-31.8l26.1,26.1l12.8-12.8l9.5,9.5L161.7,124.3z"/>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+       .st1{fill:#E5E5E5;}
+       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
+       .st3{fill:none;stroke:#D02227;stroke-miterlimit:10;}
+       .st4{fill:#D02227;}
+</style>
+<g>
+       <rect x="166.2" y="5.5" class="st0" width="93" height="5"/>
+       <path class="st1" d="M258.8,6v4h-92V6H258.8 M259.8,5h-94v6h94V5L259.8,5z"/>
+</g>
+<polygon class="st1" points="86.3,8 87.6,8 154.4,8 155.8,8 158,14 152.2,14 89.8,14 84,14 "/>
+<polygon class="st1" points="7.5,8 8.8,8 75.7,8 77,8 79.3,14 73.4,14 11.1,14 5.2,14 "/>
+<line class="st2" x1="262" y1="14.5" x2="2" y2="14.5"/>
+<line class="st2" x1="262" y1="32.8" x2="2" y2="32.8"/>
+<g>
+       <circle class="st3" cx="255.1" cy="22.6" r="3.6"/>
+       <line class="st3" x1="252.4" y1="25" x2="249" y2="28.5"/>
+</g>
+<rect x="185.5" y="19" class="st1" width="57.6" height="9.5"/>
+<rect x="190.5" y="37" class="st1" width="69.2" height="32.7"/>
+<rect x="169.7" y="72.5" class="st1" width="90.1" height="56.8"/>
+<rect x="60.4" y="72.5" class="st4" width="106.5" height="56.8"/>
+<rect x="5.2" y="72.5" class="st1" width="52.4" height="56.8"/>
+<rect x="223.3" y="132.2" class="st1" width="36.5" height="25.3"/>
+<rect x="158" y="132.2" class="st1" width="62.3" height="25.3"/>
+<rect x="136.6" y="132.2" class="st1" width="18.1" height="25.3"/>
+<rect x="76.8" y="132.2" class="st1" width="18.1" height="25.3"/>
+<rect x="56.1" y="132.2" class="st1" width="18.1" height="25.3"/>
+<rect x="5.2" y="132.2" class="st1" width="48.1" height="25.3"/>
+<rect x="97.9" y="132.2" class="st1" width="36" height="25.3"/>
+<rect x="112.3" y="37" class="st1" width="36.5" height="32.7"/>
+<rect x="151.4" y="37" class="st1" width="36.5" height="32.7"/>
+<rect x="53.4" y="37" class="st1" width="56" height="32.7"/>
+<rect x="5.2" y="37" class="st1" width="45.4" height="32.7"/>
+<path class="st0" d="M161.7,124.3H81.4l31.8-31.8l26.1,26.1l12.8-12.8l9.5,9.5L161.7,124.3z"/>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
index c6bf6fe..ed07c61 100644 (file)
@@ -1,57 +1,57 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
-<style type="text/css">\r
-       .st0{fill:#FFFFFF;}\r
-       .st1{fill:#E5E5E5;}\r
-       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
-       .st3{fill:#D02227;}\r
-       .st4{fill:#9B9A9A;}\r
-</style>\r
-<g>\r
-       <rect x="4.8" y="5.5" class="st0" width="93" height="5"/>\r
-       <path class="st1" d="M97.2,6v4h-92V6H97.2 M98.2,5h-94v6h94V5L98.2,5z"/>\r
-</g>\r
-<polygon class="st1" points="177.7,8 176.4,8 109.6,8 108.2,8 106,14 111.8,14 174.2,14 180,14 "/>\r
-<polygon class="st1" points="256.5,8 255.2,8 188.3,8 187,8 184.7,14 190.6,14 252.9,14 258.8,14 "/>\r
-<line class="st2" x1="2" y1="14.5" x2="262" y2="14.5"/>\r
-<rect x="44" y="48.4" class="st3" width="106.5" height="56.8"/>\r
-<path class="st0" d="M49.3,91.2l9.5-9.5l12.8,12.8l26.1-26.1l31.8,31.8H49.3L49.3,91.2z"/>\r
-<circle class="st1" cx="55" cy="32.3" r="11.9"/>\r
-<g>\r
-       <rect x="70.7" y="27.4" class="st4" width="76.2" height="7"/>\r
-       <rect x="70.7" y="35.5" class="st4" width="22.3" height="1.7"/>\r
-       <rect x="95" y="35.5" class="st4" width="28.2" height="1.7"/>\r
-</g>\r
-<rect x="44" y="107.8" class="st1" width="23.3" height="23.3"/>\r
-<rect x="70.7" y="107.8" class="st1" width="79.8" height="1.8"/>\r
-<rect x="70.7" y="114" class="st1" width="79.8" height="1.8"/>\r
-<rect x="70.7" y="120.2" class="st1" width="79.8" height="1.8"/>\r
-<rect x="70.7" y="126.4" class="st1" width="79.8" height="1.8"/>\r
-<rect x="44" y="134.4" class="st1" width="106.5" height="1.8"/>\r
-<rect x="44" y="140.6" class="st1" width="106.5" height="1.8"/>\r
-<rect x="44" y="146.8" class="st1" width="106.5" height="1.8"/>\r
-<rect x="44" y="153" class="st1" width="106.5" height="1.8"/>\r
-<g>\r
-       <rect x="155.7" y="37.2" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="43.4" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="49.6" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="55.8" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="27.4" class="st1" width="57.3" height="7"/>\r
-</g>\r
-<g>\r
-       <rect x="155.7" y="78.2" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="84.4" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="90.6" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="96.8" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="68.4" class="st1" width="57.3" height="7"/>\r
-</g>\r
-<g>\r
-       <rect x="155.7" y="116.7" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="122.9" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="129.1" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="135.3" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="155.7" y="106.9" class="st1" width="57.3" height="7"/>\r
-</g>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+       .st1{fill:#E5E5E5;}
+       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
+       .st3{fill:#D02227;}
+       .st4{fill:#9B9A9A;}
+</style>
+<g>
+       <rect x="4.8" y="5.5" class="st0" width="93" height="5"/>
+       <path class="st1" d="M97.2,6v4h-92V6H97.2 M98.2,5h-94v6h94V5L98.2,5z"/>
+</g>
+<polygon class="st1" points="177.7,8 176.4,8 109.6,8 108.2,8 106,14 111.8,14 174.2,14 180,14 "/>
+<polygon class="st1" points="256.5,8 255.2,8 188.3,8 187,8 184.7,14 190.6,14 252.9,14 258.8,14 "/>
+<line class="st2" x1="2" y1="14.5" x2="262" y2="14.5"/>
+<rect x="44" y="48.4" class="st3" width="106.5" height="56.8"/>
+<path class="st0" d="M49.3,91.2l9.5-9.5l12.8,12.8l26.1-26.1l31.8,31.8H49.3L49.3,91.2z"/>
+<circle class="st1" cx="55" cy="32.3" r="11.9"/>
+<g>
+       <rect x="70.7" y="27.4" class="st4" width="76.2" height="7"/>
+       <rect x="70.7" y="35.5" class="st4" width="22.3" height="1.7"/>
+       <rect x="95" y="35.5" class="st4" width="28.2" height="1.7"/>
+</g>
+<rect x="44" y="107.8" class="st1" width="23.3" height="23.3"/>
+<rect x="70.7" y="107.8" class="st1" width="79.8" height="1.8"/>
+<rect x="70.7" y="114" class="st1" width="79.8" height="1.8"/>
+<rect x="70.7" y="120.2" class="st1" width="79.8" height="1.8"/>
+<rect x="70.7" y="126.4" class="st1" width="79.8" height="1.8"/>
+<rect x="44" y="134.4" class="st1" width="106.5" height="1.8"/>
+<rect x="44" y="140.6" class="st1" width="106.5" height="1.8"/>
+<rect x="44" y="146.8" class="st1" width="106.5" height="1.8"/>
+<rect x="44" y="153" class="st1" width="106.5" height="1.8"/>
+<g>
+       <rect x="155.7" y="37.2" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="43.4" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="49.6" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="55.8" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="27.4" class="st1" width="57.3" height="7"/>
+</g>
+<g>
+       <rect x="155.7" y="78.2" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="84.4" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="90.6" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="96.8" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="68.4" class="st1" width="57.3" height="7"/>
+</g>
+<g>
+       <rect x="155.7" y="116.7" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="122.9" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="129.1" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="135.3" class="st1" width="57.3" height="1.8"/>
+       <rect x="155.7" y="106.9" class="st1" width="57.3" height="7"/>
+</g>
+</svg>
index 080045a..dd8b0f0 100644 (file)
@@ -1,69 +1,69 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
-        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
-<style type="text/css">\r
-       .st0{fill:#FFFFFF;}\r
-       .st1{fill:#E5E5E5;}\r
-       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
-       .st3{fill:#D02227;}\r
-       .st4{fill:#9B9A9A;}\r
-</style>\r
-<g>\r
-       <rect x="166.2" y="5.5" class="st0" width="93" height="5"/>\r
-       <path class="st1" d="M258.8,6v4h-92V6H258.8 M259.8,5h-94v6h94V5L259.8,5z"/>\r
-</g>\r
-<polygon class="st1" points="86.3,8 87.6,8 154.4,8 155.8,8 158,14 152.2,14 89.8,14 84,14 "/>\r
-<polygon class="st1" points="7.5,8 8.8,8 75.7,8 77,8 79.3,14 73.4,14 11.1,14 5.2,14 "/>\r
-<line class="st2" x1="262" y1="14.5" x2="2" y2="14.5"/>\r
-<rect x="113.5" y="48.4" class="st3" width="106.5" height="56.8"/>\r
-<path class="st0" d="M214.7,100.2h-80.3l31.8-31.8l26.1,26.1l12.8-12.8l9.5,9.5L214.7,100.2z"/>\r
-<circle class="st1" cx="209" cy="32.3" r="11.9"/>\r
-<g>\r
-       <rect x="117" y="27.4" class="st4" width="76.2" height="7"/>\r
-       <rect x="171" y="35.5" class="st4" width="22.3" height="1.7"/>\r
-       <rect x="140.8" y="35.5" class="st4" width="28.2" height="1.7"/>\r
-</g>\r
-<rect x="196.7" y="107.8" class="st1" width="23.3" height="23.3"/>\r
-<rect x="113.5" y="107.8" class="st1" width="79.8" height="1.8"/>\r
-<rect x="113.5" y="114" class="st1" width="79.8" height="1.8"/>\r
-<rect x="113.5" y="120.2" class="st1" width="79.8" height="1.8"/>\r
-<rect x="113.5" y="126.4" class="st1" width="79.8" height="1.8"/>\r
-<rect x="113.5" y="134.4" class="st1" width="106.5" height="1.8"/>\r
-<rect x="113.5" y="140.6" class="st1" width="106.5" height="1.8"/>\r
-<rect x="113.5" y="146.8" class="st1" width="106.5" height="1.8"/>\r
-<rect x="113.5" y="153" class="st1" width="106.5" height="1.8"/>\r
-<g>\r
-       <rect x="51" y="37.2" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="43.4" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="49.6" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="55.8" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="27.4" class="st1" width="57.3" height="7"/>\r
-</g>\r
-<g>\r
-       <rect x="51" y="78.2" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="84.4" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="90.6" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="96.8" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="68.4" class="st1" width="57.3" height="7"/>\r
-</g>\r
-<g>\r
-       <rect x="51" y="116.7" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="122.9" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="129.1" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="135.3" class="st1" width="57.3" height="1.8"/>\r
-       <rect x="51" y="106.9" class="st1" width="57.3" height="7"/>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-<g>\r
-</g>\r
-</svg>\r
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+       .st1{fill:#E5E5E5;}
+       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
+       .st3{fill:#D02227;}
+       .st4{fill:#9B9A9A;}
+</style>
+<g>
+       <rect x="166.2" y="5.5" class="st0" width="93" height="5"/>
+       <path class="st1" d="M258.8,6v4h-92V6H258.8 M259.8,5h-94v6h94V5L259.8,5z"/>
+</g>
+<polygon class="st1" points="86.3,8 87.6,8 154.4,8 155.8,8 158,14 152.2,14 89.8,14 84,14 "/>
+<polygon class="st1" points="7.5,8 8.8,8 75.7,8 77,8 79.3,14 73.4,14 11.1,14 5.2,14 "/>
+<line class="st2" x1="262" y1="14.5" x2="2" y2="14.5"/>
+<rect x="113.5" y="48.4" class="st3" width="106.5" height="56.8"/>
+<path class="st0" d="M214.7,100.2h-80.3l31.8-31.8l26.1,26.1l12.8-12.8l9.5,9.5L214.7,100.2z"/>
+<circle class="st1" cx="209" cy="32.3" r="11.9"/>
+<g>
+       <rect x="117" y="27.4" class="st4" width="76.2" height="7"/>
+       <rect x="171" y="35.5" class="st4" width="22.3" height="1.7"/>
+       <rect x="140.8" y="35.5" class="st4" width="28.2" height="1.7"/>
+</g>
+<rect x="196.7" y="107.8" class="st1" width="23.3" height="23.3"/>
+<rect x="113.5" y="107.8" class="st1" width="79.8" height="1.8"/>
+<rect x="113.5" y="114" class="st1" width="79.8" height="1.8"/>
+<rect x="113.5" y="120.2" class="st1" width="79.8" height="1.8"/>
+<rect x="113.5" y="126.4" class="st1" width="79.8" height="1.8"/>
+<rect x="113.5" y="134.4" class="st1" width="106.5" height="1.8"/>
+<rect x="113.5" y="140.6" class="st1" width="106.5" height="1.8"/>
+<rect x="113.5" y="146.8" class="st1" width="106.5" height="1.8"/>
+<rect x="113.5" y="153" class="st1" width="106.5" height="1.8"/>
+<g>
+       <rect x="51" y="37.2" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="43.4" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="49.6" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="55.8" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="27.4" class="st1" width="57.3" height="7"/>
+</g>
+<g>
+       <rect x="51" y="78.2" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="84.4" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="90.6" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="96.8" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="68.4" class="st1" width="57.3" height="7"/>
+</g>
+<g>
+       <rect x="51" y="116.7" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="122.9" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="129.1" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="135.3" class="st1" width="57.3" height="1.8"/>
+       <rect x="51" y="106.9" class="st1" width="57.3" height="7"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
index aa2998b..d896756 100644 (file)
                this.selectFileWidget.on( 'change', onUploadFormChange.bind( this ) );
                this.ownWorkCheckbox.on( 'change', onUploadFormChange.bind( this ) );
 
+               this.selectFileWidget.on( 'change', function () {
+                       var file = layout.getFile();
+
+                       // Set the date to lastModified once we have the file
+                       if ( layout.getDateFromLastModified( file ) !== undefined ) {
+                               layout.dateWidget.setValue( layout.getDateFromLastModified( file ) );
+                       }
+
+                       // Check if we have EXIF data and set to that where available
+                       layout.getDateFromExif( file ).done( function ( date ) {
+                               layout.dateWidget.setValue( date );
+                       } );
+               } );
+
                return this.uploadForm;
        };
 
                        multiline: true,
                        autosize: true
                } );
-               this.dateWidget = new mw.widgets.DateInputWidget( {
-                       $overlay: this.$overlay,
-                       required: true,
-                       mustBeBefore: moment().add( 1, 'day' ).locale( 'en' ).format( 'YYYY-MM-DD' ) // Tomorrow
-               } );
                this.categoriesWidget = new mw.widgets.CategorySelector( {
                        // Can't be done here because we don't know the target wiki yet... done in #initialize.
                        // api: new mw.ForeignApi( ... ),
                        $overlay: this.$overlay
                } );
+               this.dateWidget = new mw.widgets.DateInputWidget( {
+                       $overlay: this.$overlay,
+                       required: true,
+                       mustBeBefore: moment().add( 1, 'day' ).locale( 'en' ).format( 'YYYY-MM-DD' ) // Tomorrow
+               } );
 
                fieldset = new OO.ui.FieldsetLayout( {
                        label: mw.msg( 'upload-form-label-infoform-title' )
                return this.upload.getText();
        };
 
+       /**
+        * Get original date from EXIF data
+        *
+        * @param {Object} file
+        * @return {jQuery.Promise} Promise resolved with the EXIF date
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.getDateFromExif = function ( file ) {
+               var fileReader,
+                       deferred = $.Deferred();
+
+               if ( file && file.type === 'image/jpeg' ) {
+                       fileReader = new FileReader();
+                       fileReader.onload = function () {
+                               var fileStr, arr, i, metadata;
+
+                               if ( typeof fileReader.result === 'string' ) {
+                                       fileStr = fileReader.result;
+                               } else {
+                                       // Array buffer; convert to binary string for the library.
+                                       arr = new Uint8Array( fileReader.result );
+                                       fileStr = '';
+                                       for ( i = 0; i < arr.byteLength; i++ ) {
+                                               fileStr += String.fromCharCode( arr[ i ] );
+                                       }
+                               }
+
+                               try {
+                                       metadata = mw.libs.jpegmeta( this.result, file.name );
+                               } catch ( e ) {
+                                       metadata = null;
+                               }
+
+                               if ( metadata !== null && metadata.exif !== undefined && metadata.exif.DateTimeOriginal ) {
+                                       deferred.resolve( moment( metadata.exif.DateTimeOriginal, 'YYYY:MM:DD' ).format( 'YYYY-MM-DD' ) );
+                               } else {
+                                       deferred.reject();
+                               }
+                       };
+
+                       if ( 'readAsBinaryString' in fileReader ) {
+                               fileReader.readAsBinaryString( file );
+                       } else if ( 'readAsArrayBuffer' in fileReader ) {
+                               fileReader.readAsArrayBuffer( file );
+                       } else {
+                               // We should never get here
+                               deferred.reject();
+                               throw new Error( 'Cannot read thumbnail as binary string or array buffer.' );
+                       }
+               }
+
+               return deferred.promise();
+       };
+
+       /**
+        * Get last modified date from file
+        *
+        * @param {Object} file
+        * @return {Object} Last modified date from file
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.getDateFromLastModified = function ( file ) {
+               if ( file && file.lastModified ) {
+                       return moment( file.lastModified ).format( 'YYYY-MM-DD' );
+               }
+       };
+
        /* Setters */
 
        /**
index 47250ee..033636c 100644 (file)
                 * @return {string}
                 */
                getUrl: function ( params ) {
-                       return mw.util.getUrl( this.toString(), params );
+                       var fragment = this.getFragment();
+                       if ( fragment ) {
+                               return mw.util.getUrl( this.toString() + '#' + this.getFragment(), params );
+                       } else {
+                               return mw.util.getUrl( this.toString(), params );
+                       }
                },
 
                /**
diff --git a/tests/phpunit/includes/ExportTest.php b/tests/phpunit/includes/ExportTest.php
new file mode 100644 (file)
index 0000000..2026030
--- /dev/null
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Test class for Export methods.
+ *
+ * @group Database
+ *
+ * @author Isaac Hutt <mhutti1@gmail.com>
+ */
+class ExportTest extends MediaWikiLangTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( array(
+                       'wgContLang' => Language::factory( 'en' ),
+                       'wgLanguageCode' => 'en',
+                       'wgCapitalLinks' => true,
+               ) );
+       }
+
+       /**
+        * @covers WikiExporter::pageByTitle
+        */
+       public function testPageByTitle() {
+               global $wgContLang;
+               $pageTitle = 'UTPage';
+
+               $exporter = new WikiExporter(
+                       $this->db,
+                       WikiExporter::FULL
+               );
+
+               $title = Title::newFromText( $pageTitle );
+
+               ob_start();
+               $exporter->openStream();
+               $exporter->pageByTitle( $title );
+               $exporter->closeStream();
+               $xmlString = ob_get_clean();
+
+               // This throws error if invalid xml output
+               $xmlObject = simplexml_load_string( $xmlString );
+
+               /**
+                * Check namespaces match xml
+                * FIXME: PHP 5.3 support. When we don't support PHP 5.3,
+                * add ->namespace to object and remove from array
+                */
+               $xmlNamespaces = (array) $xmlObject->siteinfo->namespaces;
+               $xmlNamespaces = str_replace( ' ', '_', $xmlNamespaces['namespace'] );
+               unset ( $xmlNamespaces[ '@attributes' ] );
+               foreach ( $xmlNamespaces as &$namespaceObject ) {
+                       if ( is_object( $namespaceObject ) ) {
+                               $namespaceObject = '';
+                       }
+               }
+
+               $actualNamespaces = (array) $wgContLang->getNamespaces();
+               $actualNamespaces = array_values( $actualNamespaces );
+               $this->assertEquals( $actualNamespaces, $xmlNamespaces );
+
+               // Check xml page title correct
+               $xmlTitle = (array) $xmlObject->page->title;
+               $this->assertEquals( $pageTitle, $xmlTitle[0] );
+
+               // Check xml page text is not empty
+               $text = (array) $xmlObject->page->revision->text;
+               $this->assertNotEquals( '', $text[0] );
+       }
+
+}
index 9866ce1..d2b267a 100644 (file)
@@ -167,7 +167,6 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                }
        }
 
-
        public function testBatchHandlesNullFormatterResult() {
                $produce = $this->getMockBuilder( 'Kafka\Produce' )
                        ->disableOriginalConstructor()
index 66fe90c..0aef146 100644 (file)
@@ -60,6 +60,4 @@ class HttpErrorTest extends MediaWikiTestCase {
                        )
                );
        }
-
-
 }
index 921bba8..6edb3d8 100644 (file)
@@ -20,7 +20,6 @@ class ArrayBackedMemoizedCallable extends MemoizedCallable {
        }
 }
 
-
 /**
  * PHP Unit tests for MemoizedCallable class.
  * @covers MemoizedCallable
index 17decf3..8010b77 100644 (file)
@@ -160,7 +160,6 @@ class ProtectLogFormatterTest extends LogFormatterTestCase {
                );
        }
 
-
        /**
         * @dataProvider provideProtectLogDatabaseRows
         */
@@ -329,7 +328,6 @@ class ProtectLogFormatterTest extends LogFormatterTestCase {
                );
        }
 
-
        /**
         * @dataProvider provideModifyLogDatabaseRows
         */
@@ -362,7 +360,6 @@ class ProtectLogFormatterTest extends LogFormatterTestCase {
                );
        }
 
-
        /**
         * @dataProvider provideUnprotectLogDatabaseRows
         */
index 8f28158..cb10be3 100644 (file)
@@ -11,7 +11,6 @@ abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
        /** @var string */
        protected $filePath;
 
-
        protected function setUp() {
                parent::setUp();
 
index 5b2de15..536827a 100644 (file)
@@ -13,7 +13,6 @@ class XCFHandlerTest extends MediaWikiMediaTestCase {
                $this->handler = new XCFHandler();
        }
 
-
        /**
         * @param string $filename
         * @param int $expectedWidth Width
index ddf552e..843f576 100644 (file)
@@ -166,7 +166,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                }
        }
 
-
        public static function provideExtractMessagesDirs() {
                $dir = __DIR__ . '/FooBar/';
                return array(
@@ -400,7 +399,6 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
        }
 }
 
-
 /**
  * Allow overriding the default value of $this->globals
  * so we can test merging
index 9ec1b46..90051ee 100644 (file)
@@ -125,7 +125,6 @@ class UploadBaseTest extends MediaWikiTestCase {
                );
        }
 
-
        /**
         * @dataProvider provideCheckSvgScriptCallback
         */
index d224af8..61d9a70 100644 (file)
@@ -221,7 +221,6 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
                return call_user_func_array( array( $this, 'onConsecutiveCalls' ), $retvals );
        }
 
-
        protected function genSelectResult( $batchSize, $numRows, $rowGenerator ) {
                $res = array();
                for ( $i = 0; $i < $numRows; $i += $batchSize ) {
index 2c51af3..5dc0498 100644 (file)
@@ -91,6 +91,4 @@ class MWCryptHKDFTest extends MediaWikiTestCase {
                );
                // @codingStandardsIgnoreEnd
        }
-
-
 }
index aaa7751..09dc931 100755 (executable)
@@ -242,7 +242,6 @@ if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
        } );
 }
 
-
 $ok = false;
 
 if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
@@ -251,12 +250,19 @@ if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
 } else {
        foreach ( array(
                                stream_resolve_include_path( 'phpunit.phar' ),
+                               stream_resolve_include_path( 'phpunit-old.phar' ),
                                'PHPUnit/Runner/Version.php',
                                'PHPUnit/Autoload.php'
                        ) as $includePath ) {
-               // @codingStandardsIgnoreStart
-               @include_once $includePath;
-               // @codingStandardsIgnoreEnd
+
+               if ( $includePath === false ) {
+                       // stream_resolve_include_path can return false
+                       continue;
+               }
+
+               \MediaWiki\suppressWarnings();
+               include_once $includePath;
+               \MediaWiki\restoreWarnings();
                if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
                        $ok = true;
                        echo "Using PHPUnit from $includePath\n";
index 4bcb12e..2e63b7a 100644 (file)
 
        } );
 
-       QUnit.test( 'getUrl', 3, function ( assert ) {
+       QUnit.test( 'getUrl', 4, function ( assert ) {
                var title;
 
                // Config
 
                title = new mw.Title( 'John Doe', 3 );
                assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
+
+               title = new mw.Title( 'John Cena#And_His_Name_Is', 3 );
+               assert.equal( title.getUrl( { meme: true } ), '/wiki/User_talk:John_Cena?meme=true#And_His_Name_Is', 'title with fragment and query parameter' );
        } );
 
        QUnit.test( 'newFromImg', 44, function ( assert ) {
index fed0258..04b3e42 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -567,7 +567,6 @@ function wfExtractThumbParams( $file, $params ) {
        return null;
 }
 
-
 /**
  * Output a thumbnail generation error message
  *