Merge "Use delete_and_move_reason in content language on move over redirect"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 12 Apr 2017 18:13:52 +0000 (18:13 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 12 Apr 2017 18:13:52 +0000 (18:13 +0000)
233 files changed:
.gitignore
HISTORY
RELEASE-NOTES-1.29
UPGRADE
autoload.php
composer.json
docs/hooks.txt
includes/Block.php
includes/DefaultSettings.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Linker.php
includes/OutputPage.php
includes/Revision.php
includes/Sanitizer.php
includes/SiteStats.php
includes/Title.php
includes/WatchedItemQueryService.php
includes/WikiMap.php
includes/actions/InfoAction.php
includes/api/ApiBase.php
includes/api/ApiMain.php
includes/api/ApiOpenSearch.php
includes/api/ApiPageSet.php
includes/api/ApiQuery.php
includes/api/ApiQueryBase.php
includes/api/i18n/cs.json
includes/api/i18n/fr.json
includes/api/i18n/lb.json
includes/api/i18n/zh-hans.json
includes/auth/Throttler.php
includes/cache/BacklinkCache.php
includes/cache/LinkCache.php
includes/cache/MessageBlobStore.php
includes/cache/MessageCache.php
includes/changes/RecentChange.php
includes/changetags/ChangeTags.php
includes/config/EtcdConfig.php [new file with mode: 0644]
includes/dao/DBAccessBase.php
includes/db/DatabaseOracle.php
includes/deferred/LinksUpdate.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/LocalFile.php
includes/htmlform/OOUIHTMLForm.php
includes/http/CurlHttpRequest.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/MssqlInstaller.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlInstaller.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteInstaller.php
includes/installer/SqliteUpdater.php
includes/installer/i18n/roa-tara.json
includes/interwiki/ClassicInterwikiLookup.php
includes/jobqueue/JobQueueGroup.php
includes/libs/DnsSrvDiscoverer.php
includes/libs/lockmanager/DBLockManager.php
includes/libs/rdbms/connectionmanager/ConnectionManager.php
includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php
includes/libs/rdbms/database/DBConnRef.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMssql.php
includes/libs/rdbms/database/DatabaseMysql.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabaseMysqli.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/IMaintainableDatabase.php
includes/libs/rdbms/database/MaintainableDBConnRef.php
includes/libs/rdbms/database/utils/SavepointPostgres.php
includes/libs/rdbms/exception/DBQueryError.php
includes/libs/rdbms/field/PostgresField.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/objectcache/SqlBagOStuff.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialAutoblockList.php [new file with mode: 0644]
includes/specials/SpecialEmailuser.php
includes/specials/SpecialNewpages.php [changed mode: 0755->0644]
includes/specials/SpecialUserrights.php
includes/specials/SpecialWatchlist.php
includes/user/BotPassword.php
includes/user/User.php
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/ba.json
languages/i18n/bar.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dty.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/got.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lt.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ms.json
languages/i18n/my.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/or.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sco.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/tcy.json
languages/i18n/tet.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/vi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesEn.php
maintenance/dictionary/mediawiki.dic
maintenance/rebuildtextindex.php
maintenance/sqlite.inc
resources/Resources.php
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/images/icons/articles-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/articles-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.svg
resources/lib/oojs-ui/themes/mediawiki/indicators.json
resources/src/mediawiki.legacy/wikibits.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.notification.css
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.toc.js
tests/parser/parserTests.txt
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/data/resourceloader/oouiimagemodule/apex/icons.json [new file with mode: 0644]
tests/phpunit/data/resourceloader/oouiimagemodule/apex/images/icons/search.svg [new file with mode: 0644]
tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/icons.json [new file with mode: 0644]
tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/images/icons/search.svg [new file with mode: 0644]
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/api/ApiPageSetTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/libs/DnsSrvDiscovererTest.php
tests/phpunit/includes/objectcache/ObjectCacheTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderOOUIImageModuleTest.php [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js

index b2c4d45..a82ae21 100644 (file)
@@ -72,3 +72,4 @@ Thumbs.db
 /.htaccess
 /.htpasswd
 /tests/phan/issues
+*.rej
diff --git a/HISTORY b/HISTORY
index 7f365ac..c6ce06c 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,5 +1,44 @@
 Change notes from older releases. For current info see RELEASE-NOTES-1.29.
 
+= MediaWiki 1.28 =
+
+== MediaWiki 1.28.1 ==
+
+This is a security and maintenance release of the MediaWiki 1.28 branch.
+
+=== Changes since 1.28.0 ===
+
+* $wgRunJobsAsync is now false by default (T142751). This change only affects
+  wikis with $wgJobRunRate > 0.
+* Fix fatal from "WaitConditionLoop" not being found, experienced when a wiki has
+  more than one database server setup.
+* (T152717) Better escaping for PHP mail() command,
+* (T154670) A missing method causing the MySQL installer to fatal in rare
+  circumstances was restored.
+* (T154672) Un-deprecate ArticleAfterFetchContentObject hook.
+* (T158766) Avoid SQL error on MSSQL when using selectRowCount().
+* (T145635) Fix too long index error when installing with MSSQL.
+* (T156184) $wgRawHtml will no longer apply to internationalization messages.
+* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed.
+* (T154872) Fix incorrect ar_usertext_timestamp index names in new 1.28 installs.
+* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect
+  to interwiki links.
+* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when
+  $wgAdvancedSearchHighlighting is true.
+* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep
+  their values out of the logs.
+* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF
+  token.
+* (T156184) SECURITY: Escape content model/format url parameter in message.
+* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD
+  declaration.
+* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory
+  in it's fallback chain when trying to work out where to write the cache.
+* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion
+  syntax's link parameter.
+* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against
+  it.
+
 == MediaWiki 1.28 ==
 
 === Changes since 1.28.0-rc1 ===
@@ -326,6 +365,49 @@ There's usually someone online in #mediawiki on irc.freenode.net.
 
 = MediaWiki 1.27 =
 
+== MediaWiki 1.27.2 ==
+This is a security and maintenance release of the MediaWiki 1.27 branch.
+
+ApiCreateAccount was removed in 1.27.0. It was incorrectly still marked as
+deprecated (rather than already removed) in the RELEASE-NOTES at the point 1.27.0
+was released.
+
+=== Changes since 1.27.1 ===
+
+* (T68404) CSS3 attr() function with url type argument is no longer allowed
+  in inline styles.
+* $wgRunJobsAsync is now false by default (T142751). This change only affects
+  wikis with $wgJobRunRate > 0.
+* (T152717) Better escaping for PHP mail() command
+* Submitting the lgtoken and lgpassword parameters in the query string to
+  action=login is now deprecated and outputs a warning. They should be submitted
+  in the POST body instead.
+* Submitting sensitive authentication request parameters to action=clientlogin,
+  action=createaccount, action=linkaccount, and action=changeauthenticationdata
+  in the query string is now deprecated and outputs a warning. They should be
+  submitted in the POST body instead.
+* (T158766) Avoid SQL error on MSSQL when using selectRowCount()
+* (T145635) Fix too long index error when installing with MSSQL.
+* (T156184) $wgRawHtml will no longer apply to internationalization messages.
+* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed.
+* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect
+  to interwiki links.
+* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when
+  $wgAdvancedSearchHighlighting is true.
+* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep
+  their values out of the logs.
+* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF
+  token.
+* (T156184) SECURITY: Escape content model/format url parameter in message.
+* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD
+  declaration.
+* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory
+  in it's fallback chain when trying to work out where to write the cache.
+* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion
+  syntax's link parameter.
+* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against
+  it.
+
 == MediaWiki 1.27.1 ==
 
 This is a maintenance release of the MediaWiki 1.27 branch.
@@ -2670,6 +2752,32 @@ of files that are no longer available follows.
 
 = MediaWiki 1.23 =
 
+== MediaWiki 1.23.16 ==
+This is a security and maintenance release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.15 ===
+* (T68404) CSS3 attr() function with url type is no longer allowed
+  in inline styles.
+* (T156184) $wgRawHtml will no longer apply to internationalization messages.
+* Submitting the lgtoken and lgpassword parameters in the query string to
+  action=login is now deprecated and outputs a warning. They should be submitted
+  in the POST body instead.
+* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect
+  to interwiki links.
+* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when
+  $wgAdvancedSearchHighlighting is true.
+* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep
+  their values out of the logs.
+* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF
+  token.
+* (T156184) SECURITY: Escape content model/format url parameter in message.
+* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD
+  declaration.
+* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion
+  syntax's link parameter.
+* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against
+  it.
+
 == MediaWiki 1.23.15 ==
 
 This is a maintenance release of the MediaWiki 1.23 branch.
index 4b7de88..33d917c 100644 (file)
@@ -37,6 +37,8 @@ production.
   added to $wgExtraLanguageCodes instead.
 * (T161453) LocalisationCache will no longer use the temporary directory in it's
   fallback chain when trying to work out where to write the cache.
+* The user right 'editusercssjs' (deprecated in 1.16) was removed. Use
+  'editusercss' and 'edituserjs' in $wgGroupPermissions and elsewhere instead.
 
 === New features in 1.29 ===
 * (T5233) A cookie can now be set when a user is autoblocked, to track that user
@@ -307,14 +309,24 @@ changes to languages because of Phabricator reports.
 * (T156184) $wgRawHtml will no longer apply to internationalization messages.
 * Browser support for non-ES5 JavaScript browsers, including Android 2,
   Opera <12.10, and Internet Explorer 9, was lowered from Grade A to Grade C.
+* Removed wikibits global methods deprecated since MediaWiki 1.17 (T122755):
+  is_gecko, is_chrome_mac, is_chrome, webkit_version, is_safari_win, is_safari,
+  webkit_match, is_ff2, ff2_bugs, is_ff2_win, is_ff2_x11, opera95_bugs,
+  opera7_bugs, opera6_bugs, is_opera_95, is_opera_preseven, is_opera,
+  ie6_bugs, clientPC, changeText, killEvt, addHandler, hookEvent,
+  addClickHandler, removeHandler, getElementsByClassName, getInnerText,
+  setupCheckboxShiftClick, addCheckboxClickHandlers, mwEditButtons,
+  mwCustomEditButtons, injectSpinner, removeSpinner, escapeQuotes,
+  escapeQuotesHTML, jsMsg, addPortletLink, appendCSS, tooltipAccessKeyPrefix,
+  tooltipAccessKeyRegexp, updateTooltipAccessKeys.
 
 == Compatibility ==
 
 MediaWiki 1.29 requires PHP 5.5.9 or later. There is experimental support for
 HHVM 3.6.5 or later.
 
-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
+MySQL/MariaDB 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.
 
 The supported versions are:
@@ -332,20 +344,10 @@ 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.
+See the file UPGRADE for more detailed upgrade instructions, including
+important information when upgrading from versions prior to 1.11.
 
 For notes on 1.28.x and older releases, see HISTORY.
 
diff --git a/UPGRADE b/UPGRADE
index 3ec1a22..0e6ad9b 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -109,6 +109,12 @@ In the "maintenance" directory, run the updateDoubleWidthSearch.php
 script.  This will update the searchindex table for those pages that
 contain double-byte latin characters.
 
+== Upgrading from 1.10 or earlier ==
+
+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.
+
 == Upgrading from 1.8 or earlier ==
 
 MediaWiki 1.9 and later no longer keep default localized message text
@@ -135,6 +141,9 @@ to set only specific items as recommended in DefaultSettings.php.
 
 $wgLocalTZoffset was in hours, it is now using minutes.
 
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
 == Upgrading from 1.5 or earlier ==
 
 Major changes have been made to the schema from 1.4.x. The updater
@@ -149,7 +158,7 @@ UTF-8; an experimental command-line upgrade helper script,
 'upgrade1_5.php', can do this -- run it prior to 'update.php' or
 the web upgrader.
 
-NOTE that upgrade1_5.php does not work properly with recent version
+NOTE that upgrade1_5.php does not work properly with recent versions
 of MediaWiki. If upgrading a 1.4.x wiki, you should upgrade to 1.5
 first.  upgrade1_5.php has been removed from MediaWiki 1.21.
 
index 3816485..bfac50d 100644 (file)
@@ -427,6 +427,7 @@ $wgAutoloadLocalClasses = [
        'EnqueueableDataUpdate' => __DIR__ . '/includes/deferred/EnqueueableDataUpdate.php',
        'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php',
        'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
+       'EtcdConfig' => __DIR__ . '/includes/config/EtcdConfig.php',
        'EventRelayer' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
        'EventRelayerGroup' => __DIR__ . '/includes/EventRelayerGroup.php',
        'EventRelayerKafka' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerKafka.php',
@@ -1259,7 +1260,6 @@ $wgAutoloadLocalClasses = [
        'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
        'SamplingStatsdClient' => __DIR__ . '/includes/libs/stats/SamplingStatsdClient.php',
        'Sanitizer' => __DIR__ . '/includes/Sanitizer.php',
-       'SavepointPostgres' => __DIR__ . '/includes/libs/rdbms/database/utils/SavepointPostgres.php',
        'ScopedCallback' => __DIR__ . '/includes/compat/ScopedCallback.php',
        'ScopedLock' => __DIR__ . '/includes/libs/lockmanager/ScopedLock.php',
        'SearchApi' => __DIR__ . '/includes/api/SearchApi.php',
@@ -1319,6 +1319,7 @@ $wgAutoloadLocalClasses = [
        'SpecialAllPages' => __DIR__ . '/includes/specials/SpecialAllPages.php',
        'SpecialApiHelp' => __DIR__ . '/includes/specials/SpecialApiHelp.php',
        'SpecialApiSandbox' => __DIR__ . '/includes/specials/SpecialApiSandbox.php',
+       'SpecialAutoblockList' => __DIR__ . '/includes/specials/SpecialAutoblockList.php',
        'SpecialBlankpage' => __DIR__ . '/includes/specials/SpecialBlankpage.php',
        'SpecialBlock' => __DIR__ . '/includes/specials/SpecialBlock.php',
        'SpecialBlockList' => __DIR__ . '/includes/specials/SpecialBlockList.php',
@@ -1595,7 +1596,14 @@ $wgAutoloadLocalClasses = [
        'Wikimedia\\Rdbms\\ConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/ConnectionManager.php',
        'Wikimedia\\Rdbms\\DBConnRef' => __DIR__ . '/includes/libs/rdbms/database/DBConnRef.php',
        'Wikimedia\\Rdbms\\DBMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/DBMasterPos.php',
+       'Wikimedia\\Rdbms\\Database' => __DIR__ . '/includes/libs/rdbms/database/Database.php',
        'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php',
+       'Wikimedia\\Rdbms\\DatabaseMssql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMssql.php',
+       'Wikimedia\\Rdbms\\DatabaseMysql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysql.php',
+       'Wikimedia\\Rdbms\\DatabaseMysqlBase' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqlBase.php',
+       'Wikimedia\\Rdbms\\DatabaseMysqli' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqli.php',
+       'Wikimedia\\Rdbms\\DatabasePostgres' => __DIR__ . '/includes/libs/rdbms/database/DatabasePostgres.php',
+       'Wikimedia\\Rdbms\\DatabaseSqlite' => __DIR__ . '/includes/libs/rdbms/database/DatabaseSqlite.php',
        'Wikimedia\\Rdbms\\FakeResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php',
        'Wikimedia\\Rdbms\\Field' => __DIR__ . '/includes/libs/rdbms/field/Field.php',
        'Wikimedia\\Rdbms\\IBlob' => __DIR__ . '/includes/libs/rdbms/encasing/IBlob.php',
@@ -1625,6 +1633,7 @@ $wgAutoloadLocalClasses = [
        'Wikimedia\\Rdbms\\PostgresField' => __DIR__ . '/includes/libs/rdbms/field/PostgresField.php',
        'Wikimedia\\Rdbms\\ResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/ResultWrapper.php',
        'Wikimedia\\Rdbms\\SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.php',
+       'Wikimedia\\Rdbms\\SavepointPostgres' => __DIR__ . '/includes/libs/rdbms/database/utils/SavepointPostgres.php',
        'Wikimedia\\Rdbms\\SessionConsistentConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php',
        'Wikimedia\\Rdbms\\TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php',
        'WikitextContent' => __DIR__ . '/includes/content/WikitextContent.php',
index 81abe40..44a5eb4 100644 (file)
@@ -25,7 +25,7 @@
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.20.2",
+               "oojs/oojs-ui": "0.21.0",
                "oyejorge/less.php": "1.7.0.14",
                "php": ">=5.5.9",
                "psr/log": "1.0.2",
index bee4477..060af89 100644 (file)
@@ -2312,6 +2312,10 @@ $page: the Page that was rendered.
 $title: the Title of the rendered page.
 $parserOutput: ParserOutput resulting from rendering the page.
 
+'OtherAutoblockLogLink': Get links to the autoblock log from extensions which
+autoblocks users and/or IP addresses too.
+&$otherBlockLink: An array with links to other autoblock logs
+
 'OtherBlockLogLink': Get links to the block log from extensions which blocks
 users and/or IP addresses too.
 &$otherBlockLink: An array with links to other block logs
@@ -3589,6 +3593,10 @@ $removed: Groups removed
 $performer: User who performed the change, false if via autopromotion
 $reason: The reason, if any, given by the user performing the change,
 false if via autopromotion.
+$oldUGMs: An associative array (group name => UserGroupMembership object) of
+the user's group memberships before the change.
+$newUGMs: An associative array (group name => UserGroupMembership object) of
+the user's current group memberships.
 
 'UserIsBlockedFrom': Check if a user is blocked from a specific page (for
 specific block exemptions).
index b6b3ae0..0b7f7b2 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 
index d158c1e..53a147b 100644 (file)
@@ -7394,6 +7394,19 @@ $wgJobQueueAggregator = [
        'class' => 'JobQueueAggregatorNull'
 ];
 
+/**
+ * Whether to include the number of jobs that are queued
+ * for the API's maxlag parameter.
+ * The total number of jobs will be divided by this to get an
+ * estimated second of maxlag. Typically bots backoff at maxlag=5,
+ * so setting this to the max number of jobs that should be in your
+ * queue divided by 5 should have the effect of stopping bots once
+ * that limit is hit.
+ *
+ * @since 1.29
+ */
+$wgJobQueueIncludeInMaxLagFactor = false;
+
 /**
  * Additional functions to be performed with updateSpecialPages.
  * Expensive Querypages are already updated.
index 2153b8c..7bdc3bc 100644 (file)
@@ -2633,7 +2633,7 @@ class EditPage {
                }
 
                // @todo add EditForm plugin interface and use it here!
-               //       search for textarea1 and textares2, and allow EditForm to override all uses.
+               //       search for textarea1 and textarea2, and allow EditForm to override all uses.
                $wgOut->addHTML( Html::openElement(
                        'form',
                        [
index 3747c23..243d066 100644 (file)
@@ -3072,7 +3072,7 @@ function wfSplitWikiID( $wiki ) {
  * @todo Replace calls to wfGetDB with calls to LoadBalancer::getConnection()
  *       on an injected instance of LoadBalancer.
  *
- * @return Database
+ * @return \Wikimedia\Rdbms\Database
  */
 function wfGetDB( $db, $groups = [], $wiki = false ) {
        return wfGetLB( $wiki )->getConnection( $db, $groups, $wiki );
index 816271f..bed9957 100644 (file)
@@ -1561,7 +1561,7 @@ class Linker {
                $title = wfMessage( 'toc' )->inLanguage( $lang )->escaped();
 
                return '<div id="toc" class="toc">'
-                       . '<div id="toctitle"><h2>' . $title . "</h2></div>\n"
+                       . '<div id="toctitle" class="toctitle"><h2>' . $title . "</h2></div>\n"
                        . $toc
                        . "</ul>\n</div>\n";
        }
index 5380264..df49bf6 100644 (file)
@@ -302,6 +302,11 @@ class OutputPage extends ContextSource {
        /** @var array Profiling data */
        private $limitReportJSData = [];
 
+       /**
+        * Link: header contents
+        */
+       private $mLinkHeader = [];
+
        /**
         * Constructor for OutputPage. This should not be called directly.
         * Instead a new RequestContext should be created and it will implicitly create
@@ -2105,6 +2110,28 @@ class OutputPage extends ContextSource {
                return 'Vary: ' . implode( ', ', array_keys( $this->mVaryHeader ) );
        }
 
+       /**
+        * Add an HTTP Link: header
+        *
+        * @param string $header Header value
+        */
+       public function addLinkHeader( $header ) {
+               $this->mLinkHeader[] = $header;
+       }
+
+       /**
+        * Return a Link: header. Based on the values of $mLinkHeader.
+        *
+        * @return string
+        */
+       public function getLinkHeader() {
+               if ( !$this->mLinkHeader ) {
+                       return false;
+               }
+
+               return 'Link: ' . implode( ',', $this->mLinkHeader );
+       }
+
        /**
         * Get a complete Key header
         *
@@ -2361,6 +2388,12 @@ class OutputPage extends ContextSource {
                // jQuery etc. can work correctly.
                $response->header( 'X-UA-Compatible: IE=Edge' );
 
+               $this->addLogoPreloadLinkHeaders();
+               $linkHeader = $this->getLinkHeader();
+               if ( $linkHeader ) {
+                       $response->header( $linkHeader );
+               }
+
                // Prevent framing, if requested
                $frameOptions = $this->getFrameOptions();
                if ( $frameOptions ) {
@@ -2370,6 +2403,11 @@ class OutputPage extends ContextSource {
                if ( $this->mArticleBodyOnly ) {
                        echo $this->mBodytext;
                } else {
+                       // Enable safe mode if requested
+                       if ( $this->getRequest()->getBool( 'safemode' ) ) {
+                               $this->disallowUserJs();
+                       }
+
                        $sk = $this->getSkin();
                        // add skin specific modules
                        $modules = $sk->getDefaultModules();
@@ -3960,4 +3998,82 @@ class OutputPage extends ContextSource {
                        'mediawiki.widgets.styles',
                ] );
        }
+
+       /**
+        * Add Link headers for preloading the wiki's logo.
+        *
+        * @since 1.26
+        */
+       protected function addLogoPreloadLinkHeaders() {
+               $logo = $this->getConfig()->get( 'Logo' ); // wgLogo
+               $logoHD = $this->getConfig()->get( 'LogoHD' ); // wgLogoHD
+
+               $tags = [];
+               $logosPerDppx = [];
+               $logos = [];
+
+               $logosPerDppx['1.0'] = $logo;
+
+               if ( !$logoHD ) {
+                       // No media queries required if we only have one variant
+                       $this->addLinkHeader( '<' . $logo . '>;rel=preload;as=image' );
+                       return;
+               }
+
+               foreach ( $logoHD as $dppx => $src ) {
+                       // Only 1.5x and 2x are supported
+                       // Note: Keep in sync with ResourceLoaderSkinModule
+                       if ( in_array( $dppx, [ '1.5x', '2x' ] ) ) {
+                               // LogoHD uses a string in this format: "1.5x"
+                               $dppx = substr( $dppx, 0, -1 );
+                               $logosPerDppx[$dppx] = $src;
+                       }
+               }
+
+               // Because PHP can't have floats as array keys
+               uksort( $logosPerDppx, function ( $a , $b ) {
+                       $a = floatval( $a );
+                       $b = floatval( $b );
+
+                       if ( $a == $b ) {
+                               return 0;
+                       }
+                       // Sort from smallest to largest (e.g. 1x, 1.5x, 2x)
+                       return ( $a < $b ) ? -1 : 1;
+               } );
+
+               foreach ( $logosPerDppx as $dppx => $src ) {
+                       $logos[] = [ 'dppx' => $dppx, 'src' => $src ];
+               }
+
+               $logosCount = count( $logos );
+               // Logic must match ResourceLoaderSkinModule:
+               // - 1x applies to resolution < 1.5dppx
+               // - 1.5x applies to resolution >= 1.5dppx && < 2dppx
+               // - 2x applies to resolution >= 2dppx
+               // Note that min-resolution and max-resolution are both inclusive.
+               for ( $i = 0; $i < $logosCount; $i++ ) {
+                       if ( $i === 0 ) {
+                               // Smallest dppx
+                               // min-resolution is ">=" (larger than or equal to)
+                               // "not min-resolution" is essentially "<"
+                               $media_query = 'not all and (min-resolution: ' . $logos[ 1 ]['dppx'] . 'dppx)';
+                       } elseif ( $i !== $logosCount - 1 ) {
+                               // In between
+                               // Media query expressions can only apply "not" to the entire expression
+                               // (e.g. can't express ">= 1.5 and not >= 2).
+                               // Workaround: Use <= 1.9999 in place of < 2.
+                               $upper_bound = floatval( $logos[ $i + 1 ]['dppx'] ) - 0.000001;
+                               $media_query = '(min-resolution: ' . $logos[ $i ]['dppx'] .
+                                       'dppx) and (max-resolution: ' . $upper_bound . 'dppx)';
+                       } else {
+                               // Largest dppx
+                               $media_query = '(min-resolution: ' . $logos[ $i ]['dppx'] . 'dppx)';
+                       }
+
+                       $this->addLinkHeader(
+                               '<' . $logos[$i]['src'] . '>;rel=preload;as=image;media=' . $media_query
+                       );
+               }
+       }
 }
index bae974f..b20f843 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
index 5f6abee..e9519c3 100644 (file)
@@ -1784,7 +1784,7 @@ class Sanitizer {
                        'rb'         => $common,
                        'rp'         => $common,
                        'rt'         => $common, # array_merge( $common, array( 'rbspan' ) ),
-                       'rtc'         => $common,
+                       'rtc'        => $common,
 
                        # MathML root element, where used for extensions
                        # 'title' may not be 100% valid here; it's XHTML
index bc6b842..1c7730c 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index 0db4094..dd6aaef 100644 (file)
@@ -22,6 +22,7 @@
  * @file
  */
 
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\Interwiki\InterwikiLookup;
@@ -2151,8 +2152,7 @@ class Title implements LinkTarget {
        private function checkCSSandJSPermissions( $action, $user, $errors, $rigor, $short ) {
                # Protect css/js subpages of user pages
                # XXX: this might be better using restrictions
-               # XXX: right 'editusercssjs' is deprecated, for backward compatibility only
-               if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' ) ) {
+               if ( $action != 'patrol' ) {
                        if ( preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) {
                                if ( $this->isCssSubpage() && !$user->isAllowedAny( 'editmyusercss', 'editusercss' ) ) {
                                        $errors[] = [ 'mycustomcssprotected', $action ];
@@ -4651,7 +4651,7 @@ class Title implements LinkTarget {
        }
 
        /**
-        * Whether the magic words __INDEX__ and __NOINDEX__ function for  this page.
+        * Whether the magic words __INDEX__ and __NOINDEX__ function for this page.
         *
         * @return bool
         */
index ba77074..22d5439 100644 (file)
@@ -390,7 +390,7 @@ class WatchedItemQueryService {
                }
 
                if ( array_key_exists( 'rcTypes', $options ) ) {
-                       $conds['rc_type'] = array_map( 'intval',  $options['rcTypes'] );
+                       $conds['rc_type'] = array_map( 'intval', $options['rcTypes'] );
                }
 
                $conds = array_merge(
@@ -565,7 +565,7 @@ class WatchedItemQueryService {
                }
                if ( isset( $options['filter'] ) ) {
                        $filter = $options['filter'];
-                       if ( $filter ===  self::FILTER_CHANGED ) {
+                       if ( $filter === self::FILTER_CHANGED ) {
                                $conds[] = 'wl_notificationtimestamp IS NOT NULL';
                        } else {
                                $conds[] = 'wl_notificationtimestamp IS NULL';
index f7b8d2f..0f479ac 100644 (file)
@@ -182,7 +182,7 @@ class WikiMap {
 class WikiReference {
        private $mCanonicalServer; ///< canonical server URL, e.g. 'https://www.mediawiki.org'
        private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org'
-       private $mPath;   ///< path, '/wiki/$1'
+       private $mPath; ///< path, '/wiki/$1'
 
        /**
         * @param string $canonicalServer
index 167b709..df7afca 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\Database;
 
 /**
  * Displays information about a page.
index b698cef..bf8e632 100644 (file)
@@ -626,7 +626,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Gets a default replica DB connection object
-        * @return Database
+        * @return IDatabase
         */
        protected function getDB() {
                if ( !isset( $this->mSlaveDB ) ) {
index b5eff70..4068a50 100644 (file)
@@ -1230,6 +1230,35 @@ class ApiMain extends ApiBase {
                return $module;
        }
 
+       /**
+        * @return array
+        */
+       private function getMaxLag() {
+               $dbLag = MediaWikiServices::getInstance()->getDBLoadBalancer()->getMaxLag();
+               $lagInfo = [
+                       'host' => $dbLag[0],
+                       'lag' => $dbLag[1],
+                       'type' => 'db'
+               ];
+
+               $jobQueueLagFactor = $this->getConfig()->get( 'JobQueueIncludeInMaxLagFactor' );
+               if ( $jobQueueLagFactor ) {
+                       // Turn total number of jobs into seconds by using the configured value
+                       $totalJobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
+                       $jobQueueLag = $totalJobs / (float)$jobQueueLagFactor;
+                       if ( $jobQueueLag > $lagInfo['lag'] ) {
+                               $lagInfo = [
+                                       'host' => wfHostname(), // XXX: Is there a better value that could be used?
+                                       'lag' => $jobQueueLag,
+                                       'type' => 'jobqueue',
+                                       'jobs' => $totalJobs,
+                               ];
+                       }
+               }
+
+               return $lagInfo;
+       }
+
        /**
         * Check the max lag if necessary
         * @param ApiBase $module Api module being used
@@ -1239,18 +1268,22 @@ class ApiMain extends ApiBase {
        protected function checkMaxLag( $module, $params ) {
                if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) {
                        $maxLag = $params['maxlag'];
-                       list( $host, $lag ) = wfGetLB()->getMaxLag();
-                       if ( $lag > $maxLag ) {
+                       $lagInfo = $this->getMaxLag();
+                       if ( $lagInfo['lag'] > $maxLag ) {
                                $response = $this->getRequest()->response();
 
                                $response->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
-                               $response->header( 'X-Database-Lag: ' . intval( $lag ) );
+                               $response->header( 'X-Database-Lag: ' . intval( $lagInfo['lag'] ) );
 
                                if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
-                                       $this->dieWithError( [ 'apierror-maxlag', $lag, $host ] );
+                                       $this->dieWithError(
+                                               [ 'apierror-maxlag', $lagInfo['lag'], $lagInfo['host'] ],
+                                               'maxlag',
+                                               $lagInfo
+                                       );
                                }
 
-                               $this->dieWithError( [ 'apierror-maxlag-generic', $lag ], 'maxlag' );
+                               $this->dieWithError( [ 'apierror-maxlag-generic', $lagInfo['lag'] ], 'maxlag', $lagInfo );
                        }
                }
 
index ff65d0e..dc1b4e7 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\Database;
 
 /**
  * @ingroup API
index 85c6860..5609ad8 100644 (file)
@@ -71,6 +71,7 @@ class ApiPageSet extends ApiBase {
        private $mInterwikiTitles = [];
        /** @var Title[] */
        private $mPendingRedirectIDs = [];
+       private $mPendingRedirectSpecialPages = []; // [dbkey] => [ Title $from, Title $to ]
        private $mResolvedRedirectTitles = [];
        private $mConvertedTitles = [];
        private $mGoodRevIDs = [];
@@ -813,6 +814,8 @@ class ApiPageSet extends ApiBase {
                // Get validated and normalized title objects
                $linkBatch = $this->processTitlesArray( $titles );
                if ( $linkBatch->isEmpty() ) {
+                       // There might be special-page redirects
+                       $this->resolvePendingRedirects();
                        return;
                }
 
@@ -1033,7 +1036,7 @@ class ApiPageSet extends ApiBase {
 
                        // Repeat until all redirects have been resolved
                        // The infinite loop is prevented by keeping all known pages in $this->mAllPages
-                       while ( $this->mPendingRedirectIDs ) {
+                       while ( $this->mPendingRedirectIDs || $this->mPendingRedirectSpecialPages ) {
                                // Resolve redirects by querying the pagelinks table, and repeat the process
                                // Create a new linkBatch object for the next pass
                                $linkBatch = $this->getRedirectTargets();
@@ -1067,56 +1070,76 @@ class ApiPageSet extends ApiBase {
                $titlesToResolve = [];
                $db = $this->getDB();
 
-               $res = $db->select(
-                       'redirect',
-                       [
-                               'rd_from',
-                               'rd_namespace',
-                               'rd_fragment',
-                               'rd_interwiki',
-                               'rd_title'
-                       ], [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ],
-                       __METHOD__
-               );
-               foreach ( $res as $row ) {
-                       $rdfrom = intval( $row->rd_from );
-                       $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
-                       $to = Title::makeTitle(
-                               $row->rd_namespace,
-                               $row->rd_title,
-                               $row->rd_fragment,
-                               $row->rd_interwiki
-                       );
-                       $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom];
-                       unset( $this->mPendingRedirectIDs[$rdfrom] );
-                       if ( $to->isExternal() ) {
-                               $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
-                       } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
-                               $titlesToResolve[] = $to;
+               if ( $this->mPendingRedirectIDs ) {
+                       $res = $db->select(
+                               'redirect',
+                               [
+                                       'rd_from',
+                                       'rd_namespace',
+                                       'rd_fragment',
+                                       'rd_interwiki',
+                                       'rd_title'
+                               ], [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ],
+                                       __METHOD__
+                               );
+                       foreach ( $res as $row ) {
+                               $rdfrom = intval( $row->rd_from );
+                               $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
+                               $to = Title::makeTitle(
+                                       $row->rd_namespace,
+                                       $row->rd_title,
+                                       $row->rd_fragment,
+                                       $row->rd_interwiki
+                               );
+                               $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom];
+                               unset( $this->mPendingRedirectIDs[$rdfrom] );
+                               if ( $to->isExternal() ) {
+                                       $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
+                               } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
+                                       $titlesToResolve[] = $to;
+                               }
+                               $this->mRedirectTitles[$from] = $to;
                        }
-                       $this->mRedirectTitles[$from] = $to;
-               }
 
-               if ( $this->mPendingRedirectIDs ) {
-                       // We found pages that aren't in the redirect table
-                       // Add them
-                       foreach ( $this->mPendingRedirectIDs as $id => $title ) {
-                               $page = WikiPage::factory( $title );
-                               $rt = $page->insertRedirect();
-                               if ( !$rt ) {
-                                       // What the hell. Let's just ignore this
-                                       continue;
+                       if ( $this->mPendingRedirectIDs ) {
+                               // We found pages that aren't in the redirect table
+                               // Add them
+                               foreach ( $this->mPendingRedirectIDs as $id => $title ) {
+                                       $page = WikiPage::factory( $title );
+                                       $rt = $page->insertRedirect();
+                                       if ( !$rt ) {
+                                               // What the hell. Let's just ignore this
+                                               continue;
+                                       }
+                                       if ( $rt->isExternal() ) {
+                                               $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki();
+                                       } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) {
+                                               $titlesToResolve[] = $rt;
+                                       }
+                                       $from = $title->getPrefixedText();
+                                       $this->mResolvedRedirectTitles[$from] = $title;
+                                       $this->mRedirectTitles[$from] = $rt;
+                                       unset( $this->mPendingRedirectIDs[$id] );
                                }
-                               if ( $rt->isExternal() ) {
-                                       $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki();
-                               } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) {
-                                       $titlesToResolve[] = $rt;
+                       }
+               }
+
+               if ( $this->mPendingRedirectSpecialPages ) {
+                       foreach ( $this->mPendingRedirectSpecialPages as $key => list( $from, $to ) ) {
+                               $fromKey = $from->getPrefixedText();
+                               $this->mResolvedRedirectTitles[$fromKey] = $from;
+                               $this->mRedirectTitles[$fromKey] = $to;
+                               if ( $to->isExternal() ) {
+                                       $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
+                               } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
+                                       $titlesToResolve[] = $to;
                                }
-                               $from = $title->getPrefixedText();
-                               $this->mResolvedRedirectTitles[$from] = $title;
-                               $this->mRedirectTitles[$from] = $rt;
-                               unset( $this->mPendingRedirectIDs[$id] );
                        }
+                       $this->mPendingRedirectSpecialPages = [];
+
+                       // Set private caching since we don't know what criteria the
+                       // special pages used to decide on these redirects.
+                       $this->mCacheMode = 'private';
                }
 
                return $this->processTitlesArray( $titlesToResolve );
@@ -1197,8 +1220,26 @@ class ApiPageSet extends ApiBase {
                                        $dbkey = $titleObj->getDBkey();
                                        if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) {
                                                $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId;
-                                               $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
-                                               $this->mFakePageId--;
+                                               $target = null;
+                                               if ( $ns === NS_SPECIAL && $this->mResolveRedirects ) {
+                                                       $special = SpecialPageFactory::getPage( $dbkey );
+                                                       if ( $special instanceof RedirectSpecialArticle ) {
+                                                               // Only RedirectSpecialArticle is intended to redirect to an article, other kinds of
+                                                               // RedirectSpecialPage are probably applying weird URL parameters we don't want to handle.
+                                                               $context = new DerivativeContext( $this );
+                                                               $context->setTitle( $titleObj );
+                                                               $context->setRequest( new FauxRequest );
+                                                               $special->setContext( $context );
+                                                               list( /* $alias */, $subpage ) = SpecialPageFactory::resolveAlias( $dbkey );
+                                                               $target = $special->getRedirect( $subpage );
+                                                       }
+                                               }
+                                               if ( $target ) {
+                                                       $this->mPendingRedirectSpecialPages[$dbkey] = [ $titleObj, $target ];
+                                               } else {
+                                                       $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
+                                                       $this->mFakePageId--;
+                                               }
                                        }
                                } else {
                                        // Regular page
@@ -1385,7 +1426,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Get the database connection (read-only)
-        * @return Database
+        * @return IDatabase
         */
        protected function getDB() {
                return $this->mDbSource->getDB();
index 5395bf0..e6f3fc4 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * This is the main query class. It behaves similar to ApiMain: based on the
  * parameters given, it will create a list of titles to work on (an ApiPageSet
@@ -168,7 +170,7 @@ class ApiQuery extends ApiBase {
         * @param string $name Name to assign to the database connection
         * @param int $db One of the DB_* constants
         * @param array $groups Query groups
-        * @return Database
+        * @return IDatabase
         */
        public function getNamedDB( $name, $db, $groups ) {
                if ( !array_key_exists( $name, $this->mNamedDB ) ) {
index 87bb6a7..baefbda 100644 (file)
@@ -24,6 +24,7 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\ResultWrapper;
 
 /**
@@ -105,7 +106,7 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Get the Query database connection (read-only)
-        * @return Database
+        * @return IDatabase
         */
        protected function getDB() {
                if ( is_null( $this->mDb ) ) {
@@ -121,7 +122,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @param string $name Name to assign to the database connection
         * @param int $db One of the DB_* constants
         * @param array $groups Query groups
-        * @return Database
+        * @return IDatabase
         */
        public function selectNamedDB( $name, $db, $groups ) {
                $this->mDb = $this->getQuery()->getNamedDB( $name, $db, $groups );
index ca1e85a..a6f1a28 100644 (file)
                        "Dvorapa"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentace]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:API:Errors_and_warnings|v dokumentaci]].\n\n<strong>Testování:</strong> Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentace]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:Special:MyLanguage/API:Errors_and_warnings|v dokumentaci]].\n\n<strong>Testování:</strong> Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Která akce se má provést.",
        "apihelp-main-param-format": "Formát výstupu.",
-       "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „<samp>maxlag</samp>“ s hlášením typu „<samp>Waiting for $host: $lag seconds lagged</samp>“.<br />Více informací najdete v [[mw:Manual:Maxlag_parameter|příručce]].",
+       "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „<samp>maxlag</samp>“ s hlášením typu „<samp>Waiting for $host: $lag seconds lagged</samp>“.<br />Více informací najdete v [[mw:Special:MyLanguage/Manual:Maxlag_parameter|příručce]].",
        "apihelp-main-param-smaxage": "Nastaví HTTP hlavičku pro řízení kešování <code>s-maxage</code> na uvedený počet sekund. Chyby se nekešují nikdy.",
        "apihelp-main-param-maxage": "Nastaví HTTP hlavičku pro řízení kešování <code>max-age</code> na uvedený počet sekund. Chyby se nekešují nikdy.",
        "apihelp-main-param-assert": "Pokud je nastaveno na „<kbd>user</kbd>“, ověří, že je uživatel přihlášen, pokud je nastaveno na „<kbd>bot</kbd>“, ověří, že má oprávnění „bot“.",
@@ -32,7 +32,7 @@
        "apihelp-block-param-nocreate": "Nedovolit registraci nových uživatelů.",
        "apihelp-block-param-noemail": "Zakázat uživateli posílat e-maily prostřednictvím wiki. (Vyžaduje oprávnění „<code>blockemail</code>“.)",
        "apihelp-block-param-hidename": "Skrýt uživatelské jméno v knize zablokování. (Vyžaduje oprávnění <code>hideuser</code>.)",
-       "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Pokud již uživatel blokován je, přepsat současný blok.",
        "apihelp-block-param-watchuser": "Sledovat stránku uživatele nebo IP adresy a jejich diskuzní stránky.",
        "apihelp-block-example-ip-simple": "Na tři dny zablokovat IP adresu <kbd>192.0.2.5</kbd> s odůvodněním <kbd>First strike</kbd>.",
        "apihelp-opensearch-param-search": "Hledaný řetězec.",
        "apihelp-opensearch-param-limit": "Maximální počet vrácených výsledků",
        "apihelp-opensearch-param-namespace": "Jmenné prostory pro vyhledávání.",
-       "apihelp-opensearch-param-suggest": "Pokud je <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> vypnuto, nedělat nic.",
+       "apihelp-opensearch-param-suggest": "Pokud je <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> vypnuto, nedělat nic.",
        "apihelp-opensearch-param-format": "Formát výstupu.",
        "apihelp-opensearch-example-te": "Najít stránky začínající na „<kbd>Te</kbd>“.",
        "apihelp-options-param-reset": "Vrátit nastavení na výchozí hodnoty.",
        "apihelp-xml-param-includexmlnamespace": "Pokud je uvedeno, přidá jmenný prostor XML.",
        "apihelp-xmlfm-description": "Vypisuje data ve formátu XML (v čitelné HTML podobě).",
        "api-format-title": "Odpověď z MediaWiki API",
-       "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr <var>format</var>. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte <kbd>format=$2</kbd>.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].",
-       "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].",
+       "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr <var>format</var>. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte <kbd>format=$2</kbd>.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].",
+       "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].",
        "api-help-title": "Nápověda k MediaWiki API",
        "api-help-lead": "Toto je automaticky generovaná dokumentační stránka k MediaWiki API.\n\nDokumentace a příklady: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Hlavní modul",
index da98321..fb4c37f 100644 (file)
        "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Liste des mots magiques et leurs alias.",
        "apihelp-query+siteinfo-paramvalue-prop-statistics": "Renvoie les statistiques du site.",
        "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Renvoie la correspondance interwiki (éventuellement filtrée, éventuellement localisée en utilisant <var>$1inlanguagecode</var>).",
-       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Renvoie le serveur de base de donnée avec la plus grande latence de réplication.",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Renvoie le serveur de base de données ayant la plus grande latence de réplication.",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Renvoie les groupes utilisateur et les droits associés.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Renvoie les bibliothèques installées sur le wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "Renvoie les extensions installées sur le wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Renvoie une liste des balises d’extension de l’analyseur.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Renvoie une liste des accroches de fonction de l’analyseur.",
        "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Renvoie une liste de toutes les accroches souscrites (contenu de <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
-       "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste des IDs de variable.",
-       "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste des protocoles qui sont autorisés dans les liens externes.",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste d'IDs de variable.",
+       "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste de protocoles autorisés dans les liens externes.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Renvoie les valeurs par défaut pour les préférences utilisateur.",
        "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Renvoie la configuration du dialogue de téléversement.",
        "apihelp-query+siteinfo-param-filteriw": "Renvoyer uniquement les entrées locales ou uniquement les non locales de la correspondance interwiki.",
        "apihelp-query+siteinfo-param-showalldb": "Lister tous les serveurs de base de données, pas seulement celui avec la plus grande latence.",
        "apihelp-query+siteinfo-param-numberingroup": "Liste le nombre d’utilisateurs dans les groupes.",
        "apihelp-query+siteinfo-param-inlanguagecode": "Code de langue pour les noms de langue localisés (du mieux possible) et les noms d’habillage.",
-       "apihelp-query+siteinfo-example-simple": "Extraire les informations du site",
-       "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux",
-       "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle",
+       "apihelp-query+siteinfo-example-simple": "Extraire les informations du site.",
+       "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux.",
+       "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle.",
        "apihelp-query+stashimageinfo-description": "Renvoie les informations de fichier des fichiers mis en réserve.",
        "apihelp-query+stashimageinfo-param-filekey": "Clé qui identifie un téléchargement précédent qui a été temporairement mis en réserve.",
-       "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité descendante.",
+       "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité ascendante.",
        "apihelp-query+stashimageinfo-example-simple": "Renvoie les informations sur un fichier mis en réserve.",
-       "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis en réserve",
+       "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis de côté.",
        "apihelp-query+tags-description": "Lister les balises de modification.",
        "apihelp-query+tags-param-limit": "Le nombre maximal de balises à lister.",
        "apihelp-query+tags-param-prop": "Quelles propriétés récupérer :",
        "apihelp-query+tags-paramvalue-prop-description": "Ajoute la description de la balise.",
        "apihelp-query+tags-paramvalue-prop-hitcount": "Ajoute le nombre de révisions et d’entrées du journal qui ont cette balise.",
        "apihelp-query+tags-paramvalue-prop-defined": "Indique si la balise est définie.",
-       "apihelp-query+tags-paramvalue-prop-source": "Obtient les sources de la balise, ce qui comprend <samp>extension</samp> pour les balises définies par une extension et <samp>manual</samp> pour les balises pouvant être appliquées manuellement par les utilisateurs.",
+       "apihelp-query+tags-paramvalue-prop-source": "Retourne les sources de la balise, ce qui comprend <samp>extension</samp> pour les balises définies par une extension et <samp>manual</samp> pour les balises pouvant être appliquées manuellement par les utilisateurs.",
        "apihelp-query+tags-paramvalue-prop-active": "Si la balise est encore appliquée.",
        "apihelp-query+tags-example-simple": "Lister les balises disponibles",
        "apihelp-query+templates-description": "Renvoie toutes les pages incluses dans les pages fournies.",
index a803645..262f903 100644 (file)
        "apihelp-revisiondelete-param-reason": "Grond fir ze Läschen oder ze Restauréieren.",
        "apihelp-rsd-example-simple": "Den RSD-Schema exportéieren",
        "apihelp-setpagelanguage-description": "D'Sprooch vun enger Säit änneren",
+       "apihelp-setpagelanguage-description-disabled": "Aschalten\n<var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> fir dëse Aktioun ze benotzen",
        "apihelp-setpagelanguage-param-reason": "Grond fir d'Ännerung.",
        "apihelp-setpagelanguage-example-language": "Ännert d'Sprooch vun der <kbd>Main Page</kbd> op baskesch.",
        "apihelp-stashedit-param-title": "Titel vun der Säit déi geännert gëtt.",
index 3624123..152f1df 100644 (file)
        "apiwarn-nothumb-noimagehandler": "不能创建缩略图,因为$1没有关联的图片处理器。",
        "apiwarn-parse-nocontentmodel": "<var>title</var>或<var>contentmodel</var>未提供,假设$1。",
        "apiwarn-parse-titlewithouttext": "<var>title</var>在没有<var>text</var>的情况下被使用,并且请求了已解析页面的属性。您是想用<var>page</var>而不是<var>title</var>么?",
+       "apiwarn-redirectsandrevids": "重定向解决方案不能与<var>revids</var>参数一起使用。任何<var>revids</var>所指向的重定向都未被解决。",
        "apiwarn-tokennotallowed": "操作“$1”不允许当前用户使用。",
        "apiwarn-toomanyvalues": "参数<var>$1</var>指定了太多的值。上限为$2。",
        "apiwarn-truncatedresult": "此结果被缩短,否则其将大于$1字节的限制。",
index 6d3b2f4..8a10ecb 100644 (file)
@@ -130,7 +130,7 @@ class Throttler implements LoggerAwareInterface {
                        $throttleKey = wfGlobalCacheKey( 'throttler', $this->type, $index, $ipKey, $userKey );
                        $throttleCount = $this->cache->get( $throttleKey );
 
-                       if ( !$throttleCount ) {  // counter not started yet
+                       if ( !$throttleCount ) { // counter not started yet
                                $this->cache->add( $throttleKey, 1, $expiry );
                        } elseif ( $throttleCount < $count ) { // throttle limited not yet reached
                                $this->cache->incr( $throttleKey );
index 7215606..e171bc7 100644 (file)
@@ -143,7 +143,7 @@ class BacklinkCache {
        /**
         * Get the replica DB connection to the database
         * When non existing, will initialize the connection.
-        * @return Database
+        * @return IDatabase
         */
        protected function getDB() {
                if ( !isset( $this->db ) ) {
index 57f66f1..2d08895 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  * @ingroup Cache
  */
+
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
index 14baeeb..b076a08 100644 (file)
@@ -26,6 +26,7 @@
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
+use Wikimedia\Rdbms\Database;
 
 /**
  * This class generates message blobs for use by ResourceLoader modules.
index 8a42a9a..355aff4 100644 (file)
@@ -23,6 +23,7 @@
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\Database;
 
 /**
  * MediaWiki message cache structure version.
index dcab158..35f8b3b 100644 (file)
@@ -874,7 +874,7 @@ class RecentChange {
                        'rc_logid' => 0,
                        'rc_log_type' => null,
                        'rc_log_action' => '',
-                       'rc_params' =>  serialize( [
+                       'rc_params' => serialize( [
                                'hidden-cat' => WikiCategoryPage::factory( $categoryTitle )->isHidden()
                        ] )
                ];
index d2239eb..ca3c28b 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Change tagging
  */
 
+use Wikimedia\Rdbms\Database;
+
 class ChangeTags {
        /**
         * Can't delete tags with more than this many uses. Similar in intent to
diff --git a/includes/config/EtcdConfig.php b/includes/config/EtcdConfig.php
new file mode 100644 (file)
index 0000000..0f2f641
--- /dev/null
@@ -0,0 +1,275 @@
+<?php
+/**
+ * Copyright 2017
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Wikimedia\WaitConditionLoop;
+
+/**
+ * Interface for configuration instances
+ *
+ * @since 1.29
+ */
+class EtcdConfig implements Config, LoggerAwareInterface {
+       /** @var MultiHttpClient */
+       private $http;
+       /** @var BagOStuff */
+       private $srvCache;
+       /** @var array */
+       private $procCache;
+       /** @var LoggerInterface */
+       private $logger;
+
+       /** @var string */
+       private $host;
+       /** @var string */
+       private $protocol;
+       /** @var string */
+       private $directory;
+       /** @var string */
+       private $encoding;
+       /** @var integer */
+       private $baseCacheTTL;
+       /** @var integer */
+       private $skewCacheTTL;
+       /** @var integer */
+       private $timeout;
+       /** @var string */
+       private $directoryHash;
+
+       /**
+        * @param array $params Parameter map:
+        *   - host: the host address and port
+        *   - protocol: either http or https
+        *   - directory: the etc "directory" were MediaWiki specific variables are located
+        *   - encoding: one of ("JSON", "YAML")
+        *   - cache: BagOStuff instance or ObjectFactory spec thereof for a server cache.
+        *            The cache will also be used as a fallback if etcd is down.
+        *   - cacheTTL: logical cache TTL in seconds
+        *   - skewTTL: maximum seconds to randomly lower the assigned TTL on cache save
+        *   - timeout: seconds to wait for etcd before throwing an error
+        */
+       public function __construct( array $params ) {
+               $params += [
+                       'protocol' => 'http',
+                       'encoding' => 'JSON',
+                       'cacheTTL' => 10,
+                       'skewTTL' => 1,
+                       'timeout' => 10
+               ];
+
+               $this->host = $params['host'];
+               $this->protocol = $params['protocol'];
+               $this->directory = trim( $params['directory'], '/' );
+               $this->directoryHash = sha1( $this->directory );
+               $this->encoding = $params['encoding'];
+               $this->skewCacheTTL = $params['skewTTL'];
+               $this->baseCacheTTL = max( $params['cacheTTL'] - $this->skewCacheTTL, 0 );
+               $this->timeout = $params['timeout'];
+
+               if ( !isset( $params['cache'] ) ) {
+                       $this->srvCache = new HashBagOStuff( [] );
+               } elseif ( $params['cache'] instanceof BagOStuff ) {
+                       $this->srvCache = $params['cache'];
+               } else {
+                       $this->srvCache = ObjectFactory::getObjectFromSpec( $params['cache'] );
+               }
+
+               $this->logger = new Psr\Log\NullLogger();
+               $this->http = new MultiHttpClient( [
+                       'connTimeout' => $this->timeout,
+                       'reqTimeout' => $this->timeout
+               ] );
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
+       public function has( $name ) {
+               $this->load();
+
+               return array_key_exists( $name, $this->procCache['config'] );
+       }
+
+       public function get( $name ) {
+               $this->load();
+
+               if ( !array_key_exists( $name, $this->procCache['config'] ) ) {
+                       throw new ConfigException( "No entry found for '$name'." );
+               }
+
+               return $this->procCache['config'][$name];
+       }
+
+       private function load() {
+               if ( $this->procCache !== null ) {
+                       return; // already loaded
+               }
+
+               $now = microtime( true );
+               $key = $this->srvCache->makeKey( 'variable', $this->directoryHash );
+
+               // Get the cached value or block until it is regenerated (by this or another thread)...
+               $data = null; // latest config info
+               $error = null; // last error message
+               $loop = new WaitConditionLoop(
+                       function () use ( $key, $now, &$data, &$error ) {
+                               // Check if the values are in cache yet...
+                               $data = $this->srvCache->get( $key );
+                               if ( is_array( $data ) && $data['expires'] > $now ) {
+                                       $this->logger->debug( "Found up-to-date etcd configuration cache." );
+
+                                       return WaitConditionLoop::CONDITION_REACHED;
+                               }
+
+                               // Cache is either empty or stale;
+                               // refresh the cache from etcd, using a mutex to reduce stampedes...
+                               if ( $this->srvCache->lock( $key, 0, $this->baseCacheTTL ) ) {
+                                       try {
+                                               list( $config, $error, $retry ) = $this->fetchAllFromEtcd();
+                                               if ( $config === null ) {
+                                                       $this->logger->error( "Failed to fetch configuration: $error" );
+                                                       // Fail fast if the error is likely to just keep happening
+                                                       return $retry
+                                                               ? WaitConditionLoop::CONDITION_CONTINUE
+                                                               : WaitConditionLoop::CONDITION_FAILED;
+                                               }
+
+                                               // Avoid having all servers expire cache keys at the same time
+                                               $expiry = microtime( true ) + $this->baseCacheTTL;
+                                               $expiry += mt_rand( 0, 1e6 ) / 1e6 * $this->skewCacheTTL;
+
+                                               $data = [ 'config' => $config, 'expires' => $expiry ];
+                                               $this->srvCache->set( $key, $data, BagOStuff::TTL_INDEFINITE );
+
+                                               $this->logger->info( "Refreshed stale etcd configuration cache." );
+
+                                               return WaitConditionLoop::CONDITION_REACHED;
+                                       } finally {
+                                               $this->srvCache->unlock( $key ); // release mutex
+                                       }
+                               }
+
+                               if ( is_array( $data ) ) {
+                                       $this->logger->info( "Using stale etcd configuration cache." );
+
+                                       return WaitConditionLoop::CONDITION_REACHED;
+                               }
+
+                               return WaitConditionLoop::CONDITION_CONTINUE;
+                       },
+                       $this->timeout
+               );
+
+               if ( $loop->invoke() !== WaitConditionLoop::CONDITION_REACHED ) {
+                       // No cached value exists and etcd query failed; throw an error
+                       throw new ConfigException( "Failed to load configuration from etcd: $error" );
+               }
+
+               $this->procCache = $data;
+       }
+
+       /**
+        * @return array (config array or null, error string, allow retries)
+        */
+       public function fetchAllFromEtcd() {
+               $dsd = new DnsSrvDiscoverer( $this->host );
+               $servers = $dsd->getServers();
+               if ( !$servers ) {
+                       return $this->fetchAllFromEtcdServer( $this->host );
+               }
+
+               do {
+                       // Pick a random etcd server from dns
+                       $server = $dsd->pickServer( $servers );
+                       $host = IP::combineHostAndPort( $server['target'], $server['port'] );
+                       // Try to load the config from this particular server
+                       list( $config, $error, $retry ) = $this->fetchAllFromEtcdServer( $host );
+                       if ( is_array( $config ) || !$retry ) {
+                               break;
+                       }
+
+                       // Avoid the server next time if that failed
+                       $dsd->removeServer( $server, $servers );
+               } while ( $servers );
+
+               return [ $config, $error, $retry ];
+       }
+
+       /**
+        * @param string $address Host and port
+        * @return array (config array or null, error string, whether to allow retries)
+        */
+       protected function fetchAllFromEtcdServer( $address ) {
+               // Retrieve all the values under the MediaWiki config directory
+               list( $rcode, $rdesc, /* $rhdrs */, $rbody, $rerr ) = $this->http->run( [
+                       'method' => 'GET',
+                       'url' => "{$this->protocol}://{$address}/v2/keys/{$this->directory}/",
+                       'headers' => [ 'content-type' => 'application/json' ]
+               ] );
+
+               static $terminalCodes = [ 404 => true ];
+               if ( $rcode < 200 || $rcode > 399 ) {
+                       return [
+                               null,
+                               strlen( $rerr ) ? $rerr : "HTTP $rcode ($rdesc)",
+                               empty( $terminalCodes[$rcode] )
+                       ];
+               }
+
+               $info = json_decode( $rbody, true );
+               if ( $info === null || !isset( $info['node']['nodes'] ) ) {
+                       return [ null, $rcode, "Unexpected JSON response; missing 'nodes' list.", false ];
+               }
+
+               $config = [];
+               foreach ( $info['node']['nodes'] as $node ) {
+                       if ( !empty( $node['dir'] ) ) {
+                               continue; // skip directories
+                       }
+
+                       $name = basename( $node['key'] );
+                       $value = $this->unserialize( $node['value'] );
+                       if ( !is_array( $value ) || !isset( $value['val'] ) ) {
+                               return [ null, "Failed to parse value for '$name'.", false ];
+                       }
+
+                       $config[$name] = $value['val'];
+               }
+
+               return [ $config, null, false ];
+       }
+
+       /**
+        * @param string $string
+        * @return mixed
+        */
+       private function unserialize( $string ) {
+               if ( $this->encoding === 'YAML' ) {
+                       return yaml_parse( $string );
+               } else { // JSON
+                       return json_decode( $string, true );
+               }
+       }
+}
index da660bd..0f8d7f7 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\LoadBalancer;
 
 /**
index ef5a8fe..a0d7ad8 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  * @ingroup Database
  */
+
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\Blob;
 use Wikimedia\Rdbms\ResultWrapper;
 
index 5697960..a629458 100644 (file)
@@ -409,7 +409,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
 
                $deleteWheres = []; // list of WHERE clause arrays for each DB delete() call
                if ( $table === 'pagelinks' || $table === 'templatelinks' || $table === 'iwlinks' ) {
-                       $baseKey =  ( $table === 'iwlinks' ) ? 'iwl_prefix' : "{$prefix}_namespace";
+                       $baseKey = ( $table === 'iwlinks' ) ? 'iwl_prefix' : "{$prefix}_namespace";
 
                        $curBatchSize = 0;
                        $curDeletionBatch = [];
index 29c017c..bce3005 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup FileRepo
  */
 
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index 9c92bc0..d91ab24 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index c109fba..292fc80 100644 (file)
@@ -21,7 +21,8 @@
  * @ingroup FileAbstraction
  */
 
-use \MediaWiki\Logger\LoggerFactory;
+use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index 54bdf04..549edde 100644 (file)
@@ -207,7 +207,7 @@ class OOUIHTMLForm extends HTMLForm {
                                        $error = array_merge( [ $error['message'] ], $error['params'] );
                                }
                        }
-               } elseif ( $elementsType === 'errors' )  {
+               } elseif ( $elementsType === 'errors' ) {
                        $errors = $elements;
                        if ( !is_array( $errors ) ) {
                                $errors = [ $errors ];
index f958ff6..3da3eb3 100644 (file)
@@ -145,7 +145,7 @@ class CurlHttpRequest extends MWHttpRequest {
                $this->parseHeader();
                $this->setStatus();
 
-               return Status::wrap( $this->status );  // TODO B/C; move this to callers
+               return Status::wrap( $this->status ); // TODO B/C; move this to callers
        }
 
        /**
index 22717fc..6113573 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Deployment
  */
 use Wikimedia\Rdbms\LBFactorySingle;
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index 8913c77..a4cb695 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Deployment
  */
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 
index d6efeb2..8307d8b 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\Database;
+
 /**
  * Class for setting up the MediaWiki database using Microsoft SQL Server.
  *
index 988ec41..dfe595e 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\DatabaseMssql;
+
 /**
  * Class for setting up the MediaWiki database using Microsoft SQL Server.
  *
index 7269773..c0731e7 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\Database;
+
 /**
  * Class for setting up the MediaWiki database using MySQL.
  *
index 906768f..bd7cfb3 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\Database;
+
 /**
  * Class for setting up the MediaWiki database using Postgres.
  *
index 1a7b208..39cb89c 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\DatabasePostgres;
+
 /**
  * Class for handling updates to Postgres databases.
  *
index 0fe7068..e9d3ad4 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DatabaseSqlite;
+
 /**
  * Class for setting up the MediaWiki database using SQLLite.
  *
index dcd66dd..9c90283 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\DatabaseSqlite;
+
 /**
  * Class for handling updates to Sqlite databases.
  *
index 198422a..1d4fc61 100644 (file)
@@ -8,7 +8,7 @@
        "config-title": "Installazzione de MediaUicchi $1",
        "config-information": "'Mbormaziune",
        "config-localsettings-key": "Chiave de aggiornamende:",
-       "config-localsettings-badkey": "'A chiave ca è date non g'è corrette.",
+       "config-localsettings-badkey": "'A chiave de aggiornamende ca è date non g'è corrette.",
        "config-session-error": "Errore facenne accumenzà 'a sessione: $1",
        "config-your-language": "'A lènga toje:",
        "config-your-language-help": "Scacchie 'na lènghe da ausà duranne 'u processe de installazzione:",
@@ -36,6 +36,8 @@
        "config-db-type": "Tipe de database:",
        "config-db-host-oracle": "Database TNS:",
        "config-db-name-oracle": "Scheme d'u database:",
+       "config-db-username": "Nome utende d'u database:",
+       "config-db-password": "Password d'u database:",
        "config-db-port": "Porte d'u database:",
        "config-db-schema": "Scheme pe MediaUicchi:",
        "config-type-mysql": "MySQL (o combatibbile)",
index 883b5fa..5226aa0 100644 (file)
@@ -23,7 +23,7 @@ namespace MediaWiki\Interwiki;
  */
 use \Cdb\Exception as CdbException;
 use \Cdb\Reader as CdbReader;
-use Database;
+use Wikimedia\Rdbms\Database;
 use Hooks;
 use Interwiki;
 use Language;
@@ -221,7 +221,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
                                }
                        }
 
-                       $value = $this->getCacheValue( wfMemcKey( $prefix ) );
+                       $value = $this->getCacheValue( wfWikiID() . ':' . $prefix );
                        // Site level
                        if ( $value == '' && $this->interwikiScopes >= 3 ) {
                                $value = $this->getCacheValue( "_{$this->thisSite}:{$prefix}" );
index 71d68d9..9f78404 100644 (file)
@@ -170,7 +170,7 @@ class JobQueueGroup {
         * @since 1.26
         */
        public function lazyPush( $jobs ) {
-               if ( PHP_SAPI === 'cli' ) {
+               if ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' ) {
                        $this->push( $jobs );
                        return;
                }
index c33264d..ce8a204 100644 (file)
@@ -83,6 +83,22 @@ class DnsSrvDiscoverer {
                }
        }
 
+       /**
+        * @param array $server
+        * @param array $servers
+        * @return array[]
+        */
+       public function removeServer( $server, array $servers ) {
+               foreach ( $servers as $i => $srv ) {
+                       if ( $srv['target'] === $server['target'] && $srv['port'] === $server['port'] ) {
+                               unset( $servers[$i] );
+                               break;
+                       }
+               }
+
+               return array_values( $servers );
+       }
+
        /**
         * @return array[]
         */
index 8ef8196..ddb8521 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup LockManager
  */
 
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index 0d5fbf5..6481c92 100644 (file)
@@ -2,7 +2,6 @@
 
 namespace Wikimedia\Rdbms;
 
-use Database;
 use InvalidArgumentException;
 
 /**
@@ -605,4 +604,4 @@ class DBConnRef implements IDatabase {
        }
 }
 
-class_alias( 'Wikimedia\Rdbms\DBConnRef', 'DBConnRef' );
+class_alias( DBConnRef::class, 'DBConnRef' );
index 40bcc1b..6fafe71 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Wikimedia\ScopedCallback;
-use Wikimedia\Rdbms\TransactionProfiler;
-use Wikimedia\Rdbms\LikeMatch;
-use Wikimedia\Rdbms\DatabaseDomain;
-use Wikimedia\Rdbms\ResultWrapper;
-use Wikimedia\Rdbms\DBMasterPos;
-use Wikimedia\Rdbms\Blob;
 use Wikimedia\Timestamp\ConvertibleTimestamp;
-use Wikimedia\Rdbms\IDatabase;
-use Wikimedia\Rdbms\IMaintainableDatabase;
+use MediaWiki;
+use BagOStuff;
+use HashBagOStuff;
+use InvalidArgumentException;
+use DBQueryError;
+use DBUnexpectedError;
+use DBConnectionError;
+use DBReadOnlyError;
+use Exception;
+use RuntimeException;
 
 /**
  * Relational database abstraction object
@@ -339,6 +343,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        'oracle' => [],
                        'mssql' => [],
                ];
+               static $classAliases = [
+                       'DatabaseMssql' => DatabaseMssql::class,
+                       'DatabaseMysql' => DatabaseMysql::class,
+                       'DatabaseMysqli' => DatabaseMysqli::class,
+                       'DatabaseSqlite' => DatabaseSqlite::class,
+                       'DatabasePostgres' => DatabasePostgres::class
+               ];
 
                $driver = false;
                $dbType = strtolower( $dbType );
@@ -362,12 +373,17 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                } else {
                        $driver = $dbType;
                }
+
                if ( $driver === false || $driver === '' ) {
                        throw new InvalidArgumentException( __METHOD__ .
                                " no viable database extension found for type '$dbType'" );
                }
 
                $class = 'Database' . ucfirst( $driver );
+               if ( isset( $classAliases[$class] ) ) {
+                       $class = $classAliases[$class];
+               }
+
                if ( class_exists( $class ) && is_subclass_of( $class, IDatabase::class ) ) {
                        // Resolve some defaults for b/c
                        $p['host'] = isset( $p['host'] ) ? $p['host'] : false;
@@ -3479,4 +3495,5 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 }
 
-class_alias( Database::class, 'DatabaseBase' );
+class_alias( Database::class, 'DatabaseBase' ); // b/c for old name
+class_alias( Database::class, 'Database' ); // b/c global alias
index 75ddc9d..bbd2400 100644 (file)
  * @author Ryan Biesemeyer <v-ryanbi at microsoft dot com>
  * @author Ryan Schmidt <skizzerz at gmail dot com>
  */
-use Wikimedia\Rdbms\Blob;
-use Wikimedia\Rdbms\MssqlBlob;
-use Wikimedia\Rdbms\MssqlField;
-use Wikimedia\Rdbms\ResultWrapper;
-use Wikimedia\Rdbms\MssqlResultWrapper;
+
+namespace Wikimedia\Rdbms;
+
+use MediaWiki;
+use DBConnectionError;
+use DBUnexpectedError;
+use DBQueryError;
+use Exception;
+use stdClass;
 
 /**
  * @ingroup Database
@@ -1360,3 +1364,5 @@ class DatabaseMssql extends Database {
                return $old;
        }
 }
+
+class_alias( DatabaseMssql::class, 'DatabaseMssql' );
index 9ab7c64..c0c9223 100644 (file)
@@ -20,6 +20,9 @@
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
+use DBConnectionError;
 
 /**
  * Database abstraction object for PHP extension mysql.
@@ -202,3 +205,5 @@ class DatabaseMysql extends DatabaseMysqlBase {
                return mysql_real_escape_string( $s, $conn );
        }
 }
+
+class_alias( DatabaseMysql::class, 'DatabaseMysql' );
index e2b5226..b09516c 100644 (file)
  * @file
  * @ingroup Database
  */
-use Wikimedia\Rdbms\DBMasterPos;
-use Wikimedia\Rdbms\MySQLMasterPos;
-use Wikimedia\Rdbms\MySQLField;
-use Wikimedia\Rdbms\ResultWrapper;
+namespace Wikimedia\Rdbms;
+
+use DateTime;
+use DateTimeZone;
+use MediaWiki;
+use InvalidArgumentException;
+use DBError;
+use DBExpectedError;
+use DBUnexpectedError;
+use DBConnectionError;
+use Exception;
+use stdClass;
 
 /**
  * Database abstraction object for MySQL.
@@ -1360,3 +1368,5 @@ abstract class DatabaseMysqlBase extends Database {
                }
        }
 }
+
+class_alias( DatabaseMysqlBase::class, 'DatabaseMysqlBase' );
index 7a2200a..be25489 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
 
-use Wikimedia\Rdbms\ResultWrapper;
+use mysqli;
+use DBConnectionError;
+use IP;
 
 /**
  * Database abstraction object for PHP extension mysqli.
@@ -263,7 +266,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        }
 
        /**
-        * @param resource|ResultWrapper $res
+        * @param mysqli $res
         * @param int $n
         * @return mixed
         */
@@ -274,7 +277,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        }
 
        /**
-        * @param resource|ResultWrapper $res
+        * @param mysqli $res
         * @param int $n
         * @return mixed
         */
@@ -285,7 +288,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        }
 
        /**
-        * @param resource|ResultWrapper $res
+        * @param mysqli $res
         * @param int $row
         * @return mixed
         */
@@ -331,3 +334,5 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                }
        }
 }
+
+class_alias( DatabaseMysqli::class, 'DatabaseMysqli' );
index 5bcd4a8..5049f9b 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
 use Wikimedia\Timestamp\ConvertibleTimestamp;
 use Wikimedia\WaitConditionLoop;
-use Wikimedia\Rdbms\Blob;
-use Wikimedia\Rdbms\PostgresBlob;
-use Wikimedia\Rdbms\PostgresField;
-use Wikimedia\Rdbms\ResultWrapper;
+use MediaWiki;
+use DBUnexpectedError;
+use DBConnectionError;
+use Exception;
 
 /**
  * @ingroup Database
@@ -859,10 +861,10 @@ __INDEXATTR__;
         *
         * @since 1.19
         * @param string $text Postgreql array returned in a text form like {a,b}
-        * @param string $output
+        * @param string[] $output
         * @param int|bool $limit
         * @param int $offset
-        * @return string
+        * @return string[]
         */
        private function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
                if ( false === $limit ) {
@@ -1383,6 +1385,8 @@ SQL;
         * @return string Integer
         */
        private function bigintFromLockName( $lockName ) {
-               return Wikimedia\base_convert( substr( sha1( $lockName ), 0, 15 ), 16, 10 );
+               return \Wikimedia\base_convert( substr( sha1( $lockName ), 0, 15 ), 16, 10 );
        }
 }
+
+class_alias( DatabasePostgres::class, 'DatabasePostgres' );
index 090ce8e..6d187b8 100644 (file)
  * @file
  * @ingroup Database
  */
-use Wikimedia\Rdbms\Blob;
-use Wikimedia\Rdbms\SQLiteField;
-use Wikimedia\Rdbms\ResultWrapper;
+namespace Wikimedia\Rdbms;
+
+use PDO;
+use PDOException;
+use LockManager;
+use FSLockManager;
+use DBConnectionError;
+use DBReadOnlyError;
+use InvalidArgumentException;
+use RuntimeException;
+use DBError;
+use stdClass;
 
 /**
  * @ingroup Database
@@ -116,8 +125,10 @@ class DatabaseSqlite extends Database {
                $p['dbFilePath'] = $filename;
                $p['schema'] = false;
                $p['tablePrefix'] = '';
+               /** @var DatabaseSqlite $db */
+               $db = Database::factory( 'sqlite', $p );
 
-               return Database::factory( 'sqlite', $p );
+               return $db;
        }
 
        /**
@@ -1048,3 +1059,6 @@ class DatabaseSqlite extends Database {
                return 'SQLite ' . (string)$this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION );
        }
 }
+
+class_alias( DatabaseSqlite::class, 'DatabaseSqlite' );
+
index 0b146cd..feaf5cf 100644 (file)
@@ -1808,4 +1808,4 @@ interface IDatabase {
        public function setTableAliases( array $aliases );
 }
 
-class_alias( 'Wikimedia\Rdbms\IDatabase', 'IDatabase' );
+class_alias( IDatabase::class, 'IDatabase' );
index b984c42..5666170 100644 (file)
@@ -279,4 +279,4 @@ interface IMaintainableDatabase extends IDatabase {
        public function unlockTables( $method );
 }
 
-class_alias( 'Wikimedia\Rdbms\IMaintainableDatabase', 'IMaintainableDatabase' );
+class_alias( IMaintainableDatabase::class, 'IMaintainableDatabase' );
index 8238f3e..6c94eb9 100644 (file)
@@ -82,4 +82,4 @@ class MaintainableDBConnRef extends DBConnRef implements IMaintainableDatabase {
        }
 }
 
-class_alias( 'Wikimedia\Rdbms\MaintainableDBConnRef', 'MaintainableDBConnRef' );
+class_alias( MaintainableDBConnRef::class, 'MaintainableDBConnRef' );
index 8ae78e9..cf5060e 100644 (file)
@@ -18,6 +18,9 @@
  * @file
  * @ingroup Database
  */
+
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerInterface;
 
 /**
index b4c3d52..89b9cea 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index c5819a3..600f34a 100644 (file)
@@ -2,8 +2,6 @@
 
 namespace Wikimedia\Rdbms;
 
-use DatabasePostgres;
-
 class PostgresField implements Field {
        private $name, $tablename, $type, $nullable, $max_length, $deferred, $deferrable, $conname,
                $has_default, $default;
index 2ea0e4e..8b5a98d 100644 (file)
@@ -23,7 +23,6 @@
  */
 namespace Wikimedia\Rdbms;
 
-use Database;
 use DBError;
 use DBAccessError;
 use DBTransactionError;
index d178657..d268f83 100644 (file)
@@ -25,7 +25,6 @@ namespace Wikimedia\Rdbms;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use Wikimedia\ScopedCallback;
-use Database;
 use BagOStuff;
 use EmptyBagOStuff;
 use WANObjectCache;
@@ -49,7 +48,7 @@ use Exception;
 class LoadBalancer implements ILoadBalancer {
        /** @var array[] Map of (server index => server config array) */
        private $mServers;
-       /** @var \Database[][][] Map of local/foreignUsed/foreignFree => server index => IDatabase array */
+       /** @var Database[][][] Map of local/foreignUsed/foreignFree => server index => IDatabase array */
        private $mConns;
        /** @var float[] Map of (server index => weight) */
        private $mLoads;
@@ -87,7 +86,7 @@ class LoadBalancer implements ILoadBalancer {
        /** @var LoggerInterface */
        protected $perfLogger;
 
-       /** @var \Database Database connection that caused a problem */
+       /** @var Database DB connection object that caused a problem */
        private $errorConnection;
        /** @var integer The generic (not query grouped) replica DB index (of $mServers) */
        private $mReadIndex;
index 8f94374..141a375 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Cache
  */
 
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 use \MediaWiki\MediaWikiServices;
 use \Wikimedia\WaitConditionLoop;
index d72b3af..7d37944 100644 (file)
@@ -40,6 +40,8 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
                $styles['all'][] = '.mw-wiki-logo { background-image: ' .
                        CSSMin::buildUrlValue( $logo1 ) .
                        '; }';
+               // Only 1.5x and 2x are supported
+               // Note: Keep in sync with OutputPage::addLogoPreloadLinkHeaders()
                if ( $logoHD ) {
                        if ( isset( $logoHD['1.5x'] ) ) {
                                $styles[
index 3eac5df..fd31eac 100644 (file)
@@ -22,6 +22,7 @@
  * @author Roan Kattouw
  */
 
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index ad9a248..97d1dcb 100644 (file)
@@ -379,7 +379,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                },
                                                'cssClassSuffix' => 'patrolled',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                                                    return $rc->getAttribute( 'rc_patrolled' );
+                                                       return $rc->getAttribute( 'rc_patrolled' );
                                                },
                                        ],
                                        [
@@ -394,7 +394,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                },
                                                'cssClassSuffix' => 'unpatrolled',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                                                    return !$rc->getAttribute( 'rc_patrolled' );
+                                                       return !$rc->getAttribute( 'rc_patrolled' );
                                                },
                                        ],
                                ],
@@ -1169,9 +1169,9 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                &$tables, &$fields, &$conds, &$query_options, &$join_conds, $selectedExpLevels ) {
 
                global $wgLearnerEdits,
-                          $wgExperiencedUserEdits,
-                          $wgLearnerMemberSince,
-                          $wgExperiencedUserMemberSince;
+                       $wgExperiencedUserEdits,
+                       $wgLearnerMemberSince,
+                       $wgExperiencedUserMemberSince;
 
                $LEVEL_COUNT = 3;
 
@@ -1207,7 +1207,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                );
 
                if ( $selectedExpLevels === [ 'newcomer' ] ) {
-                       $conds[] =  "NOT ( $aboveNewcomer )";
+                       $conds[] = "NOT ( $aboveNewcomer )";
                } elseif ( $selectedExpLevels === [ 'learner' ] ) {
                        $conds[] = $dbr->makeList(
                                [ $aboveNewcomer, "NOT ( $aboveLearner )" ],
index ae010f6..84d3b08 100644 (file)
@@ -96,6 +96,7 @@ class SpecialPageFactory {
                'Block' => 'SpecialBlock',
                'Unblock' => 'SpecialUnblock',
                'BlockList' => 'SpecialBlockList',
+               'AutoblockList' => 'SpecialAutoblockList',
                'ChangePassword' => 'SpecialChangePassword',
                'BotPasswords' => 'SpecialBotPasswords',
                'PasswordReset' => 'SpecialPasswordReset',
@@ -505,7 +506,7 @@ class SpecialPageFactory {
         * @param bool $including Bool output is being captured for use in {{special:whatever}}
         * @param LinkRenderer|null $linkRenderer (since 1.28)
         *
-        * @return bool
+        * @return bool|Title
         */
        public static function executePath( Title &$title, IContextSource &$context, $including = false,
                LinkRenderer $linkRenderer = null
diff --git a/includes/specials/SpecialAutoblockList.php b/includes/specials/SpecialAutoblockList.php
new file mode 100644 (file)
index 0000000..dcb2444
--- /dev/null
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Implements Special:AutoblockList
+ *
+ * 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 SpecialPage
+ */
+
+/**
+ * A special page that lists autoblocks
+ *
+ * @since 1.29
+ * @ingroup SpecialPage
+ */
+class SpecialAutoblockList extends SpecialPage {
+
+       function __construct() {
+               parent::__construct( 'AutoblockList' );
+       }
+
+       /**
+        * Main execution point
+        *
+        * @param string $par Title fragment
+        */
+       public function execute( $par ) {
+               $this->setHeaders();
+               $this->outputHeader();
+               $out = $this->getOutput();
+               $lang = $this->getLanguage();
+               $out->setPageTitle( $this->msg( 'autoblocklist' ) );
+               $this->addHelpLink( 'Autoblock' );
+               $out->addModuleStyles( [ 'mediawiki.special' ] );
+
+               # setup BlockListPager here to get the actual default Limit
+               $pager = $this->getBlockListPager();
+
+               # Just show the block list
+               $fields = [
+                       'Limit' => [
+                               'type' => 'limitselect',
+                               'label-message' => 'table_pager_limit_label',
+                               'options' => [
+                                       $lang->formatNum( 20 ) => 20,
+                                       $lang->formatNum( 50 ) => 50,
+                                       $lang->formatNum( 100 ) => 100,
+                                       $lang->formatNum( 250 ) => 250,
+                                       $lang->formatNum( 500 ) => 500,
+                               ],
+                               'name' => 'limit',
+                               'default' => $pager->getLimit(),
+                       ]
+               ];
+
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getPageTitle() ); // Remove subpage
+               $form = HTMLForm::factory( 'ooui', $fields, $context );
+               $form->setMethod( 'get' )
+                       ->setFormIdentifier( 'blocklist' )
+                       ->setWrapperLegendMsg( 'autoblocklist-legend' )
+                       ->setSubmitTextMsg( 'autoblocklist-submit' )
+                       ->setSubmitProgressive()
+                       ->prepareForm()
+                       ->displayForm( false );
+
+               $this->showList( $pager );
+       }
+
+       /**
+        * Setup a new BlockListPager instance.
+        * @return BlockListPager
+        */
+       protected function getBlockListPager() {
+               $conds = [
+                       'ipb_parent_block_id IS NOT NULL'
+               ];
+               # Is the user allowed to see hidden blocks?
+               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+                       $conds['ipb_deleted'] = 0;
+               }
+
+               return new BlockListPager( $this, $conds );
+       }
+
+       /**
+        * Show the list of blocked accounts matching the actual filter.
+        * @param BlockListPager $pager The BlockListPager instance for this page
+        */
+       protected function showList( BlockListPager $pager ) {
+               $out = $this->getOutput();
+
+               # Check for other blocks, i.e. global/tor blocks
+               $otherAutoblockLink = [];
+               Hooks::run( 'OtherAutoblockLogLink', [ &$otherAutoblockLink ] );
+
+               # Show additional header for the local block only when other blocks exists.
+               # Not necessary in a standard installation without such extensions enabled
+               if ( count( $otherAutoblockLink ) ) {
+                       $out->addHTML(
+                               Html::element( 'h2', [], $this->msg( 'autoblocklist-localblocks',
+                                       $pager->getNumRows() )->parse() )
+                               . "\n"
+                       );
+               }
+
+               if ( $pager->getNumRows() ) {
+                       $out->addParserOutputContent( $pager->getFullOutput() );
+               } else {
+                       $out->addWikiMsg( 'autoblocklist-empty' );
+               }
+
+               if ( count( $otherAutoblockLink ) ) {
+                       $out->addHTML(
+                               Html::rawElement(
+                                       'h2',
+                                       [],
+                                       $this->msg( 'autoblocklist-otherblocks', count( $otherAutoblockLink ) )->parse()
+                               ) . "\n"
+                       );
+                       $list = '';
+                       foreach ( $otherAutoblockLink as $link ) {
+                               $list .= Html::rawElement( 'li', [], $link ) . "\n";
+                       }
+                       $out->addHTML(
+                               Html::rawElement(
+                                       'ul',
+                                       [ 'class' => 'mw-autoblocklist-otherblocks' ],
+                                       $list
+                               ) . "\n"
+                       );
+               }
+       }
+
+       protected function getGroupName() {
+               return 'users';
+       }
+}
index a69406c..830b438 100644 (file)
@@ -289,7 +289,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                                'text',
                                [
                                        'id' => 'emailusertarget',
-                                       'class' => 'mw-autocomplete-user',  // used by mediawiki.userSuggest
+                                       'class' => 'mw-autocomplete-user', // used by mediawiki.userSuggest
                                        'autofocus' => true,
                                        'size' => 30,
                                ]
old mode 100755 (executable)
new mode 100644 (file)
index b33aa7d..127b530 100644 (file)
@@ -387,7 +387,8 @@ class UserrightsPage extends SpecialPage {
                $user->invalidateCache();
 
                // update groups in external authentication database
-               Hooks::run( 'UserGroupsChanged', [ $user, $add, $remove, $this->getUser(), $reason ] );
+               Hooks::run( 'UserGroupsChanged', [ $user, $add, $remove, $this->getUser(),
+                       $reason, $oldUGMs, $newUGMs ] );
                MediaWiki\Auth\AuthManager::callLegacyAuthPlugin(
                        'updateExternalDBGroups', [ $user, $add, $remove ]
                );
index c1c9ab0..e9d3f26 100644 (file)
@@ -111,7 +111,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
         */
        protected function transformFilterDefinition( array $filterDefinition ) {
                if ( isset( $filterDefinition['showHideSuffix'] ) ) {
-                         $filterDefinition['showHide'] = 'wl' . $filterDefinition['showHideSuffix'];
+                       $filterDefinition['showHide'] = 'wl' . $filterDefinition['showHideSuffix'];
                }
 
                return $filterDefinition;
index 57610fc..9a955fb 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 use MediaWiki\Session\BotPasswordSessionProvider;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
  * Utility class for bot passwords
@@ -68,7 +69,7 @@ class BotPassword implements IDBAccessObject {
        /**
         * Get a database connection for the bot passwords database
         * @param int $db Index of the connection to get, e.g. DB_MASTER or DB_REPLICA.
-        * @return Database
+        * @return IMaintainableDatabase
         */
        public static function getDB( $db ) {
                global $wgBotPasswordsCluster, $wgBotPasswordsDatabase;
index ef4537f..30e370e 100644 (file)
@@ -27,6 +27,7 @@ use MediaWiki\Auth\AuthManager;
 use MediaWiki\Auth\AuthenticationResponse;
 use MediaWiki\Auth\AuthenticationRequest;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\Database;
 
 /**
  * String Some punctuation to prevent editing from broken text-mangling proxies.
@@ -146,7 +147,6 @@ class User implements IDBAccessObject {
                'editmyuserjs',
                'editmywatchlist',
                'editsemiprotected',
-               'editusercssjs', # deprecated
                'editusercss',
                'edituserjs',
                'hideuser',
index cba46ae..231ab22 100644 (file)
        "undeleteviewlink": "اعرض",
        "undeleteinvert": "اعكس الاختيار",
        "undeletecomment": "السبب:",
-       "undeletedrevisions": "تم استرجاع {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلا|$1 تعديل}}",
-       "undeletedrevisions-files": "أسترجعت {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}}  و{{PLURAL:$2||ملف واحد|ملفان|$2 ملفات|$2 ملفًا|$2 ملف}}",
-       "undeletedfiles": "أسترجع {{PLURAL:$1||ملف واحد|ملفان|$1 ملفات|$1 ملفًا|$1 ملف}}",
        "cannotundelete": "بعض أو كل عملية الاسترجاع فشلت:\n$1",
        "undeletedpage": "'''تم استرجاع $1'''\n\nراجع [[Special:Log/delete|سجل الحذف]] لمعاينة عمليات الحذف والاسترجاعات الحديثة.",
        "undelete-header": "انظر الصفحات المحذوفة حديثا في [[Special:Log/delete|سجل الحذف]].",
index db353b9..23d0b1d 100644 (file)
        "undeleteviewlink": "ver",
        "undeleteinvert": "Invertir seleición",
        "undeletecomment": "Motivu:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revisión restaurada|$1 revisiones restauraes}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivu|$2 archivos}} restauraos",
-       "undeletedfiles": "{{PLURAL:$1|1 archivu restauráu|$1 archivos restauraos}}",
        "cannotundelete": "Falló total o parcialmente la restauración:\n$1",
        "undeletedpage": "'''Restauróse $1'''\n\nConsulta'l [[Special:Log/delete|rexistru d'esborraos]] pa ver los esborraos y restauraciones de recién.",
        "undelete-header": "Mira nel [[Special:Log/delete|rexistru d'esborraos]] les páxines esborraes recién.",
index 9925369..1e5d794 100644 (file)
        "undeleteviewlink": "ҡарарға",
        "undeleteinvert": "Һайланғандарҙы әйләндерергә",
        "undeletecomment": "Сәбәп:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|өлгө}} тергеҙелде",
-       "undeletedrevisions-files": "{{PLURAL:$1|1=өлгө}} һәм {{PLURAL:$2|файл}} тергеҙелде",
-       "undeletedfiles": "{{PLURAL:$1|файл}} тергеҙелде",
        "cannotundelete": "Юйыуҙы кире алып булманы:\n$1",
        "undeletedpage": "'''$1 бите тергеҙелде'''\n\nҺуңғы юйыуҙарҙы һәм тергеҙеүҙәрҙе ҡарау өсөн, [[Special:Log/delete|юйыу яҙмалары журналын]] ҡарағыҙ.",
        "undelete-header": "Һуңғы юйылған биттәрҙе [[Special:Log/delete|юйыу яҙмалары журналында]] ҡарағыҙ.",
index 5a2c295..fd6f1e0 100644 (file)
        "undeletebtn": "Wiederherstön",
        "undeletelink": "oschaugn / wiadaheastejn",
        "undeleteviewlink": "oschaugn",
-       "undeletedfiles": "$1 {{PLURAL:$1|Datei|Dateien}} san wieda hergstellt worn",
        "undelete-search-box": "Suach noch gleschde Artiken",
        "undelete-search-submit": "Suach",
        "undelete-show-file-submit": "Jo",
index 922c3d4..3d6f8e3 100644 (file)
        "php-uploaddisabledtext": "Загрузка файлаў была адключаная ў парамэтрах канфігурацыі PHP. Калі ласка, праверце значэньне парамэтра «file_uploads».",
        "uploadscripted": "Гэты файл утрымлівае HTML-код альбо скрыпт, які можа памылкова апрацоўвацца браўзэрам.",
        "upload-scripted-pi-callback": "Немагчыма загрузіць файл, які ўтрымлівае інструкцыі апрацоўкі табліцы стыляў XML.",
+       "upload-scripted-dtd": "Немагчыма загрузіць SVG-файлы, якія ўтрымліваюць нестандартнае DTD-абвяшчэньне.",
        "uploaded-script-svg": "У загружаным SVG-файле знойдзены небясьпечны элемэнт з падтрымкай сцэнароў «$1».",
        "uploaded-hostile-svg": "Знойдзены небясьпечны CSS у элемэнце стылю загружанага SVG-файла.",
        "uploaded-event-handler-on-svg": "Усталёўваць атрыбуты апрацоўніка падзеяў <code>$1=\"$2\"</code> не дазволена для SVG-файлаў.",
        "undeleteviewlink": "паказаць",
        "undeleteinvert": "Адваротны выбар",
        "undeletecomment": "Прычына:",
-       "undeletedrevisions": "{{PLURAL:$1|адноўленая $1 вэрсія|адноўленыя $1 вэрсіі|адноўленыя $1 вэрсіяў}}",
-       "undeletedrevisions-files": "адноўленыя $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}} і $2 {{PLURAL:$2|файл|файлы|файлаў}}",
-       "undeletedfiles": "{{PLURAL:$1|адноўлены $1 файл|адноўленыя $1 файлы|адноўленыя $1 файлаў}}",
        "cannotundelete": "Некаторыя або ўсе аднаўленьні не былі выкананыя:\n$1",
        "undeletedpage": "'''Старонка $1 была адноўленая'''\n\nГлядзіце [[Special:Log/delete|журнал выдаленьняў]] для прагляду апошніх выдаленьняў і аднаўненьняў.",
        "undelete-header": "Глядзіце [[Special:Log/delete|журнал выдаленьняў]] для прагляду апошніх выдаленьняў.",
        "htmlform-user-not-valid": "<strong>$1</strong> — некарэктнае імя карыстальніка.",
        "logentry-delete-delete": "$1 {{GENDER:$2|выдаліў|выдаліла}} старонку $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|выдаліў|выдаліла}} перанакіраваньне $3 шляхам перазапісу",
-       "logentry-delete-restore": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3",
+       "restore-count-revisions": "$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}}",
        "logentry-delete-event": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|1=падзеі ў журнале|падзеяў у журнале}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|вэрсіі|вэрсіяў}} старонкі $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць падзеяў у журнале на $3",
index d178140..3216686 100644 (file)
        "undeleteviewlink": "преглеждане",
        "undeleteinvert": "Обръщане на избора",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "{{PLURAL:$1|Една версия беше възстановена|$1 версии бяха възстановени}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Една версия|$1 версии}} и {{PLURAL:$1|един файл|$2 файла}} бяха възстановени",
-       "undeletedfiles": "{{PLURAL:$1|Един файл беше възстановен|$1 файла бяха възстановени}}",
        "cannotundelete": "Една или повече операции по възстановяване се провалиха:\n$1",
        "undeletedpage": "'''Страницата „$1“ беше възстановена.'''\n\nМожете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].",
        "undelete-header": "Прегледайте [[Special:Log/delete|дневника на изтриванията]] за текущо изтритите страници.",
index a536f3d..5cb321e 100644 (file)
        "rcfilters-hideminor-conflicts-typeofchange": "কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়, তাই এই ছাঁকনিটির সাথে নিম্নোক্ত পরিবর্তনের ধরন ছাঁকনিগুলির সংঘর্ষ আছে: $1",
        "rcfilters-typeofchange-conflicts-hideminor": "এই \"পরিবর্তনের ধরন\"-সংক্রান্ত ছাঁকনিটির সাথে \"অনুল্লেখ্য সম্পাদনা\" ছাঁকনিটির সংঘর্ষ আছে। কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়।",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)।",
+       "rclistfromreset": "তারিখ নির্বাচন পুনঃস্থাপন করুন",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "rcshowhideminor": "অনুল্লেখ্য পরিবর্তনগুলো $1",
        "rcshowhideminor-show": "দেখাও",
        "php-uploaddisabledtext": "পিএইপি -এ ফাইল আপলোড নিস্ক্রিয় রয়েছে।\nঅনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।",
        "uploadscripted": "এই ফাইলে এমন HTML বা স্ক্রিপ্ট কোড আছে যা একটি ওয়েব ব্রাউজার ভুল বুঝতে পারে।",
        "upload-scripted-pi-callback": "এক্সএমএল-স্টাইলশিট প্রক্রিয়াকরণ নির্দেশনাবিশিষ্ট কোন ফাইল আপলোড করা সম্ভব নয়।",
+       "upload-scripted-dtd": "SVG ফাইল আপলোড করা যাবে না যা অ-মানক DTD ঘোষণা ধারণ করে।",
        "uploaded-script-svg": "আপলোডকৃত SVG ফাইলে স্ক্রিপ্টযোগ্য উপাদান \"$1\" পাওয়া গেছে।",
        "uploaded-hostile-svg": "আপলোড করা SVG ফাইলের শৈলী উপাদানে অনিরাপদ সিএসএস পাওয়া গেছে।",
        "uploaded-event-handler-on-svg": "এসভিজি ফাইলের জন্য <code>$1=\"$2\"</code> ইভেন্ট-হ্যান্ডলার বৈশিষ্ট্যটি নির্ধারণ করা অনুমোদিত নয়।",
        "undeleteviewlink": "দেখাও",
        "undeleteinvert": "ব্যুত্ক্রমে নির্বাচন",
        "undeletecomment": "কারণ:",
-       "undeletedrevisions": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} পুনরুদ্ধার করা হয়েছে",
-       "undeletedrevisions-files": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} এবং {{PLURAL:$2|১টি ফাইল|$2টি ফাইল}} পুনরুদ্ধার করা হয়েছে",
-       "undeletedfiles": "{{PLURAL:$1|১টি ফাইল|$1টি ফাইল}} পুনরুদ্ধার করা হয়েছে",
        "cannotundelete": "কিছু বা সব পুনরুদ্ধার করা যায়নি:\n$1",
        "undeletedpage": "'''$1 পুনরুদ্ধার করা হয়েছে'''\n\nসাম্প্রতিক মুছে ফেলা ও পুনরুদ্ধারের ঘটনাগুলির জন্য [[Special:Log/delete|অবলুপ্তি লগ]] দেখুন।",
        "undelete-header": "সাম্প্রতিক সময়ে মুছে ফেলা পাতাগুলি দেখতে [[Special:Log/delete|অবলুপ্তি লগ]] দেখুন।",
        "htmlform-user-not-valid": "<strong>$1</strong> একটি বৈধ ব্যবহারকারীর নাম নয়।",
        "logentry-delete-delete": "$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে",
        "logentry-delete-delete_redir": "$1 পুনর্লিখনের দ্বারা $3 পুনর্নির্দেশ {{GENDER:$2|অপসারণ করেছেন}}",
-       "logentry-delete-restore": "$1 কর্তৃক $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে",
+       "logentry-delete-restore": "$1 $3 পাতাটি {{GENDER:$2|পুনরুদ্ধার করেছেন}} ($4)",
+       "logentry-delete-restore-nocount": "$1 $3 পাতাটি {{GENDER:$2|পুনরুদ্ধার করেছেন}}",
+       "restore-count-revisions": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}}",
+       "restore-count-files": "{{PLURAL:$1|১টি ফাইল|$1টি ফাইল}}",
        "logentry-delete-event": "$1 {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
        "logentry-delete-revision": "$1 {{PLURAL:$5|একটি সংস্করণের|$5টি সংস্করণের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
        "logentry-delete-event-legacy": "$1 $3টায় লগ ইভেন্টসমূহের দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন",
        "special-characters-group-thai": "থাই",
        "special-characters-group-lao": "লাও",
        "special-characters-group-khmer": "খেমার",
+       "special-characters-group-canadianaboriginal": "কানাডীয় আদিবাসী",
        "special-characters-title-endash": "en ড্যাশ",
        "special-characters-title-emdash": "em ড্যাশ",
        "special-characters-title-minus": "বিয়োগ চিহ্ন",
        "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে ব্যবহার করুন: :<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "সংশোধন $1",
        "pageid": "পাতার আইডি $1",
-       "rawhtml-notallowed": "&lt;html&gt; ট্যাগ স্বাভাবিক পৃষ্ঠাগুলির বাহিরে ব্যবহার করা যাবে না।"
+       "rawhtml-notallowed": "&lt;html&gt; ট্যাগ স্বাভাবিক পৃষ্ঠাগুলির বাহিরে ব্যবহার করা যাবে না।",
+       "gotointerwiki": "{{SITENAME}} ছেড়ে যাচ্ছেন",
+       "gotointerwiki-invalid": "নিদিষ্টকৃত শিরোনামটি অবৈধ ছিল।",
+       "gotointerwiki-external": "আপনি [[$2]] পরিদর্শন করতে {{SITENAME}} ছাড়তে চলেছেন যা একটি ভিন্ন ওয়েবসাইট।\n\n[$1 $1-এ অবিরত থাকতে এখানে ক্লিক করুন]।",
+       "undelete-cantedit": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ আপনার এই পাতাটি সম্পাদনা করার অনুমতি নেই।",
+       "undelete-cantcreate": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ এই নামে কোন পাতা বিদ্যমান নেই ও আপনার এই পাতাটি তৈরি করার অনুমতি নেই।"
 }
index e0ab301..8d0ecf9 100644 (file)
        "undeleteviewlink": "gwelet",
        "undeleteinvert": "Eilpennañ an diuzadenn",
        "undeletecomment": "Abeg :",
-       "undeletedrevisions": "Adsavet {{PLURAL:$1|1 stumm|$1 stumm}}",
-       "undeletedrevisions-files": "Adsavet ez ez eus bet {{PLURAL:$1|1 stumm|$1 stumm}} ha {{PLURAL:$2|1 restr|$2 restr}}",
-       "undeletedfiles": "{{PLURAL:$1|1 restr|$1 restr}} adsavet",
        "cannotundelete": "Dibosupl eo bet nullañ diziverkadennoù zo pe an holl anezho :\n$1",
        "undeletedpage": "'''Diziverket eo bet $1'''\n\nSellit ouzh [[Special:Log/delete|marilh an diverkadennoù]] evit teuler ur sell ouzh an diverkadennoù diwezhañ.",
        "undelete-header": "Gwelet [[Special:Log/delete|al log diverkañ]] evit ar pajennoù diverket nevez zo.",
index 9ac1030..47d504d 100644 (file)
        "undeleteviewlink": "pogledaj",
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|vraćena $1 verzija|vraćene $1 verzije|vraćeno $1 verzija}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 verzija|$1 verzije|$1 verzija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno",
-       "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
        "cannotundelete": "Vraćanje jedne ili svih stavki nije uspjelo:\n$1",
        "undeletedpage": "<strong>Stranica $1 je vraćena</strong>\n\nProvjerite [[Special:Log/delete|zapisnik brisanja]] za zapise nedavnih brisanja i vraćanja.",
        "undelete-header": "Pogledajte [[Special:Log/delete|zapisnik brisanja]] za nedavno obrisane stranice.",
        "special-characters-group-thai": "tajlandski",
        "special-characters-group-lao": "laoski",
        "special-characters-group-khmer": "kmerski",
+       "special-characters-group-canadianaboriginal": "kanadski domorodni",
        "special-characters-title-endash": "crtica",
        "special-characters-title-emdash": "duga crta",
        "special-characters-title-minus": "minus",
index 0ccc4ed..f2602f3 100644 (file)
        "undeleteviewlink": "veure",
        "undeleteinvert": "Invertir selecció",
        "undeletecomment": "Motiu:",
-       "undeletedrevisions": "{{PLURAL:$1|Una revisió restaurada|$1 revisions restaurades}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Una revisió|$1 revisions}} i {{PLURAL:$2|un fitxer|$2 fitxers}} restaurats",
-       "undeletedfiles": "$1 {{PLURAL:$1|fitxer restaurat|fitxers restaurats}}",
        "cannotundelete": "Hi ha hagut un error en algunes o totes les restauracions:\n$1",
        "undeletedpage": "'''S'ha restaurat «$1»'''\n\nConsulteu el [[Special:Log/delete|registre d'esborraments]] per a veure els esborraments i els restauraments més recents.",
        "undelete-header": "Vegeu [[Special:Log/delete|el registre d'eliminació]] per a veure les pàgines eliminades recentment.",
index a5f7bc0..3819e5b 100644 (file)
        "undeleteviewlink": "хьажа",
        "undeleteinvert": "Къастае массо",
        "undeletecomment": "Бахьана:",
-       "undeletedrevisions": "{{PLURAL:$1|меттахӀоьттина}} $1 {{PLURAL:$1|хийцам}}",
-       "undeletedrevisions-files": "меттахӀоьттина $1 {{PLURAL:$1|верси}} а, $2 {{PLURAL:$2|файл}} а",
-       "undeletedfiles": "$1 {{PLURAL:$1|файл меттахӀоттайина|файлаш меттахӀоттайина}}",
        "cannotundelete": "ГӀалат меттахӀоттайина:\n$1",
        "undeletedpage": "'''МеттахӀоттайина агӀо «$1».'''\n\nДӀадяхнарш долу могӀане [[Special:Log/delete|тéптаре хьажа]].",
        "undelete-header": "Дукху хан йоцуш дӀаяхна агӀонаш хьажа мега [[Special:Log/delete|дӀадаьхьнарш долу тептар чохь]].",
index 176b2b7..34ab28b 100644 (file)
        "undeletebtn": "Кери кетир!",
        "undeletelink": "косьтер/кери кетир",
        "undeletecomment": "Себеп:",
-       "undeletedrevisions": "Топлам {{PLURAL:$1|1=1 къайд|$1 къайд}} кери кетирильди.",
        "undelete-header": "Кеченлерде ёкъ этильген саифелерни корьмек ичюн [[Special:Log/delete|ёкъ этюв журналына]] бакъынъыз.",
        "undelete-search-submit": "Къыдыр",
        "namespace": "Исим фезасы:",
index 0f463ba..4b1400d 100644 (file)
        "undeletebtn": "Keri ketir!",
        "undeletelink": "köster/keri ketir",
        "undeletecomment": "Sebep:",
-       "undeletedrevisions": "Toplam {{PLURAL:$1|1 qayd|$1 qayd}} keri ketirildi.",
        "undelete-header": "Keçenlerde yoq etilgen saifelerni körmek içün [[Special:Log/delete|yoq etüv jurnalına]] baqıñız.",
        "undelete-search-submit": "Qıdır",
        "namespace": "İsim fezası:",
index d159371..79e2bf7 100644 (file)
        "rcfilters-filter-user-experience-level-experienced-label": "Zkušení uživatelé",
        "rcfilters-filter-user-experience-level-experienced-description": "Více než 30 dní činnosti a 500 editací.",
        "rcfilters-filtergroup-automated": "Automatizované příspěvky",
-       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-label": "Robot",
        "rcfilters-filter-bots-description": "Editace provedené pomocí automatizovaných nástrojů.",
-       "rcfilters-filter-humans-label": "Člověk (ne bot)",
+       "rcfilters-filter-humans-label": "Člověk (ne robot)",
        "rcfilters-filter-humans-description": "Editace provedené lidmi.",
        "rcfilters-filtergroup-reviewstatus": "Stav prověření",
        "rcfilters-filter-patrolled-label": "Prověřené",
        "undeleteviewlink": "prohlédnout",
        "undeleteinvert": "Invertovat výběr",
        "undeletecomment": "Důvod:",
-       "undeletedrevisions": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}} a {{PLURAL:$2|jeden soubor|$2 soubory|$2 souborů}}.",
-       "undeletedfiles": "{{PLURAL:$1|Obnoven jeden soubor|Obnoveny $1 soubory|Obnoveno $1 souborů}}",
        "cannotundelete": "Některá nebo všechna obnovení se nezdařila:\n$1",
        "undeletedpage": "<strong>Stránka „$1“ byla obnovena</strong>\n\nZáznam o posledních mazáních a obnoveních najdete v [[Special:Log/delete|knize smazaných stránek]].",
        "undelete-header": "Vizte nedávno smazané stránky v [[Special:Log/delete|knize smazaných stránek]].",
        "htmlform-user-not-valid": "<strong>$1</strong> není platné uživatelské jméno.",
        "logentry-delete-delete": "$1 {{GENDER:$2|smazal|smazala}} stránku $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|smazal|smazala}} přesunem přesměrování $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3",
+       "restore-count-revisions": "{{PLURAL:$1|jedna revize|$1 revize|$1 revizí}}",
+       "restore-count-files": "{{PLURAL:$1|jeden soubor|$1 soubory|$1 souborů}}",
        "logentry-delete-event": "$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} stránky $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3",
index 8114a09..b74fbb1 100644 (file)
        "undeleteviewlink": "ansehen",
        "undeleteinvert": "Auswahl umkehren",
        "undeletecomment": "Grund:",
-       "undeletedrevisions": "{{PLURAL:$1|1 Version wurde|$1 Versionen wurden}} wiederhergestellt",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Version|$1 Versionen}} und {{PLURAL:$2|1 Datei|$2 Dateien}} wurden wiederhergestellt",
-       "undeletedfiles": "{{PLURAL:$1|1 Datei wurde|$1 Dateien wurden}} wiederhergestellt",
        "cannotundelete": "Einige oder alle Wiederherstellungen sind fehlgeschlagen:\n$1",
        "undeletedpage": "'''„$1“''' wurde wiederhergestellt.\n\nIm [[Special:Log/delete|Lösch-Logbuch]] findest du eine Übersicht der gelöschten und wiederhergestellten Seiten.",
        "undelete-header": "Siehe das [[Special:Log/delete|Lösch-Logbuch]] für kürzlich gelöschte Seiten.",
        "unblocked-id": "Sperr-ID $1 wurde freigegeben",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] wurde freigegeben.",
        "blocklist": "Gesperrte Benutzer",
+       "autoblocklist": "Automatische Sperren",
+       "autoblocklist-submit": "Suchen",
+       "autoblocklist-legend": "Automatische Sperren auflisten",
+       "autoblocklist-localblocks": "Lokale automatische {{PLURAL:$1|Sperre|Sperren}}",
+       "autoblocklist-empty": "Die Liste der automatischen Sperren ist leer.",
+       "autoblocklist-otherblocks": "Andere automatische {{PLURAL:$1|Sperre|Sperren}}",
        "ipblocklist": "Gesperrte Benutzer",
        "ipblocklist-legend": "Suche nach einem gesperrten Benutzer",
        "blocklist-userblocks": "Benutzersperren ausblenden",
        "htmlform-user-not-valid": "<strong>$1</strong> ist kein gültiger Benutzername.",
        "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seite $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|löschte}} die Weiterleitung $3 durch Überschreiben",
-       "logentry-delete-restore": "$1 {{GENDER:$2|stellte}} Seite $3 wieder her",
+       "logentry-delete-restore": "$1 {{GENDER:$2|stellte}} die Seite „$3“ wieder her ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|stellte}} die Seite „$3“ wieder her",
+       "restore-count-revisions": "{{PLURAL:$1|Eine Version|$1 Versionen}}",
+       "restore-count-files": "{{PLURAL:$1|Eine Datei|$1 Dateien}}",
        "logentry-delete-event": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|einer Version|von $5 Versionen}} der Seite $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit von Logbucheinträgen auf $3",
index 19fd992..735f273 100644 (file)
        "viewyourtext": "Na pela '''Vurnayışê ke kerdê''' re şıma şenê kopya kerê:",
        "protectedinterface": "Na pela qandê nusnerin destegê verri dana u kes xırabin nêqero deye kerda kılit.",
        "editinginterface": "'''İqaz:''' Şıma yew perra ke softwarei rê nuştey miyan-bestoği dana cı, aye vırnenê.\nVırnayışê ena perre do eno wiki sero asayışê miyan-bestoğê karberanê binan de bıaso.\n\nTadayışi (çarnayışi) rê , yardımê [https://translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra haydarê procêdoşkerdışi de vınderê.",
-       "cascadeprotected": "No pel de vurnayiş qedexe biyo, çunke şıma tuşa \"kademeyın\" aqtif kerdo u no {{PLURAL:$1|pele|pelo}} pawıteyo de xebıtyeno:\n$2",
+       "cascadeprotected": "Ena perre vırnayışan rê akerde niya, çunke a {{PLURAL:$1|perre|perranê}} bınênan de zi yew be yew ravêrdeya, gırweniyena:\n$2",
        "namespaceprotected": "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
-       "customcssprotected": "Mısadeyê şıma çıniyo ke na pela CSSi bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.",
-       "customjsprotected": "Mısadeyê şıma çıniyo ke na pela Java Scripti bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.",
+       "customcssprotected": "İzına şıma çıniya ke ena perra CSSi bıvırnên, çıke ena perra xısusiye eyaranê karberan gêna xo miyan.",
+       "customjsprotected": "İzına şıma çıniya ke ena perra Java Scripti bıvırnên, çıke ena perra xısusiye eyaranê karberan gêna xo miyan.",
        "mycustomcssprotected": "Desturê şıma çıniyo ke na pela CSSi bıvurnê.",
        "mycustomjsprotected": "Desturê şıma çıniyo ke na pela JavaScripti bıvurnê.",
        "myprivateinfoprotected": "Ğısusi malumatana ğo timar kerdışire icazeta şıma çıniya.",
        "userlogin-joinproject": "Cıkewe {{SITENAME}}",
        "createaccount": "Hesab vıraze",
        "userlogin-resetpassword-link": "Parola xo kerda xo vira?",
-       "userlogin-helplink2": "Heqa qeydbiyayışi de peşti bıgêrên",
+       "userlogin-helplink2": "Qeydbiyayışi sero peşti bıgêrên",
        "userlogin-loggedin": "Tı xora namey {{GENDER:$1|$1}} ra kewtê/kewtay cı.\nFormê cêrêni bıgureyne ke namey karberio bin ra cı kewê.",
        "userlogin-reauth": "Eger ke {{GENDER:$1|$1}} şımayê se xo araşt kerdışirê fına ronıştış akerê.",
        "userlogin-createanother": "Zewbi hesab vıraz",
        "permissionserrors": "İdari xeta",
        "permissionserrorstext": "Qey {{PLURAL:$1|sebeb|sebebê}} cêrini ra icazetê şıma çıniyo:",
        "permissionserrorstext-withaction": "{{PLURAL:$1|Sebebê|Sebebê}} cêri ra icazetê $2y çıniyo:",
-       "recreate-moveddeleted-warn": "'''Hişyari: no pel o ke şıma vırazeni vere cû vırazyayo.'''\n\nDiqet bıkeri no vurnayişê şıma re gerek esto:",
+       "recreate-moveddeleted-warn": "'''Hişyari: Şıma yew nuşteyo ke veri de esteriyao, ey vırazenê.'''\n\nHetê bınêni de qeydê esterıtışi u kırıştışi esto:",
        "moveddeleted-notice": "Ena pela esteriya ya.\nQeydé  esternayışi u wedarnayışi cér dé deya yo.",
        "log-fulllog": "Temamê rocaneyi bıvine",
        "edit-hook-aborted": "Vurnayiş vınderiya.\nYew sebeb beyan nibı.",
        "page_first": "verên",
        "page_last": "peyên",
        "histlegend": "Ferqê weçinayışi: Qutiya versiyonan qandé  têversanayış işaret ke u dest be ''enter''i ya zi gocega cêrêne rone.<br />\nCetwel: <strong>({{int:ferq}})</strong> = ferqê versiyonê peyêni, <strong>({{int:peyên}})</strong> = ferqê versiyonê verêni, <strong>{{int:q}}</strong> = vırnayışo werdiyo.",
-       "history-fieldset-title": "Çımberz verori",
+       "history-fieldset-title": "Çım ra viyarnayışan cı geyre",
        "history-show-deleted": "Tenya esterıtey",
        "histfirst": "Verênêr",
        "histlast": "Peyênêr",
        "action-mergehistory": "tarixê ena perre yew ke",
        "action-userrights": "heqqa karberanê hemî bivurne",
        "action-userrights-interwiki": "heqqa karberanê ke wikiyê binî de hemî bivurne",
-       "action-siteadmin": "database kilit bike ya zi a bike",
+       "action-siteadmin": "Databasei kılit ke ya zi a ke",
        "action-sendemail": "e-posta bırşe",
        "action-editmyoptions": "Tercihanê xo bıvurne",
        "action-editmywatchlist": "Lista xoya ewniyayışi bıvırnê",
        "recentchanges": "Vırnayışê peyêni",
        "recentchanges-legend": "Tercihê vırnayışanê peyênan",
        "recentchanges-summary": "Wiki sero vırnayışê peyêni asenê.",
-       "recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.",
+       "recentchanges-noresult": "Demê periyodi de vırnayış be enê kriteran çıniyo.",
        "recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
        "recentchanges-label-newpage": "Enê vırnayışi yew perra newiye vıraşta.",
        "recentchanges-label-minor": "No yew vırnayışo werdiyo",
        "undeleteviewlink": "bıvin",
        "undeleteinvert": "Weçinayışi dimlaşt ke",
        "undeletecomment": "Sebeb:",
-       "undeletedrevisions": "pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revizyon|$1 revizyon}} u {{PLURAL:$2|1 dosya|$2 dosya}} ameyê halê xo yê verıni",
-       "undeletedfiles": "{{PLURAL:$1|1 dosya|$1 dosya}} tepiya anciyayi.",
        "cannotundelete": "Besternayışonhemembyana tayno nêbeno:\n$1",
        "undeletedpage": "'''$1 pel tepiya anciya'''\n\nqey karê tepiya ardışi u qey karê hewn a kerdışê verıni bıewnê [[Special:Log/delete|qeydê hewn a kerdışi]].",
        "undelete-header": "Peleyê ke veror de besterneyayê êna bıvinê: [[Special:Log/delete|qeydê esterneya]].",
        "block": "Karberi vındarne",
        "unblock": "Hesabê karberi akerê",
        "blockip": "{{GENDER:$1|Karberi}} kılit ke",
-       "blockip-legend": "Karber blok bike",
+       "blockip-legend": "Karberi blok ke",
        "blockiptext": "pê şuxulnayişê formê cêrıni, şıma eşkeni verniyê vurnayişkerdışê yew karberi ya zi yew IPyi bıgêrî. No têna qey verni-gırewtışê vandalizmiyo u gani şıma [[{{MediaWiki:Policy-url}}|qaydeyan]] re diqqet bıkeri. cêr de muheqqeq sebebê verni-grewtışi bınusi. (mesela: -nê- pelani de vandalizm kerdo)",
        "ipaddressorusername": "Adresa IPy ya zi nameyê karberi:",
        "ipbexpiry": "Qedyayış:",
        "ipbsubmit": "Nê karberi kılit ke",
        "ipbother": "Waxtê bini:",
        "ipboptions": "2 saeti:2 hours,1 roce:1 day,3 roci:3 days,1 hefte:1 week,2 heftey:2 weeks,1 aşme:1 month,3 aşmi:3 months,6 aşmi:6 months,1 serre:1 year,ebedi:infinite",
-       "ipbhidename": "Nameyê karberî listeyan u vurnayîşan ra binumne",
-       "ipbwatchuser": "Pela miniqaşe u pela ena karberî seyr bike",
+       "ipbhidename": "Namey karberi vırnayış u listan ra bınımne",
+       "ipbwatchuser": "Perra karberanê karberi u werênayışi cı ewne.",
        "ipb-disableusertalk": "No karber wexto ke bloqedeyo wa pela da xodı vurnayış kerdışi rê izin medı",
-       "ipb-change-block": "Pê ena ayaran, karberî reyna bloke bike",
+       "ipb-change-block": "Karberi be enê eyaran reyna piya bloke ke.",
        "ipb-confirm": "Bloke kerdışi tesdik ke",
        "badipaddress": "Adresê IPî raşt niyo",
        "blockipsuccesssub": "Blok biyo",
        "ipb-confirmhideuser": "Wexto ke \"karberi bınımnê\" nışandeyo se şıma ye kenê karberi bloke kerê. No, Namey karberi lista pêron dı u dekewtışê rocekan dı aktiv bo.Şıma qayıli ney bıkerê?",
        "ipb-edit-dropdown": "Sebebê blokî bivurne",
        "ipb-unblock-addr": "$1 a bik",
-       "ipb-unblock": "Yew adresê IPî ya zi nameyê karberî blok bike",
+       "ipb-unblock": "Yew adresê IPy ya zi namey karberi bloke ke",
        "ipb-blocklist": "Blokî ke hama estê ey bivîne",
        "ipb-blocklist-contribs": "İştirakê {{GENDER:$1|$1}}`i",
        "ipb-blocklist-duration-left": "$1 vet",
-       "unblockip": "Hesabê karberî a bike",
+       "unblockip": "Hesabê karberi a ke",
        "unblockiptext": "Cıreştışê nuştışê IP ya zi karberio ke ver ra gêriyayo, seba peyser barkerdışi dey rê formê cêrêni bıgurenên.",
        "ipusubmit": "Enê kılit kerdışi wedarnê",
        "unblocked": "[[User:$1|$1]] blok biyo",
        "move-page": "$1 Bıkırış",
        "move-page-legend": "Pele bere",
        "movepagetext": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|double]] ya zi [[Special:BrokenRedirects|broken redirects]] qontrol bıki.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''Teme!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
-       "movepagetext-noredirectfixer": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|raçarnayışo dılet]] ya zi [[Special:BrokenRedirects|raçarnayışo xırab]]i qontrol bıke.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İkaz!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
+       "movepagetext-noredirectfixer": " Gırwenayışê formê bınêni do namey perre newe vırazo, pêro vêrorê cı bıkırışo namey newe ser.\nMa namey kıhanêri keni perra serşıkıtışi ser nameyo newe.\nŞıma şenê perra serşıkıtışı zi berê namey raştıkên bıvırnên.\n\nEger şıma nêwazenê, ma şıma ra reca keni şıma [[Special:DoubleRedirects|açarnayışo (tadayışo) dılet]] ya zi [[Special:BrokenRedirects|açarnayışo (tadayışon) çewt]]i kontrol kerên.\nŞıma gani kontrol kerên eger linki şınê perranê raştan ser.\n\nTeme eger ser yew name de yew nuşte esto, sistemê wiki '''nêşeno''' nuştey şıma bıkırışo. Eger ser enê namey de yew perra venge esta, sistemê wiki şeno nuştey şıma bıkırışo.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İqaz!'''\nNo kırıştış şeno yew perra populere rê wışkên u nêpawiyay bo. Ma şıma ra reca kenime, kerdışê xo ra ver peyniyê cı bıvênên.",
        "movepagetalktext": "Ma peleyê mınaqeşeyê ena pele otomatik beno, '''ma nıeşken ber, eg:'''\n*Yew peleyê mınaqeşeyê ser ena name rona esto, ya zi\n*Tı quti check nıkerd.\n\nOturse, tı gani peleyê mınaqeşeyê manually beri.",
        "moveuserpage-warning": "'''Diqet:''' Ti eka yew pelê karberi beni. Diqet bike teyna pel beni feqat ena pele reyna nameyê newi \"nebeno''.",
        "movenologintext": "qey vurnayişê nameyê peli şıma gani qeyd kerde u cıkewteyê [[Special:UserLogin|sistemi]] bıbiy.",
        "unit-pixel": "px",
        "confirm_purge_button": "Temam",
        "confirm-purge-top": "Vervirê na pele bestere?",
-       "confirm-purge-bottom": "Purge kerdişê yew pel cacheyî estereno u revizyonê penîyî mucneno.",
+       "confirm-purge-bottom": "Pakkerdışê yew perre virê verêni estereno u çımraviyarnayışê peyêni gêno ver.",
        "confirm-watch-button": "TEMAM",
        "confirm-watch-top": "Ena pele lista xoya seyrkerdışi ke",
        "confirm-unwatch-button": "TEMAM",
index b4faa3a..30cc41c 100644 (file)
        "undeletehistory": "यदि कुनै पानालाई पुन: स्थापन गरायौ भण्या सम्पूर्ण संस्करणहरू इतिहासमी पुन:स्थापन हुन्याछन् ।\nयदि यै नामबठे  नयाँ पानो निर्माण भैसक्याको छ भण्या पुन: स्थापित संस्करणहरू पूर्व इतिहासको रुपमी स्थापित हुन्याछन् ।",
        "undeleterevdel": "यदि यो मल्लो पानो बणन्छ  या फाइल संस्करणहरू आंशिक मेटियाका छन् भण्या मेट्न्या काम रद्द गरिन्या छैन।\nत्यै अवस्थामी तमीले छनौटमी अन्तिम मेटियाको नयाँ संस्करण नलुकाउन्यामी चिनो लगाउनु पडन्छ ।",
        "undelete-revision": "$3द्वारा $1को ($4को  समय $5 मी) मेट्याका संशोधनहरू :",
-       "undeletedrevisions": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} पुनर्स्थापित गरियो",
-       "undeletedrevisions-files": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} र {{PLURAL:$2|एउटा फाइल|$2 फाइलहरू}} पुनर्स्थापित गरियो",
-       "undeletedfiles": "{{PLURAL:$1|१ फाइल|$1 फाइलहरू }} पूर्वस्थितिमी ल्याइयो",
        "undelete-header": "भर्खरै मेटायाका पानाहरू हेद्दाकीलाई [[Special:Log/delete|मेटायाका लग]]मी जाओ।",
        "undelete-search-prefix": "सुरुवाती शब्द अनुसार पानाहरू खोज",
        "undelete-no-results": "मेटियाका पानाहरूको अभिलेखमी क्वै पन मिल्दा पानाहरू नाइभेटिया ।",
index ff0286c..1a94c80 100644 (file)
        "undeleteviewlink": "προβολή",
        "undeleteinvert": "Ανατροπή επιλογής",
        "undeletecomment": "Αιτία:",
-       "undeletedrevisions": "{{PLURAL:$1|τροποποίηση|τροποποιήσεις}} αποκαταστάθηκαν",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} και $2 {{PLURAL:$2|αρχείο|αρχεία}} επαναφέρθηκαν",
-       "undeletedfiles": "$1 {{PLURAL:$1|αρχείο|αρχεία}} επαναφέρθηκαν",
        "cannotundelete": "Μερικές ή όλες οι  αναιρέσεις διαγραφής απέτυχαν: $1",
        "undeletedpage": "'''Η $1 έχει επαναφερθεί'''\n\nΣυμβουλευτείτε το [[Special:Log/delete|αρχείο καταγραφής διαγραφών]] για ένα μητρώο των πρόσφατων διαγραφών και επαναφορών.",
        "undelete-header": "Δείτε [[Special:Log/delete|το αρχείο καταγραφής διαγραφών]] για πρόσφατα διαγεγραμμένες σελίδες.",
index e08a439..582f5f7 100644 (file)
        "right-editsemiprotected": "Edit pages protected as \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Edit the content model of a page",
        "right-editinterface": "Edit the user interface",
-       "right-editusercssjs": "Edit other users' CSS and JavaScript files",
        "right-editusercss": "Edit other users' CSS files",
        "right-edituserjs": "Edit other users' JavaScript files",
        "right-editmyusercss": "Edit your own user CSS files",
        "unblocked-id": "Block $1 has been removed.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] has been unblocked.",
        "blocklist": "Blocked users",
+       "autoblocklist": "Autoblocks",
+       "autoblocklist-submit": "Search",
+       "autoblocklist-legend": "List autoblocks",
+       "autoblocklist-localblocks": "Local {{PLURAL:$1|autoblock|autoblocks}}",
+       "autoblocklist-empty": "The autoblock list is empty.",
+       "autoblocklist-otherblocks": "Other {{PLURAL:$1|autoblock|autoblocks}}",
        "ipblocklist": "Blocked users",
        "ipblocklist-legend": "Find a blocked user",
        "blocklist-userblocks": "Hide account blocks",
index d50eb85..32cb092 100644 (file)
        "post-expand-template-argument-warning": "Averto: Ĉi tiu paĝo enhavas almenaŭ unu ŝablonan argumenton, kiu havas tro grandan etendan pezon.\nĈi tiuj argumentoj estis forlasitaj.",
        "post-expand-template-argument-category": "Paĝoj enhavantaj forlasitajn argumentojn de ŝablonoj",
        "parser-template-loop-warning": "Rekursiva ŝablono estis trovita: [[$1]]",
+       "template-loop-category": "Paĝoj kun ŝablonaj iteracioj",
        "parser-template-recursion-depth-warning": "Ŝablona profundeco transpasis limon ($1)",
        "language-converter-depth-warning": "Profundo de lingvo-konvertilo preterpasis limon ($1)",
        "node-count-exceeded-category": "Paĝoj kie la nombro da nodoj estas preterpasita",
        "undeleteviewlink": "vidi",
        "undeleteinvert": "Inversigi selektaĵon",
        "undeletecomment": "Kialo:",
-       "undeletedrevisions": "{{PLURAL:$1|1 versio restarigita|$1 versioj restarigitaj}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 versio|$1 versioj}} kaj {{PLURAL:$2|1 dosiero|$2 dosieroj}} restarigitaj",
-       "undeletedfiles": "{{PLURAL:$1|1 dosiero restarigita|$1 dosieroj restarigitaj}}",
        "cannotundelete": "Iu aŭ ĉiuj restarigoj malsukcesis: \n$1",
        "undeletedpage": "'''$1 estis restarigita'''\n\nKonsultu la [[Special:Log/delete|deletion log]] por protokolo pri la lastatempaj forigoj kaj restarigoj.",
        "undelete-header": "Konsulti la [[Special:Log/delete|protokolo de forigoj]] por lastatempaj forigoj.",
index 304d113..3cecd14 100644 (file)
        "saveusergroups": "Guardar grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "userrights-groupsmember": "Miembro de:",
        "userrights-groupsmember-auto": "Miembro implícito de:",
-       "userrights-groups-help": "Usted puede alterar los grupos en que está este usuario:\n* Una casilla marcada significa que el usuario está en ese grupo.\n* Una casilla sin marcar significa que el usuario no está en ese grupo.\n* Un * indica que no se puede eliminar el grupo una vez que se han añadido o viceversa.\n* Un # indica que sólo se puede volver a poner la fecha de caducidad de este grupo; no se pueden llevar adelante.",
+       "userrights-groups-help": "Puedes cambiar los grupos en que está este usuario:\n* Una casilla marcada significa que el usuario está en ese grupo.\n* Una casilla sin marcar significa que el usuario no está en ese grupo.\n* Un * indica que no se puede eliminar el grupo una vez que se ha añadido o viceversa.\n* Un # indica que sólo se puede volver a poner la fecha de caducidad de membresía de este grupo; no se pueden llevar adelante.",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "No tienes permiso para editar permisos de usuario en otros wikis.",
        "userrights-nodatabase": "La base de datos $1 no existe o no es local.",
        "undeleteviewlink": "ver",
        "undeleteinvert": "Invertir selección",
        "undeletecomment": "Razón:",
-       "undeletedrevisions": "{{PLURAL:$1|Una revisión restaurada|$1 revisiones restauradas}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivo|$2 archivos}} restaurados",
-       "undeletedfiles": "$1 {{PLURAL:$1|archivo restaurado|archivos restaurados}}",
        "cannotundelete": "Hubo un error en la totalidad o en parte del proceso de la restauración:\n$1",
        "undeletedpage": "<strong>Se ha restaurado $1</strong>\n\nConsulta el [[Special:Log/delete|registro de borrados]] para ver una lista de los últimos borrados y restauraciones.",
        "undelete-header": "En el [[Special:Log/delete|registro de borrados]] se listan las páginas eliminadas.",
        "htmlform-user-not-valid": "<strong>$1</strong> no es un nombre de usuario válido.",
        "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|borró}} la redirección $3 con un traslado",
-       "logentry-delete-restore": "$1 restauró la página $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restauró}} la página $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|restauró}} la página $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 revisión|$1 revisiones}}",
+       "restore-count-files": "{{PLURAL:$1|1 archivo|$1 archivos}}",
        "logentry-delete-event": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|un evento|$5 eventos}} del registro en $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|una revisión |$5 revisiones}} en la página  $3: $4",
        "logentry-delete-event-legacy": "$1 ha {{GENDER:$2|cambiado}} la visibilidad de eventos del registro en $3",
        "restrictionsfield-label": "Intervalos de IP permitidos:",
        "restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activarlo todo, utiliza <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisión $1",
-       "pageid": "ID de página $1"
+       "pageid": "ID de página $1",
+       "gotointerwiki": "Salir de {{SITENAME}}",
+       "gotointerwiki-invalid": "El título especificado no es válido."
 }
index 63508b4..bce9bf8 100644 (file)
        "undeleteviewlink": "ikusi",
        "undeleteinvert": "Alderanztu aukera",
        "undeletecomment": "Arrazoia:",
-       "undeletedrevisions": "{{PLURAL:$1|Berrikuspen 1 leheneratu da|$1 berrikuspen leheneratu dira}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|berrikuspen|berrikuspen}} eta {{PLURAL:$2|fitxategi|fitxategi}} leheneratu dira",
-       "undeletedfiles": "{{PLURAL:$1|fitxategi|fitxategi}} leheneratu dira",
        "cannotundelete": "Ezabatutako birgaitze betean edo hainbatetan akatsa: $1",
        "undeletedpage": "'''«$1» leheneratu da'''\n\nAzken ezabatze eta leheneratzeak ikusteko, jo ezazu [[Special:Log/delete|ezabaketa erregistrora]].",
        "undelete-header": "Berriki ezabatutako orriak ikusteko, jo ezazu [[Special:Log/delete|ezabaketa erregistrora]].",
        "htmlform-user-not-valid": "<strong>$1</strong> erabiltzaile izena ezin da erabili.",
        "logentry-delete-delete": "$1 {{GENDER:$2|wikilariak}} «$3» orria ezabatu du",
        "logentry-delete-restore": "$1 administratzaileak «$3» orria {{GENDER:$2|lehengoratu}} du",
-       "logentry-delete-event": "$1 wikilariak ikusgaitasuna {{{{GENDER:$2|}}|aldatu}} {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4",
+       "logentry-delete-event": "$1 wikilariak ikusgaitasuna {{GENDER:$2|aldatu}} {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4",
        "logentry-delete-revision": "$1 erabiltzaileak {{PLURAL:$5|berrikuste baten|$5 berrikusteren}} ikusgaitasuna aldatu du «$3» orrian: $4",
-       "logentry-suppress-delete": "$1 erabiltzaileak $3 orrialdea {{GENDER:$2|ezabatu}} du",
+       "logentry-suppress-delete": "$1 erabiltzaileak $3 orria {{GENDER:$2|ezabatu}} du",
        "logentry-suppress-event": "$1 wikilariak ezkutuan ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, «$3» orrian: $4",
        "revdelete-content-hid": "edukia ezkutatu da",
        "revdelete-summary-hid": "edizioaren laburpena ezkutatu da",
index 91a1790..3769c68 100644 (file)
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
        "recentchanges-legend-plusminus": "(<em>±۱۲۳</em>)",
        "recentchanges-submit": "نمایش",
-       "rcfilters-activefilters": "Ù\81عاÙ\84â\80\8cکردÙ\86 Ù¾Ø§Ù\84اÛ\8cÙ\87â\80\8cÙ\87ا",
+       "rcfilters-activefilters": "پاÙ\84اÛ\8cÙ\87â\80\8cÙ\87اÛ\8c Ù\81عاÙ\84",
        "rcfilters-restore-default-filters": "بازگردانی پالایه‌های پیش‌فرض",
-       "rcfilters-clear-all-filters": "پاک‌کردن پالایش‌ها",
+       "rcfilters-clear-all-filters": "پاک‌کردن تمام پالایه‌ها",
        "rcfilters-search-placeholder": "پالایش تغییرات اخیر (جستجو یا شروع به تایپ)",
        "rcfilters-invalid-filter": "پالایهٔ نامعتبر",
        "rcfilters-empty-filter": "پالایه‌ای فعال نیست. همهٔ مشارکت‌های دیده می‌شوند.",
        "rcfilters-highlightmenu-title": "انتخاب رنگ",
        "rcfilters-highlightmenu-help": "یک رنگ انتخاب کنید تا این خصوصیت پر رنگ شود",
        "rcfilters-filterlist-noresults": "پالایه‌ای یافت نشد",
-       "rcfilters-noresults-conflict": "نتیجه‌ای یافت نشد چون محدوده جستجو دارای تداخل است",
-       "rcfilters-state-message-subset": "این پالایه تاثیری ندارد چون نتایج آن شامل موارد مرزی {{PLURAL:$2|پالایه|پالایه}} است (از پررنگ‌کننده برای تمایز استفاده کنید): $1",
-       "rcfilters-filtergroup-registration": "ثبت‌نام کاربر",
+       "rcfilters-noresults-conflict": "نتیجه‌ای یافت نشد چون محدودهٔ جستجو دارای تعارض است",
+       "rcfilters-state-message-subset": "این پالایه تاثیری ندارد چون نتایج آن توسط {{PLURAL:$2|پالایهٔ|پالایه‌های}} گسترده‌تری که در ادامه {{PLURAL:$2|آمده‌است|آمده‌اند}} شامل می‌شود (از پررنگ‌کننده برای تمایز استفاده کنید): $1",
+       "rcfilters-state-message-fullcoverage": "انتخاب تمام پالایه‌ها در یک گروه مثل این است که هیچ‌کدام را انتخاب نکنید، بنابراین پالایه‌ها اثری نداشتند. گروه شامل این موارد است: $1",
+       "rcfilters-filtergroup-registration": "ثبت نام کاربر",
        "rcfilters-filter-registered-label": "ثبت شده",
-       "rcfilters-filter-registered-description": "ورود ویرایشگران.",
+       "rcfilters-filter-registered-description": "ویرایشگران وارد شده به سامانه.",
        "rcfilters-filter-unregistered-label": "ثبت‌نام نکرده",
        "rcfilters-filter-unregistered-description": "ویرایشگرانی که به سامانه وارد نشده‌اند.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "پالایهٔ ثبت‌نشده غیرفعال می‌شود و تاثیرات آن توسط  {{PLURAL:$2|پالایه|پالایه‌های}} تجربه شده که فقط توسط کاربران ثبت‌نام شده {{PLURAL:$2|می‌یابد|می‌یابند}}:$1",
-       "rcfilters-filtergroup-authorship": "ویرایش نویسندگی",
-       "rcfilters-filter-editsbyself-label": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø´Ù\85ا",
-       "rcfilters-filter-editsbyself-description": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø§Ù\86جاÙ\85 Ø´Ø¯Ù\87 ØªÙ\88سط Ø´Ù\85ا.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "این پالایه با {{PLURAL:$2|پالایه|پالایه‌های}} تجربهٔ زیر که فقط کاربران ثبت‌نام شده را {{PLURAL:$2|می‌یابد|می‌یابند}} تعارض دارد: $1",
+       "rcfilters-filtergroup-authorship": "ویرایشگر",
+       "rcfilters-filter-editsbyself-label": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø®Ù\88دتاÙ\86",
+       "rcfilters-filter-editsbyself-description": "ویرایش‌های شما.",
        "rcfilters-filter-editsbyother-label": "ویرایش‌های دیگران",
-       "rcfilters-filter-editsbyother-description": "ویرایش‌های ایجاد شده توسط دیگران (نه شما).",
+       "rcfilters-filter-editsbyother-description": "ویرایش‌های ایجاد شده توسط دیگر کاربران (نه شما).",
        "rcfilters-filtergroup-userExpLevel": "درجهٔ تجربه (فقط برای کاربران ثبت‌نام کرده)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "این پالایه غیرفعال شد چون فقط کاربران ثبت‌نام کرده را پیدا می کرد در نتیجه پالایه کاربران ثبت‌نام نکرده تاثیرات آن را لغو می‌کند.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "پالایه کاربران ثبت‌نام نکرده با پالایه‌های دیگر در تعارض است. پالایه‌‌های دیگر فقط کاربران ثبت‌نام شده را می‌یابند. این پالایه‌های در تعارض در بالا غیرفعال شده‌اند.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "پالایه‌های تجربه فقط کاربران ثبت‌نام کرده را پیدا می‌کنند، در نتیجه با پالایهٔ «کاربران ثبت‌نام نکرده» تعارض دارند.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "پالایه «کاربران ثبت‌نام نکرده» با یک یا چند مورد از پالایه‌های تجربه در تعارض است. پالایه‌های دیگر در قسمت «پالایه‌های فعال» در بالا نشان داده شده‌اند.",
        "rcfilters-filter-user-experience-level-newcomer-label": "تازه‌واردها",
        "rcfilters-filter-user-experience-level-newcomer-description": "کمتر از ۱۰ ویرایش یا ۴ روز فعالیت.",
        "rcfilters-filter-user-experience-level-learner-label": "آموزندگان",
-       "rcfilters-filter-user-experience-level-learner-description": "فعالیت و تعداد روز بیشتر از تازه‌وارد ولی کمتر از کاربر باتجریه.",
+       "rcfilters-filter-user-experience-level-learner-description": "حجم و مدت فعالیت بیشتر از تازه‌واردان ولی کمتر از کاربران باتجریه.",
        "rcfilters-filter-user-experience-level-experienced-label": "کاربران باتجربه",
        "rcfilters-filter-user-experience-level-experienced-description": "بیشتر از ۳۰ روز فعالیت و ۵۰۰ ویرایش.",
        "rcfilters-filtergroup-automated": "ویرایش‌های خودکار",
        "rcfilters-filter-humans-description": "ویرایش توسط انسان.",
        "rcfilters-filtergroup-reviewstatus": "وضعیت بازبینی",
        "rcfilters-filter-patrolled-label": "گشت‌خورده",
-       "rcfilters-filter-patrolled-description": "برچسب ویرایش به عنوان گشت‌خورده.",
+       "rcfilters-filter-patrolled-description": "ویرایش‌های گشت‌خورده.",
        "rcfilters-filter-unpatrolled-label": "گشت‌نخورده",
-       "rcfilters-filter-unpatrolled-description": "ویرایش‌ها به عنوان گشت‌نخورده.",
+       "rcfilters-filter-unpatrolled-description": "ویرایش‌های گشت‌نخورده.",
        "rcfilters-filtergroup-significance": "اهمیت",
        "rcfilters-filter-minor-label": "ویرایش‌های جزئی",
        "rcfilters-filter-minor-description": "ویرایش‌هایی که به عنوان جزئی برچسب خورده‌اند.",
        "rcfilters-filter-newpages-label": "ایجاد صفحه",
        "rcfilters-filter-newpages-description": "ویرایش‌هایی که منجر به ایجاد صفحه شده‌اند.",
        "rcfilters-filter-categorization-label": "تغییرات رده",
-       "rcfilters-filter-categorization-description": "سیاههٔ صفحاتی که به رده افزوده یا حذف شده‌اند.",
+       "rcfilters-filter-categorization-description": "سوابق صفحه‌هایی که به رده‌ها افزوده یا حذف شده‌اند.",
        "rcfilters-filter-logactions-label": "سیاههٔ فعالیت‌ها",
        "rcfilters-filter-logactions-description": "فعالیت‌های مدیریتی، ایجاد حساب، حذف صفحه، بارگذاری‌ها ....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "پالایهٔ «ویرایش جزئی» با یک یا چند تا از پالایه‌های «نوع تغییرات» تعارض دارد چرا که برخی از انواع تغییرات را نمی‌توان به عنوان «جزئی» علامت زد. پالایه‌های دیگر در قسمت «پالایه‌های فعال» در بالا نشان داده شده‌اند.",
+       "rcfilters-hideminor-conflicts-typeofchange": "برخی از انواع تغییرات را نمی‌توان به عنوان «جزئی» علامت زد، به همین خاطر این پالایه با پالایه‌های «نوع تغییرات» که در ادامه آمده در تعارض است: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "این پالایهٔ «نوع تغییرات» با پالایهٔ «تغییرات جزئی» در تعارض است. برخی از انواع تغییرات را نمی‌توان به عنوان «جزئی» علامت زد.",
        "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
+       "rclistfromreset": "از نو کردن انتخاب تاریخ",
        "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
        "php-uploaddisabledtext": "بارگذاری پرونده‌های پی‌اچ‌پی غیرفعال است.\nلطفاً تنظیمات file_uploads را بررسی کنید.",
        "uploadscripted": "این صفحه حاوی کد اچ‌تی‌ام‌ال یا اسکریپتی است که ممکن است به‌نادرست توسط مرورگر وب تفسیر شود.",
        "upload-scripted-pi-callback": "نمی‌توان یک پرونده شامل دستورالعمل پردازش استایل‌شیت اکس‌ام‌ال بارگذاری کرد.",
+       "upload-scripted-dtd": "امکان بارگذاری پرونده‌های اس‌وی‌جی که حاوی تعارف دی‌تی‌دی غیر استاندارد باشند وجود ندارد.",
        "uploaded-script-svg": "عنصر قابل برنامه‌ریزی «$1» در پرونده بارگذاری اس‌وی‌جی یافت شد.",
        "uploaded-hostile-svg": "سی‌اس‌اس نا امن در عنصر سبک پروندهٔ بارگذاری شدهٔ اس‌وی‌جی یافت شد.",
        "uploaded-event-handler-on-svg": "قرار دادن ویژگی‌های مدیریت رویداد <code>$1=\"$2\"</code> در پرونده‌های اس‌وی‌جی مجاز نیست.",
        "undeleteviewlink": "نمایش",
        "undeleteinvert": "وارونه کردن انتخاب",
        "undeletecomment": "دلیل:",
-       "undeletedrevisions": "$1 نسخه احیا {{PLURAL:$1|شد}}",
-       "undeletedrevisions-files": "$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
-       "undeletedfiles": "$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
        "cannotundelete": "تمام یا بخشی از احیا ناموفق بود:\n$1",
        "undeletedpage": "'''$1 احیا شد'''\n\nبرای دیدن سیاههٔ حذف‌ها و احیاهای اخیر به  [[Special:Log/delete|سیاههٔ حذف]] رجوع کنید.",
        "undelete-header": "برای دیدن صفحه‌های حذف‌شدهٔ اخیر [[Special:Log/delete|سیاههٔ حذف]] را ببینید.",
        "htmlform-user-not-valid": "حساب کاربری <strong>$1</strong> معتبر نیست.",
        "logentry-delete-delete": "$1 صفحهٔ $3 را {{GENDER:$2|حذف کرد}}",
        "logentry-delete-delete_redir": "$1 تغییرمسیر $3 را با رونویسی {{GENDER:$2|حذف کرد}}",
-       "logentry-delete-restore": "$1 صفحهٔ $3 را {{GENDER:$2|احیا کرد}}",
+       "logentry-delete-restore": "$1 صفحهٔ $3 را {{GENDER:$2|احیا کرد}} ($4)",
+       "logentry-delete-restore-nocount": "$1 صفحهٔ $3 را {{GENDER:$2|احیا کرد}}",
+       "restore-count-revisions": "{{PLURAL:$1|یک نسخه|$1 نسخه}}",
+       "restore-count-files": "{{PLURAL:$1|یک پرونده|$1 پرونده}}",
        "logentry-delete-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاهه|$5 مورد سیاهه}} را در $3 {{GENDER:$2|تغییر داد}}: $4",
        "logentry-delete-revision": "$1 پیدایی {{PLURAL:$5|یک نسخه|$5 نسخه}} صفحه $3 را {{GENDER:$2|تغییر داد}}: $4",
        "logentry-delete-event-legacy": "$1 پیدایی موارد سیاهه را در $3 {{GENDER:$2|تغییر داد}}",
        "special-characters-group-thai": "تایلندی",
        "special-characters-group-lao": "لائو",
        "special-characters-group-khmer": "خمر",
+       "special-characters-group-canadianaboriginal": "بومی کانادا",
        "special-characters-title-endash": "خط فاصله",
        "special-characters-title-emdash": "خط فاسله کشیده",
        "special-characters-title-minus": "علامت منفی",
        "restrictionsfield-label": "بازه‌های آی‌پی مجاز:",
        "restrictionsfield-help": "یک نشانی آی‌پی یا بازهٔ سی‌آی‌دی‌ار در هر خط وارد کنید. برای فعال کردن همه‌چیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br /><code>::/0</code>",
        "revid": "نسخهٔ $1",
-       "pageid": "شناسهٔ صفحهٔ $1"
+       "pageid": "شناسهٔ صفحهٔ $1",
+       "rawhtml-notallowed": "برچسب‌های &lt;html&gt; را نمی‌توان خارج از صفحه‌های معمولی استفاده کرد.",
+       "gotointerwiki": "در حال ترک {{SITENAME}}",
+       "gotointerwiki-invalid": "عنوان مشخص شده غیرمجاز بود.",
+       "gotointerwiki-external": "شما در حال ترک {{SITENAME}} هستید تا [[$2]] را ببینید که یک وب‌گاه مجزا است.\n\n[$1 اینجا کلیک کنید تا به $1 بروید]",
+       "undelete-cantedit": "شما نمی‌توانید این صفحه را احیا کنید چون مجاز به ویرایش این صفحه نیستید.",
+       "undelete-cantcreate": "شما نمی‌توانید این صفحه را احیا کنید چرا که صفحه‌ای به این نام همینک وجود ندارد و شما مجاز به ساختن آن نیستید."
 }
index 4c599ad..1f7cde0 100644 (file)
        "undeleteviewlink": "näytä",
        "undeleteinvert": "Käänteinen valinta",
        "undeletecomment": "Syy:",
-       "undeletedrevisions": "{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin",
-       "undeletedrevisions-files": "{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin",
-       "undeletedfiles": "{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin",
        "cannotundelete": "Palauttaminen epäonnistui osittain tai kokonaan:\n$1",
        "undeletedpage": "'''$1 on palautettu.'''\n\n[[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.",
        "undelete-header": "[[Special:Log/delete|Poistolokissa]] on lista viimeisimmistä poistoista.",
index 1adc5ca..1f49bcc 100644 (file)
        "expansion-depth-exceeded-category": "Pages dépassant la profondeur d'expansion maximale",
        "expansion-depth-exceeded-category-desc": "La page dépasse la profondeur d’expansion maximale.",
        "expansion-depth-exceeded-warning": "Page dépassant la profondeur d’expansion maximale",
-       "parser-unstrip-loop-warning": "Boucle non démontable détectée",
-       "parser-unstrip-recursion-limit": "Limite de récursion non démontable dépassée ($1)",
+       "parser-unstrip-loop-warning": "Boucle non dépilable détectée",
+       "parser-unstrip-recursion-limit": "Limite de récursion non dépilable dépassée ($1)",
        "converter-manual-rule-error": "Erreur détectée dans la règle manuelle de conversion de langue",
        "undo-success": "Cette modification va être annulée.\nVeuillez vérifier les différences ci-dessous, puis publier l’annulation si c’est bien ce que vous voulez faire.",
        "undo-failure": "Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.",
        "rcfilters-filter-humans-description": "Modifications faites par des éditeurs humains.",
        "rcfilters-filtergroup-reviewstatus": "Etat de révision",
        "rcfilters-filter-patrolled-label": "Patrouillé",
-       "rcfilters-filter-patrolled-description": "Modifications marquées comme patrouillées.",
-       "rcfilters-filter-unpatrolled-label": "Non patrouillé",
-       "rcfilters-filter-unpatrolled-description": "Modifications non marquées comme patrouillées.",
+       "rcfilters-filter-patrolled-description": "Modifications marquées comme relues.",
+       "rcfilters-filter-unpatrolled-label": "Non relu",
+       "rcfilters-filter-unpatrolled-description": "Modifications non marquées comme étant relues.",
        "rcfilters-filtergroup-significance": "Signification",
        "rcfilters-filter-minor-label": "Modifications mineures",
        "rcfilters-filter-minor-description": "Modifications que l’auteur a marquées comme mineures.",
        "undeleteviewlink": "voir",
        "undeleteinvert": "Inverser la sélection",
        "undeletecomment": "Motif :",
-       "undeletedrevisions": "$1 {{PLURAL:$1|version restaurée|versions restaurées}}",
-       "undeletedrevisions-files": "$1 version{{PLURAL:$1||s}} et $2 fichier{{PLURAL:$2||s}} restauré{{PLURAL:$2||s}}",
-       "undeletedfiles": "$1 {{PLURAL:$1|fichier restauré|fichiers restaurés}}",
        "cannotundelete": "Certaines ou toutes les restaurations ont échoué :\n$1",
        "undeletedpage": "<strong>La page $1 a été restaurée.</strong>\n\nConsultez le [[Special:Log/delete|journal des suppressions]] pour obtenir la liste des récentes suppressions et restaurations.",
        "undelete-header": "Consultez le [[Special:Log/delete|journal des suppressions]] pour lister les pages récemment supprimées.",
        "htmlform-user-not-valid": "<strong>$1</strong> n’est pas un nom d’utilisateur valide.",
        "logentry-delete-delete": "$1 {{GENDER:$2|a supprimé}} la page $3",
        "logentry-delete-delete_redir": "$1 a {{GENDER:$2|supprimé}} la redirection vers $3 par écrasement",
-       "logentry-delete-restore": "$1 {{GENDER:$2|a restauré}} la page $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|a restauré}} la page $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|a restauré}} la page $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 révision|$1 révisions}}",
+       "restore-count-files": "{{PLURAL:$1|1 fichier|$1 fichiers}}",
        "logentry-delete-event": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3 : $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|a modifié}} la visibilité des événements du journal sur $3",
index b70db10..7894932 100644 (file)
        "undeleteviewlink": "ver",
        "undeleteinvert": "Inverter a selección",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "{{PLURAL:$1|Restaurouse $1 revisión|Restauráronse $1 revisións}}",
-       "undeletedrevisions-files": "Restauráronse $1 {{PLURAL:$1|revisión|revisións}} e $2 {{PLURAL:$2|ficheiro|ficheiros}}",
-       "undeletedfiles": "{{PLURAL:$1|Restaurouse $1 ficheiro|Restauráronse $1 ficheiros}}",
        "cannotundelete": "Algunhas ou todas as restauracións fallaronː\n$1",
        "undeletedpage": "'''A páxina \"$1\" foi restaurada'''\n\nComprobe o [[Special:Log/delete|rexistro de borrados]] para ver as entradas recentes no rexistro de páxinas eliminadas e restauradas.",
        "undelete-header": "Consulte [[Special:Log/delete|no rexistro de borrados]] as páxinas borradas recentemente.",
index 6220a07..f9e1384 100644 (file)
                        "Gothicspeaker"
                ]
        },
+       "tog-previewontop": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽 𐍆𐌰𐌿𐍂𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌰𐍂𐌺𐌰",
        "tog-previewonfirst": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽 𐌰𐍄 𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽",
+       "tog-enotifusertalkpages": "𐍃𐌰𐌽𐌳𐌴𐌹 𐌼𐌹𐌺 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌾𐌰𐌱𐌰𐌹 𐌼𐌴𐌹𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌹𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌳𐌰",
+       "tog-shownumberswatching": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍂𐌰𐌸𐌾𐍉𐌽 𐍅𐌹𐍄𐌰𐌽𐌳𐌰𐌹𐌶𐌴 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌴",
+       "tog-oldsig": "𐌸𐌴𐌹𐌽𐌰 𐍅𐌹𐍃𐌰𐌽𐌳𐌴𐌹 𐌿𐍆𐌼𐌴𐌻𐌴𐌹𐌽𐍃",
        "underline-always": "𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉",
        "underline-never": "𐌽𐌹 𐌰𐌹𐍅",
        "sunday": "𐌰𐍆𐌰𐍂𐍃𐌰𐌱𐌱𐌰𐍄𐍉",
        "badtitle": "𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐍄𐌰 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹",
        "badtitletext": "𐍆𐍂𐌰𐌹𐌷𐌰𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐍅𐌰𐍃 𐌿𐌽𐌲𐌰𐌼𐌰𐌲𐌰𐌽𐌳𐍃, 𐌻𐌰𐌿𐍃, 𐌰𐌹𐌸𐌸𐌰𐌿 𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐌱𐌰 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍃 𐌼𐌹𐌸𐍂𐌰𐌶𐌳𐌰 𐌸𐌰𐌿 𐌼𐌹𐌸-𐍅𐌹𐌺𐌹 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹. 𐌼𐌰𐌲𐌹 𐌷𐌰𐌱𐌰𐌽 𐌰𐌹𐌽𐌰 𐌸𐌰𐌿 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐍉𐍃 𐌱𐍉𐌺𐍉𐍃 𐌱𐍂𐌿𐌺𐌹𐌳𐍉𐍃 𐌹𐌽 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌾𐌰𐌼.",
        "viewsource": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
+       "protectedpagetext": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳, 𐌴𐌹 𐌽𐌹 𐍅𐌰𐌹𐍂𐌸𐌴𐌹𐌽𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌸𐌰𐌿 𐌰𐌽𐌸𐌰𐍂𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
        "mycustomjsprotected": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 JavaScript 𐌻𐌰𐌿𐍆.",
        "yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉:",
        "userlogin-yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉",
        "cannotloginnow-title": "𐌽𐌿 𐌽𐌹 𐌼𐌰𐌲𐍄 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽",
        "login": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "nav-login-createaccount": "𐌰𐍄𐌲𐌰𐌲𐌲 / 𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
-       "userlogin": "𐌰𐍄𐌲𐌰𐌲𐌲 / 𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
-       "userloginnocreate": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "logout": "𐌰𐍆𐌻𐌴𐌹𐌸",
        "userlogout": "𐌰𐍆𐌻𐌴𐌹𐌸",
        "userlogin-noaccount": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽?",
        "userlogin-joinproject": "𐌲𐌰𐌳𐌰𐌹𐌻𐌴𐌹 𐌹𐌽 𐌽𐌰𐍄𐌾𐌰𐍃𐍄𐌰𐌳𐌰 {{SITENAME}}",
-       "nologinlink": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
        "createaccount": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
-       "gotaccount": "𐌾𐌿 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽 𐌷𐌰𐌱𐌰𐌹𐍃? $1.",
-       "gotaccountlink": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "userlogin-resetpassword-link": "𐌿𐍆𐌰𐍂𐌼𐌿𐌽𐌽𐍉𐌳𐌴𐍃 𐌸𐌴𐌹𐌽𐌰𐌼𐌼𐌰 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳𐌰?",
        "userlogin-helplink2": "𐌷𐌹𐌻𐍀𐌰 𐌼𐌹𐌸 𐌰𐍄𐌲𐌰𐌲𐌲𐌰",
        "createacct-emailoptional": "𐌴-𐌱𐍉𐌺𐍉𐍃 (𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍉𐍃)",
        "createacct-email-ph": "𐌼𐌴𐌻𐌴𐌹 𐌸𐌴𐌹𐌽𐍉𐍃 𐌴-𐌱𐍉𐌺𐍉𐍃",
-       "createaccountreason": "𐌲𐍂𐌿𐌽𐌳𐌿𐍃:",
        "createacct-reason": "𐌲𐍂𐌿𐌽𐌳𐌿𐍃",
        "createacct-submit": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌸𐌴𐌹𐌽𐌰 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
        "createacct-benefit-heading": "{{SITENAME}} 𐍄𐌰𐍅𐌹𐌸 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 𐌼𐌰𐌽𐌽𐌰𐌼 𐍃𐍅𐌴 𐌸𐌿𐌺.",
        "minoredit": "𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌼𐌹𐌽𐌽𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
        "watchthis": "𐌰𐍄𐍅𐌹𐍄 𐌻𐌰𐌿𐌱𐌰",
        "savearticle": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌻𐌰𐌿𐍆",
+       "publishpage": "𐌼𐌴𐍂𐌴𐌹 𐌻𐌰𐌿𐍆",
        "preview": "𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐍃",
        "showpreview": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽",
        "showdiff": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃",
index a09048c..e6d3e06 100644 (file)
        "undeleteviewlink": "aaluege",
        "undeleteinvert": "Uswahl umchehre",
        "undeletecomment": "Grund:",
-       "undeletedrevisions": "{{PLURAL:$1|ei Revision|$1 Revisione}} wider zruckgholt.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Version|$1 Versione}} un {{PLURAL:$2|1 Datei|$2 Dateie}} sin widerhärgstellt wore",
-       "undeletedfiles": "{{PLURAL:$1|1 Datei isch|$1 Dateie sin}} widerhärgstellt wore",
        "cannotundelete": "D Widerhärstellig isch nit gange:\n\n$1",
        "undeletedpage": "'''„$1“''' isch widerhärgstellt wore.\n\nIm [[Special:Log/delete|Lesch-Logbuech]] findsch e Ibersicht vu dr gleschte un widerhärgstellte Syte.",
        "undelete-header": "Lueg im [[Special:Log/delete|Lesch-Logbuech]] no Syte, wu in dr letschte Zyt glescht wore sin.",
index 401a0c4..a69343a 100644 (file)
        "undeleteviewlink": "הצגה",
        "undeleteinvert": "הפיכת הבחירה",
        "undeletecomment": "סיבה:",
-       "undeletedrevisions": "{{PLURAL:$1|שוחזרה גרסה אחת|שוחזרו $1 גרסאות}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}} ו{{PLURAL:$2|קובץ אחד|־$2 קבצים}} שוחזרו",
-       "undeletedfiles": "{{PLURAL:$1|שוחזר קובץ אחד|שוחזרו $1 קבצים}}",
        "cannotundelete": "השחזור (או חלק ממנו) נכשל:\n$1",
        "undeletedpage": "<strong>הדף $1 שוחזר</strong>\n\nראו את [[Special:Log/delete|יומן המחיקות]] לרשימה של המחיקות והשחזורים שבוצעו לאחרונה.",
        "undelete-header": "{{GENDER:|ראה|ראי|ראו}} את [[Special:Log/delete|יומן המחיקות]] לרשימה של דפים שנמחקו לאחרונה.",
        "unblocked-id": "חסימה מספר $1 שוחררה.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] שוחררה מחסימתה.",
        "blocklist": "משתמשים חסומים",
+       "autoblocklist": "חסימות אוטומטיות",
+       "autoblocklist-submit": "חיפוש",
+       "autoblocklist-legend": "רשימת חסימות אוטומטיות",
+       "autoblocklist-localblocks": "{{PLURAL:$1|חסימה אוטומטית מקומית|חסימות אוטומטיות מקומיות}}",
+       "autoblocklist-empty": "רשימת החסימות האוטומטיות ריקה.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|חסימה אוטומטית אחרת|חסימות אוטומטיות אחרות}}",
        "ipblocklist": "משתמשים חסומים",
        "ipblocklist-legend": "מציאת משתמש חסום",
        "blocklist-userblocks": "הסתרת חסימות של משתמשים רשומים",
        "htmlform-user-not-valid": "<strong>$1</strong> אינו שם משתמש תקין.",
        "logentry-delete-delete": "$1 {{GENDER:$2|מחק|מחקה}} את הדף $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|מחק|מחקה}} את ההפניה $3 באמצעות דריסה",
-       "logentry-delete-restore": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3",
+       "restore-count-revisions": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}}",
+       "restore-count-files": "{{PLURAL:$1|קובץ אחד|$1 קבצים}}",
        "logentry-delete-event": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרסאות}} בדף $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של פעולות יומן של $3",
index d466bd2..b734764 100644 (file)
        "undeleteviewlink": "देखें",
        "undeleteinvert": "चुनाव उलटें",
        "undeletecomment": "कारण:",
-       "undeletedrevisions": "{{PLURAL:$1|एक अवतरण पुनर्स्थापित किया|$1 अवतरण पुनर्स्थापित किये}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 अवतरण|$1 अवतरण}} और {{PLURAL:$2|1 फ़ाइल|$2 फ़ाइलें}} पुनर्स्थापित कर दीं",
-       "undeletedfiles": "{{PLURAL:$1|1 फ़ाइल|$1 फ़ाइलें}} पुनर्स्थापित",
        "cannotundelete": "पुनर्स्थापित नहीं कर सके:\n$1",
        "undeletedpage": "'''$1 को पुनर्स्थापित कर दिया गया है'''\n\nहाल में हटाये गये तथा पुनर्स्थापित किये गए पन्नों की जानकारी के लिये [[Special:Log/delete|हटाने की लॉग]] देखें।",
        "undelete-header": "हाल में हटाये गये पृष्ठ देखने के लिये [[Special:Log/delete|हटाने का लॉग]] देखें।",
        "log-action-filter-protect-modify": "सुरक्षा परिवर्तन",
        "log-action-filter-protect-unprotect": "असुरक्षा",
        "log-action-filter-protect-move_prot": "सुरक्षा स्थानांतरण",
+       "log-action-filter-rights-rights": "मैनुअल परिवर्तन",
        "log-action-filter-rights-autopromote": "स्वतः परिवर्तन",
+       "log-action-filter-suppress-event": "लॉग अवरोध",
+       "log-action-filter-suppress-revision": "संशोधन अवरोध",
+       "log-action-filter-suppress-delete": "पृष्ठ अवरोध",
+       "log-action-filter-suppress-block": "ब्लॉक द्वारा युजर अवरोध",
+       "log-action-filter-suppress-reblock": "पुन: ब्लॉक द्वारा युजर अवरोध",
        "log-action-filter-upload-upload": "नया अपलोड",
        "log-action-filter-upload-overwrite": "फिर से अपलोड",
        "authmanager-create-disabled": "खाता निर्माण निष्क्रिय है।",
index 3d1f466..20d15d5 100644 (file)
        "undeleteviewlink": "pregled",
        "undeleteinvert": "Obrni odabir",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|$1 inačica vraćena|$1 inačice vraćene|$1 inačica vraćeno}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}} i {{PLURAL:$2|$2 datoteka vraćena|$2 datototeke vraćene|$2 datoteka vraćeno}}",
-       "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
        "cannotundelete": "Vraćanje obrisane inačice nije uspjelo:\n$1",
        "undeletedpage": "'''$1 je vraćena'''\n\nPogledajte [[Special:Log/delete|evidenciju brisanja]] za zapise nedavnih brisanja i vraćanja.",
        "undelete-header": "Pogledaj [[Special:Log/delete|evidenciju brisanja]] za nedavno obrisane stranice.",
index 78d16e3..6ccf0dd 100644 (file)
        "undeleteviewlink": "megtekintés",
        "undeleteinvert": "Kijelölés megfordítása",
        "undeletecomment": "Ok:",
-       "undeletedrevisions": "$1 változat helyreállítva",
-       "undeletedrevisions-files": "{{PLURAL:$1|egy|$1}} változat és {{PLURAL:$2|egy|$2}} fájl visszaállítva",
-       "undeletedfiles": "{{PLURAL:$1|egy|$1}} fájl visszaállítva",
        "cannotundelete": "Egy vagy több visszaállítás sikertelen:\n$1",
        "undeletedpage": "'''$1 helyreállítva'''\n\nLásd a [[Special:Log/delete|törlési naplót]] a legutóbbi törlések és helyreállítások listájához.",
        "undelete-header": "A legutoljára törölt lapokat lásd a [[Special:Log/delete|törlési naplóban]].",
index f7bbf3b..2fbb756 100644 (file)
        "undeleteviewlink": "vider",
        "undeleteinvert": "Inverter selection",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "{{PLURAL:$1|1 version|$1 versiones}} restaurate",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 version|$1 versiones}} e {{PLURAL:$2|1 file|$2 files}} restaurate",
-       "undeletedfiles": "$1 {{PLURAL:$1|file|files}} restaurate",
        "cannotundelete": "Le restauration ha partial- o totalmente fallite:\n$1",
        "undeletedpage": "'''$1 ha essite restaurate'''\n\nConsulta le [[Special:Log/delete|registro de deletiones]] pro un lista de deletiones e restaurationes recente.",
        "undelete-header": "Vide [[Special:Log/delete|le registro de deletiones]] pro un lista de paginas recentemente delite.",
index 2395d94..9de536f 100644 (file)
        "undeleteviewlink": "lihat",
        "undeleteinvert": "Balikkan pilihan",
        "undeletecomment": "Alasan:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|revisi|revisi}} telah dikembalikan",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|revisi|revisi}} and $2 berkas dikembalikan",
-       "undeletedfiles": "$1 {{PLURAL:$1|berkas|berkas}} dikembalikan",
        "cannotundelete": "Beberapa pembatalan penghapusan gagal:\n$1",
        "undeletedpage": "'''$1 berhasil dikembalikan'''\n\nLihat [[Special:Log/delete|log penghapusan]] untuk data penghapusan dan pengembalian.",
        "undelete-header": "Lihat [[Special:Log/delete|log penghapusan]] untuk daftar halaman yang baru dihapus.",
index fbadb16..9104972 100644 (file)
@@ -35,7 +35,7 @@
        "tog-enotifwatchlistpages": "Esuratannak no mabaliwan ti panid wenno ti papeles iti listaan dagiti bambantayak",
        "tog-enotifusertalkpages": "Esuratannak no mabaliwan ti panid ti tungtungak",
        "tog-enotifminoredits": "Esuratannak pay para kadagiti bassit a panagurnos kadagiti panid ken papeles",
-       "tog-enotifrevealaddr": "Iparang ti pagtaengan ti esuratko iti panagipakaaammo kadagiti esurat",
+       "tog-enotifrevealaddr": "Iparang ti adres ti esuratko iti panagipakaaammo kadagiti esurat",
        "tog-shownumberswatching": "Ipakita ti bilang dagiti agbuybuya nga agar-aramat",
        "tog-oldsig": "Ti adda a pirmam:",
        "tog-fancysig": "Tratuen ti pirma a kas wikitext (awanan iti automatiko a silpo)",
        "returnto": "Agsubli iti $1.",
        "tagline": "Manipud iti {{SITENAME}}",
        "help": "Tulong",
-       "search": "Biruken",
+       "search": "Agbiruk",
        "search-ignored-headings": " #<!-- saan a kutkutien daytoy a linia --> <pre>\n# Dagiti paulo a saanto nga ikaskaso babaen ti panagbiruk.\n# Dagiti panagbalbaliw mabalinton intono ti panid nga addaan ti paulo ket maipasurotan.\n# Mabalinmo a piliten ti panangisurot manen iti panid babaen ti awan linaon a panagurnos.\n# Ti eskritu ket kasla dagiti sumaganad:\n#   * Amin manipud ti karater ti \"#\" aginggana ti gibus ti linia ket komentario.\n#   * Amin a saan a blanko a linia ket eksakto a titulo a saan nga maikaskaso, kadakkel ti letra ken amin.\nDagiti reperensia\nDagiti silpo ti ruar\nKitaen pay\n #</pre> <!-- saan a kutkutien daytoy a linia -->",
-       "searchbutton": "Biruken",
+       "searchbutton": "Agbiruk",
        "go": "Inkan",
        "searcharticle": "Inkan",
        "history": "Pakasaritaan ti panid",
        "protectedpage": "Nasalakniban a panid",
        "jumpto": "Lumaktaw idiay:",
        "jumptonavigation": "pagdaliasatan",
-       "jumptosearch": "biruken",
+       "jumptosearch": "agbiruk",
        "view-pool-error": "Pasensian, dagiti server ket nadagsenan unay iti agdama.\nAdu unay dagiti agar-aramat nga agpadpadas nga agbuya iti daytoy a panid.\nPangngaasi nga agurayka bassit sakbay a padasem manen a serrekan daytoy a panid.\n\n$1",
        "generic-pool-error": "Pasensian, dagiti server ket agdama a nadagsenan iti agdama.\nAdu unay dagiti agar-aramat nga agpadpadas nga agbuya iti daytoy a rekurso.\nPangngaasi nga agurayka bassit sakbay a padasem manen a serrekan daytoy a rekurso.",
        "pool-timeout": "Madamdama agur-uray para iti kandado",
        "readonly": "Narikepan ti database",
        "enterlockreason": "Agikabil ti rason para iti pannakarikep, mangiraman ti maysa a karkulo no kaanonto a malukatan",
        "readonlytext": "Ti database ket agdama a narikpan kadagiti baro a panagikabil ken panagbaliw, mabalin a gapu dagiti kadawyan a pagsimpa, kalpasanna a normalto nga agsubli.\n\nTi administrador ti sistema a nangrikep ket nangited iti daytoy a palawag: $1",
-       "missing-article": "Ti database ket saan a nakabiruk ti testo ti panid a mabirukanna koma, a nanaganan ti \"$1\" $2.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a baak a paggiddiatan wenno silpo ti pakasaritaan ti maysa panid a dati a naikkat.\n\nNo saan a kasta, mabalin a nakasarakka ti parikut ti sopwer.\n\nPangngaasi nga ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isuratmo ti pakaammo dayta nga URL.",
+       "missing-article": "Ti database ket saan a nakabiruk ti teksto ti panid a mabirukanna koma, a nanaganan ti \"$1\" $2.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a baak a paggiddiatan wenno silpo ti pakasaritaan ti maysa panid a dati a naikkat.\n\nNo saan a kasta, mabalin a nakasarakka ti parikut ti sopwer.\n\nPangngaasi nga ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isuratmo ti pakaammo dayta nga URL.",
        "missingarticle-rev": "(rebision#: $1)",
        "missingarticle-diff": "(Dip: $1, $2)",
        "readonly_lag": "Automatiko a narikpan ti database kabayatan a dagiti tagabu a server ti database ket kumamakam iti agturay",
        "userlogin-loggedin": "Nakastrekkan a kas ni {{GENDER:$1|$1}}.\nUsaren ti porma dita baba tapno sumrek a kas sabali nga agar-aramat.",
        "userlogin-reauth": "Nasken a sumrekka manen tapno mapasingkedan a sika ni {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Agpartuat iti sabali a pakabilangan",
-       "createacct-emailrequired": "Esurat a pagtaengan",
-       "createacct-emailoptional": "Esurat a pagtaengan (pagpilian)",
+       "createacct-emailrequired": "Adres ti esurat",
+       "createacct-emailoptional": "Adres ti esurat (pagpilian)",
        "createacct-email-ph": "Ikabil ti esurat a pagtaengam",
-       "createacct-another-email-ph": "Ikabil ti esurat a pagtaengan",
-       "createaccountmail": "Agusar iti pugto a temporario a kontrasenias ken ipatulod iti naisangayan nga esurat a pagtaengan",
+       "createacct-another-email-ph": "Ikabil ti adres ti esurat",
+       "createaccountmail": "Agusar iti pugto a temporario a kontrasenias ken ipatulod iti nainaganan nga adres ti esurat",
        "createaccountmail-help": "Mabalin a mausar a panagpartuat ti pakabilangan para iti sabali a tao a saan a makaammo iti kontrasenias.",
        "createacct-realname": "Pudno a nagan (pagpilian)",
        "createacct-reason": "Rason",
        "passwordtooshort": "Dagiti kontrasenias ket nasken a saan a basbasit ngem {{PLURAL:$1|1 a karakter|$1 a karkarakter}}.",
        "passwordtoolong": "Dagiti kontrasenias ket nasken a saan nga at-atiddog ngem {{PLURAL:$1|1 a karakter|$1 a karkarakter}}.",
        "passwordtoopopular": "Saan a mabalin a mausar dagiti kadawyan a mapilpili a kontrasenias. Pangngaasi nga agpili iti naisangsangayan a kontrasenias.",
-       "password-name-match": "Nasken a ti kontrasenias ket maigiddiat manipud ti naganmo.",
+       "password-name-match": "Nasken a ti kontrasenias ket maigiddiat manipud iti naganmo.",
        "password-login-forbidden": "Naipariten ti panagusar iti daytoy a nagan ti agar-aramat ken kontrasenias.",
        "mailmypassword": "Isaad manen ti kontrasenias",
        "passwordremindertitle": "Baro a temporario a kontrasenias para iti {{SITENAME}}",
-       "passwordremindertext": "Adda maysa a tao (mabalin a sika met laeng, manipud iti IP a pagtaengan a $1) ket nagkiddaw iti baro a kontrasenias para iti {{SITENAME}} ($4). Ti temporario a kontrasenias para kenni agar-aramat \"$2\" ket napartuaten ken naisaad iti \"$3\". No kastan ti kinayatmo, nasken itan a sumrekka ken agpili iti baro a kontrasenias.\nTi temporario a kontraseniasmo ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\n\nNo sabali ti nagkiddaw, wenno nalagipmon ti kontraseniasmo,\nken dimo kayaten a sukatan daytoy, mabalinmo a di ikaskaso daytoy a mensahe ken agtuloy nga usaren ti daan a kontraseniasmo.",
-       "noemail": "Awan ti esurat a pagtaengan a nairehistro para kenni agar-aramat \"$1\".",
-       "noemailcreate": "Nasken a mangitedka ti pudno nga esurat a pagtaengan.",
-       "passwordsent": "Naipatuloden ti baro a kontrasenias iti esurat a pagtaengan a nairehistro kenni \"$1\".\nPangngaasi a sumrekka manen kalpasan ti pannakaawatmo.",
+       "passwordremindertext": "Adda maysa a tao (mabalin a sika met laeng, manipud iti adres ti IP ti $1) ket nagkiddaw iti baro a kontrasenias para iti {{SITENAME}} ($4). Ti temporario a kontrasenias para kenni agar-aramat \"$2\" ket napartuaten ken naisaad iti \"$3\". No kastan ti kinayatmo, nasken itan a sumrekka ken agpili iti baro a kontrasenias.\nTi temporario a kontraseniasmo ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\n\nNo sabali ti nagkiddaw, wenno nalagipmon ti kontraseniasmo,\nken dimo kayaten a sukatan daytoy, mabalinmo a di ikaskaso daytoy a mensahe ken agtuloy nga usaren ti daan a kontraseniasmo.",
+       "noemail": "Awan ti adres ti esurat a nairehistro para kenni agar-aramat \"$1\".",
+       "noemailcreate": "Nasken a mangitedka iti umiso nga adres ti esurat.",
+       "passwordsent": "Naipatuloden ti baro a kontrasenias iti adres ti esurat a nairehistro kenni \"$1\".\nPangngaasi a sumrekka manen kalpasan iti pannakaawatmo.",
        "blocked-mailpassword": "Ti adresmo ti IP ket naserraan manipud iti panagurnos. Tapno mapawilan ti panagabuso, saan a maipalubos ti agusar ti panagipulang ti kontrasenias manipud iti daytoy nga adres ti IP.",
-       "eauthentsent": "Naipatuloden ti pammatalged nga esurat iti naikeddeng nga esurat a pagtaengan.\nSakbay a maipatulod ti ania man nga esurat iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapatalgedan ti pakabilangan ket agpayso a kukuam.",
+       "eauthentsent": "Naipatuloden ti pammatalged nga esurat iti naikeddeng nga adres ti esurat.\nSakbay a maipatulod ti ania man nga esurat iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapatalgedan ti pakabilangan ket agpayso a kukuam.",
        "throttled-mailpassword": "Ti panangisaad manen ti kontrasenias ket naipatuloden, iti kaunegan ti napalabas  {{PLURAL:$1|nga oras|a $1 nga or-oras}}.\nTapno maipawilan ti panagabuso, maysa laeng a panangisaad manen ti kontrasenias ti maipatulod iti tunggal {{PLURAL:$1|maysa nga oras|$1 nga or-oras}}.",
        "mailerror": "Biddut iti panangipatulod ti surat: $1",
-       "acct_creation_throttle_hit": "Dagiti sumarungkar iti daytoy a wiki nga agus-usar ti IP a pagtaengan ket nakapartuat {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} iti nasakbayan nga aldaw, nga isu laeng ti kaadu a maipalubos iti daytoy a paset ti panawen.\nA kas ti nagbanagan, dagiti agsarsarungkar nga agus-usar ti IP a pagtaengan ket agdama a saanda a mabalin a makapartuat kadagiti pakabilangan.",
+       "acct_creation_throttle_hit": "Dagiti sumarungkar iti daytoy a wiki nga agus-usar iti adres ti IP ket nakapartuat {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} iti nasakbayan nga $2 nga isu laeng ti kaadu a maipalubos iti daytoy a paset ti panawen.\nA kas ti nagbanagan, dagiti agsarsarungkar nga agus-usar iti adres ti IP ket agdama a saanda a mabalin a makapartuat kadagiti pakabilangan.",
        "emailauthenticated": "Ti esurat a pagtaengam ket napatalgedan idi $2, $3.",
-       "emailnotauthenticated": "Saan pay a napatalgedan ti esuratmo a pagtaengan.\nAwanto ti esurat a maipatulod para kadagiti sumaganad a langa.",
-       "noemailprefs": "Ipanaganan ti esurat a pagtaengan tapno agbalin dagitoy a langa.",
+       "emailnotauthenticated": "Saan pay a napatalgedan ti adres ti esuratmo.\nAwanto ti esurat a maipatulod para kadagiti sumaganad a langa.",
+       "noemailprefs": "Manginagan iti maysa nga adres ti esurat tapno agbalin dagitoy a langa.",
        "emailconfirmlink": "Pasingkedam ti esurat a pagtaengam",
-       "invalidemailaddress": "Ti esurat a pagtaengan ket saan a maawat ngamin ket kasla adda ti saan a napudno a porma.\nPangngaasi nga agikabil ti nasayaat a porma ti pagtaengan wenno ikkaten amin a naikabil.",
-       "cannotchangeemail": "Dagiti pakabilangan nga esurat a pagtaengan ket saan a mabaliwan iti daytoy a wiki.",
+       "invalidemailaddress": "Ti adres ti esurat ket saan a maawat ngamin ket kasla adda ti saan a napudno a pormat.\nPangngaasi nga agikabil ti nasayaat a pormat ti adres wenno ikkaten amin a naikabil.",
+       "cannotchangeemail": "Dagiti pakabilangan nga adres ti esurat ket saan a mabaliwan iti daytoy a wiki.",
        "emaildisabled": "Daytoy a sitio ket saan a makaipatulod kadagiti esurat.",
        "accountcreated": "Napartuaten ti pakabilangan",
        "accountcreatedtext": "Ti pakabilangan ti agar-aramat para kenni [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tungtungan]]) ket napartuaten.",
        "pt-createaccount": "Agpartuat iti pakabilangan",
        "pt-userlogout": "Rummuar",
        "php-mail-error-unknown": "Di ammo a biddut iti surat ti annong ti PHP().",
-       "user-mail-no-addy": "Pinadas nga inpatulod ti esurat nga awan ti maysa nga esurat a pagtaengan.",
+       "user-mail-no-addy": "Pinadas nga inpatulod ti esurat nga awan ti maysa nga adres ti esurat.",
        "user-mail-no-body": "Pinadas nga inpatulod ti esurat nga awan ti maysa a linaonna wenno ababa unay a bagi.",
        "changepassword": "Baliwan ti kontrasenias",
        "resetpass_announce": "Tapno malpas ti panagserrek, nasken a mangisaadka iti baro a kontrasenias.",
        "passwordreset-emaildisabled": "Dagiti langa ti esurat ket nabaldado iti daytoy a wiki.",
        "passwordreset-username": "Nagan ti agar-aramat:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-email": "Esurat a pagtaengan:",
+       "passwordreset-email": "Adres ti esurat:",
        "passwordreset-emailtitle": "Dagiti salaysay ti pakabilangan iti {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti maysa a panangisaad manen ti kontrasenias para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloyka nga agusar ti daan a kontrasenias.",
-       "passwordreset-emailtext-user": "Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangisaad manen ti bukod a kontrasenias para iti {{SITENAME}}\n($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ken saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloykan nga agusar ti daan a kontraseniasmo.",
+       "passwordreset-emailtext-ip": "Adda (baka sika, ti naggapuan ti adres ti IP ti $1) a nagkiddaw iti maysa a panangisaad manen ti kontrasenias para iti {{SITENAME}} ($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga adres ti esurat:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika iti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloyka nga agusar iti daan a kontrasenias.",
+       "passwordreset-emailtext-user": "Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangisaad manen ti bukod a kontrasenias para iti {{SITENAME}}\n($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga adres ti esurat:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ken saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloykan nga agusar ti daan a kontraseniasmo.",
        "passwordreset-emailelement": "Nagan ti agar-aramat: \n$1\n\nTemporario a kontrasenias: \n$2",
        "passwordreset-emailsentemail": "No daytoy nga adres ti esurat ket mainaig iti pakabilangam, maipatulodto ti maysa nga esurat iti panangisaad manen ti kontrasenias.",
        "passwordreset-emailsentusername": "No adda adres ti esurat a mainaig iti daytoy a nagan ti agar-aramat, addanto maipatulod nga esurat iti panangisaad manen ti kontrasenia.",
        "changeemail": "Sukatan wenno ikkaten ti adres ti esurat",
        "changeemail-header": "Kompletuen daytoy a porma tapno masukatan ti adres ti esuratmo. No kayatmo a maikkat ti pannakainaig iti ania man nga adres ti esurat manipud iti pakabilangam, ibati a blanko ti baro nga adres ti esurat no ited ti porma.",
        "changeemail-no-info": "Masapul a nakastrekka tapno dagus a makapan iti ditoy a panid.",
-       "changeemail-oldemail": "Agdama nga esurat a pagtaengan:",
-       "changeemail-newemail": "Baro nga esurat a pagtaengan:",
+       "changeemail-oldemail": "Agdama nga adres ti esurat:",
+       "changeemail-newemail": "Baro nga adres ti esurat:",
        "changeemail-newemail-help": "Daytoy a pagikabilan ket nasken a blanko no kayatmo a maikkat ti adres ti esuratmo. Saanmonto a mabalin ti mangisaad manen ti nalipatan a kontrasenias ken saankanto a makaawat kadagiti esurat manipud iti daytoy a wiki no maikkat ti adres ti esurat.",
        "changeemail-none": "(awan)",
        "changeemail-password": "Ti bukodmo a kontrasenias ti {{SITENAME}}:",
        "showpreview": "Ipakita ti ipadas",
        "showdiff": "Ipakita dagiti binaliwan",
        "blankarticle": "<strong>Ballaag:</strong> Ti panid a parpatuatem ket blanko.\nNo pindutem manen ti \"{{int:savearticle}}\", ti panid ket mapartuatto nga awan ti ania man a linaon.",
-       "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek. Ti IP a pagtaengan ket publikonto a makita nga agaramidka iti ania man a panagurnos. No <strong>[$1 sumrekka]</strong> wenno <strong>[$2 agpartuatka iti pakabilangan]</strong>, dagiti inurnosmo ket maitunosto iti naganmo nga agar-aramat, ken dagiti dadduma pay a pagimbagan.",
+       "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek. Ti adres ti IP ket publikonto a makita nga agaramidka kadagiti ania man a panagurnos. No <strong>[$1 sumrekka]</strong> wenno <strong>[$2 agpartuatka iti pakabilangan]</strong>, dagiti inurnosmo ket maitunosto iti naganmo nga agar-aramat, ken dagiti dadduma pay a pagimbagan.",
        "anonpreviewwarning": "<em>Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a pakasaritaan ti panagurnos iti daytoy a panid.</em>",
        "missingsummary": "<strong>Palagip:</strong> Saanka a nakaited iti pakabuklan ti panagurnos.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
        "selfredirect": "<strong>Ballaag:</strong> Ibawbaw-ingmo daytoy a panid iti isu met laeng a panid.\nMabalinmo nga innaganan ti kamali a puntaan para iti baw-ing, wenno mabalin nga ur-urnosem ti kamali a panid.\nNo pindutem manen ti \"{{int:savearticle}}\" , mapartuatto lattan ti baw-ing.",
        "subject-preview": "Panangipadas ti suheto:",
        "previewerrortext": "Adda napasamak a maysa a biddut bayat a nagpadpadas kadagiti binawbaliwam.",
        "blockedtitle": "Naseraan ti agar-aramat",
-       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti IP a pagtaengam.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
-       "autoblockedtext": "Ti IP a pagtaengam ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga esurat a pagtaengan a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panagusar daytoy.\n\nTi tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
+       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti adres ti IP.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga adres ti esurat a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga adres ti IP ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
+       "autoblockedtext": "Ti bukodmo nga adres ti IP ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga adres ti esurat a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panagusar daytoy.\n\nTi agdama a bukodmo nga adres ti IP ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
        "blockednoreason": "awan ti naited a rason",
        "whitelistedittext": "Pangngaasi a $1 tapno makaurnos kadagiti panid.",
        "confirmedittext": "Masapul a pasingkedam ti esurat sakbay a makaurnos kadagitoy a panid.\nPangngaasi nga isaad ken ipapudnom ti esuratmo babaen ti [[Special:Preferences|kakaykayatan ti agar-aramat]].",
        "accmailtext": "Ti pugto a napartuat a kontrasenias para kenni [[User talk:$1|$1]] ket naipatuloden iti $2. Mabalin a masukatan iti\n<em>[[Special:ChangePassword|pagsukatan ti kontrasenias]]</em> a panid no sumrekka.",
        "newarticle": "(Baro)",
        "newarticletext": "Nasurotmo ti silpo ti awan pay a panid. \nTi mangpartuat ti panid, rugiamon ti agmakinilia iti kahon dita baba (kitaen ti [$1 panid ti tulong] para iti adu pay a pakaammo). \nNo addaka ditoy babaen ti biddut, pindutem ti buton ti <strong>back</strong> ti pagbasabasam.",
-       "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat iti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero nga IP a pagtaengan tapno mailasin isuda a lalaki/babai.\nTi kastoy nga IP a pagtaengan ket us-usaren a bingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:CreateAccount|agpartuatka iti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
+       "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat iti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero ti adres ti IP tapno mailasin isuda a lalaki/babai.\nTi kastoy nga adres ti IP ket us-usaren a pagbibingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:CreateAccount|agpartuatka iti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
        "noarticletext": "Awan ti agdama a teksto iti daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk iti kastoy a titulo ti panid]] kadagiti sabali a panid,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan],\nwenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} partuaten daytoy a panid]</span>.",
        "noarticletext-nopermission": "Awan ti agdama  a linaon daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk para iti titulo ti daytoy a panid]] kadagiti sabali a panid, wenno <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan]</span>, ngem awan ti pammalubosmo a mangpartuat iti daytoy a panid.",
        "missing-revision": "Ti panagbalbaliw ti #$1 iti daytoy a panid a nanaganan ti \"{{FULLPAGENAME}}\" ket awan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a silpo ti baak a pakasaritaan iti maysa a naikkaten a panid.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "copyrightwarning2": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket mabalin a maurnos, mabaliwan, wenno ikkaten dagiti sabali a kontributor.\nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud iti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan. (kitaen ti $1 para kadagiti salaysay).\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
        "editpage-cannot-use-custom-model": "Saan a mabaliwan ti modelo ti linaon iti daytoy a panid.",
        "longpageerror": "<strong>Biddut: Ti teksto nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kilkilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kilkilobyte}}.</strong>\nSaan a mabalin a maidulin.",
-       "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador ti sistema a nangrikep ket nangited iti daytoy a palawag: $1",
+       "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti tekstom iti papeles ti teksto ken idulinmo daytoy intono madamdama.\n\nTi administrador ti sistema a nangrikep ket nangited iti daytoy a palawag: $1",
        "protectedpagewarning": "<strong>Ballaag: Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ditoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "cascadeprotectedwarning": "<strong>Ballaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos gapu ta nailak-am {{PLURAL:$1|iti sumaganad a panid|kadagiti sumaganad a panid}} a nasalakniban iti sariap:",
        "post-expand-template-argument-warning": "<strong>Ballaag:</strong> Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panangipalawag ti plantilia a dakkel unay ti panagpadakkelna.\nDagitoy nga argumento ket saanen a nairaman.",
        "post-expand-template-argument-category": "Pampanid a naglaon kadagiti saan a nairaman nga argumento ti plantilia",
        "parser-template-loop-warning": "Nakaduktal iti silo ti plantilia: [[$1]]",
+       "template-loop-category": "Pampanid nga agraman kadagiti silo ti plantilia",
        "parser-template-recursion-depth-warning": "Nalabsan ti patingga ti panagdullit ti kinauneg ti plantilia ($1)",
        "language-converter-depth-warning": "Nalabsan ti patingga ti pagbaliwen a kinauneg ti pagsasao ($1)",
        "node-count-exceeded-category": "Dagiti panid a nakasurokan ti bilang ti nodo",
        "parser-unstrip-loop-warning": "Nakaduktal ti di-naukisan a silo",
        "parser-unstrip-recursion-limit": "Nalabsan ti patingga ti panagdullit ti di-naukisan ($1)",
        "converter-manual-rule-error": "Adda biddut a naduktalan iti manual nga alagaden ti panagbalbaliw ti pagsasao",
-       "undo-success": "Ti panag-urnos ket saan a maisubli.\nPangngaasi a kitaen ti panangipada dita baba tapno maammuan no daytoy ti kayatmo nga aramiden, ken kalpasanna idulin dagiti sinukatan dita baba tapno malpas ti panagsubli ti inurnos.",
+       "undo-success": "Mabalin a maisubli ti panagurnos.\nPangngaasi a kitaen ti panangiyasping dita baba tapno maammuan no daytoy ti kayatmo nga aramiden, ken kalpasanna idulin dagiti sinukatan dita baba tapno malpas ti panangisubli ti inurnos.",
        "undo-failure": "Ti inurnos ket saan a maipasubli gapu ta adda dagiti nakisinnungat a patingnga a naurnos.",
        "undo-norev": "Saan a maibabawi ti naurnos ngamin ket awan daytoy wenno mabalin a naikkaten.",
        "undo-nochange": "Ti inurnos ket kasla naibabawin.",
        "undo-summary": "Ibabawi ti $1 a binaliwan babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]])",
        "undo-summary-username-hidden": "Isubli ti $1 a binaliwan babaen ti nailemmeng nga agar-aramat",
-       "cantcreateaccount-text": "Ti panagpartuat iti pakabilangan manipud ti daytoy nga IP a pagtaengan (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
-       "cantcreateaccount-range-text": "Ti panagpartuat iti pakabilangan manipud kadagiti pagtaengan ti IP iti sakop ti <strong>$1</strong>, a mairaman ti IP a pagtaengam (<strong>$4</strong>), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
+       "cantcreateaccount-text": "Ti panagpartuat iti pakabilangan manipud iti daytoy nga adres ti IP (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
+       "cantcreateaccount-range-text": "Ti panagpartuat iti pakabilangan manipud kadagiti adres ti IP iti sakop ti <strong>$1</strong>, a mairaman ti adres ti IP (<strong>$4</strong>), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
        "viewpagelogs": "Kitaen dagiti listaan para iti daytoy a panid",
        "nohistory": "Awan ti pakasaritaan ti panagurnos iti daytoy a panid.",
        "currentrev": "Kinaudi a rebision",
        "page_first": "umuna",
        "page_last": "naudi",
        "histlegend": "Panagpili ti diperensia: Markaan dagiti kahon ti radio kadagiti rebision tapno maipada ken pinduten ti enter wenno ti buton dita baba.<br />\nLeyenda: <strong>({{int:cur}})</strong> = naggidiatan ti kinaudi a rebision, <strong>({{int:last}})</strong> = naggidiatan ti sarsarunuen a rebision, <strong>{{int:minoreditletter}}</strong> = bassit nga urnos.",
-       "history-fieldset-title": "Agbasabasa iti pakasaritaan",
-       "history-show-deleted": "Naikkat laeng",
+       "history-fieldset-title": "Agbiruk para kadagiti rebision",
+       "history-show-deleted": "Naikkat laeng ti rebision",
        "histfirst": "kadaanan",
        "histlast": "kabaruan",
        "historysize": "({{PLURAL:$1|1 byte|dagiti $1 a byte}})",
        "rev-deleted-comment": "(naikkat ti pakabuklan ti inurnos)",
        "rev-deleted-user": "(naikkat ti nagan ti agar-aramat)",
        "rev-deleted-event": "(naikkat ti listaan dagiti salaysay)",
-       "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno IP a pagtaengan - ti inurnos ket nailemmeng manipud kadagiti kontribusion]",
+       "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno adres ti IP - nailemmeng ti inurnos manipud kadagiti kontribusion]",
        "rev-deleted-text-permission": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "rev-suppressed-text-permission": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabalin a mabirukan iti [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
        "rev-deleted-text-unhide": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].\nMabalinmo pay a [$1 makita daytoy a rebision] no kayatmo ti agtuloy.",
        "revdelete-hide-image": "Ilemmeng ti linaon ti papeles",
        "revdelete-hide-name": "Ilemmeng ti puntaan ken dagiti parametro",
        "revdelete-hide-comment": "Pakabuklan ti inurnos",
-       "revdelete-hide-user": "Nagan ti agar-amat/IP a pagtaengan ti editor",
+       "revdelete-hide-user": "Nagan ti agar-amat/adres ti IP ti editor",
        "revdelete-hide-restricted": "Depdepen ti datos manipud kadagiti administrador ken dagiti pay sabali",
        "revdelete-radio-same": "(saan a sukatan)",
        "revdelete-radio-set": "Nailemmeng",
        "prefs-misc": "Sabsabali",
        "prefs-resetpass": "Sukatan ti kontrasenias",
        "prefs-changeemail": "Sukatan wenno ikkaten ti adres ti esurat",
-       "prefs-setemail": "Isaad ti esurat a pagtaengan",
+       "prefs-setemail": "Isaad ti maysa nga adres ti esurat",
        "prefs-email": "Dagiti pagpilian ti esurat",
        "prefs-rendering": "Tabas",
        "saveprefs": "Idulin",
        "restoreprefs": "Isubli amin dagiti kasisigud a pannakaisaad (kadagiti amin a seksion)",
        "prefs-editing": "Ur-urnosen",
-       "searchresultshead": "Biruken",
+       "searchresultshead": "Agbiruk",
        "stub-threshold": "Pagpatinggaan para iti panagpormat iti silpo ti pungol ($1):",
        "stub-threshold-sample-link": "wadan",
        "stub-threshold-disabled": "Nabaldado",
        "timezoneuseserverdefault": "Usaren ti kasisigud ti wiki ($1)",
        "timezoneuseoffset": "Sabali (inaganan ti timbengan)",
        "servertime": "Oras ti server:",
-       "guesstimezone": "Punuen manipud ti pagbasabasa",
+       "guesstimezone": "Punuen manipud iti pagbasabasa",
        "timezoneregion-africa": "Aprika",
        "timezoneregion-america": "Amerika",
        "timezoneregion-antarctica": "Antartika",
        "timezoneregion-indian": "Taaw Indiano",
        "timezoneregion-pacific": "Taaw Pasipiko",
        "allowemail": "Pakabaelam ti esurat a naggapo kadagiti sabali nga agar-aramat",
-       "prefs-searchoptions": "Biruken",
+       "prefs-searchoptions": "Agbiruk",
        "prefs-namespaces": "Dagiti nagan ti espasio",
        "default": "kasisigud",
        "prefs-files": "Dagiti papeles",
        "prefs-help-gender": "Ti panangisaad daytoy a kakaykayatan ket saan a nasken.\nTi sopwer ket agus-usar iti pategna tapno tawagannaka ken ibaganaka kadagiti sabali nga agus-usar iti maitunos gramatika ti henero.\nDaytoy a pakaammo ket makitanto iti publiko.",
        "email": "Esurat",
        "prefs-help-realname": "Saan a nasken ti pudno a nagan.\nNo maited, mabalin a maaramatto a panangited iti pammadayaw kenka iti obram.",
-       "prefs-help-email": "Ti esurat a pagtaengan ket saan a masapul, ngem masapul kadagiti panangisaad manen ti kontrasenias, no malipatam ti kontraseniasmo.",
+       "prefs-help-email": "Ti adres ti esurat ket saan a masapul, ngem masapul kadagiti panangisaad manen ti kontrasenias, no malipatam ti kontraseniasmo.",
        "prefs-help-email-others": "Mabalinmo pay ti agpili tapno dagiti sabali nga agar-aramat ket mabalin nga esuratandaka babaen ti silpo ti panidmo wenno ti panid ti tungtungam.\nTi esurat a pagtaengam ket saan a maipakita no agkontak kenka dagiti agar-aramat.",
-       "prefs-help-email-required": "Masapul ti esurat a pagtaengan.",
+       "prefs-help-email-required": "Masapul ti adres ti esurat.",
        "prefs-info": "Kangrunaan a pakaammo",
        "prefs-i18n": "Internasionalisasion",
        "prefs-signature": "Pirma",
        "prefs-help-prefershttps": "Daytoy a kakaykayatan ket mapakabaelanto iti sumaruno nga iseserrekmo.",
        "prefswarning-warning": "Nagaramikka kadagiti panagbalbaliw kadagiti kakaykayatam a saan pay a naidulin.\nNo panawan daytoy a panid a saan nga agpindut iti \"$1\" dagiti kakaykayatam ket saanto a mapabaro.",
        "prefs-tabs-navigation-hint": "Pakaammo: Mabalinmo nga usaren dagiti kanigid ken kanawan a tekla ti pana tapno madaliasat ti baetan dagiti etiketa iti listaan dagiti etiketa.",
-       "userrights": "Panagtaripato kadagiti karbengan ti agar-aramat",
+       "userrights": "Dagiti karbengan ti agar-aramat",
        "userrights-lookup-user": "Agpili iti agar-aramat",
        "userrights-user-editname": "Mangiserrek iti nagan ti agar-aramat:",
        "editusergroup": "Ikarga dagiti grupo ti agar-aramat",
        "right-move-rootuserpages": "Agiyalis kadagiti ramut a panid ti agar-aramat",
        "right-move-categorypages": "Agiyalis iti pampanid ti kategoria",
        "right-movefile": "Agiyalis kadagiti papeles",
-       "right-suppressredirect": "Saan nga agpartuat kadagiti baw-ing manipud ti taudan ti pampanid no agiyalis kadagiti panid",
+       "right-suppressredirect": "Saan nga agpartuat kadagiti baw-ing manipud iti taudan ti pampanid no agiyalis kadagiti panid",
        "right-upload": "Agikarga kadagiti papeles",
        "right-reupload": "Agisurat manen kadagiti addan a papeles",
        "right-reupload-own": "Agisurat manen kadagiti addan a papeles a bukod nga inkarga",
        "right-editmyuserjs": "Agurnos kadagiti bukodmo a papeles ti JavaScript ti agar-aramat",
        "right-viewmywatchlist": "Agkita iti bukodmo a listaan ti bambantayan",
        "right-editmywatchlist": "Agurnos iti bukodmo a listaan ti bambantayan. Laglagipen nga adda dagiti tignay a mangnayonto pay laeng ti pampanid urayno awan daytoy a karbengan.",
-       "right-viewmyprivateinfo": "Agkita iti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)",
-       "right-editmyprivateinfo": "Agurnos iti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)",
+       "right-viewmyprivateinfo": "Agkita iti bukodmo a pribado a datos (kasla ti adres ti esurat, pudno a nagan)",
+       "right-editmyprivateinfo": "Agurnos iti bukodmo a pribado a datos (kasla ti adres ti esurat, pudno a nagan)",
        "right-editmyoptions": "Agurnos kadagiti bukodmo a kakaykayatan",
        "right-rollback": "Napardas a mangisubli kadagiti inurnos ti naudi nga agar-aramat a nagurnos iti naisangayan a panid",
        "right-markbotedits": "Agmarka kadagiti naipasubli nga urnos a kas inurnos dagiti bot",
        "right-noratelimit": "Saan a maaringan babaen dagiti patingga ti gatad",
        "right-import": "Agala ti pampanid manipud kadagiti sabali a wiki",
-       "right-importupload": "Agala kadagiti panid manipud ti naikarga a papeles",
+       "right-importupload": "Agala kadagiti panid manipud iti naikarga a papeles",
        "right-patrol": "Markaanna dagiti inurnos ti dadduma a kas napatruliaan",
        "right-autopatrol": "Automatiko a mamarkaanna ti bukod nga inurnos a kas napatruliaan",
        "right-patrolmarks": "Agkita kadagiti kaudian a binaliwan dagiti marka ti napatruliaan",
        "grant-blockusers": "Serraan ken ikkaten ti serra dagiti agar-aramat",
        "grant-createaccount": "Agpartuat kadagiti pakabilangan",
        "grant-createeditmovepage": "Agpartuat, agurnos, ken agiyalis kadagiti panid",
-       "grant-delete": "Agikkat kadagiti panid, dagit irebision, ken dagiti naikabil iti listaan",
+       "grant-delete": "Agikkat kadagiti panid, dagitrebision, ken dagiti naikabil iti listaan",
        "grant-editinterface": "Urnosen ti nagan ti espasio ti MediaWiki ken ti CSS/JavaScript ti agar-aramat",
        "grant-editmycssjs": "Urnosen ti bukodmo a CSS/JavaScript ti agar-aramat",
        "grant-editmyoptions": "Urnosem ti bukodmo a kakaykayatan ti agar-aramat",
        "upload-form-label-infoform-categories": "Katkategoria",
        "upload-form-label-infoform-date": "Petsa",
        "upload-form-label-own-work-message-generic-local": "Pasingkedak nga ikarkargak daytoy a papeles a sumursurot kadagiti termino ti serbisio ken dagiti annuroten ti lisensia iti {{SITENAME}}.",
-       "upload-form-label-not-own-work-message-generic-local": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti {{SITENAME}}, pangngaasi nga irekep daytoy a dialogo ken padasen ti sabali a pamay-an.",
+       "upload-form-label-not-own-work-message-generic-local": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti {{SITENAME}}, pangngaasi nga irikep daytoy a dialogo ken padasen ti sabali a pamay-an.",
        "upload-form-label-not-own-work-local-generic-local": "Mabalinmo pay a padasen [[Special:Upload|ti kasisigud a pagikargaan a panid]].",
        "upload-form-label-own-work-message-generic-foreign": "Maawatak nga agikarkargaak iti daytoy a papeles iti pagbibingayan a repositorio. Pasingkedak nga ar-aramidek a sumursurot kadagiti termino ti serbisio ken dagiti annuroten ti lisensia idiay.",
-       "upload-form-label-not-own-work-message-generic-foreign": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti pagbibingayan a repositorio, pangngaasi nga irekep daytoy a dialogo ken padasen ti sabali a pamay-an.",
+       "upload-form-label-not-own-work-message-generic-foreign": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti pagbibingayan a repositorio, pangngaasi nga irikep daytoy a dialogo ken padasen ti sabali a pamay-an.",
        "upload-form-label-not-own-work-local-generic-foreign": "Malinmo pay a padasen ti panagusar [[Special:Upload|ti panid a pagikargaan iti {{SITENAME}}]], no daytoy a panid ket mabalin a maikarga idiay babaen dagiti bukodda nga annuroten.",
        "backend-fail-stream": "Saan a maipan ti papeles $1.",
        "backend-fail-backup": "Saan a makaidulin ti kapada ti papeles ti $1.",
        "img-auth-accessdenied": "Nalibak ti iseserrek",
        "img-auth-nopathinfo": "Ti servermo ket saan a naisaad nga agipasa iti daytoy a pakaammo.\nMabalin a naibatay iti CGI ken saan a makasuporta ti img_auth.\nKitaen ti https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization .",
        "img-auth-notindir": "Ti kiniddaw a dalan ket saan nga adda iti naaramid a direktorio ti pagikargaan",
-       "img-auth-badtitle": "Saan a makaaramid ti umisu a titulo manipud ti \"$1\".",
+       "img-auth-badtitle": "Saan a makaaramid ti umisu a titulo manipud iti \"$1\".",
        "img-auth-nologinnWL": "Saanka a nakastrek ken ti \"$1\" ket awan idiay mabalin a listaan.",
        "img-auth-nofile": "Awan ti papeles ti \"$1\".",
        "img-auth-isdir": "Padpadasem ti mangserrek ti direktorio ti \"$1\".\nTi laeng panagserrek ti papeles ti maipalubos.",
        "nolicense": "Awan ti napili",
        "licenses-edit": "Urnosen dagiti pagpilian ti lisensia",
        "license-nopreview": "(Saan a magun-od ti panagipadas)",
-       "upload_source_url": "(ti pinilim a papeles manipud ti umisu, ken publiko a maserrekan nga URL)",
-       "upload_source_file": "(ti pinilim a papeles manipud ti kompiutermo)",
+       "upload_source_url": "(ti pinilim a papeles manipud iti umisu, ken publiko a maserrekan nga URL)",
+       "upload_source_file": "(ti pinilim a papeles manipud iti kompiutermo)",
        "listfiles-delete": "ikkaten",
        "listfiles-summary": "Daytoy nga espesial a panid ket agiparang kadagiti amin a naikarga a papeles.",
        "listfiles_search_for": "Agbiruk para iti nagan ti midia:",
        "doubleredirects": "Dagiti namindua a naibaw-ing",
        "doubleredirectstext": "Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabali a baw-ing a pampanid.\nIti tunggal maysa nga aray ket aglaon kadagiti silpo iti umuna ken maikadua a baw-ing, ken ti pay puntaan ti maikadua a baw-ing, nga isu ti \"pudno\" a puntaan ti panid, nga ti umuna a baw-ing ket isu koma ti pakaituduanna.\nNasolbaren dagiti <del>nakurosan</del> a naikabil.",
        "double-redirect-fixed-move": "Naiyalisen ti [[$1]].\nAutomatiko idi a napabaro ken naibaw-ing tattan iti [[$2]].",
-       "double-redirect-fixed-maintenance": "Automatiko nga agsimsimpa ti doble a baw-ing manipud ti [[$1]] iti [[$2]] iti panagtaripato nga obra.",
+       "double-redirect-fixed-maintenance": "Automatiko nga agsimsimpa ti doble a baw-ing manipud iti [[$1]] iti [[$2]] iti panagtaripato nga obra.",
        "double-redirect-fixer": "Panagsimpa ti baw-ing",
        "brokenredirects": "Dagiti naputed a baw-ing",
        "brokenredirectstext": "Dagiti sumaganad a baw-ing ket nakasilpo kadagiti awan a panid:",
        "ancientpages": "Dagiti kadaanan a panid",
        "move": "Iyalis",
        "movethispage": "Iyalis daytoy a panid",
-       "unusedimagestext": "Adda dagiti sumaganad a papeles ngem saanda a naikabil iti aniaman a panid.\nPangngaasi a laglagipen a dagiti sabali a sitio ti web ket mabalin a nakasilpoda iti papeles iti dagus a URL, ken mabalin pay a nailista ditoy urayno saanda nga aktibo a maus-usar.",
+       "unusedimagestext": "Adda dagiti sumaganad a papeles ngem saanda a naikabil iti ania man a panid.\nPangngaasi a laglagipen a dagiti sabali a sitio ti web ket mabalin a nakasilpoda iti papeles iti dagus a URL, ken mabalin pay a nailista ditoy urayno saanda nga aktibo a maus-usar.",
        "unusedcategoriestext": "Ti sumaganad a kategoria ti pampanid ket adda,urayno awan ti sabali a panid wenno kategoria ti agus-usar kaniada.",
        "notargettitle": "Awan ti puntaan",
        "notargettext": "Saanmo a nainagan ti puntaan a panid wenno agar-aramat ti mangtungpal iti daytoy nga annong.",
        "apisandbox-multivalue-all-values": "$1 (Amin a patpateg)",
        "booksources": "Dagiti taudan ti libro",
        "booksources-search-legend": "Agbiruk para kadagiti taudan ti libro",
-       "booksources-search": "Biruken",
+       "booksources-search": "Agbiruk",
        "booksources-text": "Dita baba ket listaan dagiti silpo ti sabali a sitio nga aglaklako ti baro ken saan a nausar a liblibro, ken mabalin nga addaan pay iti adu a pakaammo a maipanggep kadagiti libro a birbirukem:",
-       "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud ti kasisigud a taudan.",
+       "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud iti kasisigud a taudan.",
        "magiclink-tracking-rfc": "Pampanid nga agus-usar kadagiti salamangka a silpo ti RFC",
        "magiclink-tracking-rfc-desc": "Daytoy a panid ket agus-usar kadagiti salamangka a silpo ti RFC. Kitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] no kasano iti mangiyakar.",
        "magiclink-tracking-pmid": "Pampanid nga agus-usar kadagiti salamangka a silpo ti PMID",
        "all-logs-page": "Amin a listaan a publiko",
        "alllogstext": "Naikaykaysa a panagiparang kadagiti amin a magun-od a listaan iti {{SITENAME}}.\nMapabassitmo ti panagkita babaen ti panagpili ti kita ti listaan, ti nagan ti agar-aramat (sensitibo ti kadakkel ti letra), wenno ti naapektaran a panid (sensitibo pay ti kadakkel ti letra).",
        "logempty": "Awan dagiti maipada a banag iti listaan.",
-       "log-title-wildcard": "Agbiruk kadagiti titulo a mangrugi iti daytoy a testo",
+       "log-title-wildcard": "Agbiruk kadagiti titulo a mangrugi iti daytoy a teksto",
        "showhideselectedlogentries": "Baliwan ti panagkita kadagiti napili a naikabil iti listaan",
        "log-edit-tags": "Urnosen dagiti etiketa iti napili a listaan ti naikabkabil",
        "checkbox-select": "Agpili: $1",
        "linksearch": "Panagbiruk kadagiti akinruar a silpo",
        "linksearch-pat": "Tabas ti panagbiruk:",
        "linksearch-ns": "Nagan ti espasio:",
-       "linksearch-ok": "Biruken",
+       "linksearch-ok": "Agbiruk",
        "linksearch-text": "Dagiti naatap a tarheta a kas ti \"*.wikipedia.org\" ket mabalin nga usaren.\nMasapul ti saan a basbassit ngem kangatuan a dominio, kas pagarigan \"*.org\".<br />\n{{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: $1 (kasisigud iti http:// no awan ti nainaganan a protokol).",
-       "linksearch-line": "Ti $1 ket naisilpo manipud ti $2",
+       "linksearch-line": "Ti $1 ket naisilpo manipud iti $2",
        "linksearch-error": "Ti naatap a tarheta ket mabalin nga agparang laeng iti rugi ti nagan ti agsangaili.",
        "listusersfrom": "Iparang dagiti agar-aramat a mangrugi iti:",
        "listusers-submit": "Ipakita",
        "listgrouprights-addgroup-self": "Agnayon {{PLURAL:$2|iti grupo|kadagiti grupo}} iti bukod a pakabilangan: $1",
        "listgrouprights-removegroup-self": "Agikkat {{PLURAL:$2|iti grupo|kadagiti grupo}} manipud ti bukod a pakabilangan: $1",
        "listgrouprights-addgroup-self-all": "Inayon amin dagiti grupo iti bukod a pakabilangan",
-       "listgrouprights-removegroup-self-all": "Ikkatem amin dagiti grupo manipud ti bukod a pakabilangan",
+       "listgrouprights-removegroup-self-all": "Ikkatem amin dagiti grupo manipud iti bukod a pakabilangan",
        "listgrouprights-namespaceprotection-header": "Dagiti panangigawid ti nagan ti espasio",
        "listgrouprights-namespaceprotection-namespace": "Nagan ti espasio",
        "listgrouprights-namespaceprotection-restrictedto": "Karbengan wenno karkarbengan a mangpalubos nga agurnos ti agar-aramat",
        "hidden-category-category-desc": "Ti kategoria ket aglaon ti <code><nowiki>__HIDDENCAT__</nowiki></code> iti panid a linaonna, a mangpawil daytoy nga agparang kadagiti silpo ti kahon ti kategoria kadagiti panid babaen ti kasisigud.",
        "trackingcategories-nodesc": "Awan ti magun-od a deskripsion.",
        "trackingcategories-disabled": "Nabaldado ti kategoria",
-       "mailnologin": "Awan ti pagipatulodan a pagtaengan",
-       "mailnologintext": "Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga esurat a pagtaengan idiay [[Special:Preferences|kaykayatam]] tapno makaipatulod iti esurat kadagiti sabali nga agar-aramat.",
+       "mailnologin": "Awan ti pagipatulodan nga adres",
+       "mailnologintext": "Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga adres ti esurat iti [[Special:Preferences|kaykayatam]] tapno makaipatulod iti esurat kadagiti sabali nga agar-aramat.",
        "emailuser": "Esuratan daytoy nga agar-aramat",
        "emailuser-title-target": "Esuratam daytoy nga {{GENDER:$1|agar-aramat}}",
        "emailuser-title-notarget": "Esuratan ti agar-aramat",
-       "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod iti esurat a mensahe iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapo\" a pagtaengan ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
+       "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod iti mensahe ti esurat iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapo\" nga adres ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
        "defemailsubject": "Esurat ti {{SITENAME}} a naggapo kenni \"$1\"",
        "usermaildisabled": "Saanmo a mabalin ti agipatulod ti esurat",
        "usermaildisabledtext": "Saanmo a mabalin ti agipatulod ti esurat kadagiti sabali nga agar-aramat iti daytoy a wiki",
-       "noemailtitle": "Awan ti esurat a pagtaengan",
-       "noemailtext": "Ti agar-aramat ket saan a nanginagan ti umisu nga esurat a pagtaengan.",
+       "noemailtitle": "Awan ti adres ti esurat",
+       "noemailtext": "Daytoy nga agar-aramat ket saan a nanginagan ti umisu nga adres ti esurat.",
        "nowikiemailtext": "Ti agar-aramat ket mabalinna ti agpili a saan nga umawat iti esurat kadagiti sabali nga agar-aramat.",
        "emailnotarget": "Awan wenno saan nga umisu a nagan ti agar-aramat para iti nagipatulodan.",
        "emailtarget": "Ikabil ti nagan ti agar-aramat a pangitulodam",
        "addedwatchtext": "Ti \"[[:$1]]\" ken ti tungtunganna a panid ket nainayonen iti [[Special:Watchlist|listaan ti bambantayam]].",
        "addedwatchtext-talk": "Ti \"[[:$1]]\" ken ti mainaig a panidna ket nainayoen iti [[Special:Watchlist|bambantayam]].",
        "addedwatchtext-short": "Ti panid ti \"$1\" ket nainayonen iti listaan ti bambantayam.",
-       "removewatch": "Ikkaten manipud ti listaan ti bambantayan",
+       "removewatch": "Ikkaten manipud iti listaan ti bambantayan",
        "removedwatchtext": "Ti \"[[:$1]]\" ken ti tungtunganna a panid ket naikkaten manipud iti [[Special:Watchlist|listaan ti bambantayam]].",
        "removedwatchtext-talk": "Ti \"[[:$1]]\" ken ti mainaig a panidna ket naikkaten manipud iti [[Special:Watchlist|bambantayam]].",
-       "removedwatchtext-short": "Ti panid ti \"$1\" ket naikkaten manipud ti listaan ti bambantayam.",
+       "removedwatchtext-short": "Ti panid ti \"$1\" ket naikkaten manipud iti listaan ti bambantayam.",
        "watch": "Bantayan",
        "watchthispage": "Bantayan daytoy a panid",
        "unwatch": "Saanen a bantayan",
        "log-name-contentmodel": "Listaan ti panagbaliw ti modelo ti linaon",
        "log-description-contentmodel": "Dagiti pasamak a mainaig kadagiti modelo ti linaon ti panid",
        "logentry-contentmodel-new": "{{GENDER:$2|Pinartuat}} ni $1 ti panid ti $3 a nagusar ti saan a kasisigud a modelo ti linaon ti \"$5\"",
-       "logentry-contentmodel-change": "{{GENDER:$2|Binaliwan}} ni $1 ti modelo ti panid ti $3 manipud ti \"$4\" iti \"$5\"",
+       "logentry-contentmodel-change": "{{GENDER:$2|Binaliwan}} ni $1 ti modelo ti panid ti $3 manipud iti \"$4\" iti \"$5\"",
        "logentry-contentmodel-change-revertlink": "isubli",
        "logentry-contentmodel-change-revert": "isubli",
        "protectlogpage": "Listaan ti panagsalaknib",
        "protectlogtext": "Dita baba ket adda listaan dagiti sinukatan a salaknib ti panid.\nKitaen ti [[Special:ProtectedPages|listaan kadagiti nasalakniban a panid]] ti listaan kadagiti agdama a panagpataray a panagsalaknib ti panid.",
        "protectedarticle": "nasalakniban ti \"[[$1]]\"",
        "modifiedarticleprotection": "nasukatan ti agpang ti salaknib para iti \"[[$1]]\"",
-       "unprotectedarticle": "naikkat ti salaknib manipud ti \"[[$1]]\"",
-       "movedarticleprotection": "iyalis ti kasasaad ti salaknib manipud ti \"[[$2]]\" iti \"[[$1]]\"",
+       "unprotectedarticle": "naikkat ti salaknib manipud iti \"[[$1]]\"",
+       "movedarticleprotection": "iyalis ti kasasaad ti salaknib manipud iti \"[[$2]]\" iti \"[[$1]]\"",
        "protect-title": "Sukatan ti agpang ti salaknib para iti \"$1\"",
        "protect-title-notallowed": "Kitaen ti agpang ti salaknib ti \"$1\"",
        "prot_1movedto2": "[[$1]] naiyalis iti [[$2]]",
        "restriction-upload": "Agikarga",
        "restriction-level-sysop": "napno a nasalakniban",
        "restriction-level-autoconfirmed": "nasalakniban-bassit",
-       "restriction-level-all": "aniaman nga agpang",
+       "restriction-level-all": "ania man nga agpang",
        "undelete": "Kitaen dagiti naikkat a panid",
        "undeletepage": "Kitaen ken isubli dagiti naikkat a panid",
        "undeletepagetitle": "<strong>Ti sumaganad ket buklen dagiti naikkat a rebision ti [[:$1|$1]]</strong>.",
        "undeleterevisions": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naikkat",
        "undeletehistory": "No ipasublim daytoy a panid, amin dagiti rebision ket maipasubli iti pakasaritaan.\nKet no adda baro a panid a kanagnaganna a naaramid ti napalabas a panagikkat, dagiti naipasubli a rebision ket agparang iti napalabas a pakasaritaan.",
        "undeleterevdel": "Ti panagikkat ket saan a maaramid no agbanag iti rabaw ti panid, wenno ti rebision ti papeles ket maikkatan ti bassit.\nIti kastoy a kaso, masapul nga ikkatem ti kur-it wenno ikkatem ti lemmeng dagiti kabarbaro a naikkat a rebision.",
-       "undeletehistorynoadmin": "Daytoy a panid ket naikkaten.\nTi rason ti panagikkat ket naipakita iti pakabuklan dita baba, ken dagita a salaysay ti agar-aramat a nagurnos iti daytoy a panid sakbay a naikkat.\nTi husto a testo dagitoy a naikat a rebision ket magun-od laeng dagiti administrador.",
+       "undeletehistorynoadmin": "Daytoy a panid ket naikkaten.\nTi rason ti panagikkat ket naipakita iti pakabuklan dita baba, ken dagita a salaysay ti agar-aramat a nagurnos iti daytoy a panid sakbay a naikkat.\nTi husto a teksto dagitoy a naikat a rebision ket magun-od laeng dagiti administrador.",
        "undelete-revision": "Naikkat ti rebision ti $1 (manipud idi $4, $5) babaen ni $3:",
        "undeleterevision-missing": "Imbalido wenno napukaw a rebision.\nAddaanka ngata ti madi a silpo, wenno ti rebision ket mabalin a naipasubli wenno naikkat manipud ti arkibo.",
        "undeleterevision-duplicate-revid": "Saan a maisubli {{PLURAL:$1|ti maysa a rebision|dagiti $1 a rebision}}, gapu ta {{PLURAL:$1|ti bukona|dagiti bukodda}} nga <code>rev_id</code> ket naus-usaren.",
        "undeleteviewlink": "kitaen",
        "undeleteinvert": "Baliktaden ti napili",
        "undeletecomment": "Rason:",
-       "undeletedrevisions": "{{PLURAL:$1|1 a rebision|dagiti $1 a rebision}} ti naisubli",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 a rebision|dagiti $1 a rebision}} ken {{PLURAL:$2|1 a papeles|dagiti $2 a papeles}} ti naisubli",
-       "undeletedfiles": "{{PLURAL:$1|1 a papeles|dagiti $1 a papeles}} ti naisubli",
        "cannotundelete": "Napaay ti sangkabassit wenno amin iti panagisubli ti panagikkat:\n$1",
        "undeletedpage": "<strong>Naisublin ti $1</strong>\n\nBinsiren ti [[Special:Log/delete|listaan ti panagikkat]] para iti rehistro dagiti kaudian panagikkat ken naisubsubli.",
        "undelete-header": "Kitaen [[Special:Log/delete|ti listaan ti panagikkat]] kadagiti kaudian a naikkat a panid.",
-       "undelete-search-title": "Biruken dagiti naikkat a panid",
-       "undelete-search-box": "Biruken dagiti naikkat a panid",
+       "undelete-search-title": "Agbiruk kadagiti naikkat a panid",
+       "undelete-search-box": "Agbiruk kadagiti naikkat a panid",
        "undelete-search-prefix": "Ipakita dagiti panid a mangrugi iti:",
-       "undelete-search-submit": "Biruken",
+       "undelete-search-submit": "Agbiruk",
        "undelete-no-results": "Awan dagiti kapada ti panid a nasarakan idiay arkibo ti panagikkat.",
        "undelete-filename-mismatch": "Saan maisubli ti panagikkat ti rebision ti papeles nga adda oras ket petsana a $1: Saan nga agpada ti nagan ti papeles.",
        "undelete-bad-store-key": "Saan a maisubli ti pinagikkat ti rebision ti papeles nga adda oras ket petsana a $1: Ti papeles ket napukaw sakbay a naikkat.",
        "contributions-userdoesnotexist": "Ti pakabilangan ti agar-aramat ni \"$1\" ket saan a nakarehistro.",
        "nocontribs": "Awan ti nasarakan a nasukatan a kapada dagitoy a kriteria.",
        "uctop": "(agdama)",
-       "month": "Manipud ti bulan (ken nasapsapa):",
-       "year": "Manipud ti tawen (ken nasapsapa):",
+       "month": "Manipud iti bulan (ken nasapsapa):",
+       "year": "Manipud iti tawen (ken nasapsapa):",
        "sp-contributions-newbies": "Iparang dagiti kontribusion dagiti kabarbaro a pakabilangan laeng",
        "sp-contributions-newbies-sub": "Para kadagiti kabarbaro a pakabilangan",
        "sp-contributions-newbies-title": "Dagiti kontribusion para kadagiti baro a pakabilangan",
        "sp-contributions-talk": "tungtungan",
        "sp-contributions-userrights": "panagtaripato kadagiti karbengan ti agar-aramat",
        "sp-contributions-blocked-notice": "Agdama a naserraan daytoy nga agar-aramat.\nTi naudi a naikabil iti listaan ti pannakaserra ket naited dita baba para iti reperensia:",
-       "sp-contributions-blocked-notice-anon": "Daytoy nga IP a pagtaengan ket agdama a naserraan.\nTi naudi a naikabil iti listaan ti pannakaserra ket adda dita baba para iti reperensia:",
+       "sp-contributions-blocked-notice-anon": "Daytoy nga adres ti IP ket agdama a naserraan.\nTi naudi a naikabil iti listaan ti pannakaserra ket adda dita baba para iti reperensia:",
        "sp-contributions-search": "Agbiruk para kadagiti kontribusion",
-       "sp-contributions-username": "IP a pagtaengan wenno nagan ti agar-aramat:",
+       "sp-contributions-username": "Adres ti IP wenno nagan ti agar-aramat:",
        "sp-contributions-toponly": "Ipakita laeng dagiti inurnos dagiti kaudian a rebision",
        "sp-contributions-newonly": "Ipakita laeng dagiti inurnos a pannakapartuat ti pampanid",
        "sp-contributions-hideminor": "Ilemmeng dagiti bassit a panagurnos",
-       "sp-contributions-submit": "Biruken",
+       "sp-contributions-submit": "Agbiruk",
        "whatlinkshere": "Dagiti nakasilpo ditoy",
        "whatlinkshere-title": "Pampanid a nakasilpo iti \"$1\"",
        "whatlinkshere-page": "Panid:",
        "blockip": "Serraan ti {{GENDER:$1|agar-aramat}}",
        "blockip-legend": "Serraan ti agar-aramat",
        "blockiptext": "Usaren ti porma dita baba tapno maserraan ti panagserrek ti panagsurat manipud iti naisangayan nga adres ti IP wenno nagan ti agar-aramat.\nDaytoy ket nasken laeng a maaramid tapno mapawilan ti bandalismo, ken segun iti [[{{MediaWiki:Policy-url}}|annuroten]].\nIkabil ti naisangayan a rason dita baba (kas pagarigan, ti panagdakamat kadagiti naisangayan a panid a nabandalismo).\nMabalinmo a serraan dagiti sakup ti adres ti IP babaen ti panagusar ti sintaksis ti [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; ti kadakkelan a maipalubos a sakup ket /$1 para iti IPv4 ken /$2 para iti IPv6.",
-       "ipaddressorusername": "IP a pagtaengan wenno nagan ti agar-aramat:",
+       "ipaddressorusername": "Adres ti IP wenno nagan ti agar-aramat:",
        "ipbexpiry": "Agpaso:",
        "ipbreason": "Rason:",
        "ipbreason-dropdown": "*Dagiti kadawyan a rason ti panagserra\n** Agikabil kadagiti  madi a pakaammo\n** Agikkat kadagiti linaon ti pampanid\n** Agikabil ti spam a silpo iti ruar\n** Agikabil ti minamaag/saan a maawatan a pampanid\n** Mangbutbuteng a panagkukua /mangriribok\n** Agab-abuso kadagiti nadumaduma a pakabilangan\n** Saan a maawat a nagan ti agar-aramat",
-       "ipb-hardblock": "Iparit dagiti nakastrek nga agar-aramat manipud ti panagurnos manipud ti daytoy nga IP a pagtaengan",
+       "ipb-hardblock": "Iparit dagiti nakastrek nga agar-aramat manipud iti panagurnos manipud iti daytoy nga adres ti IP",
        "ipbcreateaccount": "Pawilan ti panagpartuat iti pakabilangan",
        "ipbemailban": "Pawilan ti agar-aramat nga agipatulod iti esurat",
-       "ipbenableautoblock": "Automatiko a mangserra ti naudi nga IP a pagtaengan nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga IP a pagtaengan nga ayan ti pangipadasanda nga agurnos",
+       "ipbenableautoblock": "Automatiko a mangserra ti naudi nga adres ti IP nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga adres ti IP nga ayan ti pangipadasanda nga agurnos",
        "ipbsubmit": "Serraan daytoy nga agar-aramat",
        "ipbother": "Sabali nga oras:",
        "ipboptions": "2 nga oras:2 hours,1 nga aldaw:1 day,3 nga aldaw:3 days,1 a lawas:1 week,2 a lawas:2 weeks,1 a bulan:1 month,3 a bulan:3 months,6 a bulan:6 months,1 a tawen:1 year,awan inggana:infinite",
        "ipb-disableusertalk": "Pawilan daytoy nga agar-aramat nga agurnos kadagiti bukodda a tungtungan a panid bayat a naserraan",
        "ipb-change-block": "Serraan manen ti agar-aramat kadagitoy a pannakaisaad",
        "ipb-confirm": "Pasingkedan ti serra",
-       "badipaddress": "Imbalido nga IP a pagtaengan",
+       "badipaddress": "Imbalido nga adres ti IP",
        "blockipsuccesssub": "Balligi ti panangserra",
        "blockipsuccesstext": "Ni [[Special:Contributions/$1|$1]] ket naserraanen.<br />\nKitaen ti [[Special:BlockList|listaan ti serra]] tapno marepaso dagiti serra.",
        "ipb-blockingself": "Mangrugrugika nga agserra kenka! Sigurado a kayatmo nga aramiden daytoy?",
        "ipb-confirmaction": "No sigurado a kayatmo nga aramiden daytoy, pangngaasi a kitaen ti \"{{int:ipb-confirm}}\" a pagikabilan dita baba.",
        "ipb-edit-dropdown": "Urnosen dagiti rason ti panagserra",
        "ipb-unblock-addr": "Lukatan ti serra ni $1",
-       "ipb-unblock": "Lukatan ti serra ti nagan ti agar-aramat wenno IP a pagtaengan",
+       "ipb-unblock": "Lukatan ti serra ti nagan ti agar-aramat wenno adres ti IP",
        "ipb-blocklist": "Kitaen dagiti adda a serra",
        "ipb-blocklist-contribs": "Dagiti kontribusion para kenni {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "$1 ti nabati",
        "unblockip": "Lukatan ti serra ti agar-aramat",
-       "unblockiptext": "Usaren ti porma dita baba tapno maisubli ti panagserrek ti panagsurat ti dati a naserran nga IP a pagtaengan wenno nagan ti agar-aramat.",
+       "unblockiptext": "Usaren ti porma dita baba tapno maisubli ti panagserrek ti panagsurat ti dati a naserran nga adres ti IP wenno nagan ti agar-aramat.",
        "ipusubmit": "Ikkaten daytoy a serra",
        "unblocked": "Naikkat ti pannakaserra ni [[User:$1|$1]].",
        "unblocked-range": "Naikkaten ti serra ti $1.",
        "blocklist-by": "Ti nagserra nga admin",
        "blocklist-params": "Dagiti parametro ti serra",
        "blocklist-reason": "Rason",
-       "ipblocklist-submit": "Biruken",
+       "ipblocklist-submit": "Agbiruk",
        "ipblocklist-localblock": "Lokal a serra",
        "ipblocklist-otherblocks": "Sabali {{PLURAL:$1|a serra|kadagiti serra}}",
        "infiniteblock": "inggana't inggana",
        "emailblock": "nabaldado ti esurat",
        "blocklist-nousertalk": "saan a mabalin nga agurnos ti bukod a tungtungan a panid",
        "ipblocklist-empty": "Awan linaon ti listaan ti serra.",
-       "ipblocklist-no-results": "Ti kiniddaw nga IP a pagtaengan wenno nagan ti agar-aramat ket saan a naserraan.",
+       "ipblocklist-no-results": "Ti kiniddaw nga adres ti IP wenno nagan ti agar-aramat ket saan a naserraan.",
        "blocklink": "serraan",
        "unblocklink": "ikkaten ti serra",
        "change-blocklink": "baliwan ti serra",
        "blocklog-showsuppresslog": "Daytoy nga agar-aramat ket dati a naserraan ken nailemmeng.\nTi listaan ti panagpasardeng ket naikabil dita baba para iti reperensia:",
        "blocklogentry": "naserraan ni [[$1]] nga adda ti oras a panagpaso iti $2 $3",
        "reblock-logentry": "sinukatan ti pannakaserra para kenni [[$1]] nga adda ti oras a panagpaso iti $2 $3",
-       "blocklogtext": "Daytoy ket listaan ti agar-aramat kadagiti panagserra ken panaglukat ti serra\nDagiti automatiko a panakaserra ti IP a pagtaengan ket saan a nailista.\nKitaen ti [[Special:BlockList|listaan ti serra]] para iti listaan kadagiti agdama a naiparit a pagpataray ken dagiti serra.",
+       "blocklogtext": "Daytoy ket listaan ti agar-aramat kadagiti panagserra ken panaglukat ti serra\nDagiti automatiko a pannakaserra ti adres ti IP ket saan a nailista.\nKitaen ti [[Special:BlockList|listaan ti serra]] para iti listaan kadagiti agdama a panangiparit ti pagpataray ken dagiti serra.",
        "unblocklogentry": "lukatan ti serra ni $1",
        "block-log-flags-anononly": "dagiti di ammo nga agar-aramat laeng",
        "block-log-flags-nocreate": "nabaldado ti panagpartuat ti pakabilangan",
        "ipb-otherblocks-header": "Sabali {{PLURAL:$1|a naserraan|kadagiti naserraan}}",
        "unblock-hideuser": "Saanmo a maisubli ti serra daytoy nga agar-aramat, nailemmengen ti nagan daytoy nga agar-aramat.",
        "ipb_cant_unblock": "Biddut: San a nabirukan ti ID $1 ti serra. Mabalin a nalukatanen ti serrana.",
-       "ipb_blocked_as_range": "Biddut: Ti IP a pagtaengan ti $1 ket saan a dagus a naserraan ken saan a malukatan ti serrana.\nNgem, nupay kasta, naserran a kas paset ti sakop ti $2, a mabalin a malukatan ti serrana.",
+       "ipb_blocked_as_range": "Biddut: Ti adres ti IP ti $1 ket saan a dagus a naserraan ken saan a malukatan ti serrana.\nNgem, nupay kasta, naserran a kas paset ti sakop ti $2, a mabalin a malukatan ti serrana.",
        "ip_range_invalid": "Imbalido a sakop ti IP.",
        "ip_range_toolarge": "Dagiti serra a nasakop a dakdakkel ngem /$1 ket saan a maipalubos.",
        "proxyblocker": "Pannakbagi a panagserra",
        "proxyblockreason": "Ti IP a pagtaengam ket naserraan ngamin ket daytoy ket nakalukat a panakbagi.\nPangngaasi a kontakem ti agit-ited ti serbisio ti Internetmo wenno teknikal a suporta ti gunglom ken ibagam kaniada ti nakaro a parikut ti seguridad.",
        "sorbsreason": "Ti IP a pagtaengam ket nailista a kasla \"nalukatan a pannakbagi\" iti DNSBL nga inusar babaen ti {{SITNAME}}.",
        "sorbs_create_account_reason": "Ti IP a pagtaengam ket nailista a kasla \"nalukatan a pannakbagi\" iti DNSBL nga inusar babaen ti {{SITNAME}}.\nSaanka a makapartuat ti pakabilangan.",
-       "xffblockreason": "Ti maysa nga IP a pagtaengan nga adda iti X-Forwarded-For header, mabalin a kukuam wenno ti pannakbagi a server nga us-usarem, ket naserraan. Ti kasisigud a rason ti pannakaserra idi ket: $1",
+       "xffblockreason": "Ti maysa nga adres ti IP nga adda iti paulo ti X-Forwarded-For, mabalin a kukuam wenno ti pannakbagi a server nga us-usarem, ket naserraan. Ti kasisigud a rason ti pannakaserra idi ket: $1",
        "cant-see-hidden-user": "Ti agar-aramat a kayatmo a serraan ket naserraanen ken nailemmeng.\nGapu ta awan met ti karbengam nga agilemming ti agar-aramat, saanmo a makita wenno maurnos ti serra ti agar-aramat.",
        "ipbblocked": "Saanmo a mabalin ti agserra wenno agikkat ti serra ti sabali nga agar-aramat, ngamin ket naserraanka met.",
        "ipbnounblockself": "Saanmo a mabalin a lukatan ti serram.",
        "movepagetext-noredirectfixer": "Ti panagusar ti kinabuklan dita baba, ket panaganan ti panid, iyalisna amin ti pakasaritaanna iti baro a nagan.\nTi daan a titulo ket agbalin baw-ing a panid idiay baro a titulo.\nSiguraduem a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRebbengem ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket <strong>saan</strong> a maiyalis no addaan iti sigud a panid iti baro a titulo, malaksid no awan linaonna wenno no maysa a baw-ing a panid ken awan ti panagbaliw iti pakasaritaan ti napalabas. \nKayat a sawen daytoy a mabalinmo a sukatan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saanmo a mabalin a suratan manen ti addaan a panid.\n\n<strong>Nota:</strong>\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim ta pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
        "movepagetalktext": "No kur-item daytoy a kahon, automatikonto a maiyalis ti mainaig a tungtungan a panid, malaksid no addanto idiay iti adda linaon a tungtungan a panid.\n\nIti daytoy a kaso, masapul nga iyalis wenno manual nga itiponmo ti panid no kayatmo.",
        "moveuserpage-warning": "<strong>Ballaag:</strong> Mangrugrugika nga agiyalis ti panid ti agar-aramat. Pangngaasi a laglapipen a ti panid ket isu laeng ti maiyalis ken ti agar-aramat ket <em>saanto</em> a managanan.",
-       "movecategorypage-warning": "<strong>Ballaag:</strong> Mangiyal-aliskan iti panid ti kategoria. Pangngaasi a laglagipen a ti maiyalisto laeng ket ti panid ken ti aniaman a pampanid iti daan a kategoria ket <em>saanto</em> a maikategoria iti baro.",
+       "movecategorypage-warning": "<strong>Ballaag:</strong> Mangiyal-aliskan iti panid ti kategoria. Pangngaasi a laglagipen a ti maiyalisto laeng ket ti panid ken ti ania man a pampanid iti daan a kategoria ket <em>saanto</em> a maikategoria iti baro.",
        "movenologintext": "Masapul a nakarehistroka nga agar-aramat ken [[Special:UserLogin|nakastrek]] tapno makaiyalis iti panid.",
        "movenotallowed": "Awan ti pammalubosmo nga agiyalis kadagiti panid.",
        "movenotallowedfile": "Awan ti pammalubosmo nga agiyalis kadagiti papeles.",
        "cant-move-to-user-page": "Awan ti pammalubosmo nga agiyalis ti panid iti panid ti agar-aramat (malaksid kadagiti subpanid ti agar-aramat).",
        "cant-move-category-page": "Awan ti pammalubosmo nga agiyalis kadagiti panid ti kategoria.",
        "cant-move-to-category-page": "Awan ti pammalubosmo nga agiyalis ti panid iti panid ti kategoria.",
+       "cant-move-subpages": "Awan pammalubosmo nga agiyalis kadagiti subpanid.",
+       "namespace-nosubpages": "Saan a mangipalubos kadagiti subpanid ti nagan ti espasio ti \"$1\".",
        "newtitle": "Baro a titulo:",
        "move-watch": "Bantayan ti taudan a panid ken puntaan a panid",
        "movepagebtn": "Iyalis ti panid",
        "movepage-moved-redirect": "Napartuaten ti maysa a baw-ing.",
        "movepage-moved-noredirect": "Napasardeng ti pannakapartuat ti baw-ing.",
        "articleexists": "Adda panid nga adda ti kastan a nagan, wenno ti nagan a pinilim ket saan a mabalin.\nPangngaasi nga agpili ti sabali a nagan.",
-       "cantmove-titleprotected": "Saanmo a maiyalis ti panid iti daytoy a lokasion ngamin ket ti baro a titulo ket nasalakniban manipud ti pannakapartuat",
+       "cantmove-titleprotected": "Saanmo a maiyalis ti panid iti daytoy a lokasion ngamin ket ti baro a titulo ket nasalakniban manipud iti pannakapartuat",
        "movetalk": "Iyalis ti mainaig a panid ti tungtungan",
        "move-subpages": "Iyalis dagiti subpanid (aginggana iti $1)",
        "move-talk-subpages": "Iyalis dagiti subpanid ti tungtungan ti panid (aginggana iti $1)",
        "revertmove": "isubli",
        "delete_and_move_text": "Addan ti pangipanan a panid ti \"[[:$1]]\".\nKayatmo nga ikkaten daytoy tapno makaiyaliska?",
        "delete_and_move_confirm": "Wen, ikkaten ti panid",
-       "delete_and_move_reason": "Naikkat tapno mawayaan ti pannaka-iyalis manipud ti \"[[$1]]\"",
+       "delete_and_move_reason": "Naikkat tapno mawayaan ti pannaka-iyalis manipud iti \"[[$1]]\"",
        "selfmove": "Ti titulo ti taudan ken ti pangipanan ket agpadpada;\nsaanmo a maiyalis ti panid ti isu met laeng a panid.",
        "immobile-source-namespace": "Saan a maiyalis dagiti panid iti nagan ti espasio ti \"$1\"",
        "immobile-target-namespace": "Saan a maiyalis dagiti panid iti nagan ti espasio ti \"$1\"",
        "immobile-target-namespace-iw": "Ti silpo nga interwiki ket saan nga umiso a puntaan para iti panagiyalis ti panid.",
        "immobile-source-page": "Saan a mabalin nga iyalis daytoy a panid.",
        "immobile-target-page": "Saan a maiyalis iti dayta a pangipanan a titulo.",
-       "bad-target-model": "Ti kinaykayat a pangipanan ket agus-usar ti sabali a modelo ti linaon. Saan a mapagbaliwen manipud ti $1 iti $2.",
+       "bad-target-model": "Ti kinaykayat a pangipanan ket agus-usar ti sabali a modelo ti linaon. Saan a mapagbaliwen manipud iti $1 iti $2.",
        "imagenocrossnamespace": "Saan a maiyalis ti papeles iti saan nagan ti espasio ti papeles",
        "nonfile-cannot-move-to-file": "Saan a maiyalis ti saan a papeles iti nagan ti espasio ti papeles",
        "imagetypemismatch": "Ti baro a pagpaatiddog ti papeles ket saan a maipada iti bukodna a kita",
        "imageinvalidfilename": "Ti puntaan a nagan ti papeles ket imbalido",
-       "fix-double-redirects": "Agpabaro kadagiti aniaman a baw-ing a mangipatudo ti kasisigud a titulo",
+       "fix-double-redirects": "Agpabaro kadagiti ania man a baw-ing a mangipatudo ti kasisigud a titulo",
        "move-leave-redirect": "Mangibati ti baw-ing",
        "protectedpagemovewarning": "<strong>Balaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan ti gundaway nga administrador ti makaiyalis.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "semiprotectedpagemovewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaiyalis daytoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "move-over-sharedrepo": "Addan ti [[:$1]] iti pagbingayan a repositorio. Ti panagiyalis ti papeles iti daytoy a titulo ket tuonenna ti pagbingayan a papeles.",
        "file-exists-sharedrepo": "Ti napilim a nagan ti papeles ket naususaren iti pagbingayan a repositorio.\nPangngaasi nga agpilika ti sabali a nagan.",
        "export": "Agipan kadagiti panid",
-       "exporttext": "Maipanmo ti testo ken pakasaritaan ti inurnos iti maysa a panid wenno pampanid a nabalkut ti XML.\nDaytoy ket mabalin a maikabil iti sabali a wiki nga agususar ti MediaWiki nga usaren ti [[Special:Import|pinagala ti panid]].\n\nTi pinagipan ti panid, ikabil ti titulo dita kahon ti testo dita baba, maysa a titulo iti maysa a linia, ken agpili ka no ti kayatmo ket ti agdama a pinagbaliw ken amin nga daan a panagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a panagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a panagurnos.\n\nNo iti kinaudi a kaso mabalinmo nga usaren ti silpo, a kas pagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exporttext": "Maipanmo ti teksto ken pakasaritaan ti inurnos iti maysa a panid wenno pampanid a nabalkut ti XML.\nDaytoy ket mabalin a maikabil iti sabali a wiki nga agus-usar ti MediaWiki nga usaren ti [[Special:Import|pinagala ti panid]].\n\nTi pinagipan ti panid, ikabil ti titulo dita kahon ti teksto dita baba, maysa a titulo iti maysa a linia, ken agpilika no ti kayatmo ket ti agdama a panagbaliw ken amin nga daan a panagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a panagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a panagurnos.\n\nNo iti kinaudi a kaso mabalinmo nga usaren ti silpo, a kas pagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid \"[[{{MediaWiki:Mainpage}}]]\".",
        "exportall": "Ipan amin a pampanid",
        "exportcuronly": "Iraman laeng ti kinaudi a panagbaliw, saan a ti napno a pakasaritaan",
        "exportnohistory": "----\n<strong>Nota:</strong> Ti pagipapan dagiti napno a pakasaritaan dagiti panid iti daytoy a kinabuklan ket nabaldado gapu dagiti pannakalaing ti panagandar a rason.",
        "exportlistauthors": "Iraman ti amin a listaan kadagiti nagaramid iti tunggal a maysa a panid",
        "export-submit": "Agipan",
-       "export-addcattext": "Agnayon kadagiti panid manipud ti kategoria:",
+       "export-addcattext": "Agnayon kadagiti panid manipud iti kategoria:",
        "export-addcat": "Inayon",
-       "export-addnstext": "Agnayon kadagiti panid manipud ti nagan ti espasio:",
+       "export-addnstext": "Agnayon kadagiti panid manipud iti nagan ti espasio:",
        "export-addns": "Inayon",
        "export-download": "Idulin a kas papeles",
        "export-templates": "Mangiraman kadagiti plantilia",
        "export-manual": "Manual nga inayon dagiti panid:",
        "allmessages": "Dagiti mensahe ti sistema",
        "allmessagesname": "Nagan",
-       "allmessagesdefault": "Kasisigud a testo ti mensahe",
-       "allmessagescurrent": "Agdama a testo ti mensahe",
+       "allmessagesdefault": "Kasisigud a teksto ti mensahe",
+       "allmessagescurrent": "Agdama a teksto ti mensahe",
        "allmessagestext": "Daytoy ti listaan dagiti mensahe ti sistema a magun-od iti nagan ti espasio ti MediaWiki.\nPangngaasi a bisitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Lokalisasion ti MediaWiki] ken [https://translatewiki.net translatewiki.net] no kayatmo ti agparawad kadagiti sapasap a panagipatarus ti MediaWiki.",
        "allmessagesnotsupportedDB": "Daytoy a panid ket saan a musar gapu ta nabaldado ti <strong>$wgUseDatabaseMessages</strong>.",
        "allmessages-filter-legend": "Sagat",
        "thumbnail-more": "Padakkelen",
        "filemissing": "Awan ti papeles",
        "thumbnail_error": "Biddut ti panagpartuat ti bassit a ladawan: $1",
-       "thumbnail_error_remote": "Biddut a mensahe manipud ti $1: \n$2",
+       "thumbnail_error_remote": "Biddut a mensahe manipud iti $1: \n$2",
        "djvu_page_error": "Ti DjVu a panid ket saan a masakop",
        "djvu_no_xml": "Saan a naala ti XML iti DjVu a papeles",
        "thumbnail-temp-create": "Saan a makapartuat ti temporario a bassit a ladawan ti papeles",
        "import-mapping-subpage": "Alaen a kas dagiti subpanid ti sumaganad a panid:",
        "import-upload-filename": "Nagan ti papeles:",
        "import-comment": "Komentario:",
-       "importtext": "Pangngaasi nga ipanmo ti papeles manipud ti nagtaudan a wiki nga agusar ti [[Special:Export|ramit ti panagipan]].\nIdulinmo iti bukodmo a kompiuter ken ikarga ditoy.",
+       "importtext": "Pangngaasi nga ipanmo ti papeles manipud iti nagtaudan a wiki nga agusar ti [[Special:Export|ramit ti panagipan]].\nIdulinmo iti bukodmo a kompiuter ken ikarga ditoy.",
        "importstart": "Agal-ala kadagiti panid...",
        "import-revision-count": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}}",
        "importnopages": "Awan dagiti maala a panid.",
        "xml-error-string": "$1 iti linia $2, tukol $3 (byte $4): $5",
        "import-upload": "Ikarga ti datos ti XML",
        "import-token-mismatch": "Pannakapukaw ti sesion ti datos.\n\nMabalin a nakaruarka. <strong>Pangngaasi a pasingkedan a nakastrekka pay laeng ken padasem manen</strong>.\nNo saan pay a mabalin, padasem ti [[Special:UserLogout|rummuar]] ken sumrek manen, ken kitaen no ti pagpasabasam ket mangipalubos kadagiti galieta manipud iti daytoy a sitio.",
-       "import-invalid-interwiki": "Saan a makaala manipud ti nainaganan a wiki.",
+       "import-invalid-interwiki": "Saan a makaala manipud iti nainaganan a wiki.",
        "import-error-edit": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket saanmo a mabalin nga urnosen.",
        "import-error-create": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket saanmo a mabalin a partuaten.",
        "import-error-interwiki": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket ti nagan ket naireserba para iti ruar a panagsilpo (interwiki).",
        "import-rootpage-invalid": "Ti naited a ramut ti panid ket imbalido a titulo.",
        "import-rootpage-nosubpage": "Ti nagan ti espasio ti \"$1\" iti ramut ti panid ket saan a mangpalubos kadagiti subpanid.",
        "importlogpage": "Listaan ti panagala",
-       "importlogpagetext": "Dagiti administratibo a panagala kadagiti panid nga addaan iti pakasaritaan ti panag-urnos manipud kadagiti sabali a wiki.",
+       "importlogpagetext": "Dagiti administratibo a panagala kadagiti panid nga addaan iti pakasaritaan ti panagurnos manipud kadagiti sabali a wiki.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naala",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|rebision|dagiti rebision}} ti naala manipud ti $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|rebision|dagiti rebision}} ti naala manipud iti $2",
        "javascripttest": "Panagsubok ti JavaScript",
        "javascripttest-pagetext-unknownaction": "Di ammo a tignay ti \"$1\".",
        "javascripttest-qunit-intro": "Kitaen ti [ $1 dukomentasion ti panagsubok] idiay mediawiki.org.",
        "tooltip-pt-userpage": "Panidmo nga agar-aramat",
-       "tooltip-pt-anonuserpage": "Ti panid ti agar-aramat para iti daytoy nga IP a pagtaengan a kas ur-urnosem",
+       "tooltip-pt-anonuserpage": "Ti panid ti agar-aramat para iti daytoy nga adres ti IP a kas ur-urnosem",
        "tooltip-pt-mytalk": "Tungtungam a panid",
        "tooltip-pt-anontalk": "Pakitungtungan a maipanggep kadagiti panagurnos manipud iti daytoy nga adres ti IP",
        "tooltip-pt-preferences": "Dagiti kakaykayatam",
        "tooltip-ca-undelete": "Isubli dagiti inurnos a naaramid iti daytoy a panid sakbay idi naikkat",
        "tooltip-ca-move": "Iyalis daytoy a panid",
        "tooltip-ca-watch": "Inayon daytoy a panid iti listaan ti bambantayam",
-       "tooltip-ca-unwatch": "Ikkaten daytoy a panid manipud ti listan ti bambantayam",
+       "tooltip-ca-unwatch": "Ikkaten daytoy a panid manipud iti listan ti bambantayam",
        "tooltip-search": "Agbiruk iti {{SITENAME}}",
        "tooltip-search-go": "Inka idiay panid nga adda kastoy a naganna no adda",
-       "tooltip-search-fulltext": "Biruken dagiti panid para iti daytoy a testo",
+       "tooltip-search-fulltext": "Agbiruk kadagiti panid para iti daytoy a teksto",
        "tooltip-p-logo": "Sarungkaran ti umuna a panid",
        "tooltip-n-mainpage": "Sarungkaran ti umuna a panid",
        "tooltip-n-mainpage-description": "Sarungkaran ti umuna a panid",
        "creditspage": "Dagiti pammadayaw ti panid",
        "nocredits": "Awan dagiti pakaammo ti pammadayaw a magun-od para iti daytoy a panid.",
        "spamprotectiontitle": "Panagsalaknib a sagat para iti spam",
-       "spamprotectiontext": "Ti testo a kayatmo nga idulin ket sinerraan babaen ti sagat ti spam.\nDaytoy ket mabalin a gapuanan babaen ti silpo a naiparit ti akin ruar a sitio.",
-       "spamprotectionmatch": "Ti sumaganad a testo ket isu ti nangkalbit ti sagat ti spam: $1",
+       "spamprotectiontext": "Ti teksto a kayatmo nga idulin ket sinerraan babaen ti sagat ti spam.\nDaytoy ket mabalin a gapuanan babaen ti silpo a naiparit ti akinruar a sitio.",
+       "spamprotectionmatch": "Ti sumaganad a teksto ket isu ti nangkalbit ti sagat ti spam: $1",
        "spambot_username": "Panagdalus iti spam ti MediaWiki",
        "spam_reverting": "Ipasubli ti naudi a rebision nga awan dagiti linaon a silpo iti $1",
        "spam_blanking": "Amin dagiti rebision ket aglaon kadagiti silpo iti $1, iblanko",
        "newimages-showbots": "Ipakita dagiti naikarga babaen dagiti bot",
        "newimages-hidepatrolled": "Ilemmeng dagiti panangikarga a napatruliaan",
        "noimages": "Awan ti makita.",
-       "ilsubmit": "Biruken",
+       "ilsubmit": "Agbiruk",
        "bydate": "babaen ti petsa",
        "sp-newimages-showfrom": "Iparang dagiti baro a papeles a mangrugi manipud idi $2, $1",
        "seconds": "{{PLURAL:$1|$1 a segundo|$1 a segsegundo}}",
        "confirmemail_needlogin": "Masapulmo ti $1 tapno mapasingkedan ti esurat a pagtaengam.",
        "confirmemail_success": "Napasingkedanen ti esurat a pagtaengam.\nMabalinmo tattan ti [[Special:UserLogin|sumrek]] ken nanamen ti wiki.",
        "confirmemail_loggedin": "Napasingkedanen ti esurat a pagtaengam.",
-       "confirmemail_subject": "Pammasingked ti esurat a pagtaengan ti {{SITENAME}}",
-       "confirmemail_body": "Addaan, baka sika, ti naggapu ti IP a pagtaengan $1,\nket nagrehistro ti pakabilangan \"$2\" iti daytoy nga esurat a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan a daytoy a pakabilangan ket kukuam ken ti \npinagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surotem daytoy a panilpo\nta pasardengem ti pinakasingkedan ti esurat a  pagtaengam:\n\n$5\n\nDaytoy a pammasingked a kodigo ket agpaso iti $4.",
-       "confirmemail_body_changed": "Addaan, baka sika, ti naggapu ti IP a pagtaengam $1,\nket nangsukat ti esurat a pagtaengan ti pakabilangan \"$2\" iti daytoy a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket kukuam ken ti \npanagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surutem daytoy a panilpo\nta pasardengem ti pinakasingkedan ti esurat a pagtaengam:\n\n$5\n\nDaytoy a kodigo a pasingkedan ket agpaso iti $4.",
-       "confirmemail_body_set": "Addaan, baka sika met laeng, manipud ti IP a pagtaengan ti $1,\nket nangikabil ti esurat a pagtaengan ti pakabilangan ti \"$2\" iti daytoy a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket agpayso a kukuam ken \npakabaelan dagiti esurat a langa idiay {{SITENAME}}, lukatam daytoy a silpo idiay pabasabasam:\n\n$3\n\nNo daytoy a pakabilangan ket *saanmo* a kukua, surutem daytoy a silpo\ntapno ukasen ti panagpasingked ti esurat a pagtaengan:\n\n$5\n\nDaytoy a panagpasingked ti kodigo ket agpaso intono $4.",
+       "confirmemail_subject": "Pammasingked ti adres ti esurat ti {{SITENAME}}",
+       "confirmemail_body": "Addaan, baka sika, ti naggapu ti adres ti IP ti $1,\nket nagrehistro ti pakabilangan \"$2\" iti daytoy nga adres ti esurat iti {{SITENAME}}\n\nTapno mapasingkedan a daytoy a pakabilangan ket kukuam ken ti \npinagpabalin ti esurat a kita iti {{SITENAME}}, lukatam daytoy a silpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surotem daytoy a silpo\nta pasardengem ti panagpasingked ti adres ti esuratmo:\n\n$5\n\nDaytoy a kodigo ti pammasingked ket agpaso intono $4.",
+       "confirmemail_body_changed": "Addaan, baka sika, ti naggapu ti adres ti IP ti $1,\nket nangsukat ti adres ti esurat ti pakabilangan \"$2\" iti daytoy ngaadres iti {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket kukuam ken ti \npanagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surutem daytoy a silpo\nta pasardengem ti panagpasingked ti adres ti esuratmo:\n\n$5\n\nDaytoy a kodigo a pammasingked ket agpaso intono $4.",
+       "confirmemail_body_set": "Addaan, baka sika met laeng, manipud iti adres ti IP ti $1,\nket nangikabil ti adres ti esurat ti pakabilangan ti \"$2\" iti daytoy nga adres iti {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket agpayso a kukuam ken \npakabaelan dagiti esurat a langa iti {{SITENAME}}, lukatam daytoy a silpo iti pabasabasam:\n\n$3\n\nNo daytoy a pakabilangan ket *saanmo* a kukua, surutem daytoy a silpo\ntapno ukasen ti panagpasingked ti adres ti esurat:\n\n$5\n\nDaytoy a panagpasingked ti kodigo ket agpaso intono $4.",
        "confirmemail_invalidated": "Naukas ti pammasingked ti esurat a pagtaengam",
        "invalidateemail": "Ukasen ti pammasingked ti esurat",
        "notificationemail_subject_changed": "Nabaliwanen ti nairehistro nga adres ti esurat ti {{SITENAME}}",
        "confirm-watch-button": "Sige",
        "confirm-watch-top": "Inayon daytoy a panid iti listaan ti bambantayam?",
        "confirm-unwatch-button": "Sige",
-       "confirm-unwatch-top": "Ikkatem daytoy a panid manipud ti listaan ti bambantayam?",
+       "confirm-unwatch-top": "Ikkatem daytoy a panid manipud iti listaan ti bambantayam?",
        "confirm-rollback-button": "Sige",
        "confirm-rollback-top": "Isubli dagiti panagurnos iti daytoy a panid?",
        "quotation-marks": "\"$1\"",
        "lag-warn-normal": "Dagiti panangbalbaliw a nabarbaro ngem $1 {{PLURAL:$1|a segundo|a segsegundo}} ket mabalin a saan a maiparang iti daytoy a listaan.",
        "lag-warn-high": "Gapu ti kinabuntog ti database server, dagiti nasukatan a barbaro ngem $1 {{PLURAL:$1|a segundo|a segegundo}} ket mabalin a saan nga agparang iti daytoy a listaan.",
        "watchlistedit-normal-title": "Urnosen ti listaan ti bambantayan",
-       "watchlistedit-normal-legend": "Ikkaten dagiti titulo manipud ti listaan ti bambantayam",
+       "watchlistedit-normal-legend": "Ikkaten dagiti titulo manipud iti listaan ti bambantayam",
        "watchlistedit-normal-explain": "Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba.\nTi mangikkat ti titulo, ikur-it ti kaaripingna a kahon, ken pinduten ti \"{{int:Watchlistedit-normal-submit}}\".\nMabalinmo pay nga [[Special:EditWatchlist/raw|urnosen ti naata a listaan]].",
        "watchlistedit-normal-submit": "Ikkaten dagiti titulo",
-       "watchlistedit-normal-done": "{{PLURAL:$1|1 ti titulo|$1 dagiti titulo}} a naikkat manipud ti listaan ti bambantayam:",
+       "watchlistedit-normal-done": "{{PLURAL:$1|Ti bugbugtong a titulo|Dagiti $1 a titulo}} ket naikkat manipud iti listaan ti bambantayam:",
        "watchlistedit-raw-title": "Urnosen ti naata a listaan ti bambantayan",
        "watchlistedit-raw-legend": "Urnosen ti naata a listaan ti bambantayan",
        "watchlistedit-raw-explain": "Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba, ken mabaliwam nga urnosen babaen ti panagnayon ken panagkissay manipud ti listaan;\nmaysa a titulo tunggal maysa a linia.\nNo malpaska, pinduten ti \"{{int:Watchlistedit-raw-submit}}\".\nMabalinmo pay nga [[Special:EditWatchlist|usaren ti pagalagadan nga editor]].",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 a titulo|$1 kadagiti titulo}} ti naikkat:",
        "watchlistedit-clear-title": "Dalusan ti listaan ti bambantayan",
        "watchlistedit-clear-legend": "Dalusan ti listaan ti bambantayan",
-       "watchlistedit-clear-explain": "Amin dagiti titulo ket maikkatto manipud ti listaan ti bambantayam",
+       "watchlistedit-clear-explain": "Amin dagiti titulo ket maikkatto manipud iti listaan ti bambantayam",
        "watchlistedit-clear-titles": "Dagiti titulo:",
        "watchlistedit-clear-submit": "Dalusan ti listaan ti bambantayan (Daytoy ket permanente!)",
        "watchlistedit-clear-done": "Nadalusanen ti bambantayam.",
        "version-poweredby-others": "dadduma pay",
        "version-poweredby-translators": "dagiti agipatpatarus iti translatewiki.net",
        "version-credits-summary": "Kayatmi koma a pammadayawan dagiti sumaganad a tao para kadagiti kontribusonda iti [[Special:Version|MediaWiki]].",
-       "version-license-info": "Ti MediaWiki ket nawaya a sopwer; mabalinmo nga iwaras ken/wenno baliwan babaen kadagiti termino ti GNU General Public License a naipablaak babaen ti Free Software Foundation; wenno bersion 2 iti Lisensia, wenno (ti panagpilim) ti  aniaman a naudi a bersion.\n\nTi MediaWiki ket naiwarwaras iti namnama a makatulongto, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANNAKAILAKO wenno KALAINGANNA ITI DAYTOY A PANGGEP. Kitaen ti GNU General Public License para kadagiti adu pay a salaysay.\n\nNaka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU General Public License] a nairaman iti daytoy a programa; no saan, agsuratka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem iti online].",
+       "version-license-info": "Ti MediaWiki ket nawaya a sopwer; mabalinmo nga iwaras ken/wenno baliwan babaen kadagiti termino ti GNU General Public License a naipablaak babaen ti Free Software Foundation; wenno bersion 2 iti Lisensia, wenno (ti panagpilim) ti  ania man a naudi a bersion.\n\nTi MediaWiki ket naiwarwaras iti namnama a makatulongto, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANNAKAILAKO wenno KALAINGANNA ITI DAYTOY A PANGGEP. Kitaen ti GNU General Public License para kadagiti adu pay a salaysay.\n\nNaka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU General Public License] a nairaman iti daytoy a programa; no saan, agsuratka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem iti online].",
        "version-software": "Naisaad a sopwer",
        "version-software-product": "Produkto",
        "version-software-version": "Bersion",
        "fileduplicatesearch": "Agbiruk kadagiti duplikado a papeles",
        "fileduplicatesearch-summary": "Agbiruk kadagiti duplikado a papeles a naibatay kadagiti pateg ti hash.",
        "fileduplicatesearch-filename": "Nagan ti papeles:",
-       "fileduplicatesearch-submit": "Biruken",
+       "fileduplicatesearch-submit": "Agbiruk",
        "fileduplicatesearch-info": "$1 × $2 a piksel<br />Rukod ti papeles: $3<br />Kita ti MIME: $4",
        "fileduplicatesearch-result-1": "Awan ti kapadpadana a duplikado ti papeles ti \"$1\".",
        "fileduplicatesearch-result-n": "Ti papeles ti \"$1\" ket addaan {{PLURAL:$2|iti 1 nga agpadpada a duplikado|kadagiti $2 nga agpadpada a duplikado}}.",
        "tags-create-warnings-above": "Nakasarak {{PLURAL:$2|iti sumaganad a ballaag|kadagiti sumaganad a ballaag}} idi nagpadas a nagpartuat iti etiketa ti \"$1\":",
        "tags-create-warnings-below": "Kayatmo kadi ti agtuloy nga agpartuat iti etiketa?",
        "tags-delete-title": "Ikkaten ti etiketa",
-       "tags-delete-explanation-initial": "Ik-ikkatemon ti etiketa ti \"$1\" manipud ti database.",
+       "tags-delete-explanation-initial": "Ik-ikkatemon ti etiketa ti \"$1\" manipud iti database.",
        "tags-delete-explanation-in-use": "Daytoy ket maikkatto manipud {{PLURAL:$2|kadagiti $2 a rebision wenno naikabil iti listaan|kadagiti amin a $2 a rebision/wenno naikabil iti listaan}} iti agdama  a nakaipakatanna.",
        "tags-delete-explanation-warning": "Daytoy nga aksion ket <strong>saan a maipasubli</strong> ken <strong>saan a mabalin nga ibabawi</strong>, urayno babaen dagiti administradore ti database. Siguraduem a daytoy ti etiketa a kayatmo nga ikkaten.",
        "tags-delete-explanation-active": "<strong>Aktibo pay laeng ti etiketa ti \"$1\", ken agtuloy a maipakat iti masakbayan.</strong> Tapno mangpasardeng daytoy a mapasamak, mapan iti lugar wenno luglugar nga ayan a pakaipakatanto ti etiketa, ken ibaldado idiay.",
        "feedback-bugornote": "No sisasagakan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi nga [$1 ireporta ti parikut].\nNupay kasta, mausarmo ti nalaka a porma dita baba. Ti komentario nga itedmo ket mainayon iti panid \"[$3 $2], a mairaman ti naganmo nga agar-aramat ken no ania ti pagbasabasa nga us-sarem.",
        "feedback-cancel": "Ukasen",
        "feedback-close": "Nalpasen",
-       "feedback-error1": "Biddut: Saan a malasin dagiti nagbanagan manipud ti API",
+       "feedback-error1": "Biddut: Saan a malasin dagiti nagbanagan manipud iti API",
        "feedback-error2": "Biddut: Napaay ti panagurnos",
-       "feedback-error3": "Biddut: Awan ti sungbat manipud ti API",
+       "feedback-error3": "Biddut: Awan ti sungbat manipud iti API",
        "feedback-error4": "Biddut:Saan a naipablak iti naited a titulo ti feedback",
        "feedback-message": "Mensahe:",
        "feedback-subject": "Suheto:",
        "restrictionsfield-badip": "Imbalido nga adres ti IP wenno sakup: $1",
        "restrictionsfield-label": "Dagiti mapalubosan a sakup ti IP:",
        "revid": "rebision $1",
-       "pageid": "ID ti panid $1"
+       "pageid": "ID ti panid $1",
+       "gotointerwiki": "Pumanpanaw iti {{SITENAME}}"
 }
index d2487dd..652f82e 100644 (file)
        "undeleteviewlink": "skoða",
        "undeleteinvert": "Snúa vali við",
        "undeletecomment": "Ástæða:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|breyting endurvakin|breytingar endurvaktar}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|breyting|breytingar}} og $2 {{PLURAL:$2|skrá|skrár}} endurvaktar",
-       "undeletedfiles": "$1 {{PLURAL:$1|skrá endurvakin|skrár endurvaktar}}",
        "cannotundelete": "Afturköllun eyðingar mistókst að hluta eða í heild: \n$1",
        "undeletedpage": "'''$1 var endurvakin'''\n\nSkoðaðu [[Special:Log/delete|eyðingaskrána]] til að skoða eyðingar og endurvakningar.",
        "undelete-header": "Sjá [[Special:Log/delete|eyðingarskrá]] fyrir síður sem nýlega hefur verið eytt.",
index f834a5b..128586b 100644 (file)
                        "Tosky",
                        "Selven",
                        "Margherita.mignanelli",
-                       "Redredsonia"
+                       "Redredsonia",
+                       "Luigi.delia"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "undeleteviewlink": "visualizza",
        "undeleteinvert": "Inverti selezione",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "{{PLURAL:$1|Una versione recuperata|$1 versioni recuperate}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Una versione|$1 versioni}} e $2 file recuperati",
-       "undeletedfiles": "{{PLURAL:$1|Un file recuperato|$1 file recuperati}}",
        "cannotundelete": "Alcuni o tutti i ripristini non riusciti:\n$1",
        "undeletedpage": "'''La pagina $1 è stata recuperata'''\n\nConsulta il [[Special:Log/delete|registro delle cancellazioni]] per vedere le cancellazioni e i recuperi più recenti.",
        "undelete-header": "Consulta il [[Special:Log/delete|registro delle cancellazioni]] per vedere le cancellazioni più recenti.",
        "htmlform-user-not-exists": "<strong>$1</strong> non esiste.",
        "htmlform-user-not-valid": "<strong>$1</strong> non è un nome utente valido.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ha cancellato}} la pagina $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|ha ripristinato}} la pagina \"$3\"",
+       "logentry-delete-restore": "$1 {{GENDER:$2|ha ripristinato}} la pagina $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|ha ripristinato}} la pagina $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 versione|$1 versioni}}",
+       "restore-count-files": "{{PLURAL:$1|1 file|$1 file}}",
        "logentry-delete-event": "$1 {{GENDER:$2|ha modificato}} la visibilità di {{PLURAL:$5|un'azione del registro|$5 azioni del registro}} di \"$3\": $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ha modificato}} la visibilità per {{PLURAL:$5|una versione|$5 versioni}} della pagina $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ha modificato}} la visibilità di alcune azioni del registro di $3",
        "restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "versione $1",
        "pageid": "ID della pagina $1",
-       "rawhtml-notallowed": "I tag &lt;html&gt; non possono essere utilizzati al di fuori delle normali pagine."
+       "rawhtml-notallowed": "I tag &lt;html&gt; non possono essere utilizzati al di fuori delle normali pagine.",
+       "gotointerwiki-invalid": "Il titolo specificato non è valido."
 }
index 5e3cb72..1e8ee00 100644 (file)
        "undeleteviewlink": "閲覧",
        "undeleteinvert": "選択を反転",
        "undeletecomment": "理由:",
-       "undeletedrevisions": "{{PLURAL:$1|$1版}}を復元しました",
-       "undeletedrevisions-files": "{{PLURAL:$1|$1版}}と{{PLURAL:$2|$2ファイル}}を復元しました",
-       "undeletedfiles": "{{PLURAL:$1|$1ファイル}}を復元しました",
        "cannotundelete": "復元に一部またはすべて失敗しました:\n$1",
        "undeletedpage": "<strong>$1 を復元しました。</strong>\n\n最近の削除と復元は[[Special:Log/delete|削除記録]]で参照できます。",
        "undelete-header": "最近削除されたページは[[Special:Log/delete|削除記録]]で確認できます。",
index e1472af..be38848 100644 (file)
        "accmailtitle": "Tembung sandi wis kinirim",
        "accmailtext": "Tembung sandi sembarang kanggo [[User talk:$1|$1]] wis dikirim menyang $2.\n\nTembung sandi iki bisa diganti ing kaca <em>[[Special:ChangePassword|salin tembung sandi]]</em> sawisé mlebu log.",
        "newarticle": "(Anyar)",
-       "newarticletext": "Katonané panjenengan ngetutaké pranala artikel sing durung ana.\nManawa kersa manulis artikel iki, manggaa. (Mangga mirsani [$1 Pitulung] kanggo informasi sabanjuré).\nYèn ora sengaja tekan kéné, bisa ngeklik pencètan '''back''' waé ing panjlajah wèb panjenengan.",
+       "newarticletext": "Panjenengan ngetuti pranala sing durung ana.\nKanggo nggawé kaca, gagéa ngetik ing kothak ngisor iki (deleng [$1 kaca pitulung] ngenani katerangané).\nManawa panjenengan tekan kéné awit ora sengaja, kliken tumbul <strong>balik</strong> ana ing pangluruné panjenengan.",
        "anontalkpagetext": "---- ''Iki yaiku kaca dhiskusi sawijining panganggo anonim sing durung kagungan akun utawa ora nganggo akuné, dadi kita keeksa kudu nganggo alamat IP-né kanggo nepangi. Alamat IP kaya mengkéné iki bisa dienggo déning panganggo sing séjé-séjé. Yèn panjenengan pancèn panganggo anonim lan olèh komentar-komentar miring, mangga [[Special:CreateAccount|nggawé akun]] utawa [[Special:UserLogin|log mlebu]] supaya ora rancu karo panganggo anonim liyané ing mangsa ngarep.''",
        "noarticletext": "Kala saiki kaca iki durung ana tulisané.\nSampéyan bisa [[Special:Search/{{PAGENAME}}|nggolèki sesirahing kaca iki]] sajeroning kaca liya,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nggolèki log sing magepokan],\nutawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} nggawé kaca iki]</span>.",
        "noarticletext-nopermission": "Saiki ora ana tèks ing kaca iki. \nSampéyan bisa [[Special:Search/{{PAGENAME}}|nggolèki judhul kaca iki]] nèng kaca liya, \nutawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|kaca={{urlencode:{{FULLPAGENAME}}}}}} nggolèki log sing kaitan]</span>, nanging Sampéyan ora nduwèni idin nggawé kaca iki.",
        "undeleteviewlink": "pirsani",
        "undeleteinvert": "Walik pilihan",
        "undeletecomment": "Alesan:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|révisi|révisi}} wis dibalèkaké",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|révisi|révisi}} lan $2 berkas dibalèkaké",
-       "undeletedfiles": "$1 {{PLURAL:$1|berkas|berkas}} dibalèkaké",
        "cannotundelete": "Olèhé mbatalaké pambusakan gagal;\n$1",
        "undeletedpage": "'''$1 bisa dibalèkaké'''\n\nDelengen [[Special:Log/delete|log pambusakan]] kanggo data pambusakan lan pambalèkan.",
        "undelete-header": "Mangga mirsani [[Special:Log/delete|log pambusakan]] kanggo daftar kaca sing lagi waé dibusak.",
index 3f7fd96..97b3e87 100644 (file)
        "savearticle": "გვერდის შენახვა",
        "savechanges": "ცვლილებების შენახვა",
        "publishpage": "გვერდის გამოქვეყნება",
-       "publishchanges": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\92á\83\90á\83\9bá\83\9dá\83¥á\83\95á\83\94á\83§á\83\9cá\83\94á\83\91ა",
+       "publishchanges": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83\9cá\83\90á\83®á\83\95ა",
        "preview": "წინასწარი გადახედვა",
        "showpreview": "წინასწარი გადახედვის ჩვენება",
        "showdiff": "ცვლილებების ჩვენება",
        "undeleteviewlink": "იხილე",
        "undeleteinvert": "გააუქმეთ გამოყოფა",
        "undeletecomment": "მიზეზი:",
-       "undeletedrevisions": "$1 ვერსია აღდგენილია",
-       "undeletedrevisions-files": "$1 ვერსია და $2 ფაილი აღდგენილია",
-       "undeletedfiles": "$1 ფაილი აღდგენილია",
        "cannotundelete": "ზოგიერთი ან ყველა წაშლის გაუქმება ვერ განხორციელდა:\n$1",
        "undeletedpage": "'''$1 აღდგენილია'''\n\nუკანასკნელი წაშლილთა და აღდგენის სია შეგიძლიათ ნახოთ [[Special:Log/delete|წაშლილთა სიაში]].",
        "undelete-header": "ბოლოს წაშლილი გვერდების სიის ნახვა შეიძლება [[Special:Log/delete|წაშლათა ჟურნალში]].",
index 7cfa046..96e8396 100644 (file)
        "undeleteviewlink": "មើល",
        "undeleteinvert": "ក្រៅពីនោះ",
        "undeletecomment": "មូលហេតុ៖",
-       "undeletedrevisions": "បានស្តារឡើងវិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}",
-       "undeletedrevisions-files": "បានស្តារឡើងវិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}និង{{PLURAL:$2|១ឯកសារ|$2ឯកសារ}}",
-       "undeletedfiles": "{{PLURAL:$1|១ ឯកសារ|$1 ឯកសារ}} ត្រូវបានស្ដារឡើងវិញ",
        "cannotundelete": "ឈប់លុបមិនសម្រេច៖​$1",
        "undeletedpage": "'''$1 ត្រូវបានស្តារឡើងវិញហើយ'''\n\nសូម​ចូល​ទៅ [[Special:Log/delete|កំណត់ហេតុ​នៃ​ការលុប]] ដើម្បី​ពិនិត្យ​មើល​កំណត់ត្រា​នៃ​ការលុប​និង​ការ​ស្ដារ​ឡើង​វិញ​។",
        "undelete-header": "មើលទំព័រដែលត្រូវបានលុបចោលថ្មីៗក្នុង[[Special:Log/delete|កំណត់ហេតុនៃការលុបចោល]]។",
index 7fd7712..8d1450a 100644 (file)
        "php-uploaddisabledtext": "PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.",
        "uploadscripted": "이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.",
        "upload-scripted-pi-callback": "XML 스타일시트 처리 명령을 포함하는 파일은 업로드할 수 없습니다.",
+       "upload-scripted-dtd": "비표준 DTD 선언이 포함된 SVG 파일을 업로드할 수 없습니다.",
        "uploaded-script-svg": "업로드된 SVG 파일에서 스크립트로 만들 수 있는 \"$1\" 요소를 발견했습니다.",
        "uploaded-hostile-svg": "업로드된 SVG 파일의 스타일 요소에 안전하지 않은 CSS가 있습니다.",
        "uploaded-event-handler-on-svg": "이벤트 핸들러 속성 <code>$1=\"$2\"</code> 설정은 SVG 파일에서 사용할 수 없습니다.",
        "undeleteviewlink": "보기",
        "undeleteinvert": "선택 반전",
        "undeletecomment": "이유:",
-       "undeletedrevisions": "{{PLURAL:$1|판 1개|판 $1개}}를 되살렸습니다",
-       "undeletedrevisions-files": "{{PLURAL:$1|판 1개|판 $1개}}와 {{PLURAL:$2|파일 1개|파일 $2개}}를 되살렸습니다",
-       "undeletedfiles": "{{PLURAL:$1|파일 1개|파일 $1개}}를 되살렸습니다",
        "cannotundelete": "일부 또는 모든 항목의 되살리기를 실패했습니다:\n$1",
        "undeletedpage": "<strong>$1 문서를 되살렸습니다.</strong>\n\n[[Special:Log/delete|삭제 기록]]에서 최근의 삭제 및 되살리기 기록을 볼 수 있습니다.",
        "undelete-header": "최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.",
        "htmlform-user-not-valid": "<strong>$1</strong>은 올바른 사용자 이름이 아닙니다.",
        "logentry-delete-delete": "$1님이 $3 문서를 {{GENDER:$2|삭제했습니다}}",
        "logentry-delete-delete_redir": "$1님이 덮어쓰기를 통해 $3 문서를 {{GENDER:$2|삭제했습니다}}",
-       "logentry-delete-restore": "$1님이 $3 문서를 {{GENDER:$2|되살렸습니다}}",
+       "logentry-delete-restore": "$1님이 $3 문서를 {{GENDER:$2|되살렸습니다}} ($4)",
+       "logentry-delete-restore-nocount": "$1님이 $3 문서를 {{GENDER:$2|되살렸습니다}}",
+       "restore-count-revisions": "{{PLURAL:$1|1개의 판|$1개의 판}}",
+       "restore-count-files": "{{PLURAL:$1|1개의 파일|$1개의 파일}}",
        "logentry-delete-event": "$1님이 $3의 {{PLURAL:$1|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
        "logentry-delete-revision": "$1님이 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
        "logentry-delete-event-legacy": "$1님이 $3 문서 기록의 보이기 설정을 {{GENDER:$2|바꾸었습니다}}",
        "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "$1 판",
        "pageid": "페이지 ID $1",
-       "gotointerwiki-invalid": "지정된 제목이 올바르지 않습니다."
+       "gotointerwiki": "{{SITENAME}}을(를) 떠납니다",
+       "gotointerwiki-invalid": "지정된 제목이 올바르지 않습니다.",
+       "gotointerwiki-external": "별개의 웹사이트인 [[$2]]의 방문을 위해 {{SITENAME}}을(를) 떠나려고 합니다.\n\n[$1 $1(으)로 계속 진행하려면 여기를 클릭하십시오].",
+       "undelete-cantedit": "이 문서를 편집할 권한이 없으므로 이 문서를 복구할 수 없습니다.",
+       "undelete-cantcreate": "이 이름으로 된 문서가 없고 이 문서를 만들 권한이 없으므로 이 문서를 복구할 수 없습니다."
 }
index d17b402..266b25b 100644 (file)
        "undeleteviewlink": "weisen",
        "undeleteinvert": "Auswiel ëmdréinen",
        "undeletecomment": "Grond:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|Versioun gouf|$1 Versioune goufe}} restauréiert",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Versioun|$1 Versiounen}} a(n) {{PLURAL:$2|1 Fichier|$2 Fichiere}} goufe restauréiert",
-       "undeletedfiles": "$1 {{PLURAL:$1|Fichier gouf|Fichiere goufe}} restauréiert",
        "cannotundelete": "E puer oder all d'Restauratiounen hunn net funktionéiert:\n$1",
        "undeletedpage": "'''$1''' gouf restauréiert.\n\nAm [[Special:Log/delete|Läsch-Logbuch]] fannt Dir déi geläscht a restauréiert Säiten.",
        "undelete-header": "Kuckt [[Special:Log/delete|Läschlescht]] fir rezent geläscht Säiten.",
        "htmlform-user-not-valid": "<strong>$1</strong> ass kee valabele Benotzernumm.",
        "logentry-delete-delete": "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
        "logentry-delete-delete_redir": "$1 huet d'Viruleedung $3 duerch Iwwerschreiwe {{GENDER:$2|geläscht}}.",
-       "logentry-delete-restore": "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
+       "logentry-delete-restore": "$1 {{GENDER:$2|huet}} d'Säit $3 ($4) restauréiert",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
+       "restore-count-revisions": "{{PLURAL:$1|1 Versioun|$1 Versiounen}}",
+       "restore-count-files": "{{PLURAL: $1|1 Fichier|$1 Fichieren}}",
        "logentry-delete-event": "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 {{GENDER:$2|geännert}}",
        "logentry-delete-revision": "$1 huet d'Visibilitéit {{PLURAL:$5|vun enger Versioun|vu(n) $5 Versiounen}} op der Säit $3:$4 {{GENDER:$2|geännert}}",
        "logentry-delete-event-legacy": "$1 huet d'Visibilitéit vun Elementer am Log op $3 {{GENDER:$2|geännert}}",
        "restrictionsfield-label": "Zougeloossen IP-Beräicher:",
        "revid": "Versioun $1",
        "gotointerwiki": "{{SITENAME}} verloossen",
-       "gotointerwiki-invalid": "De spezifizéierten Titel war net valabel."
+       "gotointerwiki-invalid": "De spezifizéierten Titel war net valabel.",
+       "undelete-cantedit": "Dir kënnt dës Säit net restauréiere well Dir dës Säit net änneren däerft.",
+       "undelete-cantcreate": "Dir kënnt dës Säit net restauréieren well et elo keng Säit mat deem Numm gëtt a well Dir dës Säit net uleeën däerft."
 }
index d8b344d..08bff71 100644 (file)
        "undeleteviewlink": "žiūrėti",
        "undeleteinvert": "Žymėti priešingai",
        "undeletecomment": "Priežastis:",
-       "undeletedrevisions": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}} ir $2 {{PLURAL:$2|failas|failai|failų}}",
-       "undeletedfiles": "{{PLURAL:$1|atkurtas $1 failas|atkurti $1 failai|atkurta $1 failų}}",
        "cannotundelete": "Visi arba kai kurie atkūrimai nepavyko:\n$1",
        "undeletedpage": "'''$1 buvo atkurtas'''\n\nPeržiūrėkite [[Special:Log/delete|trynimų sąrašą]], norėdami rasti paskutinių trynimų ir atkūrimų sąrašą.",
        "undelete-header": "Kad sužinotumėte, kurie puslapiai paskiausiai ištrinti, žiūrėkite [[Special:Log/delete|šalinimų sąrašą]].",
        "newimages-summary": "Šis specialus puslapis rodo paskiausiai įkeltus failus.",
        "newimages-legend": "Filtras",
        "newimages-label": "Failo vardas (ar jo dalis):",
+       "newimages-user": "IP adresas ar vartotojo vardas",
        "newimages-showbots": "Rodyti robotų atliktus įkėlimus",
        "newimages-hidepatrolled": "Paslėpti patruliuotus įkeltus failus",
        "noimages": "Nėra ką parodyti.",
        "htmlform-user-not-valid": "<strong>$1</strong> nėra tinkamas naudotojo vardas.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ištrynė}} puslapį $3",
        "logentry-delete-delete_redir": "$1 pervadindamas {{GENDER:$2|ištrynė}} buvusį nukreipimą $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|atkūrė}} puslapį $3",
+       "logentry-delete-restore": "$1 atkūrė puslapį $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 atkūrė puslapį $3",
+       "restore-count-files": "{{PLURAL:$1|1 failas|$1 failai}}",
        "logentry-delete-event": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|žurnalo įvykio|$5 žurnalo įvykių}} $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|versijos|$5 versijų}} puslapyje $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|pakeitė}} matomumą žurnalo renginiams $3",
        "unlinkaccounts": "Atsieti paskyras",
        "unlinkaccounts-success": "Paskyra buvo atsieta.",
        "revid": "apžvalga $1",
-       "pageid": "puslapio ID $1"
+       "pageid": "puslapio ID $1",
+       "rawhtml-notallowed": "&lt;html&gt; negali būti naudojamos ne normaliuose puslapiuose.",
+       "gotointerwiki": "Išeinama iš {{SITENAME}}",
+       "gotointerwiki-invalid": "Nurodytas pavadinimas negalimas."
 }
index 0556f4b..31b5304 100644 (file)
        "undeleteviewlink": "hijery",
        "undeleteinvert": "Hampifamaidika ny safidy",
        "undeletecomment": "Antony :",
-       "undeletedrevisions": "voaverina ny {{PLURAL:$1|fanovana|fanovana}} $1",
-       "undeletedfiles": "rakitra voaverina $1 {{PLURAL:$1}}",
        "cannotundelete": "Tsy nandeha soa aman-tsara ilay famerenana ;\nefa nisy mpikambana iray hafa angamba no namerina ilay pejy.",
        "undeletedpage": "'''Voaverina ny pejy $1.'''\n\nVakio ny [[Special:Log/delete|laogim-pamafana]] ho an'ny lisitry ny famafana sy ny famerenana pejy.",
        "undelete-header": "Jereo ny [[Special:Log/delete|laogim-pamafana]] rehefa hanalisitra ny pejy vao voafafa.",
index 8cfb664..c6bb80a 100644 (file)
        "rcfilters-hideminor-conflicts-typeofchange": "Извезни видови промени не можат да се означат како „ситни“, па затоа овој филтер е во спротиставеност со следниве филтри за видови промени: $1",
        "rcfilters-typeofchange-conflicts-hideminor": "Овој филтер за видови промени е во спротиставеност со филтерот „Ситни уредувања“. Извсни видови промени не можат да се означат како „ситни“.",
        "rcnotefrom": "Подолу {{PLURAL:$5|е прикажана промената|се прикажани промените}} почнувајќи од <strong>$3, $4</strong>  (се прикажуваат до <b>$1</b>).",
+       "rclistfromreset": "Нов избор на датуми",
        "rclistfrom": "Прикажи нови промени почнувајќи од $3 $2",
        "rcshowhideminor": "$1 ситни промени",
        "rcshowhideminor-show": "Прикажи",
        "php-uploaddisabledtext": "Подигањето на податотеки е оневозможено во PHP. \nПроверете го нагодувањето file_uploads.",
        "uploadscripted": "Податотеката содржи HTML-код или сценарио што може погрешно да се протолкува во прелистувачот.",
        "upload-scripted-pi-callback": "Не можам да подигнам податотека што содржи напатствие за обработка на XML-стилска страница.",
+       "upload-scripted-dtd": "Не можам да подигнам SVG-податотеки што содржат нестандардна DTD-изјава.",
        "uploaded-script-svg": "Пронајдов скриптен елемент „$1“ во подигнатата SVG-податотека.",
        "uploaded-hostile-svg": "Пронајдов небезбеден CSS во стилскиот елемент на подигнатата SVG-податотека.",
        "uploaded-event-handler-on-svg": "Задавањето на атрибути <code>$1=\"$2\"</code> за работа со настани не е дозволено за SVG-податотеки.",
        "undeleteviewlink": "преглед",
        "undeleteinvert": "Обратен избор",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "{{PLURAL:$1|1 измена е обновена|$1 измени се обновени}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 измена|$1 измени}} и {{PLURAL:$2|1 податотека|$2 податотеки}} се вратени",
-       "undeletedfiles": "{{PLURAL:$1|1 податотека е вратена|$1 податотеки се вратени}}",
        "cannotundelete": "Враќањето не успеа делумно или целосно:\n$1",
        "undeletedpage": "'''$1 беше обновена'''\n\nПогледнете го [[Special:Log/delete|дневникот на бришења]] за попис на претходни бришења и обновувања.",
        "undelete-header": "Списокот на неодамна избришани страници ќе го најдете на [[Special:Log/delete|дневникот на бришења]].",
        "htmlform-user-not-valid": "<strong>$1</strong> не претставува важечко корисничко име.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ја избриша}} страницата $3",
        "logentry-delete-delete_redir": "$1 го {{GENDER:$2|избриша}} пренасочувањето $3 со презапишување",
-       "logentry-delete-restore": "$1 {{GENDER:$2|ја возобнови}} страницата $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|ја возобнови}} страницата $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|ја поврати}} страницата $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 преработка|$1 преработки}}",
+       "restore-count-files": "{{PLURAL:$1|1 податотека|$1 податотеки}}",
        "logentry-delete-event": "$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|преработка|$5 преработки}} на страницата $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ја измени}} видливоста на настаните во дневникот на $3",
        "restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
        "revid": "преработка $1",
        "pageid": "назнака на страницата $1",
-       "rawhtml-notallowed": "&lt;html&gt;-ознаките не може да се користат вон нормалните страници."
+       "rawhtml-notallowed": "&lt;html&gt;-ознаките не може да се користат вон нормалните страници.",
+       "gotointerwiki": "Го напуштате {{SITENAME}}",
+       "gotointerwiki-invalid": "Укажаниот наслов беше неважечки.",
+       "gotointerwiki-external": "Го напуштате {{SITENAME}} упатени кон [[$2]], кое е посебно мрежно место.\n\n[$1 Тука продолжете кон $1].",
+       "undelete-cantedit": "Не можете да ја вратите избришаната страница бидејќи уредувањето на страницава не ви е дозволено.",
+       "undelete-cantcreate": "Не можете да ја вратите страницава бидејќи не постои страница со таков назив и не ви е дозволено да ја создадете."
 }
index 0f14682..f386599 100644 (file)
        "undeleteviewlink": "papar",
        "undeleteinvert": "Kecualikan pilihan",
        "undeletecomment": "Sebab:",
-       "undeletedrevisions": "$1 semakan dipulihkan",
-       "undeletedrevisions-files": "$1 semakan dan $2 fail dipulihkan",
-       "undeletedfiles": "$1 fail dipulihkan",
        "cannotundelete": "Penyahhapusan gagal: $1",
        "undeletedpage": "'''$1 telah dipulihkan'''\n\nSila rujuk [[Special:Log/delete|log penghapusan]] untuk rekod penghapusan terkini.",
        "undelete-header": "Lihat [[Special:Log/delete|log penghapusan]] untuk laman-laman yang baru dihapuskan.",
index 2797753..39bacff 100644 (file)
        "undeleteviewlink": "ကြည့်ရန်",
        "undeleteinvert": "ရွေးချယ်ထားခြင်းကို ပြောင်းပြန်လှန်ရန်",
        "undeletecomment": "အ​ကြောင်း​ပြ​ချက် -",
-       "undeletedrevisions": "{{PLURAL:$1|မူတစ်ခု|မူ $1 ခု}} ကိုပြန်လည် ထိန်းသိမ်းပြီး",
        "undelete-search-box": "ဖျက်ပစ်သည့် စာမျက်နှာများမှ ရှာရန်",
        "undelete-search-submit": "ရှာဖွေရန်",
        "undelete-show-file-submit": "မှန်",
index b27371f..46ecd0e 100644 (file)
        "saveusergroups": "Lagre {{GENDER:$1|brukergrupper}}",
        "userrights-groupsmember": "Medlem av:",
        "userrights-groupsmember-auto": "Implisitt medlem av:",
-       "userrights-groups-help": "Du kan endre hvilke grupper denne brukeren er medlem av.\n* En avkrysset boks betyr at brukeren er medlem av gruppen.\n* En uavkrysset boks betyr at brukeren ikke er medlem av gruppen.\n* En * betyr at du ikke kan fjerne gruppemedlemskapet når du har lagt det til, eller vice versa.\n* En # betyr at du kun kan forkorte utløpstiden til denne gruppen, du kan ikke forlenge den.",
+       "userrights-groups-help": "Du kan endre hvilke grupper denne brukeren er medlem av.\n* En avkrysset boks betyr at brukeren er medlem av gruppen.\n* En uavkrysset boks betyr at brukeren ikke er medlem av gruppen.\n* En * betyr at du ikke kan fjerne gruppemedlemskapet når du har lagt det til, eller vice versa.\n* En # betyr at du kun kan forkorte utløpstiden til dette gruppemedlemskapet, du kan ikke forlenge den.",
        "userrights-reason": "Årsak:",
        "userrights-no-interwiki": "Du har ikke tillatelse til å endre brukerrettigheter på andre wikier.",
        "userrights-nodatabase": "Databasen $1 finnes ikke, eller er ikke lokal.",
        "userrights-expiry-options": "1 dag:1 day,1 uke:1 week,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year",
        "userrights-invalid-expiry": "Utløpstiden for gruppa «$1» er ugyldig.",
        "userrights-expiry-in-past": "Utløpstiden for gruppa «$1» har vært.",
-       "userrights-cannot-shorten-expiry": "Du kan ikke forlenge utløpstiden til gruppa «$1». Bare brukere med tillatelse til å legge til eller fjerne denne gruppa kan forlenge utløpstider.",
+       "userrights-cannot-shorten-expiry": "Du kan ikke forlenge utløpstiden til gruppemedlemskapet i «$1». Bare brukere med tillatelse til å legge til eller fjerne denne gruppa kan forlenge utløpstider.",
        "userrights-conflict": "En konflikt med endringen av brukerrettigheter! Vær vennlig å sjekke og på nytt bekrefte endringene dine.",
        "group": "Gruppe:",
        "group-user": "Brukere",
        "rcfilters-hideminor-conflicts-typeofchange": "Visse endringstyper kan ikke merkes som «mindre», så dette filteret konflikterer med følgende endringstypefiltre: $1",
        "rcfilters-typeofchange-conflicts-hideminor": "Dette endringstypefilteret konflikterer med filteret for «Mindre endringer». Visse endringstyper kan ikke merkes som «mindre».",
        "rcnotefrom": "Nedenfor er vist {{PLURAL:$5|endringen|endringene}} som er gjort siden <strong>$3, $4</strong> (frem til <strong>$1</strong>).",
+       "rclistfromreset": "Nullstill datovalg",
        "rclistfrom": "Vis nye endringer fra og med $3 $2",
        "rcshowhideminor": "$1 mindre endringer",
        "rcshowhideminor-show": "Vis",
        "php-uploaddisabledtext": "PHP-filopplasting er deaktivert. Sjekk innstillingen for file_uploads.",
        "uploadscripted": "Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.",
        "upload-scripted-pi-callback": "Det er ikke tillatt å laste opp en fil som inneholder et kjørbart XML-stilark.",
+       "upload-scripted-dtd": "Kan ikke laste opp SVG-filer som har en ikke-standard DTD-erklæring.",
        "uploaded-script-svg": "Fant et skriptelement \"$1\" i den opplastede SVG-koden.",
        "uploaded-hostile-svg": "Fant usikker CSS i stilelementet til opplastet SVG-fil",
        "uploaded-event-handler-on-svg": "Å sette event-handler-attributtene <code>$1=\"$2\"</code> tillates ikke i SVG-filer.",
        "undeleteviewlink": "vis",
        "undeleteinvert": "Inverter valg",
        "undeletecomment": "Årsak:",
-       "undeletedrevisions": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} gjenopprettet",
-       "undeletedrevisions-files": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} og {{PLURAL:$2|én fil|$2 filer}} gjenopprettet",
-       "undeletedfiles": "{{PLURAL:$1|Én fil|$1 filer}} gjenopprettet",
        "cannotundelete": "Deler av eller hele gjennopprettingen feilet:\n$1",
        "undeletedpage": "'''$1 ble gjenopprettet'''\n\nSjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger og gjenopprettelser.",
        "undelete-header": "Se [[Special:Log/delete|slettingsloggen]] for nylig slettede sider.",
        "htmlform-user-not-valid": "<strong>$1</strong> er ikke et gyldig brukernavn.",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettet}} siden $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|slettet}} omdirigeringen $3 ved å overskrive",
-       "logentry-delete-restore": "$1 {{GENDER:$2|gjenopprettet}} siden $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|gjenopprettet}} siden $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|gjenopprettet}} siden $3",
+       "restore-count-revisions": "{{PLURAL:$1|Én revisjon|$1 revisjoner}}",
+       "restore-count-files": "{{PLURAL:$1|Én fil|$1 filer}}",
        "logentry-delete-event": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|endret}} synligheten av logghendelser på $3",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laotisk",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Kanadisk stavelsesskrift",
        "special-characters-title-endash": "tankestrek",
        "special-characters-title-emdash": "lang tankestrek",
        "special-characters-title-minus": "minustegn",
        "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk: <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisjon $1",
        "pageid": "side-ID $1",
-       "rawhtml-notallowed": "&lt;html&gt;-tagger kan ikke brukes utenfor normale sider."
+       "rawhtml-notallowed": "&lt;html&gt;-tagger kan ikke brukes utenfor normale sider.",
+       "gotointerwiki": "Forlater {{SITENAME}}",
+       "gotointerwiki-invalid": "Den gitte tittelen var ugyldig.",
+       "gotointerwiki-external": "Du er i ferd med å forlate {{SITENAME}} for å besøke [[$2]], som er et annet nettsted.\n\n[$1 Klikk her for å fortsette til $1].",
+       "undelete-cantedit": "Du kan ikke gjenopprette denne siden fordi du ikke har tillatelse til å redigere den.",
+       "undelete-cantcreate": "Du kan ikke gjenopprette denne siden fordi det ikke er noen eksisterende side med dette navnet, og du ikke har tillatelse til å opprette siden."
 }
index 00cf703..7f7b847 100644 (file)
        "undeleteviewlink": "bekijken",
        "undeleteinvert": "Selectie omkeren",
        "undeletecomment": "Reden:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|versie|versies}} teruggeplaatst",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestand|$2 bestanden}} teruggeplaatst",
-       "undeletedfiles": "{{PLURAL:$1|1 bestand|$1 bestanden}} teruggeplaatst",
        "cannotundelete": "Het terugplaatsen is (gedeeltelijk) mislukt:\n$1",
        "undeletedpage": "'''$1 is teruggeplaatst'''\n\nIn het [[Special:Log/delete|verwijderingslogboek]] staan recente verwijderingen en herstelhandelingen.",
        "undelete-header": "Zie het [[Special:Log/delete|verwijderingslogboek]] voor recent verwijderde pagina's.",
        "htmlform-user-not-valid": "<strong>$1</strong> is geen geldige gebruikersnaam.",
        "logentry-delete-delete": "$1 {{GENDER:$2|heeft}} de pagina $3 verwijderd",
        "logentry-delete-delete_redir": "$1 heeft de doorverwijzing $3 {{GENDER:$2|verwijderd}} door deze te overschrijven",
-       "logentry-delete-restore": "$1 {{GENDER:$2|heeft}} de pagina $3 teruggeplaatst",
+       "logentry-delete-restore": "$1 {{GENDER:$2|heeft}} de pagina $3 ($4) teruggeplaatst",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|heeft}} de pagina $3 teruggeplaatst",
+       "restore-count-revisions": "{{PLURAL:$1|1 versie|$1 versies}}",
+       "restore-count-files": "{{PLURAL:$1|1 bestand|$1 bestanden}}",
        "logentry-delete-event": "$1 {{GENDER:$2|heeft}} de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|heeft}} de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|heeft}} de zichtbaarheid van logboekregels van $3 gewijzigd",
index 4e9ef18..5efeb94 100644 (file)
        "undeleteviewlink": "ଦେଖଣା",
        "undeleteinvert": "ବଛାଯାଇଥିବା ଲେଖାକୁ ଓଲଟେଇଦେବେ",
        "undeletecomment": "କାରଣ:",
-       "undeletedrevisions": "{{PLURAL:$1|ଗୋଟିଏ ସଂକଳନ|$1 ଗୋଟି ସଂକଳନ}} ପୁନସ୍ଥାପନ କରାଗଲା",
-       "undeletedrevisions-files": "{{PLURAL:$1|ଗୋଟିଏ ସଂସ୍କରଣ|$1 ଗୋଟି ସଂସ୍କରଣ}} ଓ {{PLURAL:$2|ଗୋଟିଏ ଫାଇଲ|$2 ଗୋଟି ଫାଇଲ}} ପୁନସ୍ଥାପନ କରାଗଲା",
-       "undeletedfiles": "{{PLURAL:$1|ଗୋଟିଏ ଫାଇଲ|$1 ଗୋଟି ଫାଇଲ}} ପୁନସ୍ଥାପନ କରାଗଲା",
        "cannotundelete": "ଲିଭାଇବାରୁ ରୋକିବା ବିଫଳ ହେଲା;\n$1",
        "undeletedpage": "'''$1ର ପୁନସ୍ଥାପନ କରାଗଲା'''\n\nନଗଦ ଲିଭାଇବା ଓ ପୁନସ୍ଥାପନ ପାଇଁ [[Special:Log/delete|ଲିଭାଇବା ଇତିହାସ]] ଦେଖନ୍ତୁ ।",
        "undelete-header": "ନଗଦ ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାସବୁ ପାଇଁ [[Special:Log/delete|ଲିଭାଇବା ଇତିହାସ]] ଦେଖନ୍ତୁ ।",
index 767d3ef..1659f65 100644 (file)
@@ -86,7 +86,8 @@
                        "Sethakill",
                        "Mateon1",
                        "Jdx",
-                       "Kirsan"
+                       "Kirsan",
+                       "Krottyianock"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "rcfilters-hideminor-conflicts-typeofchange": "Niektóre rodzaje zmian nie mogą być uznawane za „drobne”, dlatego ten filtr koliduje z następującymi filtrami Rodzaju zmian: $1",
        "rcfilters-typeofchange-conflicts-hideminor": "Ten filtr Rodzaju zmian koliduje z filtrem „Drobne zmiany”. Nie wszystkie zmiany mogą być uznawane za „drobne”.",
        "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} {{PLURAL:$5|wykonaną|wykonane}} po <strong>$3, $4</strong> (nie więcej niż '''$1''' pozycji).",
+       "rclistfromreset": "Zresetuj wybór danych",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "rcshowhideminor": "$1 drobne edycje",
        "rcshowhideminor-show": "Pokaż",
        "php-uploaddisabledtext": "Przesyłanie plików PHP zostało zablokowane. Sprawdź ustawienie „file_uploads”.",
        "uploadscripted": "Plik zawiera kod HTML lub skrypt, który może zostać błędnie zinterpretowany przez przeglądarkę internetową.",
        "upload-scripted-pi-callback": "Nie można przesłać pliku, zawierającego instrukcję obsługi arkusza stylów XML.",
+       "upload-scripted-dtd": "Nie można przesyłać plików SVG zawierających niestandardową deklarację DTD.",
        "uploaded-script-svg": "Znaleziono element skryptowy „$1” we przesyłanym pliku SVG.",
        "uploaded-hostile-svg": "Znaleziono niebezpieczny kod CSS w przesyłanym pliku SVG.",
        "uploaded-event-handler-on-svg": "Ustawianie atrybutów obsługi zdarzeń <code>$1=\"$2\"</code> jest niedozwolone w plikach SVG.",
        "undeleteviewlink": "pokaż",
        "undeleteinvert": "Odwróć zaznaczenie",
        "undeletecomment": "Powód:",
-       "undeletedrevisions": "odtworzono {{PLURAL:$1|1 wersję|$1 wersje|$1 wersji}}",
-       "undeletedrevisions-files": "odtworzono $1 {{PLURAL:$1|wersję|wersje|wersji}} i $2 {{PLURAL:$2|plik|pliki|plików}}",
-       "undeletedfiles": "odtworzył $1 {{PLURAL:$1|plik|pliki|plików}}",
        "cannotundelete": "Niektóre lub wszystkie odtworzenia nie powiodły się:\n$1",
        "undeletedpage": "'''Odtworzono stronę $1.'''\n\nZobacz [[Special:Log/delete|rejestr usunięć]], jeśli chcesz przejrzeć ostatnie operacje usuwania i odtwarzania stron.",
        "undelete-header": "Zobacz [[Special:Log/delete|rejestr usunięć]], aby sprawdzić ostatnio usunięte strony.",
        "logentry-delete-delete": "$1 {{GENDER:$2|usunął|usunęła}} stronę $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|usunął|usunęła}} przekierowanie $3 poprzez nadpisanie",
        "logentry-delete-restore": "$1 {{GENDER:$2|odtworzył|odtworzyła}} stronę $3",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|odtworzył|odtworzyła}} stronę $3",
+       "restore-count-revisions": "odtworzono {{PLURAL:$1|1 wersja|$1 wersji}}",
+       "restore-count-files": "{{PLURAL: $1|1 Plik|$1 plików}}",
        "logentry-delete-event": "$1 {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w rejestrze $3, wykonano następujące operacje: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|zmienił|zmieniła}} widoczność zdarzeń w rejestrze strony $3",
        "special-characters-group-thai": "Tajskie",
        "special-characters-group-lao": "Laotańskie",
        "special-characters-group-khmer": "Khmerskie",
+       "special-characters-group-canadianaboriginal": "Kanadyjski Aborygen",
        "special-characters-title-endash": "półpauza",
        "special-characters-title-emdash": "pauza",
        "special-characters-title-minus": "minus",
        "log-action-filter-suppress-reblock": "Ukrycie użytkownika poprzez ponowną blokadę",
        "log-action-filter-upload-upload": "Nowe przesłane",
        "log-action-filter-upload-overwrite": "Przesłane ponownie",
+       "authmanager-authn-no-primary": "Podane dane nie mogą być użyte do kontroli poświadczeń.",
+       "authmanager-authn-no-local-user": "Żaden użytkownik nie korzysta z tych danych.",
        "authmanager-authn-autocreate-failed": "Automatyczne tworzenie lokalnego konta nie powiodło się: $1",
        "authmanager-create-disabled": "Utworzenie konta jest wyłączone.",
        "authmanager-create-from-login": "Aby utworzyć konto, wypełnij odpowiednie pola.",
        "restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "wersja $1",
        "pageid": "ID strony: $1",
-       "rawhtml-notallowed": "Znaczniki &lt;html&gt; nie mogą być stosowane poza zwykłymi stronami."
+       "rawhtml-notallowed": "Znaczniki &lt;html&gt; nie mogą być stosowane poza zwykłymi stronami.",
+       "gotointerwiki": "Opuszczasz {{SITENAME}}",
+       "gotointerwiki-invalid": "Podany tytuł jest nieprawidłowy.",
+       "gotointerwiki-external": "Zamierzasz przejść z witryny {{SITENAME}} do innej witryny:\n [[$2]].\n\n[$1 Kliknij, aby przejść do: $1]."
 }
index 035d1ae..5f0d19d 100644 (file)
                        "Joao Xavier",
                        "Nahime2015",
                        "Alex Great",
-                       "EVinente"
+                       "EVinente",
+                       "Felipe L. Ewald"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "post-expand-template-argument-warning": "Aviso: Esta página contém pelo menos um argumento de predefinição com um tamanho muito grande.\nEstes argumentos foram omitidos.",
        "post-expand-template-argument-category": "Páginas com argumentos de predefinições descartados",
        "parser-template-loop-warning": "Ciclo de predefinições detectado: [[$1]]",
+       "template-loop-category": "Páginas com loops de predefinição",
+       "template-loop-category-desc": "A página contém um loop de predefinição, ou seja, uma predefinição que se chama recursivamente.",
        "parser-template-recursion-depth-warning": "O limite de profundidade de recursividade de predefinição foi ultrapassado ($1)",
        "language-converter-depth-warning": "O limite de profundidade do conversor de línguas excedeu a ($1)",
        "node-count-exceeded-category": "Páginas em que o total de nós é excedido",
        "rcfilters-invalid-filter": "Filtro inválido",
        "rcfilters-empty-filter": "Nenhum filtro ativo. Todas as contribuições são mostradas.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "O que é isso?",
        "rcfilters-filterlist-feedbacklink": "Forneça feedback sobre os novos filtros (beta)",
        "rcfilters-highlightbutton-title": "Realçar os resultados",
        "rcfilters-highlightmenu-title": "Selecione uma cor",
        "rcfilters-filterlist-noresults": "Nenhum filtro encontrado",
+       "rcfilters-noresults-conflict": "Nenhum resultado encontrado porque os critérios de pesquisa estão em conflito",
        "rcfilters-filtergroup-registration": "Registro de usuário",
        "rcfilters-filter-registered-label": "Registrado",
        "rcfilters-filter-registered-description": "Editores conectados.",
        "undeleteviewlink": "visualizar",
        "undeleteinvert": "Inverter seleção",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|edição restaurada|edições restauradas}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|arquivo restaurado|arquivos restaurados}}",
-       "undeletedfiles": "{{PLURAL:$1|arquivo restaurado|$1 arquivos restaurados}}",
        "cannotundelete": "Algumas ou todas as restaurações falharam:\n$1",
        "undeletedpage": "'''$1 foi restaurada'''\n\nConsulte o [[Special:Log/delete|registro de eliminações]] para um registro das eliminações e restaurações mais recentes.",
        "undelete-header": "Veja o [[Special:Log/delete|registro de deleções]] para as páginas recentemente eliminadas.",
index 3136079..698249a 100644 (file)
        "right-editsemiprotected": "{{doc-right|editsemiprotected}}\nRefers to {{msg-mw|Protect-level-autoconfirmed}}.\n\nSee also:\n* {{msg-mw|Right-editeditorprotected}}\n* {{msg-mw|Right-editextendedsemiprotected}}\n* {{msg-mw|Right-editprotected}}\n* {{msg-mw|Right-editsemiprotected}}",
        "right-editcontentmodel": "{{doc-right|editcontentmodel}}",
        "right-editinterface": "{{doc-right|editinterface}}",
-       "right-editusercssjs": "{{doc-right|editusercssjs}}",
        "right-editusercss": "{{doc-right|editusercss}}\nSee also:\n* {{msg-mw|Right-editmyusercss}}",
        "right-edituserjs": "{{doc-right|edituserjs}}\nSee also:\n* {{msg-mw|Right-editmyuserjs}}",
        "right-editmyusercss": "{{doc-right|editmyusercss}}\nSee also:\n* {{msg-mw|Right-editusercss}}",
        "unblocked-id": "Used in [[Special:Unblock]]. Parameters:\n* $1 - autoblock ID\nSee also:\n* {{msg-mw|Unblocked}}\n* {{msg-mw|Unblocked-range}}",
        "unblocked-ip": "{{doc-important|Do not translate the title \"Special:Contributions\".}}\nParameters:\n* $1 - the IP address that was unblocked\nSee also:\n* {{msg-mw|Unblocked-range}}\n* {{msg-mw|Unblocked-id}}\n*{{msg-mw|Unblocked}}",
        "blocklist": "{{doc-special|BlockList}}",
+       "autoblocklist": "Title of [[Special:AutoblockList]].",
+       "autoblocklist-submit": "Used as Submit button text in the form on [[Special:AutoblockList]].\n\nSee also:\n* {{msg-mw|Ipblocklist-legend}}\n* {{msg-mw|Autoblocklist-submit}}\n{{Identical|Search}}",
+       "autoblocklist-legend": "Used as legend of the form in [[Special:AutoblockList]].\n\nSee also:\n* {{msg-mw|Autoblocklist-legend}}\n* {{msg-mw|Autoblocklist-submit}}",
+       "autoblocklist-localblocks": "[[File:Special AutoBlockList new.png|thumb|Example]]\nUsed on [[Special:AutoblockList]] as header when global autoblocks exists too.",
+       "autoblocklist-empty": "Used in [[Special:AutoblockList]].",
+       "autoblocklist-otherblocks": "[[File:Special AutoBlockList new.png|thumb|Example]]\nUsed on [[Special:AutoblockList]] as header for other blocks, i.e. from GlobalBlocking or TorBlocks.\n\nParameters:\n* $1 - number of blocks",
        "ipblocklist": "Title of [[Special:Ipblocklist]].",
        "ipblocklist-legend": "Used as legend of the form in [[Special:BlockList]].\n\nSee also:\n* {{msg-mw|Ipblocklist-legend}}\n* {{msg-mw|Ipblocklist-submit}}",
        "blocklist-userblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
        "logentry-delete-delete_redir": "{{Logentry|[[Special:Log/delete]]}}",
        "logentry-delete-restore": "{{Logentry|[[Special:Log/delete]]}}\n* $4 - {{msg-mw|restore-count-revisions}} or/and {{msg-mw|restore-count-files}}",
        "logentry-delete-restore-nocount": "{{Logentry|[[Special:Log/delete]]}}",
-       "restore-count-revisions": "Used as parameter in {{msg-mw|logentry-delete-restore}}",
-       "restore-count-files": "Used as parameter in {{msg-mw|logentry-delete-restore}}",
+       "restore-count-revisions": "Used as parameter in {{msg-mw|logentry-delete-restore}}\n{{Identical|Revision}}",
+       "restore-count-files": "Used as parameter in {{msg-mw|logentry-delete-restore}}\n{{Identical|File}}",
        "logentry-delete-event": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - count of affected log events",
        "logentry-delete-revision": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - the number of affected revisions of the page $3",
        "logentry-delete-event-legacy": "{{Logentry|[[Special:Log/delete]]}}",
index f6c2945..e28b723 100644 (file)
        "undeleteviewlink": "qhaway",
        "undeleteinvert": "Akllasqantinta t'ikrachiy",
        "undeletecomment": "Kayrayku:",
-       "undeletedrevisions": "{{PLURAL:$1|Huk paqarichisqa llamk'apusqa|$1 paqarichisqa llamk'apusqakuna}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 llamk'apusqaqa|$1 llamk'apusqakunaqa}} {{PLURAL:$2|1 willañiqipas|$2 willañiqikunapas}} paqarichisqam",
-       "undeletedfiles": "{{PLURAL:$1|1 willañiqiqa|$1 willañiqikunaqa}} paqarichisqam",
        "cannotundelete": "Manam atinichu qullusqata paqarichiyta: $1",
        "undeletedpage": "'''$1 nisqaqa paqarichisqañam'''\n\n[[Special:Log/delete|Qulluy hallch'api]] qhaway ñaqha qullusqakunata paqarichisqakunatapas rikunaykipaq.",
        "undelete-header": "[[Special:Log/delete|Qulluy hallch'apiqa]] qullusqa p'anqakunap sutinkunatam rikunki.",
index 4229092..b5fed9f 100644 (file)
        "botpasswords-label-cancel": "Annulle",
        "botpasswords-label-delete": "Scangìlle",
        "botpasswords-label-resetpassword": "Azzere 'a passuord",
+       "botpasswords-label-grants-column": "Assegnazziune",
        "botpasswords-created-title": "Passuord d'u bot ccrejate",
        "botpasswords-updated-title": "Passuord d'u bot cangiate",
        "botpasswords-deleted-title": "Passuord d'u bot scangellate",
        "passwordreset-emailtext-user": "L'utende $1 sus a {{SITENAME}} ave richieste 'na mail pe arrecurdarse le dettaglie d'u cunde sue pe {{SITENAME}}\n($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}}  'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailelement": "Nome utende: \n$1\n\nPassuord temboranèe: \n$2",
        "passwordreset-emailsentemail": "Ce queste éte 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
+       "passwordreset-nocaller": "'Nu chiamande adda essere mise",
+       "passwordreset-nosuchcaller": "'U chiamande nnon g'esiste: $1",
        "changeemail": "Cange o live 'u 'ndirizze e-mail",
        "changeemail-header": "Comblete stu module pe cangià 'u 'ndirizze email. Ce tu vuè ccu live l'associazione cu ogne indirizze email da 'u cunde tune, lasse 'u 'ndirizze email vacande quanne conferme 'u module.",
        "changeemail-no-info": "Tu a essere collegate pe accedere a sta pàgene direttamende.",
        "undeleteviewlink": "vide",
        "undeleteinvert": "Selezione a smerse",
        "undeletecomment": "Mutive:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revisione|$1 revisiune}} ripristinete",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revisione|$1 revisiune}} e {{PLURAL:$2|1 file|$2 file}} ripristinete",
-       "undeletedfiles": "{{PLURAL:$1|1 file|$1 file}} ripristinete",
        "cannotundelete": "Repristine fallite:\n$1",
        "undeletedpage": "'''$1 ha state repristinate'''\n\nLigge l'[[Special:Log/delete|archivije de le scangellaminde]] pe 'nu report de le urteme scangellaminde e repristinaminde.",
        "undelete-header": "Vide [[Special:Log/delete|l'archivije de le scangellaminde]] pe l'urteme pàggene scangellete.",
        "htmlform-user-not-exists": "<strong>$1</strong> non g'esiste.",
        "htmlform-user-not-valid": "<strong>$1</strong> non g'è 'nu nome utende valide.",
        "logentry-delete-delete": "$1 pàgena {{GENDER:$2|scangellate}} $3",
-       "logentry-delete-restore": "$1 pàgena {{GENDER:$2|repristinate}} $3",
+       "logentry-delete-restore": "$1 pàgena {{GENDER:$2|repristinate}} $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|repristinate}} pàgene $3",
        "logentry-delete-event": "$1 {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|cangiate}} 'a vesibbilità d'u archivije de le fatte sus 'a $3",
        "mw-widgets-dateinput-no-date": "Nisciune date scacchiate",
        "mw-widgets-titleinput-description-new-page": "'a pàgene non g'esiste angore",
        "mw-widgets-titleinput-description-redirect": "redirezionate sus a $1",
-       "randomrootpage": "Pàgene prengepàle a uecchije"
+       "randomrootpage": "Pàgene prengepàle a uecchije",
+       "gotointerwiki": "Ste lasse {{SITENAME}}"
 }
index 9245ee3..aaf4370 100644 (file)
        "tog-watchlisthidebots": "Скрывать правки ботов из списка наблюдения",
        "tog-watchlisthideminor": "Скрывать малые правки из списка наблюдения",
        "tog-watchlisthideliu": "Скрывать правки представившихся участников из списка наблюдения",
-       "tog-watchlistreloadautomatically": "Ð\9fеÑ\80езагÑ\80Ñ\83жать список наблюдения автоматически всякий раз, когда изменяется фильтр (требуется JavaScript)",
+       "tog-watchlistreloadautomatically": "Ð\9eбновлÑ\8fть список наблюдения автоматически всякий раз, когда изменяется фильтр (требуется JavaScript)",
        "tog-watchlisthideanons": "Скрывать правки анонимных участников из списка наблюдения",
        "tog-watchlisthidepatrolled": "Скрывать отпатрулированные правки из списка наблюдения",
        "tog-watchlisthidecategorization": "Скрывать категоризацию страниц",
        "tog-showhiddencats": "Показывать скрытые категории",
        "tog-norollbackdiff": "Не показывать разницу версий после выполнения отката",
        "tog-useeditwarning": "Предупреждать, когда я покидаю страницу с несохранёнными изменениями",
-       "tog-prefershttps": "Всегда использовать защищённое соединение после представления системе",
+       "tog-prefershttps": "Всегда использовать защищённое соединение",
        "underline-always": "Всегда",
        "underline-never": "Никогда",
        "underline-default": "Использовать настройки браузера",
        "category-article-count": "{{PLURAL:$2|1=Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показаны $1 страницы|Показано $1 страниц}} из $2, {{PLURAL:$2|находящейся|находящихся}} в данной категории.}}",
        "category-article-count-limited": "В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц|1=только одна страница}}.",
        "category-file-count": "{{PLURAL:$2|1=Эта категория содержит единственный файл.|{{PLURAL:$1|Показан $1 файл|Показано $1 файла|Показаны $1 файлов}} из $2, {{PLURAL:$2|находящегося|находящихся}} в данной категории.}}",
-       "category-file-count-limited": "В этой категории {{PLURAL:$1|$1 файл|$1 файла|$1 файлов|1=только один файл}}.",
+       "category-file-count-limited": "В этой категории {{PLURAL:$1|1=1 файл|$1 файла|$1 файлов}}.",
        "listingcontinuesabbrev": "(продолжение)",
        "index-category": "Индексируемые страницы",
        "noindex-category": "Неиндексируемые страницы",
        "tagline": "Материал из {{grammar:genitive|{{SITENAME}}}}",
        "help": "Справка",
        "search": "Поиск",
-       "search-ignored-headings": " #<!-- оставьте эту строку как есть --> <pre>\n# Заголовки, которые будут игнорироваться поиском.\n# Изменения вступают в силу, как только страница с заголовком индексируется.\n# Вы можете принудить переиндексировать страницу с помощью нулевой правки.\n# Синтаксис выглядит следующим образом:\n#   * Всё, начинающееся на символ «#» и до конца строки представляет собой комментарий.\n#   * Каждая непустая строка — точное название того, что будет игнорироваться, включая регистр и пр.\nПримечания\nСсылки\nСм. также\n #</pre> <!-- оставьте эту строку как есть -->",
+       "search-ignored-headings": " #<!-- оставьте эту строку как есть --> <pre>\n# Заголовки, которые будут игнорироваться поиском.\n# Изменения вступают в силу после того, как страница с заголовком индексируется.\n# Вы можете принудительно переиндексировать страницу, сделав нулевую правку.\n# Синтаксис выглядит следующим образом:\n#   * Всё, начинающееся на символ «#» и до конца строки представляет собой комментарий.\n#   * Каждая непустая строка — точное название того, что будет игнорироваться, включая регистр и пр.\nПримечания\nСсылки\nСм. также\n #</pre> <!-- оставьте эту строку как есть -->",
        "searchbutton": "Найти",
        "go": "Перейти",
        "searcharticle": "Перейти",
        "delete": "Удалить",
        "deletethispage": "Удалить эту страницу",
        "undeletethispage": "Восстановить эту страницу",
-       "undelete_short": "Восстановить {{PLURAL:$1|$1 правку|$1 правки|$1 правок|1=правку}}",
-       "viewdeleted_short": "Просмотр {{PLURAL:$1|$1 удалённой правки|удалённой правки|$1 удалённых правок}}",
+       "undelete_short": "Восстановить {{PLURAL:$1|1=$1 правку|$1 правки|$1 правок|1=правку}}",
+       "viewdeleted_short": "Просмотр {{PLURAL:$1|1=$1 удалённой правки|удалённой правки|$1 удалённых правок}}",
        "protect": "Защитить",
        "protect_change": "изменить",
        "protectthispage": "Защитить эту страницу",
        "redirectpagesub": "Страница-перенаправление",
        "redirectto": "Перенаправление на:",
        "lastmodifiedat": "Последнее изменение этой страницы: $2, $1.",
-       "viewcount": "К этой странице обращались $1 {{PLURAL:$1|раз|раза|раз}}.",
+       "viewcount": "К этой странице обращались $1 {{PLURAL:$1|1=раз|раза|раз}}.",
        "protectedpage": "Защищённая страница",
        "jumpto": "Перейти к:",
        "jumptonavigation": "навигация",
        "jumptosearch": "поиск",
-       "view-pool-error": "Извините, сейчас серверы перегружены.\nПоступило слишком много запросов на просмотр этой страницы.\nПожалуйста, подождите и повторите попытку обращения к странице позже.\n\n$1",
+       "view-pool-error": "Извините, в настоящий момент серверы перегружены.\nСлишком много пользователей пытаются просмотреть этот ресурс.\nПожалуйста, подождите и повторите попытку обращения к нему позже.\n\n$1",
        "generic-pool-error": "Извините, в настоящий момент серверы перегружены.\nСлишком много пользователей пытаются просмотреть этот ресурс.\nПожалуйста, подождите и повторите попытку обращения к нему позже.",
        "pool-timeout": "Истекло время ожидания блокировки",
        "pool-queuefull": "Накопитель запросов полон",
        "pagetitle": "$1 — {{SITENAME}}",
        "retrievedfrom": "Источник — «$1»",
        "youhavenewmessages": "Вы получили $1 ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|Вы получили}} $1 от {{PLURAL:$3|$3 участника|$3 участников|1=другого участника}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Вы получили}} $1 от {{PLURAL:$3|1=$3 участника|$3 участников|1=другого участника}} ($2).",
        "youhavenewmessagesmanyusers": "Вы получили $1 от множества пользователей ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|новое сообщение|999=новые сообщения}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|последнее изменение|999=последние изменения}}",
+       "newmessageslinkplural": "{{PLURAL:$1|1=новое сообщение|999=новые сообщения}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|1=последнее изменение|999=последние изменения}}",
        "youhavenewmessagesmulti": "Вы получили новые сообщения на $1",
        "editsection": "править",
        "editold": "править",
        "confirmable-no": "Нет",
        "thisisdeleted": "Просмотреть или восстановить $1?",
        "viewdeleted": "Просмотреть $1?",
-       "restorelink": "{{PLURAL:$1|$1 удалённую правку|$1 удалённые правки|$1 удалённых правок|1=удалённую правку}}",
+       "restorelink": "{{PLURAL:$1|1=$1 удалённую правку|$1 удалённые правки|$1 удалённых правок|1=удалённую правку}}",
        "feedlinks": "В виде:",
        "feed-invalid": "Неправильный тип канала для подписки.",
        "feed-unavailable": "Ленты синдикации недоступны",
        "title-invalid-characters": "Запрашиваемое название страницы содержит недопустимые символы: «$1».",
        "title-invalid-relative": "Заголовок имеет относительный путь. Заголовки страниц с относительным путем (/,../) являются недействительными, так как они часто недоступны, когда обрабатываются браузером пользователя.",
        "title-invalid-magic-tilde": "Запрашиваемый заголовок страницы содержит недопустимую последовательность тильды (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "Запрашиваемый заголовок страницы слишком длинен. Он должен быть не более $1 {{PLURAL:$1|байта|байт}} в кодировке UTF-8.",
+       "title-invalid-too-long": "Запрашиваемый заголовок страницы слишком длинен. Он должен быть не более $1 {{PLURAL:$1|1=байта|байт}} в кодировке UTF-8.",
        "title-invalid-leading-colon": "Запрашиваемое название страницы содержит недопустимое двоеточие в начале.",
-       "perfcached": "СледÑ\83Ñ\8eÑ\89ие Ð´Ð°Ð½Ð½Ñ\8bе Ð²Ð·Ñ\8fÑ\82Ñ\8b Ð¸Ð· ÐºÑ\8dÑ\88а Ð¸ Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð½Ðµ Ñ\83Ñ\87иÑ\82Ñ\8bваÑ\82Ñ\8c Ð¿Ð¾Ñ\81ледниÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. Ð\92 ÐºÑ\8dÑ\88е Ñ\85Ñ\80аниÑ\82Ñ\81Ñ\8f Ð½Ðµ Ð±Ð¾Ð»ÐµÐµ $1 {{PLURAL:$1|записи|записей}}.",
-       "perfcachedts": "Следующие данные взяты из кэша, последний раз он обновлялся в $1. В кэше хранится не более $4 {{PLURAL:$4|записи|записей}}.",
+       "perfcached": "Ð\94аннÑ\8bе Ð²Ð·Ñ\8fÑ\82Ñ\8b ÐºÑ\8dÑ\88а; Ð¾Ð½Ð¸ Ð¼Ð¾Ð³Ð»Ð¸ Ñ\83Ñ\81Ñ\82аÑ\80еÑ\82Ñ\8c. Ð\92 ÐºÑ\8dÑ\88е Ñ\85Ñ\80аниÑ\82Ñ\81Ñ\8f Ð½Ðµ Ð±Ð¾Ð»ÐµÐµ $1 {{PLURAL:$1|1=записи|записей}}.",
+       "perfcachedts": "Следующие данные взяты из кэша, последний раз он обновлялся в $1. В кэше хранится не более {{PLURAL:$4|1=$1 записи|$1 записей}}.",
        "querypage-no-updates": "Обновление этой страницы сейчас отключено.\nПредставленные здесь данные не будут обновляться.",
        "viewsource": "Просмотр вики-текста",
        "viewsource-title": "Просмотр исходного текста страницы $1",
        "createacct-continue-submit": "Продолжить создание учётной записи",
        "createacct-another-continue-submit": "Продолжить создание учётной записи",
        "createacct-benefit-heading": "{{SITENAME}} — совместный труд таких же людей, как вы.",
-       "createacct-benefit-body1": "{{PLURAL:$1|правка|правки|правок}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|статья|статьи|статей}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|участник|участника|участников}} за последнее время",
+       "createacct-benefit-body1": "{{PLURAL:$1|1=$1 правка|$1 правки|$1 правок}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|1=$1 статья|$1 статьи|$1 статей}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|1=$1 участник|$1 участника|$1 участников}} за последнее время",
        "badretype": "Введённые вами пароли не совпадают.",
        "usernameinprogress": "Создание учётной записи для данного имени участника уже выполняется.\nПожалуйста, подождите.",
        "userexists": "Введённое имя участника уже используется.\nПожалуйста, выберите другое имя.",
        "login-userblocked": "Участник заблокирован. Вход в систему запрещен.",
        "wrongpassword": "Введённый вами пароль неверен. Попробуйте ещё раз.",
        "wrongpasswordempty": "Пожалуйста, введите непустой пароль.",
-       "passwordtooshort": "Пароль должен состоять не менее чем из $1 {{PLURAL:$1|символа|символов}}.",
-       "passwordtoolong": "Пароль не может превышать {{PLURAL:$1|1 символ|$1 символов|$1 символа}}.",
+       "passwordtooshort": "Пароль должен состоять не менее, чем из $1 {{PLURAL:$1|1=символа|символов}}.",
+       "passwordtoolong": "Пароль не может содержать более {{PLURAL:$1|1=$1 символа|$1 символов}}.",
        "passwordtoopopular": "Часто выбираемые пароли не могут быть использованы. Пожалуйста, выберите более уникальный пароль.",
        "password-name-match": "Введённый пароль должен отличаться от имени участника.",
        "password-login-forbidden": "Использование этого имени участника и пароля запрещено.",
        "mailmypassword": "Сбросить пароль",
        "passwordremindertitle": "Напоминание пароля участника {{grammar:genitive|{{SITENAME}}}}",
-       "passwordremindertext": "Кто-то (вероятно, вы, с IP-адреса $1) запросил создать\nновый пароль для {{grammar:genitive|{{SITENAME}}}} ($4). Для участника $2\nсоздан временный пароль: $3. Если это был ваш запрос,\nвам следует представиться системе и выбрать новый пароль.\nВаш временный пароль будет действовать в течение $5 {{PLURAL:$5|дня|дней}}.\n\nЕсли вы не посылали запроса на смену пароля, или если вы уже вспомнили свой пароль,\nи не желаете его менять, вы можете проигнорировать данное сообщение и\nпродолжить использовать свой старый пароль.",
+       "passwordremindertext": "Кто-то (вероятно, вы, с IP-адреса $1) запросил создать\nновый пароль для {{grammar:genitive|{{SITENAME}}}} ($4). Для участника $2\nсоздан временный пароль: $3. Если это был ваш запрос,\nвам следует представиться системе и выбрать новый пароль.\nВаш временный пароль будет действовать в течение $5 {{PLURAL:$5|1=дня|дней}}.\n\nЕсли вы не посылали запроса на смену пароля, или если вы уже вспомнили свой пароль,\nи не желаете его менять, вы можете проигнорировать данное сообщение и\nпродолжить использовать свой старый пароль.",
        "noemail": "Для участника с именем $1 электронный адрес указан не был.",
        "noemailcreate": "Вам необходимо указать корректный адрес электронной почты",
        "passwordsent": "Новый пароль был выслан на адрес электронной почты, указанный для участника $1.\n\nПожалуйста, представьтесь системе заново после получения пароля.",
        "blocked-mailpassword": "Редактирование с вашего IP-адреса запрещено. Для предотвращения злоупотреблений для этого IP-адреса заблокирована и функция восстановления пароля.",
        "eauthentsent": "На указанный адрес электронной почты отправлено письмо. \nЧтобы получать письма в дальнейшем, следуйте изложенным там инструкциям для подтверждения, что этот адрес действительно принадлежит вам.",
-       "throttled-mailpassword": "Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|1=последнего часа|последних $1 часов}}.\nДля предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания {{PLURAL:$1|за $1 час|за $1 часов|за $1 часа|1=в час}}.",
+       "throttled-mailpassword": "Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|1=последнего часа|последних $1 часов}}.\nДля предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания {{PLURAL:$1|1=за $1 час|за $1 часов|за $1 часа|1=в час}}.",
        "mailerror": "Ошибка при отправке почты: $1",
        "acct_creation_throttle_hit": "Посетители с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись|было создано $1 учётных записей|были созданы $1 учётных записи}} за последние $2 — это предельное количество для данного отрезка времени.\nВ результате, пользователи с этим IP-адресом в данный момент больше не могут создавать новых учётных записей.",
        "emailauthenticated": "Ваш адрес электронной почты подтверждён $2 в $3.",
        "page_first": "первая",
        "page_last": "последняя",
        "histlegend": "Выбор версий: отметьте версии страницы, которые вы хотите сравнить, и нажмите '''{{int:compare-submit}}'''.<br />\nПояснения: '''({{int:cur}})''' — отличия от текущей версии; '''({{int:last}})''' — отличия от предшествующей версии; '''{{int:minoreditletter}}''' — незначительные изменения.",
-       "history-fieldset-title": "Просмотреть историю",
-       "history-show-deleted": "Только удалённые",
+       "history-fieldset-title": "Поиск правок",
+       "history-show-deleted": "Только удалённые правки",
        "histfirst": "старейшие",
        "histlast": "новейшие",
        "historysize": "($1 {{PLURAL:$1|байт|байта|байт}})",
        "recentchanges-legend": "Настройки свежих правок",
        "recentchanges-summary": "Ниже в хронологическом порядке перечислены последние изменения на страницах {{grammar:genitive|{{SITENAME}}}}.",
        "recentchanges-noresult": "Изменений в указанный период, соответствующих указанным условиям, нет.",
-       "recentchanges-feed-description": "Отслеживать в этом потоке последние изменения в вики.",
+       "recentchanges-feed-description": "Отслеживание последних изменений в вики.",
        "recentchanges-label-newpage": "Этой правкой была создана новая страница.",
        "recentchanges-label-minor": "Это незначительное изменение",
        "recentchanges-label-bot": "Эта правка сделана ботом",
        "php-uploaddisabledtext": "Загрузка файлов отключена в настройках PHP. Пожалуйста, проверьте значение свойства file_uploads.",
        "uploadscripted": "Файл содержит HTML-код или скрипт, который может быть ошибочно обработан браузером.",
        "upload-scripted-pi-callback": "Невозможно загрузить файл, содержащий инструкции обработки таблицы стилей XML.",
+       "upload-scripted-dtd": "Невозможно загрузить SVG-файлы, которые содержат нестандартное DTD-объявление.",
        "uploaded-script-svg": "Найден небезопасный элемент с поддержкой сценариев «$1» в загруженном SVG-файле.",
        "uploaded-hostile-svg": "Найден небезопасный CSS-код в элементе стиля загруженного SVG-файла.",
        "uploaded-event-handler-on-svg": "Установка атрибутов обработчика событий <code>$1=\"$2\"</code> не разрешено для SVG-файлов.",
        "listgrants-grant": "Разрешение",
        "listgrants-rights": "Права",
        "trackingcategories": "Отслеживающие категории",
-       "trackingcategories-summary": "Ð\9dа Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¿ÐµÑ\80еÑ\87иÑ\81ленÑ\8b Ð¾Ñ\82Ñ\81леживаÑ\8eÑ\89ие ÐºÐ°Ñ\82егоÑ\80ии, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð·Ð°Ð¿Ð¾Ð»Ð½Ñ\8fÑ\8eÑ\82Ñ\81Ñ\8f Ð¿Ñ\80огÑ\80аммнÑ\8bм Ð¾Ð±ÐµÑ\81пеÑ\87ением MediaWiki. Их можно переименовать, изменив соответствующие системные сообщения в пространстве имён {{ns:8}}.",
-       "trackingcategories-msg": "Отслеживающая категория",
+       "trackingcategories-summary": "Ð\9dа Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¿ÐµÑ\80еÑ\87иÑ\81ленÑ\8b ÐºÐ°Ñ\82егоÑ\80ии, Ð·Ð°Ð¿Ð¾Ð»Ð½Ñ\8fемÑ\8bе Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки. Их можно переименовать, изменив соответствующие системные сообщения в пространстве имён {{ns:8}}.",
+       "trackingcategories-msg": "Отслеживаемая категория",
        "trackingcategories-name": "Имя сообщения",
        "trackingcategories-desc": "Критерий включения в категорию",
        "restricted-displaytitle-ignored": "Страницы с игнорируемыми отображаемыми названиями",
        "undeleteviewlink": "просмотреть",
        "undeleteinvert": "Обратить выделение",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "{{PLURAL:$1|восстановлено|восстановлены}} $1 {{PLURAL:$1|изменение|изменения|изменений}}",
-       "undeletedrevisions-files": "восстановлены $1 {{PLURAL:$1|версия|версии|версий}} и $2 {{PLURAL:$2|файл|файла|файлов}}",
-       "undeletedfiles": "{{PLURAL:$1|восстановлен|восстановлены}} $1 {{PLURAL:$1|файл|файла|файлов}}",
        "cannotundelete": "Некоторые или все ваши восстановления не удались:\n$1",
        "undeletedpage": "'''Страница «$1» была восстановлена.'''\n\nДля просмотра списка последних удалений и восстановлений см. [[Special:Log/delete|журнал удалений]].",
        "undelete-header": "Список недавно удалённых страниц можно посмотреть в [[Special:Log/delete|журнале удалений]].",
        "htmlform-user-not-valid": "<strong>$1</strong> — недопустимое имя учётной записи.",
        "logentry-delete-delete": "$1 {{GENDER:$2|удалил|удалила}} страницу $3",
        "logentry-delete-delete_redir": "$1 удалил{{GENDER:$2||а}} перенаправление $3 с помощью перезаписи",
-       "logentry-delete-restore": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 версия|$1 версии|$1 версий}}",
+       "restore-count-files": "{{PLURAL:$1|1 файл|$1 файла|$1 файлов}}",
        "logentry-delete-event": "$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей|1=записи}} журнала для $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий|1=версии}} страницы $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|изменил|изменила}} видимость записей журнала $3",
        "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "версия $1",
        "pageid": "ID страницы $1",
-       "gotointerwiki-invalid": "Указан некорректный заголовок."
+       "rawhtml-notallowed": "&lt;html&gt; теги могут быть использованы только в пределах обычных страниц.",
+       "gotointerwiki": "Покидаем {{grammar:genitive|{{SITENAME}}}}...",
+       "gotointerwiki-invalid": "Указан некорректный заголовок.",
+       "gotointerwiki-external": "Вы покидаете {{grammar:genitive|{{SITENAME}}}} для посещения сайта [[$2]].\n\n[$1 Нажмите здесь, чтобы перейти на $1].",
+       "undelete-cantedit": "Вы не можете восстановить эту страницу, поскольку у вас недостаточно прав для ее редактирования.",
+       "undelete-cantcreate": "Вы не можете восстановить эту страницу, поскольку она не существует, а у вас недостаточно прав для ее создания."
 }
index 6f59112..33f7fd3 100644 (file)
        "undeleteviewlink": "see",
        "undeleteinvert": "Invert the selection",
        "undeletecomment": "Raison:",
-       "undeletedrevisions": "{{PLURAL:$1|1 reveesion|$1 reveesions}} restored",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 reveesion|$1 reveesions}} n {{PLURAL:$2|1 file|$2 files}} restored",
-       "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
        "cannotundelete": "Ondelyte failed:\n$1",
        "undeletedpage": "<strong>$1 haes been restored</strong>\n\nConsult the [[Special:Log/delete|delytion log]] fer ae record o recynt delytions n restorations.",
        "undelete-header": "See [[Special:Log/delete|the delytion log]] fer the recentlie delytit pages.",
index fde90d4..61c06bd 100644 (file)
        "undeleteviewlink": "ogled",
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|obnovljena $1 redakcija|obnovljeni $1 redakciji|obnovljene $1 redakcije|obnovljenih $1 redakcij}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}} in $2 {{PLURAL:$2|datoteka|datoteki|datoteke|datotek}} {{PLURAL:$1+$2|obnovljena|obnovljeni|obnovljene|obnovljenih}}",
-       "undeletedfiles": "{{PLURAL:$1|obnovljena je $1 datoteka|obnovljeni sta $1 datoteki|obnovljene so $1 datoteke|obnovljenih je $1 datotek}}",
        "cannotundelete": "Nekatere ali vse obnove so spodletele:\n$1",
        "undeletedpage": "'''Obnovili ste stran $1.'''\n\nNedavna brisanja in obnove so zapisani v [[Special:Log/delete|dnevniku brisanja]].",
        "undelete-header": "Glej [[Special:Log/delete|dnevnik brisanja]] za nedavno izbrisane strani.",
        "htmlform-user-not-valid": "<strong>$1</strong> ni veljavno uporabniško ime.",
        "logentry-delete-delete": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} stran $3",
        "logentry-delete-delete_redir": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} preusmeritev $3 s prepisom",
-       "logentry-delete-restore": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3",
+       "logentry-delete-restore": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3",
+       "restore-count-revisions": "$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}}",
+       "restore-count-files": "$1 {{PLURAL:$1|datoteka|datoteki|datoteke|datotek}}",
        "logentry-delete-event": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4",
        "logentry-delete-revision": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost dnevniških dogodkov na $3",
index d89b720..08a1a82 100644 (file)
        "createacct-reason-ph": "Pse ju jeni duke krijuar një llogari tjetër",
        "createacct-submit": "Krijoni llogarinë tuaj",
        "createacct-another-submit": "Krijo një llogari",
+       "createacct-continue-submit": "Vazhdo krijimin e llogarisë",
+       "createacct-another-continue-submit": "Vazhdo krijimin e llogarisë",
        "createacct-benefit-heading": "{{SITENAME}} është bërë nga njerëz si ju.",
        "createacct-benefit-body1": "{{PLURAL:$1|redaktim|redaktime}}",
        "createacct-benefit-body2": "{{PLURAL:$1|faqe|faqe}}",
        "wrongpasswordempty": "Fjalëkalimi juaj ishte bosh. Ju lutemi provoni përsëri.",
        "passwordtooshort": "Fjalëkalimi juaj është i pavlefshëm ose tepër i shkurtër. Ai duhet të ketë së paku {{PLURAL:$1|1 shkronjë|$1 shkronja}} dhe duhet të jetë i ndryshëm nga emri i përdoruesit.",
        "passwordtoolong": "Fjalëkalimet nuk mund të jenë më të gjatë se {{PLURAL:$1|1 karakter|$1 karaktere}}.",
+       "passwordtoopopular": "Fjalëkalimet e zgjedhura rregullisht nuk mund të përdorën. Ju lutemi zgjedhni një fjalëkalim më unik.",
        "password-name-match": "Fjalëkalimi juaj duhet të jetë i ndryshëm nga emri juaj.",
        "password-login-forbidden": "Përdorimi i kësaj nofke dhe fjalëkalimi është i ndaluar.",
        "mailmypassword": "Ridergo fjalekalimin",
        "blockedtitle": "Përdoruesi është bllokuar",
        "blockedtext": "'''Llogaria juaj ose adresa e IP është bllokuar'''\n\nBllokimi u bë nga $1 dhe arsyeja e dhënë ishte '''$2'''.\n\n*Fillimi i bllokimit: $8\n*Skadimi i bllokimit: $6\n*I bllokuari i shënjestruar: $7\n\nMund të kontaktoni $1 ose një nga [[{{MediaWiki:Grouppage-sysop}}|administruesit]] e tjerë për të diskutuar bllokimin.\n\nVini re se nuk mund t'i dërgoni email përdoruesit nëse nuk keni një adresë të saktë të dhënë tek [[Special:Preferences|parapëlqimet e përdoruesit]] ose nëse kjo është një nga mundësitë që ju është bllokuar.\n\nAdresa e IP-së që keni është $3 dhe numri i identifikimit të bllokimit është #$5. Përfshini këto dy të dhëna në çdo ankesë.",
        "autoblockedtext": "IP adresa juaj është bllokuar automatikisht sepse ishte përdorur nga një përdorues tjetër i cili ishte bllokuar nga $1.\nArsyeja e dhënë për këtë është:\n\n:''$2''\n\n* Fillimi i bllokimit: $8\n* Kalimi i kohës së bllokimit: $6\n* Zgjatja e bllokimit: $7\n\nJu mund të kontaktoni $1 ose një tjetër [[{{MediaWiki:Grouppage-sysop}}|administrues]] për ta diskutuar bllokimin.\n\nVini re : që nuk mund ta përdorni mundësinë \"dërgo porosi elektronike\" përveç nëse keni një postë elektronike të vlefshme të regjistruar në [[Special:Preferences|preferencat tuaja]] dhe nuk jeni bllokuar nga përdorimi i saj.\n\nIP adresa juaj e tanishme është $3 dhe ID e bllokimit është #$5.\nJu lutemi përfshini këto detaje në të gjitha kërkesat që i bëni.",
+       "systemblockedtext": "Emri juaj i përdoruesit ose adresa e IP-së janë bllokuar automatikisht nga MediaWiki. \nArsyeja e dhënë është:\n\n:<em>$2</em>\n\n* Fillimi i bllokimit: $8\n* Kalimi i kohës së bllokimit: $6\n* Zgjatja e bllokimit: $7\n\nAdresa juaj e IP-së është $3.\nJu lutemi jepni të gjitha këto detaje në çfarëdo pyetje që bëni.",
        "blockednoreason": "nuk është dhënë asnjë arsye",
        "whitelistedittext": "Ju duhet të $1 për të redaktuar faqet.",
        "confirmedittext": "Ju duhet së pari ta vërtetoni e-mail adresen para se të redaktoni. Ju lutem plotësoni dhe vërtetoni e-mailin tuaj  te [[Special:Preferences|parapëlqimet]] e juaja.",
        "accmailtext": "Një fjalëkalim i krijuar në mënyrë të rastësishme për [[User talk:$1|$1]] u dërgua në $2.\n\nFjalëkalimi për këtë llogari mund të ndryshohet në faqen ''[[Special:ChangePassword|ndrysho fjalëkalimin]]'' pasi të jeni identifikuar.",
        "newarticle": "(I ri)",
        "newarticletext": "Ti ke ndjekur nje lidhje drejt një faqeje që nuk ekziston.\nPër ta krijuar këtë faqe, fillo të shkruash në kutinë e mëposhtme (shih [$1 faqen e ndihmës] për më shumë informacion).\nNëse ti ke mbërritur këtu gabimisht, atëherë kliko butonin '''pas''' të shfletuesit tënd.",
-       "anontalkpagetext": "----'' Kjo është një faqe diskutimi për një përdorues anonim i cili nuk ka krijuar akoma një llogari, ose qe nuk e përdor atë. \n Prandaj, ne duhet të përdorim adresën IP numerike për identifikimin e tij. \nKjo adresë IP mund të përdoret nga disa përdorues.\n Në qoftë se jeni një përdorues anonim dhe mendoni se ndaj jush janë bërë komente të parëndësishme, ju lutem [[Special:CreateAccount|krijoni një llogari]] ose [[Special:UserLogin|identifikohuni]] për të shmangur konfuzionin në të ardhmen me përdorues të tjerë anonim .''",
+       "anontalkpagetext": "----\n<em>Kjo është një faqe diskutimi për një përdorues anonim i cili nuk ka krijuar akoma një llogari, ose qe nuk e përdor atë.</em> \nPrandaj, ne duhet të përdorim adresën IP numerike për identifikimin e tij. \nKjo adresë IP mund të përdoret nga disa përdorues.\nNë qoftë se jeni një përdorues anonim dhe mendoni se ndaj jush janë bërë komente të parëndësishme, ju lutem [[Special:CreateAccount|krijoni një llogari]] ose [[Special:UserLogin|identifikohuni]] për të shmangur konfuzionin në të ardhmen me përdorues të tjerë anonim.",
        "noarticletext": "Momentalisht nuk ka tekst në këtë faqe.\nJu mund [[Special:Search/{{PAGENAME}}|ta kërkoni këtë titull]] në faqe tjera,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} të kërkoni ngjarjet e ngjashme në regjistër],\nose [{{fullurl:{{FULLPAGENAME}}|action=edit}} të krijoni këtë faqe]</span>.",
        "noarticletext-nopermission": "Për momentin faqja e kërkuar është bosh.\nJu mund të [[Special:Search/{{PAGENAME}}|kërkoni këtë titiull]] në faqet e tjera, ose të <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} këtkoni regjistrat e ngjashëm]</span>, por ju nuk mundeni ta krijoni këtë faqe.",
        "missing-revision": "Inspektimi #$1 i faqes me emrin \"{{FULLPAGENAME}}\" nuk ekziston.\n\nKjo zakonisht shkaktuar duke ndjekur një lidhje të vjetër tek një faqe që është fshirë. Hollësitë mund të gjenden në [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} regjistrin e fshirjeve].",
        "grant-editmywatchlist": "Redaktoni listën tuaj mbikqyrëse",
        "grant-editpage": "Redaktoni faqet ekzistuese",
        "grant-editprotected": "Redakto faqet e mbrojtura",
+       "grant-sendemail": "Dërgo e-mail te përdoruesit tjerë",
        "newuserlogpage": "Regjistri i llogarive",
        "newuserlogpagetext": "Ky është një regjistër i llogarive të fundit që janë hapur",
        "rightslog": "Regjistri i privilegjeve të përdoruesit",
        "mailnologin": "S'ka adresë dërgimi",
        "mailnologintext": "Duhet të keni [[Special:UserLogin|hyrë brenda]] dhe të keni një adresë të saktë në [[Special:Preferences|parapëlqimet]] tuaja për tu dërguar email përdoruesve të tjerë.",
        "emailuser": "Email {{GENDER:{{PAGENAME}}|përdoruesit|përdorueses}}",
+       "emailuser-title-target": "Dërgo email te ky përdorues",
        "emailuser-title-notarget": "Email për përdoruesin",
        "emailpagetext": "Mund të përdorni formularin e mëposhtëm për të dërguar e-mail tek ky përdorues.\nAdresa e email-it që shkruat tek [[Special:Preferences|preferencat tuaja]] do të duket si \"Nga\" adresa e email-it, pra marrësi do të ketë mundësinë t'ju përgjigjet direkt.",
        "defemailsubject": "{{SITENAME}} emaili nga përdoruesi \"$1\"",
        "watchlistanontext": "Ju lutemi kyçuni për të parë ose redaktuar njësitë në listën tuaj mbikëqyrëse.",
        "watchnologin": "Nuk keni hyrë brënda",
        "addwatch": "Shto tek lista mbikqyrëse",
-       "addedwatchtext": "Faqja \"[[:$1]]\"  i është shtuar [[Special:Watchlist|listës mbikqyrëse]] tuaj. Ndryshimet e ardhshme të kësaj faqeje dhe faqes së diskutimit të saj do të jepen më poshtë, dhe emri i faqes do të duket i '''trashë''' në [[Special:RecentChanges|listën e ndryshimeve së fundmi]] për t'i dalluar më kollaj.\n\nNë qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, shtypni \"çmbikqyre\" në tabelën e sipërme.",
+       "addedwatchtext": "\"[[:$1]]\"  dhe faqja e saj e diskutimit i është shtuar [[Special:Watchlist|listës tuaj të mbikëqyrjes]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" dhe faqja e saj e ndërlidhur janë shtuar [[Special:Watchlist|listës tuaj të mbikëqyrjes]].",
+       "addedwatchtext-short": "Faqja \"$1\" i është shtuar listës tuaj të mbikëqyrjes.",
        "removewatch": "Largo nga lista mbikqyrëse",
        "removedwatchtext": "\"[[:$1]]\" dhe faqja e saj e diskutimit janë hequr nga [[Special:Watchlist|lista juaj mbikëqyrëse]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" dhe faqja e saj e ndërlidhur janë hequr nga [[Special:Watchlist|lista juaj e mbikëqyrjes]].",
+       "removedwatchtext-short": "Faqja \"$1\" janë hequr nga lista juaj e mbikëqyrjes.",
        "watch": "Mbikqyre",
        "watchthispage": "Mbikqyre këtë faqe",
        "unwatch": "Çmbikqyre",
        "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikëqyrje duke mos numëruar faqet e diskutimit.",
        "wlheader-enotif": "Është aktivizuar njoftimi me email.",
        "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të <strong>trasha<strong>.",
-       "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.",
+       "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë <strong>$1</strong>''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|<strong>$2</strong>''' orët e fundit}}, që nga $3, $4.",
        "wlshowlast": "Trego $1 orët $2 ditët e fundit",
        "watchlist-hide": "Fshih",
        "watchlist-submit": "Shfaq",
+       "wlshowtime": "Periudha e kohës për ta treguar:",
        "wlshowhideminor": "redaktime të vogla",
        "wlshowhidebots": "botët",
        "wlshowhideliu": "përdorues të regjistruar",
        "watcherrortext": "Është paraqitur një gabim përderisa ndryshuat parametrat e listës suaj mbikqyrëse për \"$1\".",
        "enotif_reset": "Shëno të gjitha faqet e vizituara",
        "enotif_impersonal_salutation": "Përdorues i {{SITENAME}}",
+       "enotif_subject_deleted": "{{SITENAME}} faqja $1 është fshirë nga $2",
        "enotif_subject_created": "{{SITENAME}} faqja $1 është {{GJINIA:$2|krijuar}} nga $2",
+       "enotif_subject_moved": "{{SITENAME}} faqja $1 është lëvizuar nga $2",
+       "enotif_subject_restored": "{{SITENAME}} faqja $1 është rikthyer nga $2",
+       "enotif_subject_changed": "{{SITENAME}} faqja $1 është ndryshuar nga $2",
+       "enotif_body_intro_deleted": "{{SITENAME}} faqja $1 është fshirë në $PAGEEDITDATE nga $2, shiko $3.",
        "enotif_lastvisited": "Shikoni $1 për të gjitha ndryshimet që prej vizitës tuaj të fundit.",
        "enotif_lastdiff": "Shikoni $1 për ndryshime.",
        "enotif_anon_editor": "përdorues anonim $1",
        "undeleteviewlink": "Pamje",
        "undeleteinvert": "Selektim anasjelltas",
        "undeletecomment": "Arsyeja:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|version u restaurua|versione u restauruan}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|version|versione}} dhe $2 {{PLURAL:$2|skedë|skeda}} janë restauruar",
-       "undeletedfiles": "$1 {{PLURAL:$1|skedë u restaurua|skeda u restauruan}}",
        "cannotundelete": "Disa ose krejt çfshirjet dështuan:\n$1",
        "undeletedpage": "'''$1 është restauruar'''\n\nShikoni [[Special:Log/delete|regjistrin e grisjeve]] për grisjet dhe restaurimet së fundmi.",
        "undelete-header": "Shikoni [[Special:Log/delete|regjistrin e grisjeve]] për faqet e grisura së fundmi.",
        "sp-contributions-search": "Kërko tek kontributet",
        "sp-contributions-username": "IP Addresa ose Përdoruesi:",
        "sp-contributions-toponly": "Trego vetëm redaktimet që janë versionet më të fundit",
+       "sp-contributions-hideminor": "Fshih redaktimet e vogla",
        "sp-contributions-submit": "Kërko",
        "whatlinkshere": "Lidhjet këtu",
        "whatlinkshere-title": "Faqe që lidhen tek $1",
        "htmlform-submit": "Dërgo",
        "htmlform-reset": "Zhbëj ndryshimin",
        "htmlform-selectorother-other": "Gjitha",
+       "htmlform-date-placeholder": "VVVV-MM-DD",
        "htmlform-time-placeholder": "OO:MM:SS",
        "htmlform-datetime-placeholder": "VVVV-MM-DD OO:MM:SS",
+       "htmlform-title-not-exists": "$1 nuk ekziston.",
+       "htmlform-user-not-exists": "<strong>$1</strong> nuk ekziston.",
        "logentry-delete-delete": "$1 {{GENDER:$2|grisi}} faqen $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|riktheu}} faqen $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|e një ngjarjeje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
        "expand_templates_title": "Titulli i faqes për rrethanën, si {{FULLPAGENAME}} etj.:",
        "expand_templates_input": "Teksti me stampa:",
        "expand_templates_output": "Parapamja",
+       "expand_templates_xml_output": "Rezultat XML",
        "expand_templates_ok": "Shko",
        "expand_templates_remove_comments": "Hiq komentet",
        "expand_templates_preview": "Parapamje",
        "authmanager-realname-help": "Emri i vërtetë i përdoruesit",
        "authmanager-provider-temporarypassword": "Fjalëkalim i përkohshëm",
        "authprovider-resetpass-skip-label": "Kapërce",
+       "changecredentials": "Ndërro kredencialet",
+       "changecredentials-submit": "Ndërro kredencialet",
+       "changecredentials-invalidsubpage": "$1 nuk është tip i vlefshëm i kredencialit.",
+       "changecredentials-success": "Kredencialet tuaja kanë ndryshuar.",
+       "removecredentials": "Hiq kredencialet",
+       "removecredentials-submit": "Hiq kredencialet",
+       "removecredentials-invalidsubpage": "$1 nuk është tip i vlefshëm i kredencialit.",
+       "removecredentials-success": "Kredencialet tuaja kanë ndryshuar.",
+       "credentialsform-provider": "Tipi i kredencialit:",
+       "credentialsform-account": "Emri i llogarisë:",
+       "cannotlink-no-provider-title": "Nuk ka llogari të lidhshme",
+       "cannotlink-no-provider": "Nuk ka llogari të lidhshme.",
+       "linkaccounts": "Lidh llogari",
+       "linkaccounts-success-text": "Llogaria është lidhur.",
+       "linkaccounts-submit": "Lidh llogari",
+       "unlinkaccounts": "Ndaj llogaritë",
+       "unlinkaccounts-success": "Llogaria është ndarë.",
        "restrictionsfield-badip": "Adresë ose varg IP-je e parregulltë: $1",
        "restrictionsfield-label": "Vargu i lejuar i IP-së:",
        "revid": "versioni $1",
index 25d9d7e..9ea137f 100644 (file)
        "recentchanges-summary": "Пратите скорашње измене на овој страници.",
        "recentchanges-noresult": "Нема промена у задатом времену за задате критеријуме.",
        "recentchanges-feed-description": "Пратите скорашње измене уз помоћ овог довода.",
-       "recentchanges-label-newpage": "Ð\9dова страница",
+       "recentchanges-label-newpage": "Ð\9eвом Ð¸Ð·Ð¼ÐµÐ½Ð¾Ð¼ Ð½Ð°Ð¿Ñ\80авÑ\99ена Ñ\98е Ð½ова страница",
        "recentchanges-label-minor": "Ово је мања измена",
        "recentchanges-label-bot": "Ову измену је направио бот",
        "recentchanges-label-unpatrolled": "Ова измена још није патролирана",
        "undeleteviewlink": "погледај",
        "undeleteinvert": "Обрни избор",
        "undeletecomment": "Разлог:",
-       "undeletedrevisions": "{{PLURAL:$1|измена враћено}} $1",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека је враћена|датотеке су враћене|датотека је враћено}}",
-       "undeletedfiles": "{{PLURAL:$1|датотека враћено}} $1",
        "cannotundelete": "Враћање једне или свих ставник није успјело:\n$1",
        "undeletedpage": "<strong>Страница $1 је враћена</strong>\n\nПогледајте [[Special:Log/delete|дневник брисања]] за записе о скорашњим брисањима и враћањима.",
        "undelete-header": "Погледајте [[Special:Log/delete|историјат брисања]] за недавно обрисане странице.",
index 7a2a2f1..141dea8 100644 (file)
        "recentchanges-summary": "Pratite skorašnje izmene na ovoj stranici.",
        "recentchanges-noresult": "Nema promena u zadatom vremenu za zadate kriterijume.",
        "recentchanges-feed-description": "Pratite skorašnje izmene uz pomoć ovog dovoda.",
-       "recentchanges-label-newpage": "Nova stranica",
+       "recentchanges-label-newpage": "Ovom izmenom napravljena je nova izmena",
        "recentchanges-label-minor": "Ovo je manja izmena",
        "recentchanges-label-bot": "Ovu izmenu je napravio bot",
        "recentchanges-label-unpatrolled": "Ova izmena još nije patrolirana",
        "undeleteviewlink": "pogledaj",
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|izmena vraćeno}} $1",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka je vraćena|datoteke su vraćene|datoteka je vraćeno}}",
-       "undeletedfiles": "{{PLURAL:$1|datoteka vraćeno}} $1",
        "cannotundelete": "Vraćanje nije uspelo:\n$1",
        "undeletedpage": "<strong>Stranica $1 je vraćena</strong>\n\nPogledajte [[Special:Log/delete|dnevnik brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
        "undelete-header": "Pogledajte [[Special:Log/delete|istorijat brisanja]] za nedavno obrisane stranice.",
index 62a8466..92c0899 100644 (file)
@@ -16,7 +16,7 @@
                ]
        },
        "tog-underline": "Gurat-handapan tutumbu",
-       "tog-hideminor": "Sumputkeun éditan minor dina nu anyar robah",
+       "tog-hideminor": "Sumputkeun éditan minor dina anyar robah",
        "tog-hidepatrolled": "Sumputkeun anu geus diroris ti béréndélan nu anyar robah",
        "tog-newpageshidepatrolled": "Sumputkeun nu geus diroris tina béréndélan kaca anyar",
        "tog-extendwatchlist": "Legaan béréndélan ngarah sakabéh parobahanana kaawaskeun",
        "tog-prefershttps": "Salawasna paké sambungan aman nalika asup log",
        "underline-always": "Salawasna",
        "underline-never": "Ulah",
-       "underline-default": "Buhunna kulit atawa panyungsi",
-       "editfont-style": "Gaya aksara dina kotak éditan:",
-       "editfont-default": "Luyu jeung buhunna panyungsi",
-       "editfont-monospace": "Aksara monospasi",
+       "underline-default": "Kalakop atawa panyungsi bawaan",
+       "editfont-style": "Gaya tulisan komputer dina kotak éditan:",
+       "editfont-default": "Bawaan panyungsi",
+       "editfont-monospace": "Tulisan monospasi",
        "editfont-sansserif": "Aksara Sans-serif",
        "editfont-serif": "Aksara Serif",
        "sunday": "Minggu",
@@ -69,7 +69,7 @@
        "thursday": "Kemis",
        "friday": "Jumaah",
        "saturday": "Saptu",
-       "sun": "Ming",
+       "sun": "Min",
        "mon": "Sen",
        "tue": "Sal",
        "wed": "Reb",
        "faq": "NLD",
        "faqpage": "Project:NLD",
        "actions": "Peta",
-       "namespaces": "Spasi ngaran",
+       "namespaces": "Ngaranspasi",
        "variants": "Varian",
-       "navigation-heading": "Ménu navigasi",
+       "navigation-heading": "Menu navigasi",
        "errorpagetitle": "Kasalahan",
        "returnto": "Balik deui ka $1.",
        "tagline": "Ti {{SITENAME}}",
        "help": "Pitulung",
        "search": "Paluruh",
-       "searchbutton": "Sungsi",
+       "searchbutton": "Paluruh",
        "go": "Jung",
        "searcharticle": "Jung",
        "history": "Jujutan kaca",
        "history_short": "Jujutan",
+       "history_small": "jujutan",
        "updatedmarker": "dirobah saprak pamungkas datangna kuring",
        "printableversion": "Vérsi citakeun",
        "permalink": "Tutumbu permanén",
        "talk": "Sawala",
        "views": "Témbongan",
        "toolbox": "Parabot",
+       "tool-link-userrights": "Robah kelompok {{GENDER:$1|pamaké}}",
+       "tool-link-userrights-readonly": "Témbong kelompok {{GENDER:$1|pamaké}}",
+       "tool-link-emailuser": "Kirim surélék ka ieu {{GENDER:$1|pamaké}}",
        "userpage": "Témbongkeun kaca pamaké",
        "projectpage": "Témbongkeun kaca proyék",
        "imagepage": "Tempo kaca gambar",
        "protectedpage": "Kaca nu dikonci",
        "jumpto": "Luncat ka:",
        "jumptonavigation": "pituduh",
-       "jumptosearch": "sungsi",
+       "jumptosearch": "paluruh",
        "view-pool-error": "Punten, serverna keur pinuh.\nLoba teuing nu nyoba muka ieu kaca.\nMangga cobian sanés waktos.\n\n$1",
        "generic-pool-error": "Hampura, serverna keur pinuh.\nLoba teuing nu nyoba muka ieu sumberdaya.\nAntosan sakedap, engké cobaan deui.",
        "pool-timeout": "Béakeun waktu nungguan konci",
        "versionrequired": "Butuh MediaWiki vérsi $1",
        "versionrequiredtext": "Butuh MediaWiki vérsi $1 pikeun migunakeun ieu kaca. Mangga tingal [[Special:Version|kaca vérsi]]",
        "ok": "Heug",
-       "retrievedfrom": "Disalin ti \"$1\"",
+       "retrievedfrom": "Dicomot ti \"$1\"",
        "youhavenewmessages": "Anjeun boga $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Anjeun boga}} $1 ti {{PLURAL:$3|pamaké séjén|$3 pamaké}} ($2).",
        "youhavenewmessagesmanyusers": "Anjeun boga $1 ti pamaké lian ($2).",
        "virus-scanfailed": "nyekén gagal (kode $1)",
        "virus-unknownscanner": "antivirus teu dipikawanoh:",
        "logouttext": "<strong>Anjeun ayeuna geus kaluar log.<strong>\n\nMangkahadé, sababaraha kaca bakal tetep némbongkeun saolah-olah asup kénéh log nepi ka anjeun ngosongkeun ''cache'' dina panyungsi.",
+       "cannotlogoutnow-title": "Teu bisa kaluar log ayeuna",
+       "cannotlogoutnow-text": "Kaluar log teu mungkin bisa nalika keur ngagunakeun $1.",
        "welcomeuser": "Bagéa, $1!",
        "welcomecreation-msg": "Akun anjeun geus dijieun.\nLamun minat, Anjeun bisa ngarobah [[Special:Preferences|préferénsi]] {{SITENAME}}.",
        "yourname": "Sandiasma:",
        "createacct-yourpasswordagain-ph": "Asupkeun deui kecap sandi",
        "userlogin-remembermypassword": "Jaga ngarah angger asup log",
        "userlogin-signwithsecure": "Paké sambungan aman",
+       "cannotlogin-title": "Teu bisa asup log",
+       "cannotlogin-text": "Asup log teu mungkin bisa",
+       "cannotloginnow-title": "Teu bisa asup log ayeuna",
+       "cannotloginnow-text": "Kaluar log teu mungkin bisa nalika keur ngagunakeun $1.",
+       "cannotcreateaccount-title": "Teu bisa nyieun akun",
        "yourdomainname": "Domain anjeun",
        "password-change-forbidden": "Anjeun teu bisa ngarobah kecap sandi dina ieu wiki.",
        "externaldberror": "Aya kasalahan dina pangkalan data oténtikasi luar, atawa anjeun mémang teu diwenangkeun pikeun ngaropéa akun luar anjeun.",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Naha bet nyieun akun séjén",
        "createacct-submit": "Jieun akun anjeun",
-       "createacct-another-submit": "Jieun akun séjén",
+       "createacct-another-submit": "Jieun akun",
        "createacct-benefit-heading": "{{SITENAME}} téh dijieun ku jalma-jalma siga anjeun.",
        "createacct-benefit-body1": "{{PLURAL:$1|édit|édit}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca|kaca}}",
        "nocookieslogin": "{{SITENAME}} migunakeun ''cookies'' pikeun ngasupkeun pamaké kana log. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga pungsikeun sarta cobian deui.",
        "nocookiesfornew": "Akun pamaké teu bisa dijieun, kusabab sumberna teu bisa dipastikeun.\nPariksa kukisna bisi tumpur, terus cobaan muat ulang ieu kaca.",
        "noname": "Anjeun teu nuliskeun ngaran pamaké nu sah.",
-       "loginsuccesstitle": "Asup log geus hasil",
+       "loginsuccesstitle": "Geus asup log",
        "loginsuccess": "Anjeun ayeuna geus asup log ka {{SITENAME}} salaku \"$1\".",
-       "nosuchuser": "Euweuh pamaké nu ngaranna \"$1\".\nNgaran pamaké ngabedakeun hurup kapital.\nPariksa éjahanana, atawa paké formulir di handap pikeun [[Special:CreateAccount|nyieun rekening anyar]].",
+       "nosuchuser": "Euweuh pamaké nu ngaranna \"$1\".\nNgaran pamaké ngabedakeun gedé leutikna hurup.\nPariksa éjahanana, atawa [[Special:CreateAccount|nyieun akun anyar]].",
        "nosuchusershort": "Taya pamaké nu ngaranna \"$1\", pariksa éjahanana!",
        "nouserspecified": "Anjeun kudu ngeusian ngaran landihan.",
        "login-userblocked": "Ieu pamaké keur dipeungpeuk, teu diwenangkeun asup log.",
        "noemail": "Teu aya alamat surélék karékam pikeun \"$1\".",
        "noemailcreate": "Anjeun kudu nyadiakeun alamat surélék anu bener",
        "passwordsent": "Sandi anyar geus dikirim ka alamat surélék nu kadaptar pikeun \"$1\". Mangga asup log deui satutasna katarima.",
-       "blocked-mailpassword": "Alamat IP anjeun dipeungpeuk tina kabisa ngédit, sarta moal bisa maké fungsi ganti kecap sandi ngarah hanteu disalahgunakeun.",
+       "blocked-mailpassword": "Alamat IP anjeun dipeungpeuk tina kabisa ngédit. Pikeun nyingkahan panyalahgunaan, Anjeun teu dimeunangkeun pikeun mermanakeun kecap sandi liwat ieu alamat IP.",
        "eauthentsent": "Surélék konfirmasi geus dikirim ka alamat bieu.\nMéméh aya surat séjén asup ka akunna, anjeun kudu nuturkeun pituduh dina surélékna pikeun mastikeun yén akun éta téh bener boga anjeun.",
        "throttled-mailpassword": "Surélék pikeun ngarobah kecap sandi geus dikirim {{PLURAL:$1|jam|$1 jam}} kaliwat.\nNgarah hanteu disalahgunakeun, ngan hiji surélék anu bakal dikirim saban {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Kasalahan ngirim surat: $1",
        "emaildisabled": "Ieu loka teu bisa ngirim surélék.",
        "accountcreated": "Akun geus dijieun",
        "accountcreatedtext": "Akun pamaké [[{{ns:Pamaké}}:$1|$1]] ([[{{ns:Obrolan pamaké}}:$1|obrolan]]) geus dijieun.",
-       "createaccount-title": "Nyieun akun keur {{SITENAME}}",
+       "createaccount-title": "Nyieun akun pikeun {{SITENAME}}",
        "createaccount-text": "Aya nu nyieun akun pikeun alamat surélék anjeun di {{SITENAME}} ($4) maké sandiasma \"$2\" kalawan kecap sandi \"$3\". Anjeun kudu asup log sarta ngaganti kecap sandina.\n\nMun ieu akun dijieun alatan éror, ulah diwaro.",
        "login-throttled": "Anjeun geus loba teuing nyobaan asup log.\nTungguan $1, laju cobaan deui.",
-       "login-abort-generic": "Login gagal - Dibolaykeun",
+       "login-abort-generic": "Asup log anjeun gagal - Dibolaykeun",
        "login-migrated-generic": "Akun anjeun geus pindah, ku kituna sandiasma anjeun geus leungit ti ieu wiki.",
        "loginlanguagelabel": "Basa: $1",
        "suspicious-userlogout": "Pamundut anjeun pikeun kaluar log ditolak ku sabab sigana dikirim ku pangaprak buntu atawa ''cache'' proxi.",
        "createacct-another-realname-tip": "Ngaran asli hanteu diwajibkeun.\nLamun anjeun milih ngeusian, ieu ngaran bakal dipaké pikeun nandaan kontribusi anjeun.",
        "pt-login": "Asup log",
        "pt-login-button": "Asup log",
+       "pt-login-continue-button": "Tuluykeun asup log",
        "pt-createaccount": "Jieun akun",
        "pt-userlogout": "Kaluar log",
        "php-mail-error-unknown": "Kasalahan nu teu kanyahoan dina fungsi PHP surélék().",
        "changepassword": "Robah sandi",
        "resetpass_announce": "Pikeun nganggeuskeun asup log, anjeun kudu nyieun kecap sandi anyar.",
        "resetpass_text": "<!-- Tambahkeun téks di dieu -->",
-       "resetpass_header": "Ganti sandi akun",
+       "resetpass_header": "Robah kecap sandi akun",
        "oldpassword": "Sandi heubeul",
        "newpassword": "Sandi anyar:",
        "retypenew": "Ketik ulang sandi",
        "resetpass_submit": "Setél log asup katut sandina",
        "changepassword-success": "Kecap sandi Anjeun geus laksana dirobah!",
        "changepassword-throttled": "Anjeun geus loba teuing nyobaan asup log.\nTungguan $1 méméh nyobaan deui.",
+       "botpasswords": "Kecap sandi bot",
+       "botpasswords-label-appid": "Ngaran bot:",
+       "botpasswords-label-create": "Jieun",
+       "botpasswords-label-update": "Anyarkeun",
+       "botpasswords-label-cancel": "Bolay",
+       "botpasswords-label-delete": "Pupus",
+       "botpasswords-label-resetpassword": "Balikeun deui kecap sandi",
        "resetpass_forbidden": "Sandi henteu bisa dirobah",
        "resetpass-no-info": "Anjeun kudu asup log pkeun bisa muka ieu kaca sacara langsung.",
-       "resetpass-submit-loggedin": "Ganti kecap sandi akun",
+       "resetpass-submit-loggedin": "Robah kecap sandi",
        "resetpass-submit-cancel": "Bolay",
        "resetpass-wrong-oldpass": "Salah sandi.\nBisa jadi anjeun geus ngaganti sandina atawa ménta sandi saheulaanan anu anyar.",
        "resetpass-recycled": "Mangga ganti kecap sandi anjeun ku nu anyar.",
        "minoredit": "Ieu éditan minor",
        "watchthis": "Awaskeun kaca ieu",
        "savearticle": "Simpen",
+       "savechanges": "Simpen parobahan",
+       "publishpage": "Pedalkeun kaca",
+       "publishchanges": "Pedalkeun parobahan",
        "preview": "Pramidang",
        "showpreview": "Témbongkeun pramidang",
        "showdiff": "Témbongkeun parobahan",
        "missingsummary": "'''Pépéling:''' Anjeun can ngeusian sari éditan. Mun anjeun ngaklik deui Simpen, éditan anjeun bakal disimpen tanpa sari éditan",
        "selfredirect": "<strong>Awas:</strong> Anjeun ngalihkeun ieu kaca ka asalna.\nAnjeun sigana salah ngasupkeun tujul alihan, atawa ngédit kaca anu salah.\nUpama anjeun ngaklik deui \"{{int:savearticle}}\", alihanana bakal angger dijieun.",
        "missingcommenttext": "Mangga tulis koméntar di handapeun ieu.",
-       "missingcommentheader": "'''Pépéling''': Anjeun can ngeusian judul pikeun ieu koméntar.\nMun anjeun ngaklik deui \"{{int:savearticle}}\", éditan anjeun bakal disimpen tanpa koméntar.",
+       "missingcommentheader": "<strong>Pépéling</strong>: Anjeun can ngeusian judul pikeun ieu koméntar.\nMun anjeun ngaklik deui \"{{int:savearticle}}\", éditan anjeun bakal disimpen tanpa koméntar.",
        "summary-preview": "Ringkesan pramidang:",
        "subject-preview": "Sawangan subyek/tajuk:",
        "previewerrortext": "Aya éror nalika nyobaan nyawang robahan anjeun.",
        "right-reupload": "Nimpah koropak nu geus aya",
        "right-reupload-own": "Nimpah koropak nu geus aya nu dimuat ku sorangan",
        "right-reupload-shared": "Nampik gambar-gambar dina média lokal babarengan",
-       "right-upload_by_url": "Muatkeun koropak ti hiji alamat URL",
+       "right-upload_by_url": "Unjal berkas tina alamat URL",
        "right-purge": "Ngahapus sindangan tina kaca tanpa kaca konfirmasi",
        "right-autoconfirmed": "Ngédit kaca nu semi dikonci",
        "right-bot": "Anggap salaku prosés otomatis",
        "action-edit": "édit kaca ieu",
        "action-createpage": "mitembeyan kaca anyar",
        "action-createtalk": "mitembeyan kaca obrolan",
-       "action-createaccount": "nyieun akun pamaké ieu",
+       "action-createaccount": "jieun ieu akun pamaké",
        "action-history": "tempo jujutan ieu kaca",
        "action-minoredit": "nandaan ieu éditan salaku minor",
        "action-move": "mindahkeun ieu kaca",
        "recentchanges-label-plusminus": "Ukuran kaca robah sajumlah ieu bit",
        "recentchanges-legend-heading": "<strong>Pedaran:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (tempo ogé [[Special:NewPages|béréndélan kaca anyar]])",
+       "rcfilters-filter-patrolled-label": "Diaawas",
        "rcnotefrom": "Di handap ieu parobahan saprak <b>$2</b> (nu ditémbongkeun nepi ka <b>$1</b>).",
        "rclistfrom": "Témbongkeun nu anyar robah nepi ka $3 $2",
        "rcshowhideminor": "$1 éditan minor",
        "rcshowhidemine": "$1 éditan kuring",
        "rcshowhidemine-show": "Témbongkeun",
        "rcshowhidemine-hide": "Sumputkeun",
-       "rclinks": "Témbongkeun $1 parobahan ahir dina $2 poé ahir<br />$3",
+       "rclinks": "Témbongkeun $1 parobahan panungtung ti $2 poé ka tukang<br />$3",
        "diff": "béda",
        "hist": "juj",
        "hide": "sumputkeun",
        "lonelypagestext": "Kaca-kaca di handap ieu teu numbu ti kaca séjén di {{SITENAME}}.",
        "uncategorizedpages": "Kaca nu can dikategorikeun",
        "uncategorizedcategories": "Kategori nu can dikategorikeun",
-       "uncategorizedimages": "Gambar anu can boga kategori",
+       "uncategorizedimages": "Berkas anu can dikategorikeun",
        "uncategorizedtemplates": "Citakan nu can boga kategori",
        "unusedcategories": "Kategori nu teu kapaké",
-       "unusedimages": "Gambar anu teu kaparaké",
+       "unusedimages": "Berkas nu teu kaparaké",
        "wantedcategories": "Kategori nu dipikabutuh",
        "wantedpages": "Kaca nu dipikabutuh",
        "wantedfiles": "Berkas nu dipikabutuh",
        "booksources-search-legend": "Sungsi sumber buku",
        "booksources-search": "Paluruh",
        "booksources-text": "Di handap ieu ngabéréndélkeun tutumbu ka loka-loka nu ngical buku, boh nu anyar atawa loakan, nu sugan uninga kana buku anu nuju dipilari:",
-       "booksources-invalid-isbn": "ISBN-na sigana henteu bener; pariksa deui bisi aya salah salin ti sumber aslina.",
+       "booksources-invalid-isbn": "Sigana ISBN-na teu bener; pariksa deui bisi aya salah téplak ti sumber aslina.",
        "specialloguserlabel": "Pamaké:",
        "speciallogtitlelabel": "Sasaran (judul atawa pamaké):",
        "log": "Log",
        "wlheader-showupdated": "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
        "wlnote": "Di handap ieu mangrupa $1 {{PLURAL:$1|robahan|robahan}} ahir salila '''$2''' jam.",
        "wlshowlast": "Témbongkeun $1 jam $2 poé  ahir",
+       "wlshowhidecategorization": "kategorisasi kaca",
        "watchlist-options": "Pilihan awaskeuneun",
        "watching": "Ngawaskeun...",
        "unwatching": "Eureun ngawaskeun...",
        "undeletelink": "tempo/pulangkeun",
        "undeleteviewlink": "tempo",
        "undeletecomment": "Alesan:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|révisi|révisi}} disimpen deui",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 révisi|$1 révisi}} jeung {{PLURAL:$2|1 berkas|$2 berkas}} geus dibalikkeun",
-       "undeletedfiles": "{{PLURAL:$1|1 berkas|$1 berkas}} dibalikkeun",
        "cannotundelete": "Gagal ngabolaykeun hapusan; sigana kapiheulaan ngabolaykeun hapusan ku nu séjén.",
        "undeletedpage": "'''$1 hasil dibalikeun'''\n\nTempo [[Special:Log/delete|log hapusan]] keur data ngahapus jeung malikeun.",
        "undelete-header": "Tempo [[Special:Log/delete|log hapusan]] pikeun béréndélan kaca nu anyar dihapus.",
        "expiringblock": "kadaluwarsa $1 jam $2",
        "anononlyblock": "ngan nu teu daptar",
        "noautoblockblock": "Otopeungpeuk ditumpurkeun",
-       "createaccountblock": "nyieun akun dipeungpeuk",
+       "createaccountblock": "nyieun akun ditumpurkeun",
        "emailblock": "surélek di peungpeuk",
        "blocklist-nousertalk": "teu bisa ngarobah kaca obrolan sorangan",
        "ipblocklist-empty": "Daptar peungpeuk kosong.",
        "import-interwiki-text": "Pilih wiki jeung judul kaca nu rék diimpor.\nTanggal révisi katut ngaran nu ngédit bakal dipertahankeun.\nSadaya aktivitas impor transwiki baris kacatet dina [[Special:Log/import|log impor]].",
        "import-interwiki-sourcewiki": "Wiki sumber:",
        "import-interwiki-sourcepage": "Kaca sumber:",
-       "import-interwiki-history": "Salin sakabéh vérsi jujutan pikeun ieu kaca",
+       "import-interwiki-history": "Téplak sakabéh vérsi jujutan pikeun ieu kaca",
        "import-interwiki-templates": "Kaasup sakabéh citakan",
        "import-interwiki-submit": "Impor",
        "import-upload-filename": "Ngaran berkas:",
        "tooltip-pt-preferences": "Préferénsi {{GENDER:|anjeun}}",
        "tooltip-pt-watchlist": "Daptar kaca nu diawaskeun ku anjeun parobahanana.",
        "tooltip-pt-mycontris": "Béréndélan kontribusi {{GENDER:|anjeun}}",
-       "tooltip-pt-login": "Leuwih hadé asup log, sanajan teu wajib",
+       "tooltip-pt-login": "Leuwih hadé asup log, sok sanajan teu wajib",
        "tooltip-pt-logout": "Kaluar log",
        "tooltip-pt-createaccount": "Najan henteu kudu, Anjeun leuwih hadé nyieun akun sarta asup log",
        "tooltip-ca-talk": "Sawala ngeunaan eusi kaca",
        "tooltip-ca-move": "Pindahkeun kaca ieu",
        "tooltip-ca-watch": "Tambahkeun kaca ieu kana awaskeuneun kuring",
        "tooltip-ca-unwatch": "Kaluarkeun kaca ieu tina awaskeuneun kuring",
-       "tooltip-search": "Sungsi di {{SITENAME}}",
+       "tooltip-search": "Paluruh di {{SITENAME}}",
        "tooltip-search-go": "Jugjug kaca nu ngaranna ciples kieu (mun aya)",
-       "tooltip-search-fulltext": "Sungsi kaca-kaca nu ngandung tulisan ieu",
-       "tooltip-p-logo": "Tepas",
+       "tooltip-search-fulltext": "Paluruh kaca-kaca nu ngandung ieu tulisan",
+       "tooltip-p-logo": "Jugjug tepas",
        "tooltip-n-mainpage": "Sindang ka Tepas",
-       "tooltip-n-mainpage-description": "Jugjug Tepas",
+       "tooltip-n-mainpage-description": "Jugjug tepas",
        "tooltip-n-portal": "Ngeunaan proyékna, naon nu bisa dipigawé, di mana néanganana",
        "tooltip-n-currentevents": "Panggihan iber ngeunaan naon baé nu keur lumangsung",
        "tooltip-n-recentchanges": "Béréndélan nu anyar robah dina wiki",
-       "tooltip-n-randompage": "Muatkeun kaca naon baé",
+       "tooltip-n-randompage": "Muatkeun kaca acak",
        "tooltip-n-help": "Tempat pikeun néangan pitulung",
        "tooltip-t-whatlinkshere": "Béréndélan sakabéh kaca wiki anu nutumbu ka dieu",
        "tooltip-t-recentchangeslinked": "Anu anyar robah dina kaca-kaca anu nutumbu ti dieu",
        "exif-copyrighted": "Status hak cipta",
        "exif-copyrightowner": "Nu nyepeng hak cipta",
        "exif-usageterms": "Katangtuan pamakéan",
-       "exif-webstatement": "Pertélaan hak salin onlén",
+       "exif-webstatement": "Pertélaan hak cipta onlén",
        "exif-originaldocumentid": "ID unik dokumén asli",
        "exif-licenseurl": "URL pikeun lisénsi hak cipta",
        "exif-morepermissionsurl": "Ëmbaran lisénsi lianna",
        "monthsall": "kabéh",
        "confirmemail": "Konfirmasi alamat surélék",
        "confirmemail_noemail": "Alamat surélék anu didaptarkeun dina [[Special:Preferences|préferénsi pamaké]] anjeun teu sah.",
-       "confirmemail_text": "Ieu {{SITENAME}} butuh sangkan anjeun mastikeun alamat surélék saméméh migunakeun fitur surélék.\nAktipkeun tombol di handap pikeun ngirimkeun surat konfirmasi ka alamat anjeun. Suratna ngandung tumbu nu ngandung sandina; muatkeun tumbuna kana panyungsi anjeun pikeun ngonfirmasi yén alamat surélék anjeun sah.",
+       "confirmemail_text": "{{SITENAME}} téh anjeun kudu ngonfirmasi alamat surélék sangkan bisa migunakeun fiturna.\nKlik tombol di handap pikeun ngirimkeun talatah nu eusina konfirmasieun kana alamat anjeun. Eusi talatahna ngandung tutumbu kodeu; muatkeun tumbuna kana panyungsi anjeun pikeun ngonfirmasi yén alamat surélék anjeun sah.",
        "confirmemail_pending": "Kecap sandi konfirmasi geus dikirimkeun ka alamat surélék anjeun; mun anyar nyieun akun, mangga antos sababaraha menit saméméh mundut kecap sandi anyar.",
        "confirmemail_send": "Kirimkeun surat konfirmasi sandi",
        "confirmemail_sent": "Surélék konfirmasi geus dikirim.",
        "specialpages-group-other": "Kaca husus lainna",
        "specialpages-group-login": "Asup log / jieun akun",
        "specialpages-group-changes": "Nuanyar robah sarta log",
-       "specialpages-group-media": "Laporan sarta muatkeun koropak",
+       "specialpages-group-media": "Laporan jeung unjalan berkas",
        "specialpages-group-users": "Pamaké sarta hak pamaké",
        "specialpages-group-highuse": "Pamakéan kaca nu badag",
        "specialpages-group-pages": "Daptar kaca",
        "htmlform-reset": "Bolaykeun parobahan",
        "htmlform-selectorother-other": "Lianna",
        "logentry-delete-delete": "$1 {{GENDER:$2|ngahapus}} kaca $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|dibalikkeun}} kaca $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|dibalikkeun}} kaca $3",
+       "restore-count-revisions": "$1 {{PLURAL:$1|1 révisi|$1 révisi}}",
+       "restore-count-files": "{{PLURAL:$1|1 berkas|$1 berkas}}",
        "revdelete-restricted": "akses geus dibatesan ukur keur kuncén",
        "revdelete-unrestricted": "Watesan akses kuncén dihapuskeun",
        "logentry-move-move": "$1 {{GENDER:$2|mindahkeun}} kaca $3 ka $4",
        "special-characters-group-gujarati": "Gujarati",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
-       "special-characters-group-khmer": "Khmer"
+       "special-characters-group-khmer": "Khmer",
+       "gotointerwiki": "Ninggalkeun{{SITENAME}}",
+       "gotointerwiki-invalid": "Judul spésipik henteu valid"
 }
index 29de95c..87d00c2 100644 (file)
        "saveusergroups": "Spara {{GENDER:$1|användargrupper}}",
        "userrights-groupsmember": "Medlem i:",
        "userrights-groupsmember-auto": "Implicit medlem av:",
-       "userrights-groups-help": "Du kan ändra vilka grupper denna användare är medlem i.\n* En ikryssad ruta betyder användaren är medlem i den gruppen.\n* En okryssad ruta betyder att användaren inte är medlem i den gruppen.\n* En asterisk (*) betyder att du inte kan ta bort gruppen när du har lagt till den, eller vice versa.\n* Ett nummertecken (#) betyder att du endast kan flytta tillbaka förfallotiden för denna grupp; du kan inte flytta fram den.",
+       "userrights-groups-help": "Du kan ändra vilka grupper denna användare är medlem i.\n* En ikryssad ruta betyder användaren är medlem i den gruppen.\n* En okryssad ruta betyder att användaren inte är medlem i den gruppen.\n* En asterisk (*) betyder att du inte kan ta bort gruppen när du har lagt till den, eller vice versa.\n* Ett nummertecken (#) betyder att du endast kan flytta tillbaka förfallotiden för detta gruppmedlemskap; du kan inte flytta fram den.",
        "userrights-reason": "Anledning:",
        "userrights-no-interwiki": "Du har inte behörighet att ändra användarrättigheter på andra wikis.",
        "userrights-nodatabase": "Databasen $1 finns inte eller så är den inte lokal.",
        "userrights-expiry-options": "1 dag:1 dag,1 vecka:1 vecka,1 månad:1 månad,3 månader:3 månader,6 månader:6 månader,1 år:1 år",
        "userrights-invalid-expiry": "Förfallotiden för gruppen \"$1\" är ogiltig.",
        "userrights-expiry-in-past": "Förfallotiden för gruppen \"$1\" är i det förflutna.",
-       "userrights-cannot-shorten-expiry": "Du kan inte flytta fram förfallotiden för gruppen \"$1\". Endast användare med behörighet att lägga till och ta bort denna grupp kan flytta fram förfallodatum.",
+       "userrights-cannot-shorten-expiry": "Du kan inte flytta fram förfallotiden för medlemskapet i gruppen \"$1\". Endast användare med behörighet att lägga till och ta bort denna grupp kan flytta fram förfallodatum.",
        "userrights-conflict": "Konflikt vid ändringar av användarrättigheter! Var god granska och bekräfta dina ändringar.",
        "group": "Grupp:",
        "group-user": "Användare",
        "rcfilters-hideminor-conflicts-typeofchange": "Vissa ändringstyper kan inte betecknas som \"mindre\", så detta filter är i konflikt med följande ändringstypfilter: $1",
        "rcfilters-typeofchange-conflicts-hideminor": "Detta ändringstypfilter är i konflikt med filtret \"Mindre ändringar\". Vissa ändringstyper kan inte betecknas som \"mindre\".",
        "rcnotefrom": "Nedan visas {{PLURAL:$5|ändringen|ändringar}} sedan <strong>$3, $4</strong> (upp till <strong>$1</strong> ändringar visas).",
+       "rclistfromreset": "Återställ datumval",
        "rclistfrom": "Visa nya ändringar från och med $2 $3",
        "rcshowhideminor": "$1 mindre ändringar",
        "rcshowhideminor-show": "Visa",
        "php-uploaddisabledtext": "Filuppladdningar i PHP är avaktiverade. \nKolla inställningarna för file_uploads.",
        "uploadscripted": "Denna fil innehåller HTML eller script som felaktigt kan komma att tolkas av webbläsare.",
        "upload-scripted-pi-callback": "Kan inte ladda upp en fil som innehåller instruktioner för behandling av XML-stylesheet.",
+       "upload-scripted-dtd": "Kan inte ladda upp SVG-filer som innehåller en icke-standardiserad DTD-deklaration.",
        "uploaded-script-svg": "Hittade skriptelementet \"$1\" i den uppladdade SVG-filen.",
        "uploaded-hostile-svg": "Hittade osäker CSS i den uppladdade filens stilelement.",
        "uploaded-event-handler-on-svg": "Att ange event-handler-attribut <code>$1=\"$2\"</code> är inte tillåtet i SVG-filer.",
        "undeleteviewlink": "visa",
        "undeleteinvert": "Invertera urval",
        "undeletecomment": "Anledning:",
-       "undeletedrevisions": "{{PLURAL:$1|en version återställd|$1 versioner återställda}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|version|versioner}} och $2 {{PLURAL:$2|fil|filer}} återställda",
-       "undeletedfiles": "{{PLURAL:$1|en fil återställd|$1 filer återställda}}",
        "cannotundelete": "En del eller alla återställningar misslyckades:\n$1",
        "undeletedpage": "'''$1 har återställts'''\n\nSe [[Special:Log/delete|raderingsloggen]] för en förteckning över de senaste raderingarna och återställningarna.",
        "undelete-header": "Se [[Special:Log/delete|raderingsloggen]] för nyligen raderade sidor.",
        "htmlform-user-not-valid": "<strong>$1</strong> är inte ett giltigt användarnamn.",
        "logentry-delete-delete": "$1 {{GENDER:$2|raderade}} sidan $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|raderade}} omdirigeringen $3 genom att skriva över den",
-       "logentry-delete-restore": "$1 {{GENDER:$2|återställde}} sidan $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|återställde}} sidan $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|återställde}} sidan $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 sidversion|$1 sidversioner}}",
+       "restore-count-files": "{{PLURAL:$1|1 fil|$1 filer}}",
        "logentry-delete-event": "$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ändrade}} synligheten för logghändelser på $3",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laotiska",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Kanadensisk stavelseskrift",
        "special-characters-title-endash": "tankstreck",
        "special-characters-title-emdash": "långt tankstreck",
        "special-characters-title-minus": "minustecken",
        "restrictionsfield-help": "En IP-adress eller CIDR-intervall per rad. För att aktivera allting, använd<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
        "revid": "sidversion $1",
        "pageid": "sid-ID $1",
-       "rawhtml-notallowed": "&lt;html&gt;-taggar kan inte användas utanför normala sidor."
+       "rawhtml-notallowed": "&lt;html&gt;-taggar kan inte användas utanför normala sidor.",
+       "gotointerwiki": "Lämnar {{SITENAME}}",
+       "gotointerwiki-invalid": "Den angivna titeln var ogiltig.",
+       "gotointerwiki-external": "Du håller på att lämna {{SITENAME}} för att besöka [[$2]] som är en separat webbplats.\n\n[$1 Klicka här för att fortsätta till $1].",
+       "undelete-cantedit": "Du kan inte återställa denna sida eftersom du är inte tillåten att redigera denna sida.",
+       "undelete-cantcreate": "Du kan inte återställa denna sida eftersom det inte finns någon befintlig sida med detta namn och du tillåts inte att skapa denna sida."
 }
index 9db85c5..998f374 100644 (file)
        "december-date": "ದಸಂಬರ $1",
        "period-am": "ಕಾಂಡೆ",
        "period-pm": "ಬೈಯ್ಯ",
-       "pagecategories": "{{PLURAL:$1|ವರ್ಗೊ|ವರ್ಗೊಲು}}",
+       "pagecategories": "{{PLURAL:$1|Category|ವರ್ಗೊಲು}}",
        "category_header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಲೇಕನೊಲು",
        "subcategories": "ಉಪ ವರ್ಗೊಲು",
        "category-media-header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಚಿತ್ರೊ/ಶಬ್ಧೊ ಫೈಲ್‍ಲು",
        "category-empty": "''ಈ ವರ್ಗೊಡು ಸದ್ಯಗ್ ಓವುಲ ಪುಟೊಲಾವಡ್ ಅತ್ತ್’ನ್ಡ ಚಿತ್ರೊಲಾವಡ್ ಇಜ್ಜಿ.''",
-       "hidden-categories": "{{PLURAL:$1|ದೆಂಗಾದ್ ದೀಡ್‍ನ ವರ್ಗೊ|ದೆಂಗಾದ್ ದೀಡ್‍ನ ವರ್ಗೊಲು}}",
+       "hidden-categories": "{{PLURAL:$1|Hidden category|ದೆಂಗಾದ್ ದೀಡ್‍ನ ವರ್ಗೊಲು}}",
        "hidden-category-category": "ದೆಂಗಾದ್ ದೀತಿನ ವರ್ಗೊಲು",
-       "category-subcat-count": "{{PLURAL:$2|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ ಉಪವರ್ಗ ಉಂಡು.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|ಉಪವರ್ಗೊನು|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
+       "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|subcategory|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
        "category-subcat-count-limited": "ಈ ವರ್ಗೊಡು ತಿರ್ತ್ ತೊಜ್ಪಾದಿನ {{PLURAL:$1|ಉಪವರ್ಗ|$1 ಉಪವರ್ಗೊಲು}} ಉಂಡು.",
-       "category-article-count": "{{PLURAL:$2|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ ಕಾಲಿ ಒಂಜಿ ಪುಟೊ ಉಂಡು.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|ಪುಟೊನು|$1 ಪುಟೊಲೆನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಪುಟೊಲು ಉಂಡು.}}",
+       "category-article-count": "{{PLURAL:$2|This category contains only the following page.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|page is|$1 ಪುಟೊಲೆನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಪುಟೊಲು ಉಂಡು.}}",
        "category-article-count-limited": "ಪ್ರಸಕ್ತ ವರ್ಗೊಡು ಈ ತಿರ್ತ್’ದ {{PLURAL:$1|ಪುಟ ಉಂಡು|$1 ಪುಟೊಲು ಉಂಡು}}.",
        "category-file-count": "{{PLURAL:$2|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ ಕಾಲಿ ಒಂಜಿ ಫೈಲ್ ಉಂಡು.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1| ಫೈಲ್‍ನ್|$1  ಫೈಲ್‍ನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
        "category-file-count-limited": "ಪ್ರಸಕ್ತ ವರ್ಗೊಡು ಈ ತಿರ್ತ್’ದ {{PLURAL:$1|ಫೈಲ್ ಉಂಡು|$1 ಫೈಲ್’ಲು ಉಂಡು}}.",
        "welcomecreation-msg": "ಈರೆನ ಕಾತೆನ್ ದೆತ್ತ್‌ದಾತ್ಂಡ್.  ಈರೆನ [[Special:Preferences|{{SITENAME}} ಆಯ್ಕೆನ್]]ಬದಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ.",
        "yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
        "userlogin-yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್",
-       "userlogin-yourname-ph": "ಈರೆನ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
+       "userlogin-yourname-ph": "ಈರೆನ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
        "createacct-another-username-ph": "ಈರೆನೆ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
        "yourpassword": "ಪಾಸ್-ವರ್ಡ್:",
        "userlogin-yourpassword": "ಪ್ರವೇಸೊಪದೊ",
        "logout": "ಲಾಗ್ ಔಟ್",
        "userlogout": "ಲಾಗ್ ಔಟ್",
        "notloggedin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
-       "userlogin-noaccount": "à²\95ಾತà³\86 à²\87ದà³\8dದಿಯಾ?",
+       "userlogin-noaccount": "à²\88ರà³\86ನ à²\96ಾತà³\86 à²\87à²\9cà³\8dà²\9cà³\87?",
        "userlogin-joinproject": "{{SITENAME}}ಗ್ ಸೇರ್ಲೆ",
        "createaccount": "ಪೊಸ ಅಕ್ಕೌಂಟ್ ಸುರು ಮಲ್ಪುಲೆ",
        "userlogin-resetpassword-link": "ಈರೆನೆ ಪ್ರವೇಸೊ ಪದೊ ಮರತ್ತ್‌ಂಡಾ?",
        "createacct-reason-ph": "ಈರ್ ದಾಯೆ ನಾನಲ ಒಂಜಿ ಕಾತೆ ದೆತ್ತೊಂದುಲ್ಲರ್?",
        "createacct-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "createacct-another-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
-       "createacct-benefit-heading": "{{SITENAME}}ನಿà²\95à³\8dಲà³\86ನà²\82à²\9aಿತà³\8dತಿನ à²\9cನà³\8aà²\95à³\8dಲà³\86ಡà³\8dದà³\8d à²\89à²\82ಡಾಪà³\81à²\82ಡà³\81.",
-       "createacct-benefit-body1": "{{PLURAL:$1|ಸಂಪೊದನೆ|ಸಂಪದೊನೆಲು}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|ಪುಟೊ|ಪುಟೊಕ್ಕುಲು}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|ಇನಾಮು|ಇನಾಮುಲು}}",
+       "createacct-benefit-heading": "{{SITENAME}}à²\89à²\82ಡà³\8d à²¨à²¿à²\95à³\8dಲà³\86ನà²\82à²\9aಿತà³\8dತಿನ à²\8eಡà³\8dದà³\86ನà³\8dತà²\82à²\95à³\8dಲà³\86ಡà³\8dದà³\8d à²\89à²\82ಡಾತà³\81à²\82ಡà³\8d.",
+       "createacct-benefit-body1": "{{PLURAL:$1|edit|ಸಂಪದೊನೆಲು}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|page|ಪುಟೊಕ್ಕುಲು}}",
+       "createacct-benefit-body3": "ಇಂಚಿಪೊ{{PLURAL:$1|contributor|ಕಾಣಿಕೆ ಕೊರ್ನರ್}}",
        "badretype": "ಈರ್ ಕೊರ್ನ ಪ್ರವೇಶ ಪದೆ ಬೇತೆ ಬೇತೆ ಅತ್ಂಡ್",
        "userexists": "ಈರ್ ಕೊರ್ನ ಸದಸ್ಯರ ಪುದರ್ ಬಳಕೆಡ್ ಉಂಡು. ದಯದೀದ್ ಬೇತೆ ಪುದರ್ ಕೊರ್ಲೆ",
        "loginerror": "ಲಾಗಿನ್ ದೋಷ",
        "link_sample": "ಕೊಂಡಿದ ಸೀರ್ಸಿಕೆ",
        "link_tip": "ಉಲಯಿದ ಕೊಂಡಿ",
        "extlink_sample": "http://www.example.com ಕೊಂಡಿದ ಸೀರ್ಸಿಕೆ",
-       "extlink_tip": "ಪಿದಯಿದ ಕೊಂಡಿ(http://ರ್ದ್ ಸುರು ಮಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ)",
+       "extlink_tip": "ಪಿದಯಿದ ಕೊಂಡಿ(http:// ರ್ದ್ ಸುರು ಮಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ)",
        "headline_sample": "ಪಟ್ಯೊದ ಸೀರ್ಸಿಕೆ",
        "headline_tip": "2ನೇ ಮಟ್ಟೊದ ಸೀರ್ಸಿಕೆ",
        "nowiki_sample": "ಮುಲ್ಪ ಫಾರ್ಮೇಟ್ ಆವಂದಿನಂಚಿನ ಪಟ್ಯೊನು ಸೇರಲೆ",
        "newarticle": "(ಪೊಸತ್)",
        "newarticletext": "ನನಲ ಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪಂದಿನ ಪುಟೊಗು ಈರ್ ಬೈದರ್.\nಈ ಪುಟೊನು ಸ್ರಿಸ್ಟಿ ಮಲ್ಪೆರೆ ತಿರ್ತ್‍ದ ಚೌಕೊಡು ಬರೆಯೆರೆ ಸುರು ಮಲ್ಪುಲೆ.\n(ಜಾಸ್ತಿ ಮಾಹಿತಿಗ್ [$1 ಸಹಾಯ ಪುಟೊನು] ತೂಲೆ).\nಈ ಪುಟೊಕು ಈರ್ ತಪ್ಪಾದ್ ಬತ್ತಿತ್ತ್ಂಡ ಇರೆನ ಬ್ರೌಸರ್‍ದ '''back''' ಬಟನ್’ನ್ ಒತ್ತ್’ಲೆ.",
        "noarticletext": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತಿನ ದಾಕಲೆನ್ ನಾಡ್‍ಲೆ], ಅತ್ತಾಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
-       "noarticletext-nopermission": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತ್‌ನ ಲಾಗ್‌ನ್ ನಾಡ್‍ಲೆ], ಅತ್ತ್ಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
+       "noarticletext-nopermission": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತ್‌ನ ಲಾಗ್‌ನ್ ನಾಡ್‍ಲೆ],[{{fullurl:{{FULLPAGENAME}}|action=edit}} ಅಂಡ ಇರೆಗ್ ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿಪುನೆಗ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಿ]</span>.",
        "userpage-userdoesnotexist": "ಬಳಕೆದಾರ ಖಾತೆ \"<nowiki>$1</nowiki>\" ದಾಖಲಾತ್‘ಜ್ಜಿ. ಈರ್ ಉಂದುವೇ ಪುಟನ್ ಸಂಪಾದನೆ ಮಲ್ಪರ ಉಂಡಾಂದ್ ಖಾತ್ರಿ ಮಲ್ತೊನಿ.",
        "previewnote": "'''ಉಂದು ಕೇವಲ ಮುನ್ನೋಟ; ಪುಟೊನು ನನಲ ಒರಿಪಾದಿಜಿ ಪನ್ಪುನೇನ್ ಮರಪೊರ್ಚಿ!'''",
        "editing": "$1 ಲೇಕನೊನು ಈರ್ ಸಂಪಾದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
        "yourtext": "ಇರೆನ ಸಂಪಾದನೆ",
        "yourdiff": "ವ್ಯತ್ಯಾಸೊಲು",
        "copyrightwarning": "ದಯಮಲ್ತ್’ದ್ ಗಮನಿಸ್’ಲೆ: {{SITENAME}} ಸೈಟ್’ಡ್ ಇರೆನ ಪೂರಾ ಕಾಣಿಕೆಲುಲಾ $2 ಅಡಿಟ್ ಬಿಡುಗಡೆ ಆಪುಂಡು (ಮಾಹಿತಿಗ್ $1 ನ್ ತೂಲೆ). ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಬೇತೆಕುಲು ನಿರ್ಧಾಕ್ಷಿಣ್ಯವಾದ್ ಬದಲ್ ಮಲ್ತ್’ದ್ ಬೇತೆ ಕಡೆಲೆಡ್ ಪಟ್ಟೆರ್. ಇಂದೆಕ್ ಇರೆನ ಒಪ್ಪಿಗೆ ಇತ್ತ್’ನ್ಡ ಮಾತ್ರ ಮುಲ್ಪ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ.<br />\nಅತ್ತಂದೆ ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಈರ್ ಸ್ವತಃ ಬರೆತರ್, ಅತ್ತ್’ನ್ಡ ಕೃತಿಸ್ವಾಮ್ಯತೆ ಇಜ್ಜಂದಿನ ಕಡೆರ್ದ್ ದೆತೊನ್ದರ್ ಪಂಡ್’ದ್ ಪ್ರಮಾಣಿಸೊಂದುಲ್ಲರ್.\n'''ಕೃತಿಸ್ವಾಮ್ಯತೆದ ಅಡಿಟುಪ್ಪುನಂಚಿನ ಕೃತಿಲೆನ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಂದೆ ಮುಲ್ಪ ಪಾಡೊಚಿ!'''",
-       "templatesused": "ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|ಟೆಂಪ್ಲೇಟು|ಟೆಂಪ್ಲೇಟುಗಳು}}:",
+       "templatesused": "ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|Template|ಟೆಂಪ್ಲೇಟುಲೂ}}:",
        "templatesusedpreview": "ಈ ಮುನ್ನೋಟೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ{{PLURAL:$1|Template|Templates}}:",
        "templatesusedsection": "ಈ ಇಬಾಗೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|Template|Templates}}:",
        "template-protected": "(ಸಂರಕ್ಷಿತೊ)",
        "template-semiprotected": "(ಅರೆ-ಸಂರಕ್ಷಿತೊ)",
-       "hiddencategories": "ಈ ಪುಟೊ {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗೊಗ್|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್‍ನ್ಡ್:",
+       "hiddencategories": "ಈ ಪುಟೊನ್ {{PLURAL:$1|1 hidden category|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್‍ನ್ಡ್:",
        "permissionserrors": "ಅನುಮತಿ ದೋಷ",
-       "permissionserrorstext-withaction": "$2 ಗ್ ಇರೆಗ್ ಅನುಮತಿ ಇದ್ದಿ, ಅಯಿಕ್ {{PLURAL:$1|ಕಾರಣೊ|ಕಾರಣೊಲು}}:",
+       "permissionserrorstext-withaction": "$2 ಗ್ ಇರೆಗ್ ಅನುಮತಿ ಇದ್ದಿ, ಅಯಿಕ್ {{PLURAL:$1||reason|ಕಾರಣೊಲು}}:",
        "moveddeleted-notice": "ಈ ಪುಟೊ ಅಸ್ತಿತ್ವೊಡ್ ಇದ್ದಿ.\nಪುಟೊದ ಡಿಲೀಶನ್ ಅತ್ತ್ಂಡ್ ಕಡಪ್ಪುಡುನೆ ಲಾಗ್‍ನ್ ತೂಯರೆ ತಿರ್ತ್ ಕೊರ್ತ್ಂಡ್.",
        "postedit-confirmation-created": "ಈ ಪುಟೋನು ಉಂಡು ಮಾನ್ತುಂಡು.",
        "postedit-confirmation-saved": "ಇರೇನಾ ಸಂಪಾದನೆನ್ ಒರಿಪಾತುಂಡು.",
        "revisionasof": "$1ದಿನೊತ ಆವೃತ್ತಿ",
        "revision-info": "ಬದಲಾವಣೆ $1 ಲೆಕ್ಕೊ {{GENDER:$6|$2}} ಇಂಬೆರೆಡ್ದ್ $7",
        "previousrevision": "←ದುಂಬೊರೊ ತೂಯಿನ",
-       "nextrevision": "ದುಂಬುದ ತಿದ್ದುಪಡಿ",
+       "nextrevision": "ದುಂಬುದ ತಿದ್ದುಪಡಿ →",
        "currentrevisionlink": "ಇತ್ತೆದ ತಿದ್ದುಪಡಿ",
        "cur": "ಸದ್ಯೊ",
        "next": "ಬೊಕ್ಕದ",
        "searchresults": "ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
        "searchresults-title": "\"$1\"ಕ್ ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
        "notextmatches": "ವಾ ಪುಟೊತ ಪಠ್ಯೊಡುಲಾ ಹೋಲಿಕೆ ಇಜ್ಜಿ",
-       "prevn": "ದುಂಬು {{PLURAL:$1|$1}}",
+       "prevn": "ದುಂಬುತ್ತ {{PLURAL:$1|$1}}",
        "nextn": "ಬೊಕ್ಕೊ {{PLURAL:$1|$1}}",
        "prev-page": "ದುಂಬುತ ಪುಟೊ",
        "next-page": "ನನತಾ ಪುಟ",
        "nextn-title": "ದುಂಬುದ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊಲು}}",
        "shown-title": "ಪ್ರತಿ ಪುಟೊಡುಲಾ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊ}} ತೋಜಿಪಾವು",
-       "viewprevnext": "ತೂಲೆ($1 {{int:pipe-separator}} $2) ($3)",
+       "viewprevnext": "ತೂಲೆ ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "<strong>ಈ ಪುಟೊನು ರಚಿಸಲೆ \"[[:$1]]\" ಈ ವಿಕಿಡ್!</strong> {{PLURAL:$2|0=|See also the page found with your search.|ನಾಡ್‍ನಗ ತೋಜಿದ್ ಬರ್ಪುನ ಪಲಿತಾಂಸೊನು ತೂಲೆ.}}",
        "searchprofile-articles": "ಲೇಕನೊ ಪುಟೊ",
        "searchprofile-images": "ಮಲ್ಟಿಮೀಡಿಯೊ",
        "searchprofile-everything-tooltip": "ಮಾತ ಮಾಹಿತಿಲೆನ್ ನಾಡ್‍ಲೆ (ಪಾತೆರದ ಪುಟೊಲ ಸೇರ್ದ್)",
        "searchprofile-advanced-tooltip": "ಬಳಕೆದ ನಾಮೊವರ್ಗೊಡು ನಾಡ್‍ಲೆ",
        "search-result-size": "$1 ({{PLURAL:$2|೧ ಪದೊ|$2 ಪದೊಕುಲು}})",
-       "search-redirect": "($1 ಡ್ದ್ ಪಿರ ನಿರ್ದೇಸನೊ)",
+       "search-redirect": "($1 ಡ್ದ್ ಪಿರ ನಿರ್ದೇಸನೊ)",
        "search-section": "(ವಿಬಾಗೊ $1)",
        "search-suggest": "ಇಂದೆನ್ ನಾಡೊಂದುಲ್ಲರೆ: $1",
        "search-interwiki-caption": "ಬಳಗದ ಇತರ ಯೋಜನೆಲು",
        "recentchanges-label-bot": "ಈ ಸಂಪದನೆ ಒಂಜಿ ಬಾಟ್‍ಡ್ ಆತ್ಂಡ್",
        "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆನ್ ನನಲಾ ಪರೀಕ್ಷೆ ಮಲ್ತ್‌ಜಿ.",
        "recentchanges-label-plusminus": "ಬೈಟ್ಸ್‌ದ ಲೆಕ್ಕೊಡು ಈ ಪಾಲೆದ ಗಾತ್ರೊ ಬದಲಾತ್ಂಡ್",
-       "recentchanges-legend-heading": "<strong>ಲà³\86à²\9cà³\86à²\82ಡà³\8d:</strong>",
+       "recentchanges-legend-heading": "<strong>ಪರಿವಿಡಿ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
        "recentchanges-submit": "ತೋಜಾಲೆ",
+       "rcfilters-filterlist-whatsthis": "ಉಂದು ದಾದಾ?",
        "rcfilters-filter-user-experience-level-learner-label": "ಕಲ್ಪುನರ್",
        "rclistfrom": "$3 $2 ರ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
        "filehist-filesize": "ಫೈಲ್’ದ ಗಾತ್ರ",
        "filehist-comment": "ಅಬಿಪ್ರಾಯೊ",
        "imagelinks": "ಫೈಲ್‍ದ ಬಳಕೆ",
-       "linkstoimage": "ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|ಪುಟ|$1 ಪುಟೊಲೆ ಕೊಂಡಿ}}ಈ ಫೈಲ್‍ಗ್ ಕೊರ್ಪುಂಡು.",
+       "linkstoimage": "ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|page links|$1 ಪುಟೊಲೆ ಕೊಂಡಿ}}ಈ ಫೈಲ್‍ಗ್ ಕೊನಪೋಪುಂಡು.",
        "nolinkstoimage": "ಈ ಫೈಲ್‍ಗ್ ಸಂಪರ್ಕೊ ಉಪ್ಪುನ ವಾ ಪುಟೊಲಾ ಇದ್ದಿ.",
        "sharedupload": "ಈ ಫೈಲ್’ನ್ ಮಸ್ತ್ ಜನ ಪಟ್ಟ್’ದುಲ್ಲೆರ್ ಅಂಚೆನೆ ಉಂದು ಮಸ್ತ್ ಪ್ರೊಜೆಕ್ಟ್’ಲೆಡ್ ಉಪಯೋಗಿಸೊಲಿ",
        "sharedupload-desc-here": "ಈ ಪುಟೊ $1ಡ್ದ್ ಬೊಕ್ಕ ಬೇತೆ ಯೋಜನೆಡ್ದ್ ಗಳಸೊಲಿ.\nಈ ಪುಟೊತ ವಿವರೊ [$2 ಪುಟೊತ ವಿವರೊ] ತಿರ್ತ ಸಾಲ್‍ಡ್ ತೋಜಾದ್ಂಡ್",
        "brokenredirects-edit": "ಸಂಪೊಲಿಪುಲೆ",
        "brokenredirects-delete": "ಮಾಜಾಲೆ",
        "withoutinterwiki-submit": "ತೋಜಾಲೆ",
-       "nbytes": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}",
-       "nmembers": "$1 {{PLURAL:$1|ಸದಸ್ಯೆ|ಸದಸ್ಯೆರ್}}",
+       "nbytes": "$1 {{PLURAL:$1|byte|ಬೈಟ್‍ಲು}}",
+       "nmembers": "$1 {{PLURAL:$1|member|ಸದಸ್ಯೆರ್}}",
        "wantedfiles": "ಬೋಡಾಯಿನ ಕಡತೊಲು",
        "prefixindex": "ಪೂರ್ವನಾಮೊಲ್ದ ಸೂಚಿಕೆ",
        "prefixindex-submit": "ತೋಜಾಲೆ",
        "move": "ಮೂವ್(ಸ್ಥಳಾಂತರ) ಮಲ್ಪುಲೆ",
        "movethispage": "ಈ ಪುಟೊನು ಮೂವ್ ಮಲ್ಪುಲೆ",
        "pager-newer-n": "{{PLURAL:$1|ಪೊಸ ೧|ಪೊಸ $1}}",
-       "pager-older-n": "{{PLURAL:$1|ಪರತ್ತ್ ೧|ಪರತ್ತ್ $1}}",
+       "pager-older-n": "{{PLURAL:$1|older 1|ಪರತ್ತ್ $1}}",
        "apisandbox-reset": "ಮಾಜಲೇ",
        "apisandbox-retry": "ನನೊರ ಪ್ರಯತ್ನ ಮಾನ್ಪುಲೇ",
        "apisandbox-examples": "ಉದಾಹರಣೆಲು",
        "namespace_association": "ಜತೆಟಿತ್ತಿನ ಪುದರ್",
        "tooltip-namespace_association": "ಈ ಚೌಕೊನು ಚರ್ಚೆನ್ ಸೇರಾದ್ ಪರೀಕ್ಷಿಸಲೆ ಅತ್ತ್ಂಡ ವಿಸಯೊಗು ಸರಿಯಾಯಿನ ಪುದರ್ದ ಜತೆಟ್ ಸೇರಾಲೆ",
        "blanknamespace": "(ಮುಖ್ಯ)",
-       "contributions": "{{$1ಸದಸ್ಯೆರ್ನ}}ಕಾಣಿಕೆಲು",
+       "contributions": "{{GENDER:$1|ಸದಸ್ಯೆರ್ನ}} ಕಾಣಿಕೆಲು",
        "contributions-title": "$1 ಗ್ ಸದಸ್ಯೆರ್ನ ಕಾಣಿಕೆ",
        "mycontris": "ಎನ್ನ ಕಾನಿಕೆಲು",
        "anoncontribs": "ಕಾನಿಕೆಲು",
        "whatlinkshere": "ಇಡೆ ವಾ ಪುಟೊ ಕೊಂಡಿ ಕೊರ್ಪುಂಡು",
        "whatlinkshere-title": "\"$1\" ಪುಟೊಗು ಕೊಂಡಿ ಕೊರ್ಪುನ ಪುಟೊಲು",
        "whatlinkshere-page": "ಪುಟೊ:",
-       "linkshere": "'''[[:$1]]'''ಗ್ ಈ ತಿರ್ತ್‍ದ ಪುಟೊಗು ಕೊಂಡಿ ಕೊರ್ಪುಂಡು.",
+       "linkshere": "</strong>[[:$1]]<strong>ಗ್ ಈ ತಿರ್ತ್‍ದ ಪುಟೊಗು ಕೊಂಡಿ ಕೊರ್ಪುಂಡು.",
        "nolinkshere": "'''[[:$1]]''' ಗ್ ವಾ ಪುಟೊಲುಲಾ ಲಿಂಕ್ ಕೊರ್ಪುಜಿ.",
        "isredirect": "ಪಿರ ನಿರ್ದೇಶನೊದ ಪುಟೊ",
        "istemplate": "ಸೇರಾವುನೆ",
        "isimage": "ಫೈಲ್‍ದ ಕೊಂಡಿ",
-       "whatlinkshere-prev": "{{PLURAL:$1|ದುಂಬುದ|ದುಂಬುದ $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|ಬೊಕ್ಕದ|ಬೊಕ್ಕದ $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|previous|ದುಂಬುದ $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|next|ಬೊಕ್ಕದ $1}}",
        "whatlinkshere-links": "← ಕೊಂಡಿಲು",
        "whatlinkshere-hideredirs": "$1 ಪಿರನಿರ್ದೇಶನೊಲು",
        "whatlinkshere-hidetrans": "$1 ಸೇರಾವುನವು",
        "import-interwiki-submit": "ಆಮದು",
        "import-upload-filename": "ಕಡತದ ಪುದರ್:",
        "import-comment": "ಅಭಿಪ್ರಾಯೊ:",
-       "tooltip-pt-userpage": "{{GENDER:|ಎನ್ನ ಸದಸ್ಯ}} ಪುಟೊ",
-       "tooltip-pt-mytalk": "{{GENDER:|ಎನ್ನ}} ಚರ್ಚೆ ಪುಟೊ",
+       "tooltip-pt-userpage": "{{GENDER:|ಎನ್ನ ಸದಸ್ಯ}}  ಪುಟೊ",
+       "tooltip-pt-mytalk": "{{GENDER:|ಎನ್ನ}} ಚರ್ಚೆತಾ ಪುಟೊ",
        "tooltip-pt-preferences": "{{GENDER:|ಎನ್ನ}} ಇಸ್ಟೊಲು",
        "tooltip-pt-watchlist": "ಈರ್ ಬದಲಾವಣೆಗಾದ್ ನಿಗಾ ದೀತಿನಂಚಿನ ಪುಟೊಲೆನ ಪಟ್ಟಿ",
-       "tooltip-pt-mycontris": "{{GENDER:|ಎನ್ನ}} ಕಾನಿಕೆಲೆ ಪಟ್ಟಿ",
+       "tooltip-pt-mycontris": "{{GENDER:|ಎನ್ನ}} ಕಾನಿಕೆಲೆ ಪಟ್ಟಿ",
        "tooltip-pt-login": "ಈರ್ ಲಾಗಿನ್ ಆವೊಡುಂದು ಕೇನೊಂದುಲ್ಲೊ, ಆಂಡ ಉಂದು ದಾಲ ಕಡ್ಡಾಯ ಅತ್ತ್.",
        "tooltip-pt-logout": "ಲಾಗ್ ಔಟ್",
-       "tooltip-pt-createaccount": "ನಿà²\95à³\81ಲà³\81 à²ªà³\8aಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಾà²\82ತà³\8dâ\80\8dದà³\8d à²²à²¾à²\97ಿನà³\8d à²\86ಪà³\81ನà³\88ನà³\8d à²ªà³\8dರà³\8bತà³\8dಸಾಹಿಸವà³\8a, à²\86à²\82ಡಲಾ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
+       "tooltip-pt-createaccount": "à²\87ರà³\8d  à²ªà³\8bಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಾà²\82ತà³\8dâ\80\8dದà³\8d, à²²à²¾à²\97ಿನà³\8d à²\86ಪà³\81ನà³\88ನà³\8d à²¬à³\86ರಿ à²¬à³\8aà²\9fà³\8dà²\9fà³\81ಪà³\8b, à²\86à²\82ಡ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
        "tooltip-ca-talk": "ಮಾಹಿತಿ ಪುಟೊತ ಬಗೆಟ್ ಚರ್ಚೆ",
        "tooltip-ca-edit": "ಈ ಪುಟೊನ್ ಸಂಪೊಲಿಪುಲೆ",
        "tooltip-ca-addsection": "ಪೊಸ ವಿಬಾಗೊನು ಸುರು ಮಲ್ಪುಲೆ",
        "tooltip-t-recentchangeslinked": "ಈ ಪುಟೊಡ್ದ್ ಸಂಪರ್ಕೊ ಉಪ್ಪುನಂಚಿನ ಪುಟೊಡ್ ಇಂಚಿಪೊದ ಬದಲಾವಣೆಲು",
        "tooltip-feed-rss": "ಈ ಪುಟೊಗು ಆರ್.ಎಸ್.ಎಸ್ ಫೀಡ್",
        "tooltip-feed-atom": "ಈ ಪುಟೊಗು ಆಟಮ್ ಫೀಡ್ ಮಲ್ಪುಲೆ",
-       "tooltip-t-contributions": "{{GENDER:$1|à²\88 à²¬à²³à²\95à³\86ದಾರà³\86ರà³\8d}}à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ ಕಾಣಿಕೆದ ಪಟ್ಟಿನ್ ತೋಜಾವು",
+       "tooltip-t-contributions": "{{GENDER:$1|à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ}} ಕಾಣಿಕೆದ ಪಟ್ಟಿನ್ ತೋಜಾವು",
        "tooltip-t-emailuser": "ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೇಲ್ ಕಡಪುಡ್ಲೆ",
        "tooltip-t-upload": "ಫೈಲನ್ ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
        "tooltip-t-specialpages": "ಪೂರ  ವಿಸೇಸೊ ಪುಟೊಲೆನ ಪಟ್ಟಿ",
        "svg-long-desc": "ಎಸ್.ವಿ.ಜಿ ಫೈಲ್, ಸುಮಾರಾದ್ $1 × $2 ಚಿತ್ರೊಬಿಂದು, ಫೈಲ್‍ದ ಗಾತ್ರ: $3",
        "show-big-image": "ಮೂಲೊ ಫೈಲ್",
        "show-big-image-preview": "ಪಿರವುದ ಪುಟೊದ ಗಾತ್ರೊ: $1.",
-       "show-big-image-other": "ಬà³\87ತà³\86{{PLURAL:$2|resolution|ನಿರà³\8dನಯà³\8aಲà³\81}}: $1.",
-       "show-big-image-size": "$1 × $2 ಚಿತ್ರೊಬಿಂದುಲು",
+       "show-big-image-other": "ಬà³\87ತà³\86{{PLURAL:$2|resolution|ಪà²\9fà³\8aತà³\8dತ à²\97ಾತà³\8dರà³\8a }}: $1.",
+       "show-big-image-size": "$1 × $2 ಚಿತ್ರೊ ಬಿಂದುಲು",
        "newimages-legend": "ಅರಿಪೆ",
        "ilsubmit": "ನಾಡ್‍ಲೆ",
        "bad_image_list": "ವ್ಯವಸ್ಥೆದ ಆಕಾರ ಈ ರೀತಿ ಉಂಡು:\n\nಪಟ್ಟಿಡುಪ್ಪುನಂಚಿನ ದಾಖಲೆಲೆನ್ (* ರ್ದ್ ಶುರು ಆಪುನ ಸಾಲ್’ಲು) ಮಾತ್ರ ಪರಿಗಣನೆಗ್ ದೆತೊನೆರಾಪುಂಡು.\nಪ್ರತಿ ಸಾಲ್’ದ ಶುರುತ ಲಿಂಕ್ ಒಂಜಿ ದೋಷ ಉಪ್ಪುನಂಚಿನ ಫೈಲ್’ಗ್ ಲಿಂಕಾದುಪ್ಪೊಡು.\nಅವ್ವೇ ಸಾಲ್’ದ ಶುರುತ ಪೂರಾ ಲಿಂಕ್’ಲೆನ್ ಪರಿಗನೆರ್ದ್ ದೆಪ್ಪೆರಾಪುಂಡು, ಪಂಡ ಓವು ಪುಟೊಲೆಡ್ ಫೈಲ್’ದ ಬಗ್ಗೆ ಬರ್ಪುಂಡೋ ಔಲು.",
        "exif-imagewidth": "ಅಗೆಲ",
        "exif-imagelength": "ಎತ್ತರೊ",
        "exif-orientation": "ದಿಕ್ಕ್ ದಿಸೆ",
-       "exif-xresolution": "à²\85ಡà³\8dಡà²\97ಲà³\8aದ à²°à³\86à²\9c಼ಲ್ಯೂಶನ್",
-       "exif-yresolution": "à²\89ದà³\8dದà³\8aದ à²°à³\86à²\9c಼ಲ್ಯೂಶನ್",
+       "exif-xresolution": "à²\85ಡà³\8dಡà²\97ಲà³\8aದ à²°à³\87ಸಲ್ಯೂಶನ್",
+       "exif-yresolution": "à²\89ದà³\8dದà³\8aದ à²°à³\87ಸಲ್ಯೂಶನ್",
        "exif-datetime": "ಫೈಲ್‍ನ್ ಬದಲಾವಣೆ ಮಲ್ತ್‌ನ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
        "exif-make": "ಕ್ಯಾಮರೊದ ತಯಾರೆಕೆರ್",
        "exif-model": "ಕ್ಯಾಮರೊದ ಮಾದರಿ",
        "exif-subjectdistancerange-0": "ಗೊತ್ತಿಜ್ಜಾಂದಿನ",
        "exif-iimcategory-hth": "ಆರೋಗ್ಯ",
        "namespacesall": "ಮಾತ",
-       "monthsall": "ಮಾತ",
+       "monthsall": "ಮಾà²\82ತಾ",
        "confirm_purge_button": "ಸರಿ",
        "confirm-watch-button": "ಸರಿ",
        "confirm-unwatch-button": "ಸರಿ",
        "tags-create-submit": "ಸೃಷ್ಟಿಸಾಲೆ",
        "tags-delete-reason": "ಕಾರಣ:",
        "tags-deactivate-reason": "ಕಾರಣ:",
-       "logentry-delete-delete": "$1{{GENDER:$2|ಮಾಜಾದ್‍ಂಡ್}}ಪುಟೊ $3",
+       "logentry-delete-delete": "$1{{GENDER:$2|ಮಾಜಾತುಂಡ್}}ಪುಟೊ $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restored}} ಪುಟೊ $3 ($4)",
+       "restore-count-files": "{{PLURAL:$1|1 file|$1 ವಿಸಯೊಲು}}",
        "logentry-move-move": "$1 {{GENDER:$2|ಜಾರಲೆ}} ಪುಟೊ $3 ಡ್ದ್ $4",
-       "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ನು {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತಾಂಡ್}}",
+       "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತಾಂಡ್}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3",
        "searchsuggest-search": "{{SITENAME}}ನ್ ನಾಡ್‍ಲೆ",
        "pagelang-reason": "ಕಾರಣೊ",
index 7b73c93..a2114de 100644 (file)
        "revdelete-radio-set": "Sin",
        "revdelete-radio-unset": "Lae",
        "revdelete-edit-reasonlist": "Edita lista motivu nian",
+       "history-title": "$1: Istória revisaun nian",
        "lineno": "Liña $1:",
        "searchresults": "Rezultadu sira",
        "searchresults-title": "Rezultadu sira ba buka \"$1\"",
        "undeletelink": "lee/restaurar",
        "undeleteviewlink": "haree",
        "undeletecomment": "Razaun:",
-       "undeletedrevisions": "restaurar {{PLURAL:$1|versaun|versaun}} $1",
        "undelete-search-submit": "Buka",
        "undelete-show-file-submit": "Sin",
        "namespace": "Espasu pájina nian:",
index 8c16c16..fd8bd87 100644 (file)
        "undeleteviewlink": "tingnan",
        "undeleteinvert": "Baligtarin ang pagpili/pilian",
        "undeletecomment": "Dahilan:",
-       "undeletedrevisions": "{{PLURAL:$1|1 pagbabago|$1 mga pagbabagong}} naibalik na",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 pagbabago|$1 mga pagbabago}} at {{PLURAL:$2|1 talaksang|$2 mga talaksang}} naibalik na",
-       "undeletedfiles": "{{PLURAL:$1|1 talaksang|$1 mga talaksang}} naibalik na",
        "cannotundelete": "Hindi matagumpay ang pagpapabalik mula sa pagkakabura; maaaring may isang nakauna na sa pagpapabalik ng pahina mula sa pagkakabura.",
        "undeletedpage": "'''Naibalik na ang $1'''\n\nTingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa isang talaan ng mga kamakailan lamang na mga pagbubura at mga pagbabalik mula sa pagkakabura.",
        "undelete-header": "Tingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa kamakailan lamang na  binura/naburang mga pahina.",
index fa6ea89..39e8627 100644 (file)
        "privacypage": "Project:Gizlilik Politikası",
        "badaccess": "İzin hatası",
        "badaccess-group0": "Bu işlemi yapma yetkiniz yok.",
-       "badaccess-groups": "Yapmak istediğiniz işlem, sadece {{PLURAL:$2|şu gruptaki|şu gruplardaki}} kullanıcılar tarafından yapılabilir: $1",
+       "badaccess-groups": "İstediğiniz işlem, $1 {{PLURAL:$2|grubundaki|gruplarındaki}} kullanıcılarla sınırlıdır.",
        "versionrequired": "MediaWiki'nin $1 sürümü gerekiyor",
        "versionrequiredtext": "Bu sayfayı kullanmak için MediaWiki'nin $1 sürümü gerekmektedir. [[Special:Version|Sürüm sayfasına]] bakınız.",
        "ok": "Tamam",
        "newmessagesdifflinkplural": "son {{PLURAL:$1|değişiklik|değişiklik}}",
        "youhavenewmessagesmulti": "$1'de yeni mesajınız var",
        "editsection": "düzenle",
-       "editold": "değiştir",
+       "editold": "düzenle",
        "viewsourceold": "kaynağı gör",
-       "editlink": "değiştir",
+       "editlink": "düzenle",
        "viewsourcelink": "kaynağı gör",
        "editsectionhint": "Değiştirilen bölüm: $1",
        "toc": "İçindekiler",
        "unexpected": "beklenmeyen değer: \"$1\"=\"$2\".",
        "formerror": "Hata: Form gönderilemiyor.",
        "badarticleerror": "Bu işlem bu sayfada gerçekleştirilemez.",
-       "cannotdelete": "\"$1\" sayfa ya da dosyası silinemedi.\nBaşka bir kullanıcı tarafından zaten silinmiş olabilir.",
+       "cannotdelete": "\"$1\" adlı sayfa veya dosya silinemedi.\nBaşka bir kullanıcı tarafından daha önce silinmiş olabilir.",
        "cannotdelete-title": "\"$1\" sayfası silinemiyor",
        "delete-hook-aborted": "Silme işlemi uzantı kancası tarafından durduruldu. \nBir açıklama sunulmadı.",
        "no-null-revision": "\"$1\" sayfası için yeni boş bir sürüm oluşturulamadı",
        "password-name-match": "Parolanız kullanıcı adınızdan farklı olmalıdır.",
        "password-login-forbidden": "Bu kullanıcı adı ve parolanın kullanımı yasaklanmıştır.",
        "mailmypassword": "Parolayı sıfırla",
-       "passwordremindertitle": "{{SITENAME}} için yeni geçici şifre",
+       "passwordremindertitle": "{{SITENAME}} için yeni geçici parola",
        "passwordremindertext": "Birisi (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için yeni bir parola gönderilmesi istedi. \"$2\" kullanıcısına geçici olarak \"$3\" parolası oluşturuldu. Eğer bu sizin isteğiniz ise, oturum açıp yeni bir parola oluşturmanız gerekmektedir. Geçici parolanızın süresi {{PLURAL:$5|1 gün|$5 gün}} içinde dolacaktır.\n\nParola değişimini siz istemediyseniz veya parolanızı hatırladıysanız ve artık parolanızı değiştirmek istemiyorsanız; bu mesajı önemsemeyerek eski parolanızı kullanmaya devam edebilirsiniz.",
        "noemail": "\"$1\" adlı kullanıcıya kayıtlı bir e-posta adresi yok.",
        "noemailcreate": "Geçerli bir e-posta adresi sağlamalısınız",
        "eauthentsent": "Belirtilen e-posta adresine onay kodu içeren bir e-posta gönderildi.\nHesaba başka bir e-posta gönderilmeden önce, e-postadaki yönergeleri uygulayıp, hesabın gerçekten size ait olduğunu onaylamanız gerekir.",
        "throttled-mailpassword": "Bir parola sıfırlama e-postası son {{PLURAL:$1|bir saat|$1 saat}} içinde zaten gönderildi. Hizmeti kötüye kullanmayı önlemek için, her {{PLURAL:$1|bir saatte|$1 saatte}} sadece bir parola sıfırlama e-postası gönderilecektir.",
        "mailerror": "E-posta gönderim hatası: $1",
-       "acct_creation_throttle_hit": "Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler $2 içinde {{PLURAL:$1|1 hesap|$1 hesap}} oluşturdu, bu sayı bu zaman aralığında izin verilen azami sayıdır.\nSonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap açamazlar.",
+       "acct_creation_throttle_hit": "Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler son $2 içinde $1 hesap oluşturdu ve bu sayı bu zaman aralığında izin verilen azami sayıdır.\nSonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap açamazlar.",
        "emailauthenticated": "E-posta adresiniz $2 $3 tarihinde onaylandı.",
        "emailnotauthenticated": "E-posta adresiniz henüz onaylanmadı.\nAşağıdaki işlevlerin hiçbiri için e-posta gönderilmeyecektir.",
        "noemailprefs": "Bu özelliklerin çalışması için bir e-posta adresi belirtiniz.",
        "changepassword-throttled": "Çok fazla yeni oturum açma girişiminde bulundunuz.\nLütfen tekrar denemeden önce $1 bekleyin.",
        "botpasswords": "Bot parolaları",
        "botpasswords-summary": "<em>Bot şifreleri,</em> hesabın ana giriş kimlik bilgilerini kullanmadan API aracılığıyla bir kullanıcı hesabına erişime izin verir. Bir bot şifresi ile giriş yaptığınızda mevcut kullanıcı hakları kısıtlanabilir.\n\nBunu neden yapmak isteyebileceğinizi bilmiyorsanız, yapmayınız. Hiç kimse sizden bunlardan birini üretip onlara vermenizi istememelidir.",
-       "botpasswords-disabled": "Bot şifreleri devre dışı.",
-       "botpasswords-no-central-id": "Bot şifresini kullanmak için, merkezi bir hesap ile giriş yapmalısınız.",
-       "botpasswords-existing": "Mevcut bot şifreleri",
-       "botpasswords-createnew": "Yeni bir bot şifresi oluştur",
-       "botpasswords-editexisting": "Mevcut bir bot şifresini düzenle",
+       "botpasswords-disabled": "Bot parolaları devre dışı.",
+       "botpasswords-no-central-id": "Bot parolaları kullanmak için, merkezi bir hesap ile oturum açmalısınız.",
+       "botpasswords-existing": "Mevcut bot parolaları",
+       "botpasswords-createnew": "Yeni bir bot parolası oluştur",
+       "botpasswords-editexisting": "Mevcut bir bot parolasını düzenle",
        "botpasswords-label-appid": "Bot ismi:",
        "botpasswords-label-create": "Oluştur",
        "botpasswords-label-update": "Güncelle",
        "botpasswords-bad-appid": "Bot ismi \"$1\" geçerli değil.",
        "botpasswords-insert-failed": "Bot adı \"$1\" eklenemedi. Zaten eklenmiş olmalı?",
        "botpasswords-update-failed": "Bot ismini \"$1\" olarak güncelleme başarısız oldu. Silinmiş olabilir mi?",
-       "botpasswords-created-title": "Bot şifresi oluşturuldu.",
-       "botpasswords-created-body": "\"$2\" adlı kullanıcının \"$1\" isimli botu için şifre oluşturuldu.",
-       "botpasswords-updated-title": "Bot şifresi guncellendi",
-       "botpasswords-updated-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi güncellendi.",
-       "botpasswords-deleted-title": "Bot şifresi silindi.",
-       "botpasswords-deleted-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi silindi.",
+       "botpasswords-created-title": "Bot parolası oluşturuldu",
+       "botpasswords-created-body": "\"$2\" adlı kullanıcının \"$1\" adlı botu için bot parolası oluşturuldu.",
+       "botpasswords-updated-title": "Bot parolası güncellendi",
+       "botpasswords-updated-body": "\"$2\" adlı kullanıcının \"$1\" adlı botunun bot parolası güncellendi.",
+       "botpasswords-deleted-title": "Bot parolası silindi",
+       "botpasswords-deleted-body": "\"$2\" adlı kullanıcının \"$1\" adlı botunun bot parolası silindi.",
        "botpasswords-newpassword": "<strong>$1</strong> ile oturum açmak için yeni şifre: <strong>$2</strong>. <em>İlerde başvurmak için lütfen kaydedin.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider kullanılamaz.",
-       "botpasswords-restriction-failed": "Bot şifresi sınırlamaları oturum açmayı engelledi.",
-       "botpasswords-invalid-name": "Belirtilen kullanıcı adı bot şifresi ayırıcısını içermiyor (\"$1\").",
+       "botpasswords-restriction-failed": "Bot parolası kısıtlamaları bu oturum açma işlemini önlemektedir.",
+       "botpasswords-invalid-name": "Belirtilen kullanıcı adı bot parolası ayırıcısı içermiyor (\"$1\").",
        "resetpass_forbidden": "Parolalar değiştirilememektedir",
        "resetpass_forbidden-reason": "Şifre değiştirilemedi: $1",
        "resetpass-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
        "token_suffix_mismatch": "'''Değişikliğiniz geri çevrildi çünkü alıcınız düzenleme kutucuğundaki noktalama işaretlerini bozdu.\nDeğişikliğiniz, sayfa metninde bozulmayı önlemek için geri çevrildi.\nEğer sorunlu bir web-tabanlı anonim proksi servisi kullanıyorsanız bu olay bazen gerçekleşebilir.'''",
        "edit_form_incomplete": "'''Değişiklik formu için bazı sunuculara erişilemedi; yaptığınız değişiklikler bozulmamıştır, gözden geçirip tekrar deneyiniz.'''",
        "editing": "\"$1\" sayfasını değiştirmektesiniz",
-       "creating": "Oluşturuluyor $1",
+       "creating": "$1 sayfasını oluşturuyorsunuz",
        "editingsection": "\"$1\" sayfasında bölüm değiştirmektesiniz",
        "editingcomment": "$1 değiştiriliyor (yeni bölüm)",
        "editconflict": "Değişiklik çakışması: $1",
        "mergehistory-same-destination": "Kaynak ve hedef sayfaları aynı olamaz",
        "mergehistory-reason": "Sebep:",
        "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
-       "mergelog": "Birleştirme kaydı",
+       "mergelog": "Birleştirme günlüğü",
        "revertmerge": "Ayır",
        "mergelogpagetext": "Aşağıdaki liste, sayfaların geçmiş versiyonlarının birbirleriyle en son birleştirilmelerini içerir",
        "history-title": "\"$1\" sayfasının geçmişi",
        "searchprofile-images-tooltip": "Dosya ara",
        "searchprofile-everything-tooltip": "Tüm içerikte ara (tartışma sayfaları dahil)",
        "searchprofile-advanced-tooltip": "Özel ad alanlarında ara",
-       "search-result-size": "$1 ({{PLURAL:$2|1 kelime|$2 kelime}})",
+       "search-result-size": "$1 ($2 sözcük)",
        "search-result-category-size": "{{PLURAL:$1|1 üye|$1 üye}} ({{PLURAL:$2|1 altkategori|$2 altkategori}}, {{PLURAL:$3|1 dosya|$3 dosya}})",
        "search-redirect": "($1 sayfasından yönlendirme)",
        "search-section": "($1 bölümü)",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokratlar",
        "grouppage-suppress": "{{ns:project}}:Gözetmen",
        "right-read": "Sayfaları oku",
-       "right-edit": "Sayfaları değiştir",
+       "right-edit": "Sayfaları düzenle",
        "right-createpage": "Sayfa oluştur (tartışma sayfası olmayan)",
        "right-createtalk": "Tartışma sayfaları oluştur",
        "right-createaccount": "Yeni kullanıcı hesapları yarat",
        "rcfilters-invalid-filter": "Geçersiz süzgeç",
        "rcfilters-empty-filter": "Etkin süzgeç bulunmuyor. Tüm katkıları gösteriliyor.",
        "rcfilters-filterlist-title": "Süzgeçler",
+       "rcfilters-filterlist-whatsthis": "Bu nedir?",
        "rcfilters-filterlist-feedbacklink": "Yeni (beta) süzgeçler konusunda geribildirim verin",
        "rcfilters-highlightbutton-title": "Sonuçları vurgula",
        "rcfilters-highlightmenu-title": "Bir renk seçin",
        "rcfilters-filter-unpatrolled-label": "Devriye onayından geçmemiş",
        "rcfilters-filter-unpatrolled-description": "Devriye onayından geçmiş olarak işaretlenmeyen düzenlemeler.",
        "rcfilters-filtergroup-significance": "Önem",
-       "rcfilters-filter-minor-label": "Küçük değişiklikler",
+       "rcfilters-filter-minor-label": "Küçük düzenlemeler",
        "rcfilters-filter-minor-description": "Yazarın küçük olarak etiketlediği düzenlemeler.",
-       "rcfilters-filter-major-label": "Küçük olmayan değişiklikler",
+       "rcfilters-filter-major-label": "Küçük olmayan düzenlemeler",
        "rcfilters-filter-major-description": "Küçük olarak etiketlenmemiş düzenlemeler.",
        "rcfilters-filtergroup-changetype": "Değişiklik türü",
        "rcfilters-filter-pageedits-label": "Sayfa düzenlemeleri",
        "rcfilters-filter-categorization-label": "Kategori değişiklikleri",
        "rcfilters-filter-categorization-description": "Kategorilere eklenen veya kaldırılan sayfaların kayıtları.",
        "rcfilters-filter-logactions-label": "Günlüğü tutulan işlemler",
+       "rcfilters-filter-logactions-description": "Hizmetli işlemleri, hesap oluşturmalar, sayfa silmeler, yüklemeler....",
        "rcnotefrom": "<strong>$3, $4</strong> tarihinden itibaren yapılan {{PLURAL:$5|değişiklik|değişiklik}} aşağıdadır (<strong>$1</strong> tarhine kadar olanlar gösterilmektedir).",
        "rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster",
        "rcshowhideminor": "Küçük değişiklikleri $1",
        "filerevert-submit": "Eski haline döndür",
        "filerevert-success": "'''[[Media:$1|$1]]''' dosyası [$4 $3, $2 tarihli sürüme] geri döndürüldü.",
        "filerevert-badversion": "Bu dosyanın verilen zaman bilgisine sahip önceki bir yerel sürümü yok.",
-       "filedelete": "Sil $1",
+       "filedelete": "$1 adlı dosyayı sil",
        "filedelete-legend": "Dosya sil",
        "filedelete-intro": "'''[[Media:$1|$1]]''' dosyasını tüm geçmişiyle birlikte silmek üzeresiniz.",
        "filedelete-intro-old": "'''[[Media:$1|$1]]''' dosyasının [$4 $3, $2] tarihli sürümünü siliyorsunuz.",
        "filedelete-comment": "Neden:",
-       "filedelete-submit": "sil",
+       "filedelete-submit": "Sil",
        "filedelete-success": "'''$1''' silindi.",
        "filedelete-success-old": "'''[[Media:$1|$1]]''' dosyasının $3, $2 tarihli sürümü silindi.",
        "filedelete-nofile": "'''$1''' mevcut değildir.",
        "double-redirect-fixed-move": "[[$1]] taşındı.\nYönlendirme otomatik olarak güncellendi ve [[$2]] sayfasına yönlendirildi.",
        "double-redirect-fixed-maintenance": "[[$1]] sayfasından [[$2]] sayfasına yapılan çift yönlendirme otomatik olarak düzeltiliyor.",
        "double-redirect-fixer": "Yönlendirme tamircisi",
-       "brokenredirects": "Boş yönlendirmeler",
+       "brokenredirects": "Var olmayan sayfalara yönlendirmeler",
        "brokenredirectstext": "Aşağıdaki yönlendirmeler varolmayan sayfalara bağlantı veriyor:",
-       "brokenredirects-edit": "değiştir",
+       "brokenredirects-edit": "düzenle",
        "brokenredirects-delete": "sil",
        "withoutinterwiki": "Diğer dillere bağlantısı olmayan sayfalar",
        "withoutinterwiki-summary": "Aşağıda listelenen sayfalar diğer dillere bağlantı içermemektedir:",
        "allarticles": "Tüm maddeler",
        "allinnamespace": "Tüm sayfalar ($1 sayfaları)",
        "allpagessubmit": "Getir",
-       "allpagesprefix": "Buraya yazdığınız harflerle başlayan sayfaları listeleyin:",
+       "allpagesprefix": "Şu öneke sahip sayfaları görüntüle:",
        "allpagesbadtitle": "Girilen sayfa ismi diller arası bağlantı ya da vikiler arası bağlantı içerdiğinden geçerli değil. Başlıklarda kullanılması yasak olan bir ya da daha çok karakter içeriyor olabilir.",
        "allpages-bad-ns": "{{SITENAME}} sitesinde \"$1\" ad alanı yok.",
        "allpages-hide-redirects": "Yönlendirmeleri gizle",
        "emailfrom": "Kimden:",
        "emailto": "Kime:",
        "emailsubject": "Konu:",
-       "emailmessage": "E-posta:",
+       "emailmessage": "İleti:",
        "emailsend": "Gönder",
        "emailccme": "Mesajın bir kopyasını da bana gönder.",
        "emailccsubject": "$1'e gönderdiğiniz mesajın kopyası: $2",
        "emailsent": "E-posta gönderildi",
-       "emailsenttext": "E-postaz gönderildi.",
+       "emailsenttext": "E-posta iletiniz gönderildi.",
        "emailuserfooter": "Bu e-posta $1 tarafından $2 kullanıcısına, {{SITENAME}} sitesindeki \"Kullanıcıya e-posta gönder\" (\"{{int:emailuser}}\") fonksiyonu ile gönderilmiştir.",
        "usermessage-summary": "Sistem mesajı bırakın.",
        "usermessage-editor": "Sistem habercisi",
        "excontentauthor": "eski içerik: '$1' ('[[Special:Contributions/$2|$2]]' katkıda bulunmuş olan tek kullanıcı)",
        "exbeforeblank": "Silinmeden önceki içerik: '$1'",
        "delete-confirm": "\"$1\" sayfasını sil",
-       "delete-legend": "sil",
+       "delete-legend": "Sil",
        "historywarning": "<strong>Uyarı:</strong> Silmek üzere olduğunuz sayfanın yaklaşık olarak $1 sürüme sahip bir geçmişi var:",
        "historyaction-submit": "Göster",
        "confirmdeletetext": "Bu sayfayı veya dosyayı tüm geçmişi ile birlikte veritabanından kalıcı olarak silmek üzeresiniz.\nBu işlemden kaynaklı doğabilecek sonuçların farkında iseniz ve işlemin [[{{MediaWiki:Policy-url}}|Silme kurallarına]] uygun olduğuna eminseniz, işlemi onaylayın.",
        "actionfailed": "İşlem başarısız oldu",
        "deletedtext": "\"$1\" silindi.\nYakın zamanda silinenleri görmek için: $2.",
        "dellogpage": "Silme günlüğü",
-       "dellogpagetext": "Aşağıdaki liste son silme kayıtlarıdır.",
+       "dellogpagetext": "Aşağıda en son silme işlemlerinin bir listesi bulunmaktadır.",
        "deletionlog": "silme günlüğü",
        "reverted": "Önceki sürüm geri getirildi",
        "deletecomment": "Neden:",
        "rollbackfailed": "geri alma işlemi başarısız",
        "cantrollback": "Sayfaya son katkıda bulunan kullanıcı, sayfaya katkıda bulunmuş tek kişi olduğu için, değişiklikler geri alınamıyor.",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tarafından [[:$1]] sayfasında yapılmış son değişiklik geri döndürülemiyor;\nbaşka birisi sayfada değişiklik yaptı ya da sayfayı geri döndürdü.\n\nSon değişikliği yapan: [[User:$3|$3]] ([[User talk:$3|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "Değişiklik özeti: <em>$1</em> idi.",
+       "editcomment": "Düzenleme özeti şöyleydi: <em>$1</em>.",
        "revertpage": "[[Special:Contributions/$2|$2]] [[User talk:$2|mesaj]] tarafından yapılan değişiklikler geri alınarak, [[User:$1|$1]] tarafından değiştirilmiş önceki sürüm geri getirildi.",
        "revertpage-nouser": "Gizli bir kullanıcı tarafından yapılan değişiklikler geri alınarak {{GENDER:$1|[[User:$1|$1]]}} tarafından yapılan son revizyon geri getirildi",
        "rollback-success": "$1 tarafından yapılan değişiklikler geri alınarak;\n$2 tarafından değiştirilmiş önceki sürüme geri dönüldü.",
        "sessionfailure-title": "Oturum başarısızlığı",
        "sessionfailure": "Giriş oturumunuzla ilgili bir sorun var gibi görünüyor;\nbu eylem, oturum gaspına karşı önlem olarak iptal edildi.\nLütfen \"geri\" gidin ve geldiğiniz sayfayı yeniden yükleyin, sonra tekrar deneyin.",
+       "changecontentmodel": "Bir sayfanın içerik modelini değiştir",
        "changecontentmodel-title-label": "Sayfa başlığı",
        "changecontentmodel-model-label": "Yeni içerik modeli",
        "changecontentmodel-reason-label": "Gerekçe:",
        "minimum-size": "En küçük boyut",
        "maximum-size": "En büyük boyut:",
        "pagesize": "(bayt)",
-       "restriction-edit": "değiştir",
+       "restriction-edit": "Düzenle",
        "restriction-move": "Taşı",
        "restriction-create": "Oluştur",
        "restriction-upload": "Yükle",
        "undeleteviewlink": "görüntüle",
        "undeleteinvert": "Seçimi ters çevir",
        "undeletecomment": "Neden:",
-       "undeletedrevisions": "Toplam {{PLURAL:$1|1 kayıt|$1 kayıt}} geri getirildi.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revizyon|$1 revizyon}} ve {{PLURAL:$2|1 dosya|$2 dosya}} eski konumuna getirildi",
-       "undeletedfiles": "{{PLURAL:$1|1 dosya|$1 dosya}} geri getirildi.",
-       "cannotundelete": "Silme başarısız oldu:\n$1",
+       "cannotundelete": "Geri getirme işlemlerinden bazıları veya tümü başarısız oldu:\n$1",
        "undeletedpage": "'''$1 sayfası geri getirildi'''\n\nÖnceki silme ve geri getirme işlemleri için [[Special:Log/delete|silme kayıtları]]na bakınız.",
        "undelete-header": "Yakın zamanda silinen sayfaları görmek için [[Special:Log/delete|silme günlüğü]]ne bakın.",
        "undelete-search-title": "Silinen sayfaları ara",
        "sp-contributions-newbies": "Sadece yeni kullanıcıların katkılarını göster",
        "sp-contributions-newbies-sub": "Yeni kullanıcılar için",
        "sp-contributions-newbies-title": "Yeni hesaplar için kullanıcı katkıları",
-       "sp-contributions-blocklog": "Engel kaydı",
+       "sp-contributions-blocklog": "engelleme günlüğü",
        "sp-contributions-suppresslog": "kullanıcının silinen katkıları",
        "sp-contributions-deleted": "kullanıcının silinen katkıları",
        "sp-contributions-uploads": "yüklenenler",
        "blockip": "{{GENDER:$1|Kullanıcıyı}} engelle",
        "blockip-legend": "Kullanıcıyı engelle",
        "blockiptext": "Aşağıdaki formu kullanarak belli bir IP'nin veya kayıtlı kullanıcının değişiklik yapmasını engelleyebilirsiniz. Bu sadece vandalizmi engellemek için ve [[{{MediaWiki:Policy-url}}|kurallara]] uygun olarak yapılmalı. Aşağıya mutlaka engelleme ile ilgili bir açıklama yazınız. (örnek: -Şu- sayfalarda vandalizm yapmıştır).",
-       "ipaddressorusername": "IP adresi veya kullanıcı adı",
+       "ipaddressorusername": "IP adresi veya kullanıcı adı:",
        "ipbexpiry": "Bitiş süresi",
        "ipbreason": "Neden:",
        "ipbreason-dropdown": "*Genel engelleme nedenleri\n** Yanlış bilgi eklemek\n** Sayfalardan içeriği çıkarmak\n** Dış sitelere spam bağlantı vermek\n** Sayfalara mantıksız/anlaşılmaz sözler eklemek\n** Tehditvari davranış/Taciz\n** Birden fazla hesabı kötüye kullanmak\n** Kabul edilemez kullanıcı adı",
        "ipb-change-block": "Bu ayarlarla kullanıcıyı yeniden engelle",
        "ipb-confirm": "Engeli onayla",
        "badipaddress": "Geçersiz IP adresi",
-       "blockipsuccesssub": "IP adresi engelleme işlemi başarılı oldu",
+       "blockipsuccesssub": "Engelleme başarılı oldu",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] engellendi.<br />\nEngellemeleri gözden geçirmek için [[Special:BlockList|engel listesine]] bakınız.",
        "ipb-blockingself": "Kendinizi engellemek üzeresiniz! Bunu yapmak istediğinizden emin misiniz?",
        "ipb-confirmhideuser": "\"Kullanıcıyı gizle\" seçiliyken bir kullanıcı engellemek üzeresiniz. Bu, kullanıcının adını tüm listeler ile günlük girişlerinde bastıracaktır. Bunu yapmak istediğinizden emin misiniz?",
        "ipb-confirmaction": "Bunu gerçekten yapmak istediğinize eminseniz, lütfen en alttaki \"{{int:ipb-confirm}}\" alanını işaretleyin.",
        "ipb-edit-dropdown": "Engelleme nedenleri düzenle",
        "ipb-unblock-addr": "$1 için engellemeyi kaldır",
-       "ipb-unblock": "Engellemeyi kaldır",
+       "ipb-unblock": "Bir kullanıcı adı veya IP adresinin engellemesini kaldır",
        "ipb-blocklist": "Mevcut olan engellemeleri göster",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} için katkılar",
        "unblockip": "Kullanıcının engellemesini kaldır",
        "unblockiptext": "Daha önceden engellenmiş bir IP adresine ya da kullanıcı adına yazma erişimini geri vermek için aşağıdaki formu kullanın.",
        "ipusubmit": "Bu engellemeyi kaldır",
        "unblocked": "[[User:$1|$1]] - engelleme kaldırıldı",
-       "unblocked-range": "$1 engeli kaldırıldı",
+       "unblocked-range": "$1 adlı kullanıcının engeli kaldırıldı.",
        "unblocked-id": "$1 engeli çıkarıldı",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] engellenmiştir.",
        "blocklist": "Engellenmiş kullanıcılar",
        "blocklist-target": "Hedef",
        "blocklist-expiry": "Bitiş tarihi",
        "blocklist-by": "Engeli veren hizmetli",
-       "blocklist-params": "Engel parametreleri",
+       "blocklist-params": "Engelleme parametreleri",
        "blocklist-reason": "Gerekçe",
        "ipblocklist-submit": "Ara",
        "ipblocklist-localblock": "Yerel engelleme",
        "ipblocklist-otherblocks": "Diğer {{PLURAL:$1|engelleme|engellemeler}}",
        "infiniteblock": "Süresiz",
        "expiringblock": "$1 $2 tarihinde doluyor",
-       "anononlyblock": "sadece anonim",
+       "anononlyblock": "yalnızca anonim",
        "noautoblockblock": "otomatik engelleme devre dışı bırakıldı",
        "createaccountblock": "hesap açımı engellendi",
        "emailblock": "e-posta engellendi",
        "ipblocklist-empty": "Engelleme listesi boş.",
        "ipblocklist-no-results": "İstenen IP adresi ya da kullanıcı adı engellenmedi.",
        "blocklink": "engelle",
-       "unblocklink": "engeli kaldır",
+       "unblocklink": "engellemeyi kaldır",
        "change-blocklink": "engeli değiştir",
        "contribslink": "katkılar",
        "emaillink": "e-posta gönder",
        "autoblocker": "Otomatik olarak engellendiniz çünkü yakın zamanda IP adresiniz \"[[User:$1|$1]]\" kullanıcısı tarafından  kullanılmıştır. $1 isimli kullanıcının engellenmesi için verilen sebep: \"'''$2'''\"",
-       "blocklogpage": "Engel kaydı",
+       "blocklogpage": "Engelleme günlüğü",
        "blocklog-showlog": "Bu kullanıcı daha önceden engellenmiş.\nEngelleme günlüğü referans için aşağıda sağlanmıştır:",
        "blocklog-showsuppresslog": "Bu kullanıcı daha önceden engellenmiş ve gizlenmiş.\nGizleme günlüğü referans için aşağıda sağlanmıştır:",
-       "blocklogentry": ", [[$1]] kullanıcısını engelledi, engelleme süresi: $2 $3",
-       "reblock-logentry": "[[$1]] için bitiş tarihi $2 $3 olmak üzere engelleme ayarlarını değiştirdi",
+       "blocklogentry": ", [[$1]] adlı kullanıcıyı $2 süreyle ve $3 gerekçesiyle engelledi.",
+       "reblock-logentry": ", [[$1]] adlı kullanıcı için engelleme ayarlarını değiştirdi ve bitiş süresini $2 olarak belirledi $3",
        "blocklogtext": "Bu, kullanıcı engelleme ve engel kaldırma işlemlerinin bir günlüğüdür.\nOtomatik olarak engellenen IP adresleri listelenmemiştir.\nŞu anda geçerli yasaklama ve engellemelerin listesi için [[Special:BlockList|engelleme listesi]]ne bakın.",
-       "unblocklogentry": "$1 kullanıcının engellemesi kaldırıldı",
+       "unblocklogentry": ", $1 adlı kullanıcının engellemesini kaldırdı",
        "block-log-flags-anononly": "sadece anonim kullanıcılar",
        "block-log-flags-nocreate": "hesap yaratımı engellendi",
        "block-log-flags-noautoblock": "Otomatik engelleme iptal edildi",
        "cant-move-to-category-page": "Bir sayfayı, bir kategoriye taşımaya izniniz yok.",
        "newtitle": "Yeni başlık:",
        "move-watch": "Bu sayfayı izle",
-       "movepagebtn": "İsmi değiştir",
+       "movepagebtn": "Sayfayı taşı",
        "pagemovedsub": "İsim değişikliği tamamlandı.",
        "movepage-moved": "'''\"$1\",  \"$2\" sayfasına taşındı'''",
        "movepage-moved-redirect": "Bir yönlendirme oluşturuldu.",
        "movepage-page-moved": "$1 sayfası $2 sayfasına taşındı.",
        "movepage-page-unmoved": "$1 sayfası $2 başlığına taşınamıyor.",
        "movepage-max-pages": "En fazla $1 {{PLURAL:$1|sayfa|sayfa}} taşındı ve daha fazlası otomatik olarak taşınamaz.",
-       "movelogpage": "Taşıma kaydı",
+       "movelogpage": "Taşıma günlüğü",
        "movelogpagetext": "Aşağıda bulunan liste adı değiştirilmiş sayfaları gösterir.",
        "movesubpage": "{{PLURAL:$1|Alt sayfa|Alt sayfalar}}",
        "movesubpagetext": "Bu sayfanın aşağıda gösterilen $1 {{PLURAL:$1|altsayfası|altsayfası}} vardır.",
        "allmessagesname": "Ad",
        "allmessagesdefault": "Varsayılan ileti metni",
        "allmessagescurrent": "Kullanımdaki metin",
-       "allmessagestext": "Bu liste  MediaWiki ad alanında mevcut olan sistem mesajlarının listesidir.\nGenel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Yerelleştirmesi] ve [https://translatewiki.net translatewiki.net] sayfalarını ziyaret edin.",
-       "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' kapalı olduğu için '''{{ns:special}}:Allmessages''' kullanıma açık değil.",
+       "allmessagestext": "Bu liste, MediaWiki ad alanında bulunan sistem iletilerinin listesidir.\nGenel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Yerelleştirmesi] ve [https://translatewiki.net translatewiki.net] sayfalarını ziyaret edin.",
+       "allmessagesnotsupportedDB": "Bu sayfa kullanılamıyor, çünkü <strong>$wgUseDatabaseMessages</strong> devre dışı bırakıldı.",
        "allmessages-filter-legend": "Filtre",
        "allmessages-filter": "Özelleştirme durumuna göre filtrele:",
        "allmessages-filter-unmodified": "Değiştirilmemiş",
        "thumbnail_gd-library": "Eksik GD kütüphanesi yapılandırması: kayıp fonksiyon $1",
        "thumbnail_image-missing": "Dosya kayıp gibi görünüyor: $1",
        "thumbnail_image-failure-limit": "Yakın zamanda bu küçük resmin oluşturulması için çok fazla başarısız  girişim oldu ($1 ya da daha fazla). Lütfen daha sonra yeniden deneyin.",
-       "import": "Sayfaları aktar",
+       "import": "Sayfaları içe aktar",
        "importinterwiki": "Başka bir vikiden içe aktar",
        "import-interwiki-text": "İçe aktarmak için bir viki ve sayfa başlığı seçin.\nRevizyon tarihleri ve yazarların isimleri korunacaktır.\nBütün vikilerarası içe aktarım eylemleri [[Special:Log/import|içe aktarım günlüğünde]] kaydedilmektedir.",
        "import-interwiki-sourcewiki": "Kaynak viki:",
        "patrol-log-page": "Devriye günlüğü",
        "patrol-log-header": "Bu gözlenmiş revizyonların günlüğüdür.",
        "log-show-hide-patrol": "Gözetim günlüğünü $1",
-       "log-show-hide-tag": "$1 Etiket günlüğü",
+       "log-show-hide-tag": "Etiket günlüğünü $1",
        "deletedrevision": "$1 sayılı eski sürüm silindi.",
        "filedeleteerror-short": "$1 dosyanın silinmesinde hata oldu",
        "filedeleteerror-long": "Dosyayı silerken hatalarla karşılaşıldı:\n\n$1",
        "table_pager_limit_submit": "Git",
        "table_pager_empty": "Sonuç yok",
        "autosumm-blank": "Sayfa boşaltıldı",
-       "autosumm-replace": "Sayfa içeriği '$1' ile değiştiriliyor",
+       "autosumm-replace": "Sayfa içeriği '$1' ile değiştirildi",
        "autoredircomment": "[[$1]] sayfasına yönlendirildi",
        "autosumm-new": "Yeni sayfa: \"$1\"",
        "autosumm-newblank": "Boş bir sayfa oluşturdu",
        "revdelete-uname-unhid": "kullanıcı adı gösterildi",
        "revdelete-restricted": "hizmetliler için uygulanmış kısıtlamalar",
        "revdelete-unrestricted": "hizmetliler için kaldırılmış kısıtlamalar",
-       "logentry-block-block": "$1 {{GENDER:$2|engelledi}} {{GENDER:$4|$3}} engelleme süresi: $5 $6",
-       "logentry-block-unblock": "$1 kullanıcısının {{GENDER:$2|engeli kaldırıldı}} {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1, {{GENDER:$4|$3}} kullanıcısının engellenme süresini $5 $6 olarak {{GENDER:$2|değiştirdi}}",
+       "logentry-block-block": "$1, {{GENDER:$4|$3}} adlı kullanıcıyı $5 süreyle {{GENDER:$2|engelledi}} $6",
+       "logentry-block-unblock": "$1, {{GENDER:$4|$3}} adlı kullanıcının {{GENDER:$2|engelini kaldırdı}}",
+       "logentry-block-reblock": "$1, {{GENDER:$4|$3}} adlı kullanıcının engellenme süresini $5 olarak {{GENDER:$2|değiştirdi}} $6",
        "logentry-suppress-block": "{{GENDER:$4|$3}} $1 tarafından {{GENDER:$2|engellendi}} Zamanaşımı: $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} engelleme süresi $5 $6",
        "logentry-import-upload": "$1 dosya yükleme ile {{GENDER:$2|içe aktardı}}: $3",
        "api-error-stashfailed": "İç hata: Sunucu, geçici dosyaları kaybetti.",
        "api-error-unknown-warning": "Bilinmeyen uyarı: $1",
        "api-error-unknownerror": "Bilinmeyen hata: \"$1\".",
-       "duration-seconds": "$1 {{PLURAL:$1|saniye|saniye}}",
+       "duration-seconds": "$1 saniye",
        "duration-minutes": "$1 {{PLURAL:$1|dakika|dakika}}",
        "duration-hours": "$1 {{PLURAL:$1|saat|saat}}",
        "duration-days": "$1 {{PLURAL:$1|gün|gün}}",
index 2646210..b7a3ed0 100644 (file)
        "undeleteviewlink": "карау",
        "undeleteinvert": "Киресен сайлау",
        "undeletecomment": "Сәбәп:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|үзгәреш}} яңадан {{PLURAL:$1|торгызылды}}",
        "undelete-search-submit": "Эзләү",
        "undelete-error-long": "Файлны торгызу вакытында хаталар чыкты:\n\n$1",
        "undelete-show-file-submit": "Әйе",
index 656d81a..b4e4c93 100644 (file)
        "undeleteviewlink": "переглянути",
        "undeleteinvert": "Інвертувати виділення",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|редагування|редагування|редагувань}} відновлено",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|версія|версії|версій}} та $2 {{PLURAL:$2|файл|файли|файлів}} відновлено",
-       "undeletedfiles": "$1 {{PLURAL:$1|файл|файли|файлів}} відновлено",
        "cannotundelete": "Частина або вся процедура відновлення зазнала невдачі:\n$1",
        "undeletedpage": "'''Сторінка «$1» відновлена'''\n\nДив. [[Special:Log/delete|список вилучень]], щоб дізнатися про останні вилучення та відновлення.",
        "undelete-header": "Список нещодавно вилучених сторінок можна переглянути в [[Special:Log/delete|журналі вилучень]].",
index 4250b0c..5bc1cbe 100644 (file)
        "undeleteviewlink": "xem",
        "undeleteinvert": "Đảo sự lựa chọn",
        "undeletecomment": "Lý do:",
-       "undeletedrevisions": "$1 phiên bản được phục hồi",
-       "undeletedrevisions-files": "$1 phiên bản và $2 tập tin đã được phục hồi",
-       "undeletedfiles": "$1 tập tin đã được phục hồi",
        "cannotundelete": "Phục hồi bị thất bại một phần hoặc hoàn toàn:\n$1",
        "undeletedpage": "'''$1 đã được khôi phục'''\n\nXem nhật trình xóa và phục hồi các trang gần đây tại [[Special:Log/delete|nhật trình xóa]].",
        "undelete-header": "Xem các trang bị xóa gần đây tại [[Special:Log/delete|nhật trình xóa]].",
index 6486ad3..031e9d5 100644 (file)
        "changepassword-throttled": "你已經試咗太多次簽到動作。\n請等$1再試過。",
        "botpasswords": "機械人密碼",
        "botpasswords-disabled": "唔俾用機械人密碼。",
+       "botpasswords-existing": "而家已經有嘅機械人密碼",
+       "botpasswords-createnew": "整一個新嘅機械人密碼",
        "botpasswords-label-create": "創造",
        "botpasswords-label-update": "上載",
        "botpasswords-label-cancel": "取消",
        "prefs-help-prefershttps": "呢項喜好設定會喺你下次簽到先至開始生效。",
        "prefswarning-warning": "你改嘅喜好設定改動重未記低。\n如果你未撳「$1」就走咗,你嘅喜好設定唔會有更新。",
        "prefs-tabs-navigation-hint": "貼士:可以用鍵盤嘅←或→掣睇一覽內嘅分頁",
-       "userrights": "用戶權限管理",
-       "userrights-lookup-user": "管理用戶組",
+       "userrights": "用戶嘅權限",
+       "userrights-lookup-user": "揀一個用戶",
        "userrights-user-editname": "輸入一個用戶名:",
        "editusergroup": "編輯用戶組",
        "editinguser": "改緊<strong>[[User:$1|$1]]</strong>嘅用戶權限 $2",
        "userrights-expiry": "到期:",
        "userrights-expiry-existing": "現時到期嘅時間: $2 $3",
        "userrights-expiry-othertime": "其它時間:",
+       "userrights-invalid-expiry": "組\"$1\"嘅過期時間冇效",
        "userrights-conflict": "用戶權限更改有衝突!請再睇過同確認你嘅改動。",
        "group": "組:",
        "group-user": "用戶",
        "undeleteviewlink": "睇",
        "undeleteinvert": "反選",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "$1個修訂已經救返",
-       "undeletedrevisions-files": "$1個修訂同$2個檔案已經救返",
-       "undeletedfiles": "$1個檔案已經救返",
        "cannotundelete": "救唔到:\n$1",
        "undeletedpage": "'''$1已經成功救返'''\n\n最近嘅刪除同恢復記錄請睇[[Special:Log/delete]]。",
        "undelete-header": "睇吓[[Special:Log/delete|刪除日誌]]去睇之前刪除嘅頁頁。",
index 219fef4..05f1a62 100644 (file)
        "undeleteviewlink": "查看",
        "undeleteinvert": "反向选择",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "还原{{PLURAL:$1|$1个版本}}",
-       "undeletedrevisions-files": "还原{{PLURAL:$1|$1个版本}}和{{PLURAL:$2|$2个文件}}",
-       "undeletedfiles": "还原{{PLURAL:$1|$1个文件}}",
        "cannotundelete": "部分或全部还原删除失败:$1",
        "undeletedpage": "<strong>$1已经被还原</strong>\n\n最近的删除和还原记录请见[[Special:Log/delete|删除日志]]。",
        "undelete-header": "如要查询最近的记录请参阅[[Special:Log/delete|删除日志]]。",
        "specialpages-group-spam": "反垃圾链接工具",
        "specialpages-group-developer": "开发者工具",
        "blankpage": "空白页面",
-       "intentionallyblankpage": "这个页面被故意留为空白",
+       "intentionallyblankpage": "此页特意留白。",
        "external_image_whitelist": " #请原样保留本行文字<pre>\n#请在下面输入正则表达式片段(//之间的部份)\n#这些项目将会匹配外部图像的URL\n#匹配的项目将显示为图像,否则只会显示图像的链接\n#以#开头的行被视为评论\n#不区分大小写\n\n#请在本行上面输入所有正则表达式片段。请原样保留本行文字</pre>",
        "tags": "有效的更改标签",
        "tag-filter": "[[Special:Tags|标签]]过滤器:",
        "htmlform-user-not-valid": "<strong>$1</strong>不是一个有效的用户名。",
        "logentry-delete-delete": "$1{{GENDER:$2|删除}}页面$3",
        "logentry-delete-delete_redir": "$1通过覆盖{{GENDER:$2|删除}}重定向$3",
-       "logentry-delete-restore": "$1{{GENDER:$2|还原}}页面$3",
+       "logentry-delete-restore": "$1{{GENDER:$2|还原}}页面$3($4)",
+       "logentry-delete-restore-nocount": "$1{{GENDER:$2|还原}}页面$3",
+       "restore-count-revisions": "{{PLURAL:$1|$1个修订版本}}",
+       "restore-count-files": "{{PLURAL:$1|$1个文件}}",
        "logentry-delete-event": "$1{{GENDER:$2|更改}}$3的{{PLURAL:$5|$5个日志事件}}的可见性:$4",
        "logentry-delete-revision": "$1{{GENDER:$2|更改}}页面$3的{{PLURAL:$5|$5个版本}}的可见性:$4",
        "logentry-delete-event-legacy": "$1{{GENDER:$2|更改}}$3的日志事件的可见性",
index b404a21..fc3ad95 100644 (file)
        "undeleteviewlink": "檢視",
        "undeleteinvert": "反向選擇",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "{{PLURAL:$1|$1 個修訂}}已還原",
-       "undeletedrevisions-files": "{{PLURAL:$1|$1 個修訂}}與 {{PLURAL:$2|$2 個檔案}}已還原",
-       "undeletedfiles": "{{PLURAL:$1|$1}} 個檔案已還原",
        "cannotundelete": "部份或全部的取消刪除失敗:\n$1",
        "undeletedpage": "<strong>$1 已還原</strong>\n\n請參考 [[Special:Log/delete|刪除日誌]] 以查詢最近刪除及還原的記錄。",
        "undelete-header": "請參考 [[Special:Log/delete|刪除日誌]] 查詢最近刪除的頁面。",
        "specialpages-group-spam": "反垃圾訊息工具",
        "specialpages-group-developer": "開發人員工具",
        "blankpage": "空白頁面",
-       "intentionallyblankpage": "此頁面被故意設為空白。",
+       "intentionallyblankpage": "此頁故意留白。",
        "external_image_whitelist": " #請勿修改本行文字<pre>\n#請於下方填寫正規表示法 (只需 // 之間的內容)\n#將會檢查外部連結的圖片是否符合這些條件\n#符合條件的連結會以圖片顯示,否則只顯示連結\n#以 # 開頭的行會被做為註解\n#此條件不區分大小寫\n\n#請將所有正規表示法輸入在此行上方,請勿修改本行文字</pre>",
        "tags": "有效變更標籤",
        "tag-filter": "[[Special:Tags|標籤]]搜尋:",
        "unlinkaccounts": "取消連結帳號",
        "unlinkaccounts-success": "已取消連結帳號。",
        "authenticationdatachange-ignored": "認証資料變更未被處理,可能未設定提供者?",
-       "userjsispublic": "è«\8b注æ\84\8fï¼\9aJavaScript å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ\86\91証資料。",
-       "usercssispublic": "è«\8b注æ\84\8fï¼\9aCSS å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ\86\91証資料。",
+       "userjsispublic": "è«\8b注æ\84\8fï¼\9aJavaScript å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ©\9få¯\86資料。",
+       "usercssispublic": "è«\8b注æ\84\8fï¼\9aCSS å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ©\9få¯\86資料。",
        "restrictionsfield-badip": "無效的 IP 位址或範圍:$1",
        "restrictionsfield-label": "允許的 IP 範圍:",
        "restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用:<pre>0.0.0.0/0\n::/0</pre>",
index c52ec0e..ac9f1b7 100644 (file)
@@ -400,6 +400,7 @@ $specialPageAliases = [
        'ApiHelp'                   => [ 'ApiHelp' ],
        'ApiSandbox'                => [ 'ApiSandbox' ],
        'Ancientpages'              => [ 'AncientPages' ],
+       'AutoblockList'             => [ 'AutoblockList', 'ListAutoblocks' ],
        'Badtitle'                  => [ 'Badtitle' ],
        'Blankpage'                 => [ 'BlankPage' ],
        'Block'                     => [ 'Block', 'BlockIP', 'BlockUser' ],
index a2a06d2..e7ba8fa 100644 (file)
@@ -1322,7 +1322,6 @@ edittoken
 edittools
 editurl
 editusercss
-editusercssjs
 edituserjs
 edoe
 egrave
@@ -1398,7 +1397,6 @@ epcampus
 epcoordinator
 epinstructor
 eponline
-eqiad
 erevoke
 errno
 error
@@ -4571,7 +4569,6 @@ wmls
 wmlsc
 wmlscript
 wmlscriptc
-wmnet
 wordcount
 wordprocessingml
 wordwg
index e4bb60e..faa4d96 100644 (file)
@@ -28,6 +28,7 @@
 require_once __DIR__ . '/Maintenance.php';
 
 use Wikimedia\Rdbms\IMaintainableDatabase;
+use Wikimedia\Rdbms\DatabaseSqlite;
 
 /**
  * Maintenance script that rebuilds search index table from scratch.
index 33ca0ff..cbb0c79 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use Wikimedia\Rdbms\DatabaseSqlite;
+
 /**
  * This class contains code common to different SQLite-related maintenance scripts
  *
index 33bdcb9..43582f0 100644 (file)
@@ -2151,7 +2151,6 @@ return [
        ],
        'mediawiki.legacy.wikibits' => [
                'scripts' => 'resources/src/mediawiki.legacy/wikibits.js',
-               'dependencies' => 'mediawiki.util',
                'targets' => [ 'desktop', 'mobile' ],
        ],
 
index f390b56..be94720 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:37Z
+ * Date: 2017-04-11T22:51:05Z
  */
 ( function ( OO ) {
 
index 624cc57..0313da4 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:41Z
+ * Date: 2017-04-11T22:51:10Z
  */
 .oo-ui-element-hidden {
   display: none !important;
@@ -838,14 +838,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
   cursor: auto;
 }
-.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
-.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
-  margin-left: 0.9375em;
-}
-.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
-.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
-  margin-left: 1.2375em;
-}
 .oo-ui-inputWidget {
   margin-right: 0.5em;
 }
@@ -977,13 +969,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   cursor: pointer;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-}
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
 .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -1032,27 +1018,27 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget input::-webkit-input-placeholder,
 .oo-ui-textInputWidget textarea::-webkit-input-placeholder {
-  color: #72777d;
+  color: #767676;
   opacity: 1;
 }
 .oo-ui-textInputWidget input:-ms-input-placeholder,
 .oo-ui-textInputWidget textarea:-ms-input-placeholder {
-  color: #72777d;
+  color: #767676;
   opacity: 1;
 }
 .oo-ui-textInputWidget input::-moz-placeholder,
 .oo-ui-textInputWidget textarea::-moz-placeholder {
-  color: #72777d;
+  color: #767676;
   opacity: 1;
 }
 .oo-ui-textInputWidget input:-moz-placeholder,
 .oo-ui-textInputWidget textarea:-moz-placeholder {
-  color: #72777d;
+  color: #767676;
   opacity: 1;
 }
 .oo-ui-textInputWidget input::placeholder,
 .oo-ui-textInputWidget textarea::placeholder {
-  color: #72777d;
+  color: #767676;
   opacity: 1;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
@@ -1063,7 +1049,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
-  color: #777;
+  color: #767676;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
@@ -1103,7 +1089,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
   padding: 0.4em;
   line-height: 1.5em;
-  color: #888;
+  color: #767676;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
   margin-right: 2.0875em;
@@ -1148,9 +1134,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-color: #e1f3ff;
 }
 .oo-ui-menuSectionOptionWidget {
-  cursor: default;
   padding: 0.33em 0.75em;
-  color: #888;
+  color: #767676;
+}
+.oo-ui-menuSectionOptionWidget.oo-ui-widget-enabled {
+  cursor: default;
 }
 .oo-ui-dropdownWidget {
   display: inline-block;
@@ -1161,6 +1149,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0.5em;
 }
 .oo-ui-dropdownWidget-handle {
+  position: relative;
   width: 100%;
   display: block;
   white-space: nowrap;
@@ -1263,7 +1252,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 2.5em;
   padding: 0;
 }
-.oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
+.oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorWidget {
+  display: block;
+  position: absolute;
+  top: 0;
+  height: 100%;
   pointer-events: none;
 }
 .oo-ui-comboBoxInputWidget:last-child {
@@ -1282,6 +1275,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   visibility: visible;
   margin: 0.775em;
 }
+.oo-ui-comboBoxInputWidget-php .oo-ui-indicatorWidget {
+  right: 0;
+  max-height: 2.375em;
+  margin: 0;
+  margin-right: 0.775em;
+}
 .oo-ui-comboBoxInputWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
   cursor: default;
   opacity: 0.2;
index bff0f50..4cc49c8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:41Z
+ * Date: 2017-04-11T22:51:10Z
  */
 .oo-ui-element-hidden {
   display: none !important;
   text-align: center;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  position: relative;
   font-weight: bold;
   text-decoration: none;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button:focus {
-  border-radius: 2px;
   outline: 0;
 }
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  margin-right: 0.25em;
-  margin-left: 0.46875em;
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement > input.oo-ui-buttonElement-button {
+  line-height: 1;
+}
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  line-height: 1.172em;
+}
+.oo-ui-buttonElement.oo-ui-labelElement.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  padding-left: 2.03125em;
+}
+.oo-ui-buttonElement.oo-ui-labelElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+  padding-right: 2.5em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  display: block;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-indicatorElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  right: 0.9375em;
 }
 .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
   -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
 .oo-ui-buttonElement.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   opacity: 1;
 }
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button .oo-ui-indicatorElement-indicator {
-  margin-right: 0;
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button {
+  border-radius: 1px;
+}
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  min-width: 1.875em;
+  min-height: 1.875em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  left: 0;
 }
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  margin-left: 0.25em;
-  margin-right: 0.25em;
+.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button {
+  margin-left: -1px;
+  border: 1px solid #fff;
+  padding: 0.3125em 0;
 }
-.oo-ui-buttonElement-frameless > input.oo-ui-buttonElement-button {
-  padding-left: 0.25em;
-  padding-right: 0.25em;
+.oo-ui-buttonElement-frameless.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+  min-width: 0.9375em;
+  min-height: 0.9375em;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
   color: #222;
   color: #444;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
-  box-shadow: inset 0 0 0 1px #36c, 0 0 0 1px #36c;
+  box-shadow: 0 0 0 2px #36c;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:active {
 .oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   opacity: 0.51;
 }
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
-  padding-left: 2.4em;
-}
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  position: relative;
   min-height: 2.5em;
   border-radius: 2px;
-  padding: 0.625em 1em 0.546875em;
+  padding: 0.625em 0.9375em 0.546875em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button {
-  min-width: 3.125em;
+  padding-left: 2.03125em;
 }
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
-  min-width: 0;
-}
-.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button {
-  line-height: 1;
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  left: 0.546875em;
 }
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  line-height: 1.172em;
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+  padding-left: 2.5em;
 }
-.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  display: block;
-  position: absolute;
-  top: 0;
-  height: 100%;
-  left: 0.5625em;
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  left: 0.46875em;
 }
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  margin-left: 0.3em;
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+  padding-right: 2.03125em;
 }
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-iconElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  margin-left: 0.46875em;
-  margin-right: -0.275em;
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  right: 1.015625em;
 }
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  position: relative;
-  left: 0.2em;
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  padding-right: 2.5em;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
   background-color: #c8ccd1;
@@ -694,7 +713,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   color: #72777d;
 }
 .oo-ui-decoratedOptionWidget {
-  padding: 0.5em 2em 0.5em 3em;
+  padding: 0.703125em 0.9375em 0.625em;
+  line-height: 1;
 }
 .oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
 .oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
@@ -705,11 +725,17 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   top: 0;
   height: 100%;
 }
+.oo-ui-decoratedOptionWidget.oo-ui-iconElement {
+  padding-left: 2.5em;
+}
 .oo-ui-decoratedOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  left: 0.5em;
+  left: 0.46875em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-labelElement-label {
+  line-height: 1.172em;
 }
 .oo-ui-decoratedOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  right: 0.5em;
+  right: 0.9375em;
 }
 .oo-ui-decoratedOptionWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
 .oo-ui-decoratedOptionWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
@@ -989,14 +1015,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
   cursor: auto;
 }
-.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
-.oo-ui-popupButtonWidget-frameless-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
-  margin-left: 0.9375em;
-}
-.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
-.oo-ui-popupButtonWidget-framed-popup.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
-  margin-left: 1.5em;
-}
 .oo-ui-inputWidget {
   margin-right: 0.5em;
 }
@@ -1149,7 +1167,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
           box-sizing: border-box;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  padding: 0.5em 1em;
+  padding: 0.625em 0.9375em 0.546875em;
   font-size: inherit;
   font-family: inherit;
   vertical-align: middle;
@@ -1161,13 +1179,13 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-position: right 1.75em center;
   width: calc( 100% + 1em );
   height: 2.5em;
-  padding: 0 0 0 1em;
+  padding: 0 0 0 0.9375em;
 }
 .oo-ui-dropdownInputWidget option {
   font-size: inherit;
   font-family: inherit;
   height: 1.5em;
-  padding: 0.5em 1em;
+  padding: 0.625em 0.9375em;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
   background-color: #f8f9fa;
@@ -1367,13 +1385,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   cursor: pointer;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-}
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
 .oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
@@ -1410,7 +1422,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   color: #000;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  padding: 0.625em 0.546875em 0.546875em;
+  padding: 0.625em 0.625em 0.546875em;
 }
 .oo-ui-textInputWidget input {
   line-height: 1.172em;
@@ -1513,34 +1525,31 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
-  padding-left: 2.875em;
+  padding-left: 2.5em;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  left: 0;
+  left: 0.46875em;
   max-height: 2.5em;
-  margin-left: 0.5em;
-  background-position: right center;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 .oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-  padding-right: 2.4875em;
+  padding-right: 2.1875em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  height: 100%;
   max-height: 2.5em;
-  margin: 0 0.775em;
+  margin-right: 0.9375em;
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
   color: #72777d;
   margin-top: 1px;
-  padding: 0.625em 0.546875em 0.546875em;
+  padding: 0.625em 0 0.546875em 0.625em;
   line-height: 1.172em;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
-  margin-right: 2.0875em;
+  margin-right: 2.5em;
 }
 .oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
-  margin-left: 2.475em;
+  padding-left: 2.5em;
 }
 .oo-ui-menuSelectWidget {
   position: absolute;
@@ -1566,7 +1575,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: none;
 }
 .oo-ui-menuOptionWidget {
-  padding: 0.5em 1em;
   -webkit-transition: background-color 100ms, color 100ms;
      -moz-transition: background-color 100ms, color 100ms;
           transition: background-color 100ms, color 100ms;
@@ -1593,10 +1601,16 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-color: rgba(41, 98, 204, 0.1);
   color: #36c;
 }
+.oo-ui-menuOptionWidget.oo-ui-iconElement {
+  padding-left: 0.9375em;
+}
 .oo-ui-menuSectionOptionWidget {
-  cursor: default;
   color: #72777d;
-  padding: 0.33em 0.75em;
+  padding: 0.703125em 0.9375em 0.3125em;
+  font-weight: bold;
+}
+.oo-ui-menuSectionOptionWidget.oo-ui-widget-enabled {
+  cursor: default;
 }
 .oo-ui-dropdownWidget {
   display: inline-block;
@@ -1606,6 +1620,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0.5em;
 }
 .oo-ui-dropdownWidget-handle {
+  position: relative;
   width: 100%;
   display: block;
   white-space: nowrap;
@@ -1634,22 +1649,26 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0;
 }
 .oo-ui-dropdownWidget-handle {
-  padding: 0.546875em 0;
-  height: 2.5em;
-  line-height: 1.275;
+  min-height: 2.5em;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-  right: 0;
-  margin: 0 0.775em;
+  padding: 0.625em 0.9375em 0.546875em;
+  line-height: 1;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-  left: 0.25em;
-  margin: 0 0.3em;
+  left: 0.46875em;
+}
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
+  right: 0.9375em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-  margin: 0 1em;
+  line-height: 1.172em;
+}
+.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle {
+  padding-left: 2.5em;
+}
+.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle {
+  padding-right: 1.875em;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
   background-color: #f8f9fa;
@@ -1702,12 +1721,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
   opacity: 0.15;
 }
-.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-  margin-left: 3em;
-}
-.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-  margin-right: 2em;
-}
 .oo-ui-comboBoxInputWidget {
   display: inline-block;
   position: relative;
@@ -1742,7 +1755,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 2.5em;
   padding: 0;
 }
-.oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
+.oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorWidget {
+  display: block;
+  position: absolute;
+  top: 0;
+  height: 100%;
   pointer-events: none;
 }
 .oo-ui-comboBoxInputWidget input {
@@ -1757,20 +1774,26 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-bottom-right-radius: 2px;
   border-right-width: 1px;
 }
-.oo-ui-comboBoxInputWidget-dropdownButton {
+.oo-ui-comboBoxInputWidget-dropdownButton.oo-ui-indicatorElement {
   width: 2.5em;
 }
-.oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button {
+.oo-ui-comboBoxInputWidget-dropdownButton.oo-ui-indicatorElement .oo-ui-buttonElement-button {
   min-width: 2.5em;
   min-height: 2.5em;
   padding-left: 0;
-  padding-right: 0;
 }
-.oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button,
-.oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button:focus {
+.oo-ui-comboBoxInputWidget-dropdownButton.oo-ui-indicatorElement .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  right: 0.703125em;
+}
+.oo-ui-comboBoxInputWidget-dropdownButton.oo-ui-indicatorElement .oo-ui-buttonElement-button,
+.oo-ui-comboBoxInputWidget-dropdownButton.oo-ui-indicatorElement .oo-ui-buttonElement-button:focus {
   border-top-left-radius: 0;
   border-bottom-left-radius: 0;
 }
+.oo-ui-comboBoxInputWidget-php .oo-ui-indicatorWidget {
+  right: 0.9375em;
+  margin: 0;
+}
 .oo-ui-comboBoxInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
   opacity: 1;
 }
index 44b21ab..e566d96 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:37Z
+ * Date: 2017-04-11T22:51:05Z
  */
 ( function ( OO ) {
 
@@ -73,10 +73,10 @@ OO.ui.generateElementId = function () {
 
 /**
  * Check if an element is focusable.
- * Inspired from :focusable in jQueryUI v1.11.4 - 2015-04-14
+ * Inspired by :focusable in jQueryUI v1.11.4 - 2015-04-14
  *
  * @param {jQuery} $element Element to test
- * @return {boolean}
+ * @return {boolean} Element is focusable
  */
 OO.ui.isFocusableElement = function ( $element ) {
        var nodeName,
@@ -131,7 +131,7 @@ OO.ui.isFocusableElement = function ( $element ) {
  *
  * @param {jQuery} $container Container to search in
  * @param {boolean} [backwards] Search backwards
- * @return {jQuery} Focusable child, an empty jQuery object if none found
+ * @return {jQuery} Focusable child, or an empty jQuery object if none found
  */
 OO.ui.findFocusable = function ( $container, backwards ) {
        var $focusable = $( [] ),
@@ -235,10 +235,10 @@ OO.ui.contains = function ( containers, contained, matchContainers ) {
  *
  * Ported from: http://underscorejs.org/underscore.js
  *
- * @param {Function} func
- * @param {number} wait
- * @param {boolean} immediate
- * @return {Function}
+ * @param {Function} func Function to debounce
+ * @param {number} [wait=0] Wait period in milliseconds
+ * @param {boolean} [immediate] Trigger on leading edge
+ * @return {Function} Debounced function
  */
 OO.ui.debounce = function ( func, wait, immediate ) {
        var timeout;
@@ -264,7 +264,7 @@ OO.ui.debounce = function ( func, wait, immediate ) {
 /**
  * Puts a console warning with provided message.
  *
- * @param {string} message
+ * @param {string} message Message
  */
 OO.ui.warnDeprecation = function ( message ) {
        if ( OO.getProp( window, 'console', 'warn' ) !== undefined ) {
@@ -282,9 +282,9 @@ OO.ui.warnDeprecation = function ( message ) {
  * when the wrapper is called, return values from the function are entirely
  * discarded.
  *
- * @param {Function} func
- * @param {number} wait
- * @return {Function}
+ * @param {Function} func Function to throttle
+ * @param {number} wait Throttle window length, in milliseconds
+ * @return {Function} Throttled function
  */
 OO.ui.throttle = function ( func, wait ) {
        var context, args, timeout,
@@ -319,7 +319,7 @@ OO.ui.throttle = function ( func, wait ) {
 /**
  * A (possibly faster) way to get the current timestamp as an integer
  *
- * @return {number} Current timestamp
+ * @return {number} Current timestamp, in milliseconds since the Unix epoch
  */
 OO.ui.now = Date.now || function () {
        return new Date().getTime();
@@ -3583,9 +3583,11 @@ OO.ui.ButtonWidget.prototype.setNoFollow = function ( noFollow ) {
 // Override method visibility hints from ButtonElement
 /**
  * @method setActive
+ * @inheritdoc
  */
 /**
  * @method isActive
+ * @inheritdoc
  */
 
 /**
@@ -4560,7 +4562,7 @@ OO.ui.mixin.ClippableElement.prototype.isClippedVertically = function () {
 };
 
 /**
- * Set the ideal size. These are the dimensions the element will have when it's not being clipped.
+ * Set the ideal size. These are the dimensions #$clippable will have when it's not being clipped.
  *
  * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix
  * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix
@@ -4645,7 +4647,7 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
        } else {
                this.$clippable.css( {
                        overflowX: '',
-                       width: this.idealWidth ? this.idealWidth - extraWidth : '',
+                       width: this.idealWidth || '',
                        maxWidth: Math.max( 0, allotedWidth )
                } );
        }
@@ -4661,7 +4663,7 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
        } else {
                this.$clippable.css( {
                        overflowY: '',
-                       height: this.idealHeight ? this.idealHeight - extraHeight : '',
+                       height: this.idealHeight || '',
                        maxHeight: Math.max( 0, allotedHeight )
                } );
        }
@@ -4710,8 +4712,10 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
  * @cfg {number} [height] Height of popup in pixels. Omit to use the automatic height.
  * @cfg {boolean} [anchor=true] Show anchor pointing to origin of popup
  * @cfg {string} [position='below'] Where to position the popup relative to $floatableContainer
- *  'above': Put popup above $floatableContainer; anchor points down to the start edge of $floatableContainer
- *  'below': Put popup below $floatableContainer; anchor points up to the start edge of $floatableContainer
+ *  'above': Put popup above $floatableContainer; anchor points down to the horizontal center
+ *           of $floatableContainer
+ *  'below': Put popup below $floatableContainer; anchor points up to the horizontal center
+ *           of $floatableContainer
  *  'before': Put popup to the left (LTR) / right (RTL) of $floatableContainer; anchor points
  *            endwards (right/left) to the vertical center of $floatableContainer
  *  'after': Put popup to the right (LTR) / left (RTL) of $floatableContainer; anchor points
@@ -5148,8 +5152,7 @@ OO.ui.PopupWidget.prototype.computePosition = function () {
        }
 
        // Position the anchor (which is positioned relative to the popup) to point to $floatableContainer
-       // For popups above/below, we point to the start edge; for popups before/after, we point to the center
-       anchorPos = vertical ? ( floatablePos[ start ] + floatablePos[ end ] ) / 2 : floatablePos[ start ];
+       anchorPos = ( floatablePos[ start ] + floatablePos[ end ] ) / 2;
        anchorOffset = ( start === far ? -1 : 1 ) * ( anchorPos - popupPos[ start ] );
 
        // If the anchor is less than 2*anchorSize from either edge, move the popup to make more space
@@ -6734,8 +6737,10 @@ OO.ui.MenuSectionOptionWidget.static.highlightable = false;
  *  that toggles the menu's visibility on click, the menu will be hidden then re-shown when the user clicks
  *  that button, unless the button (or its parent widget) is passed in here.
  * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu.
+ * @cfg {jQuery} [$autoCloseIgnore] If these elements are clicked, don't auto-hide the menu.
  * @cfg {boolean} [hideOnChoose=true] Hide the menu when the user chooses an option.
  * @cfg {boolean} [filterFromInput=false] Filter the displayed options from the input
+ * @cfg {boolean} [highlightOnFilter] Highlight the first result when filtering
  */
 OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
        // Configuration initialization
@@ -6753,8 +6758,10 @@ OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
        this.filterFromInput = !!config.filterFromInput;
        this.$input = config.$input ? config.$input : config.input ? config.input.$input : null;
        this.$widget = config.widget ? config.widget.$element : null;
+       this.$autoCloseIgnore = config.$autoCloseIgnore || $( [] );
        this.onDocumentMouseDownHandler = this.onDocumentMouseDown.bind( this );
        this.onInputEditHandler = OO.ui.debounce( this.updateItemVisibility.bind( this ), 100 );
+       this.highlightOnFilter = !!config.highlightOnFilter;
 
        // Initialization
        this.$element
@@ -6783,8 +6790,12 @@ OO.mixinClass( OO.ui.MenuSelectWidget, OO.ui.mixin.ClippableElement );
  */
 OO.ui.MenuSelectWidget.prototype.onDocumentMouseDown = function ( e ) {
        if (
-               !OO.ui.contains( this.$element[ 0 ], e.target, true ) &&
-               ( !this.$widget || !OO.ui.contains( this.$widget[ 0 ], e.target, true ) )
+               this.isVisible() &&
+               !OO.ui.contains(
+                               this.$element.add( this.$widget ).add( this.$autoCloseIgnore ).get(),
+                               e.target,
+                               true
+               )
        ) {
                this.toggle( false );
        }
@@ -6831,6 +6842,7 @@ OO.ui.MenuSelectWidget.prototype.onKeyDown = function ( e ) {
  */
 OO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
        var i, item, visible, section, sectionEmpty,
+               firstItemFound = false,
                anyVisible = false,
                len = this.items.length,
                showAll = !this.isVisible(),
@@ -6852,6 +6864,11 @@ OO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
                        anyVisible = anyVisible || visible;
                        sectionEmpty = sectionEmpty && !visible;
                        item.toggle( visible );
+                       if ( this.highlightOnFilter && visible && !firstItemFound ) {
+                               // Highlight the first item in the list
+                               this.highlightItem( item );
+                               firstItemFound = true;
+                       }
                }
        }
        // Process the final section
@@ -7832,6 +7849,7 @@ OO.ui.CheckboxMultiselectWidget.prototype.onClick = function ( e ) {
  *   Deprecated, omit this parameter and specify `$container` instead.
  * @param {Object} [config] Configuration options
  * @cfg {jQuery} [$container=inputWidget.$element] Element to render menu under
+ * @cfg {number} [width] Width of the menu
  */
 OO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWidget, config ) {
        // Allow 'inputWidget' parameter and config for backwards compatibility
@@ -7843,6 +7861,8 @@ OO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWid
        // Configuration initialization
        config = config || {};
 
+       this.width = config.width;
+
        // Parent constructor
        OO.ui.FloatingMenuSelectWidget.parent.call( this, config );
 
@@ -7876,7 +7896,7 @@ OO.ui.FloatingMenuSelectWidget.prototype.toggle = function ( visible ) {
 
        if ( change && visible ) {
                // Make sure the width is set before the parent method runs.
-               this.setIdealSize( this.$container.width() );
+               this.setIdealSize( this.width || this.$container.width() );
        }
 
        // Parent method
@@ -8657,8 +8677,12 @@ OO.ui.DropdownInputWidget.prototype.onMenuSelect = function ( item ) {
  * @inheritdoc
  */
 OO.ui.DropdownInputWidget.prototype.setValue = function ( value ) {
+       var selected;
        value = this.cleanUpValue( value );
        this.dropdownWidget.getMenu().selectItemByData( value );
+       // Only allow setting values that are actually present in the dropdown
+       selected = this.dropdownWidget.getMenu().getSelectedItem();
+       value = selected ? selected.getData() : '';
        OO.ui.DropdownInputWidget.parent.prototype.setValue.call( this, value );
        return this;
 };
@@ -9560,14 +9584,14 @@ OO.ui.TextInputWidget.prototype.setRequired = function ( state ) {
        this.required = !!state;
        if ( this.required ) {
                this.$input
-                       .attr( 'required', 'required' )
+                       .prop( 'required', true )
                        .attr( 'aria-required', 'true' );
                if ( this.getIndicator() === null ) {
                        this.setIndicator( 'required' );
                }
        } else {
                this.$input
-                       .removeAttr( 'required' )
+                       .prop( 'required', false )
                        .removeAttr( 'aria-required' );
                if ( this.getIndicator() === 'required' ) {
                        this.setIndicator( null );
@@ -10259,9 +10283,14 @@ OO.ui.ComboBoxInputWidget = function OoUiComboBoxInputWidget( config ) {
                autocomplete: false
        }, config );
 
-       // ComboBoxInputWidget shouldn't support multiline
+       // ComboBoxInputWidget shouldn't support `multiline`
        config.multiline = false;
 
+       // See InputWidget#reusePreInfuseDOM about `config.$input`
+       if ( config.$input ) {
+               config.$input.removeAttr( 'list' );
+       }
+
        // Parent constructor
        OO.ui.ComboBoxInputWidget.parent.call( this, config );
 
index 8538b6e..ec6e45d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:37Z
+ * Date: 2017-04-11T22:51:05Z
  */
 ( function ( OO ) {
 
index 983bc69..cb6ebc3 100644 (file)
@@ -1,21 +1,17 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:41Z
+ * Date: 2017-04-11T22:51:10Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
   z-index: 4;
 }
-.oo-ui-popupTool .oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
-.oo-ui-popupTool .oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
-  margin-left: 1.25em;
-}
 .oo-ui-toolGroupTool > .oo-ui-popupToolGroup {
   border: 0;
   border-radius: 0;
   border-color: rgba(0, 0, 0, 0.2);
   box-shadow: inset 0 0.0875em 0.0875em 0 rgba(0, 0, 0, 0.07);
   background-color: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #F1F7FB), color-stop(100%, #fff));
-  background-image: -webkit-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #F1F7FB 0, #fff 100%);
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f1f7fb), color-stop(100%, #fff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image:    -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image:         linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff1f7fb', endColorstr='#ffffffff' )";
 }
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
   border-bottom-right-radius: 0;
   box-shadow: inset 0 0.0875em 0.0875em 0 rgba(0, 0, 0, 0.07);
   background-color: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #F1F7FB), color-stop(100%, #fff));
-  background-image: -webkit-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #F1F7FB 0, #fff 100%);
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f1f7fb), color-stop(100%, #fff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image:    -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image:         linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff1f7fb', endColorstr='#ffffffff' )";
 }
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
   line-height: 2em;
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
-  color: #888;
+  color: #767676;
 }
 .oo-ui-listToolGroup .oo-ui-tool {
   display: block;
   border-color: rgba(0, 0, 0, 0.1);
   box-shadow: inset 0 0.0875em 0.0875em 0 rgba(0, 0, 0, 0.07);
   background-color: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #F1F7FB), color-stop(100%, #fff));
-  background-image: -webkit-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #F1F7FB 0, #fff 100%);
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f1f7fb), color-stop(100%, #fff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image:    -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image:         linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff1f7fb', endColorstr='#ffffffff' )";
 }
 .oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
index 502b7b1..85095d3 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:41Z
+ * Date: 2017-04-11T22:51:10Z
  */
 .oo-ui-tool.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms;
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
   z-index: 4;
 }
-.oo-ui-popupTool .oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor,
-.oo-ui-popupTool .oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
-  margin-left: 1.25em;
-}
 .oo-ui-toolGroupTool > .oo-ui-toolGroup {
   border-right: 0;
 }
   width: 0.9375em;
   height: 100%;
   margin: 0 0.5em;
-  opacity: 0.3;
+  opacity: 0.87;
 }
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
   right: -0.3125em;
 .oo-ui-popupToolGroup.oo-ui-widget-enabled.oo-ui-popupToolGroup-active .oo-ui-tool-active.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
   color: #36c;
 }
-.oo-ui-popupToolGroup.oo-ui-widget-enabled-handle:hover {
+.oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle {
+  -webkit-transition: background-color 100ms, box-shadow 100ms;
+     -moz-transition: background-color 100ms, box-shadow 100ms;
+          transition: background-color 100ms, box-shadow 100ms;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:hover {
   background-color: #eaecf0;
 }
-.oo-ui-popupToolGroup.oo-ui-widget-enabled-handle:active {
+.oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:active {
   background-color: #eaf3ff;
 }
 .oo-ui-listToolGroup .oo-ui-tool {
   background-color: transparent;
   box-shadow: none;
 }
-.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement {
+.oo-ui-toolbar-narrow .oo-ui-toolbar-bar:after {
+  content: '';
+  display: block;
+  position: absolute;
+  top: 3.125em;
+  left: 0;
+  width: 100%;
+  height: 0;
+  border-bottom: 1px solid #c8ccd1;
+}
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement,
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-indicatorElement,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-labelElement,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-indicatorElement {
   margin: 0;
 }
-.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button {
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
   border: 0;
   border-radius: 0;
   padding: 0 0.3125em;
 }
-.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
   margin: 0 1em;
   line-height: 3.125em;
 }
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-indicatorElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  margin: 0;
+}
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-indicatorElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  margin: 0 0.3125em;
+}
 .oo-ui-toolbar-actions > .oo-ui-toolbar:not( :last-child ) {
   border-right: 1px solid #c8ccd1;
 }
index 4cc0db1..665e9dc 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:37Z
+ * Date: 2017-04-11T22:51:05Z
  */
 ( function ( OO ) {
 
index a9b31da..0d51782 100644 (file)
@@ -1,14 +1,13 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:41Z
+ * Date: 2017-04-11T22:51:10Z
  */
-.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ),
 .oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
   cursor: url(images/grab.cur );
 }
 .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-fileName {
   display: block;
-  padding-top: 0.5em;
-  padding-right: 2.375em;
-}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-clearButton {
-  right: 0.5em;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
 .oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
   height: auto;
 }
-.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-label {
-  padding: 1em;
-}
 .oo-ui-selectFileWidget:last-child {
   margin-right: 0;
 }
 .oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
   background-color: #e1f3ff;
 }
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-label {
+  padding: 1em;
+}
 .oo-ui-selectFileWidget-dropTarget {
   background-color: #fff;
   border: 1px solid #aaa;
   overflow: inherit;
   white-space: normal;
 }
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-fileName {
+  padding-top: 0.5em;
+  padding-right: 2.375em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-clearButton {
+  right: 0.5em;
+}
 .oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget {
   border-style: dashed;
 }
   background-color: #fff;
   border-color: #ddd;
 }
+.oo-ui-tagMultiselectWidget {
+  display: inline-block;
+  position: relative;
+  width: 100%;
+  max-width: 50em;
+}
+.oo-ui-tagMultiselectWidget-handle {
+  width: 100%;
+  display: block;
+  position: relative;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
+.oo-ui-tagMultiselectWidget-content {
+  position: relative;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-content > input {
+  display: none;
+}
+.oo-ui-tagMultiselectWidget-group {
+  display: inline;
+}
+.oo-ui-tagMultiselectWidget-inputPosition-outline {
+  width: 100%;
+}
+.oo-ui-tagMultiselectWidget-focusTrap {
+  display: inline-block;
+  height: 1px;
+  width: 1px;
+}
+.oo-ui-tagMultiselectWidget-handle {
+  background-color: #fff;
+  cursor: text;
+  min-height: 2.4em;
+  margin-right: 0.5em;
+  padding: 0.15em 0.25em;
+  border: 1px solid rgba(0, 0, 0, 0.1);
+  border-radius: 0.25em;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+.oo-ui-tagMultiselectWidget-handle:last-child {
+  margin-right: 0;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input {
+  border: 0;
+  line-height: 1.675em;
+  margin: 0;
+  margin-left: 0.2em;
+  padding: 0;
+  font-size: inherit;
+  font-family: inherit;
+  background-color: transparent;
+  color: #000;
+  vertical-align: middle;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::-webkit-input-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:-ms-input-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::-moz-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:-moz-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:focus {
+  outline: 0;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-iconElement .oo-ui-tagMultiselectWidget-handle {
+  padding-left: 2.475em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-iconElement .oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon {
+  left: 0;
+  margin: 0 0.3em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-indicatorElement .oo-ui-tagMultiselectWidget-handle {
+  padding-right: 2.4875em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-indicatorElement .oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
+}
+.oo-ui-tagMultiselectWidget:hover .oo-ui-tagMultiselectWidget-handle {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #ddd;
+  background-color: #f3f3f3;
+  cursor: default;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  opacity: 0.2;
+}
+.oo-ui-tagMultiselectWidget-popup > .oo-ui-popupWidget-popup {
+  border: 0;
+}
+.oo-ui-tagItemWidget {
+  position: relative;
+  display: inline-block;
+  cursor: default;
+  white-space: nowrap;
+  width: auto;
+  max-width: 100%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  vertical-align: middle;
+  padding: 0 0.4em;
+  margin: 0.1em;
+  height: 1.7em;
+  line-height: 1.7em;
+  background-color: #eeeeee;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #ddd));
+  background-image: -webkit-linear-gradient(top, #fff 0, #ddd 100%);
+  background-image:    -moz-linear-gradient(top, #fff 0, #ddd 100%);
+  background-image:         linear-gradient(to bottom, #fff 0, #ddd 100%);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
+  border: 1px solid #ccc;
+  color: #333;
+  border-radius: 0.25em;
+}
+.oo-ui-tagItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+  display: inline-block;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  cursor: text;
+}
+.oo-ui-tagItemWidget:focus {
+  outline: 0;
+  border-color: #087ecc;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-disabled {
+  opacity: 0.5;
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
+  box-shadow: none;
+  color: #333;
+  background: #eee;
+  border-color: #ccc;
+}
+.oo-ui-tagItemWidget > .oo-ui-buttonElement {
+  margin-top: -1.25em;
+  padding-left: 0.3em;
+}
 .oo-ui-capsuleMultiselectWidget {
   display: inline-block;
   position: relative;
   vertical-align: middle;
 }
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
-  color: #72777d;
+  color: #767676;
   opacity: 1;
 }
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-ms-input-placeholder {
-  color: #72777d;
+  color: #767676;
   opacity: 1;
 }
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-moz-placeholder {
-  color: #72777d;
+  color: #767676;
   opacity: 1;
 }
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-moz-placeholder {
-  color: #72777d;
+  color: #767676;
   opacity: 1;
 }
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::placeholder {
-  color: #72777d;
+  color: #767676;
   opacity: 1;
 }
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
   background-image:         linear-gradient(to bottom, #fff 0, #ddd 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
   border: 1px solid #ccc;
-  color: #555;
+  color: #333;
   border-radius: 0.25em;
 }
 .oo-ui-capsuleItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
index 8438a3d..25add3d 100644 (file)
@@ -1,14 +1,16 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:41Z
+ * Date: 2017-04-11T22:51:10Z
  */
-.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ),
+.oo-ui-draggableElement {
+  padding: 1.0546875em 0.9375em 0.9375em;
+}
 .oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
   cursor: url(images/grab.cur );
@@ -32,7 +34,7 @@
 .oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement {
   display: inline-block;
 }
-.oo-ui-draggableElement-handle:focus {
+.oo-ui-draggableElement-handle.oo-ui-widget-enabled:focus {
   border-radius: 2px;
   box-shadow: inset 0 0 0 1px #36c, 0 0 0 1px #36c;
   outline: 0;
   border-bottom-right-radius: 2px;
   border-top-right-radius: 2px;
 }
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  position: absolute;
+}
 .oo-ui-buttonSelectWidget.oo-ui-widget-enabled:focus .oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected .oo-ui-buttonElement-button {
   border-color: #36c;
   box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
 }
 .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-fileName {
   display: block;
-  padding-top: 0.5em;
-  padding-right: 2.375em;
-}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-clearButton {
-  right: 0.5em;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
 .oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
   height: auto;
 }
-.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-label {
-  padding: 1em;
-}
 .oo-ui-selectFileWidget:last-child {
   margin-right: 0;
 }
   border-radius: 0 2px 2px 0;
 }
 .oo-ui-selectFileWidget-info {
-  height: 2.4em;
   background-color: #fff;
   border: 1px solid #a2a9b1;
   border-radius: 2px 0 0 2px;
-  border-width: 1px 0 1px 1px;
+  border-right-width: 0;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
-  left: 0;
-  margin-left: 0.5em;
+  left: 0.46875em;
+  min-height: 2.4em;
+  margin-left: -1px;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-  right: 0;
-  margin-right: 0.775em;
+  right: 0.9375em;
+  min-height: 2.4em;
 }
 .oo-ui-selectFileWidget-label {
   -webkit-box-sizing: border-box;
   display: block;
   right: 2.375em;
   padding-top: 0.625em;
-  padding-left: 0.546875em;
+  padding-left: 0.625em;
   padding-bottom: 0.546875em;
   line-height: 1.172em;
   white-space: nowrap;
 }
 .oo-ui-selectFileWidget-clearButton {
   top: -1px;
-  right: 0;
+  right: 0.46875em;
   min-width: 24px;
   width: 1.875em;
   margin-right: 0;
   color: #72777d;
 }
 .oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-label {
-  left: 2.875em;
+  left: 2.5em;
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-label {
-  right: 4.4625em;
+  right: 3.75em;
   padding-left: 0;
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-clearButton {
   overflow: inherit;
   white-space: normal;
 }
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-fileName {
+  padding-right: 2.5em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-clearButton {
+  top: 0;
+}
 .oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget {
   background-color: #fff;
   border-style: dashed;
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
   opacity: 0.15;
 }
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-label {
+  padding: 1em 0.9375em;
+}
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-dropLabel {
   display: none;
 }
      -moz-user-select: none;
       -ms-user-select: none;
           user-select: none;
-  font-size: 1.1em;
-  padding: 0.75em;
+  padding: 1.0546875em 0.9375em 0.9375em;
   -webkit-transition: background-color 100ms, color 100ms;
      -moz-transition: background-color 100ms, color 100ms;
           transition: background-color 100ms, color 100ms;
   background-color: rgba(41, 98, 204, 0.1);
   color: #36c;
 }
-.oo-ui-outlineOptionWidget .oo-ui-iconElement-icon {
-  font-size: 90.90909%;
-}
 .oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
   padding-right: 1.5em;
 }
 .oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
   opacity: 0.5;
 }
-.oo-ui-outlineOptionWidget-level-0.oo-ui-iconElement {
-  padding-left: 2.571em;
+.oo-ui-outlineOptionWidget .oo-ui-labelElement-label {
+  font-size: 1.1em;
 }
 .oo-ui-outlineOptionWidget-level-1 {
   padding-left: 2.571em;
   background-color: #fff;
   color: #000;
 }
+.oo-ui-tagMultiselectWidget {
+  display: inline-block;
+  position: relative;
+  width: 100%;
+  max-width: 50em;
+}
+.oo-ui-tagMultiselectWidget-handle {
+  width: 100%;
+  display: block;
+  position: relative;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
+.oo-ui-tagMultiselectWidget-content {
+  position: relative;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-content > input {
+  display: none;
+}
+.oo-ui-tagMultiselectWidget-group {
+  display: inline;
+}
+.oo-ui-tagMultiselectWidget-inputPosition-outline {
+  width: 100%;
+}
+.oo-ui-tagMultiselectWidget-focusTrap {
+  display: inline-block;
+  height: 1px;
+  width: 1px;
+}
+.oo-ui-tagMultiselectWidget-handle {
+  min-height: 2.4em;
+  margin-right: 0.5em;
+  padding: 0.15em 0.25em;
+  border: 1px solid #a2a9b1;
+  border-radius: 2px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+.oo-ui-tagMultiselectWidget-handle:last-child {
+  margin-right: 0;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input {
+  border: 0;
+  line-height: 1.675;
+  margin: 0 0 0 0.2em;
+  padding: 0;
+  font-size: inherit;
+  font-family: inherit;
+  background-color: transparent;
+  color: #000;
+  vertical-align: middle;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::-webkit-input-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:-ms-input-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:focus {
+  outline: 0;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-iconElement .oo-ui-tagMultiselectWidget-handle {
+  padding-left: 2.475em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-iconElement .oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon {
+  left: 0;
+  margin: 0 0.3em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-indicatorElement .oo-ui-tagMultiselectWidget-handle {
+  padding-right: 2.4875em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-indicatorElement .oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle {
+  background-color: #fff;
+  cursor: text;
+  -webkit-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+     -moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+          transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled:hover .oo-ui-tagMultiselectWidget-handle {
+  border-color: #72777d;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-open .oo-ui-tagMultiselectWidget-handle {
+  border-color: #36c;
+  outline: 0;
+  box-shadow: inset 0 0 0 1px #36c;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle {
+  color: #72777d;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #c8ccd1;
+  background-color: #eaecf0;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon {
+  opacity: 0.51;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  opacity: 0.15;
+}
+.oo-ui-tagItemWidget {
+  position: relative;
+  display: inline-block;
+  cursor: default;
+  white-space: nowrap;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  width: auto;
+  max-width: 100%;
+  height: 1.7em;
+  margin: 0.1em;
+  border: 1px solid #a2a9b1;
+  border-radius: 2px;
+  padding: 0 0.4em;
+  line-height: 1.7;
+  vertical-align: middle;
+}
+.oo-ui-tagItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+  display: inline-block;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  cursor: text;
+}
+.oo-ui-tagItemWidget.oo-ui-flaggedElement-invalid {
+  border-color: #d33;
+}
+.oo-ui-tagItemWidget.oo-ui-flaggedElement-invalid:hover {
+  border-color: #d33;
+}
+.oo-ui-tagItemWidget.oo-ui-flaggedElement-invalid:focus {
+  border-color: #d33;
+  box-shadow: inset 0 0 0 1px #d33;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled {
+  background-color: #f8f9fa;
+  color: #222;
+  padding-right: 1.5375em;
+  -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+     -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+          transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled:hover {
+  background-color: #fff;
+  color: #444;
+  border-color: #a2a9b1;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled:focus {
+  border-color: #36c;
+  box-shadow: inset 0 0 0 1px #36c;
+  outline: 0;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled > .oo-ui-buttonElement {
+  display: block;
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button {
+  display: block;
+  width: 1.5375em;
+  height: 100%;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button .oo-ui-indicator-clear {
+  position: absolute;
+  top: 0;
+  right: 0.3em;
+  bottom: 0;
+  height: auto;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-disabled {
+  background-color: #eaecf0;
+  color: #72777d;
+  border-color: #c8ccd1;
+  text-shadow: 0 1px 1px #fff;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-disabled:focus {
+  outline: 0;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-disabled > .oo-ui-buttonElement {
+  display: none;
+}
 .oo-ui-capsuleMultiselectWidget {
   display: inline-block;
   position: relative;
   outline: 0;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
-  padding-left: 2.475em;
+  padding-left: 2.5em;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
-  left: 0;
-  margin: 0 0.3em;
+  left: 0.46875em;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
-  padding-right: 2.4875em;
+  padding-right: 2.8125em;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
-  right: 0;
-  margin: 0 0.775em;
+  right: 0.9375em;
 }
 .oo-ui-capsuleMultiselectWidget-popup {
   margin-top: -1px;
index 3482256..2b2f2ca 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:37Z
+ * Date: 2017-04-11T22:51:05Z
  */
 ( function ( OO ) {
 
@@ -98,7 +98,7 @@ OO.ui.mixin.DraggableElement.prototype.toggleDraggable = function ( isDraggable
        if ( this.draggable !== isDraggable ) {
                this.draggable = isDraggable;
 
-               this.$element.toggleClass( 'oo-ui-draggableElement-undraggable', !this.draggable );
+               this.$handle.toggleClass( 'oo-ui-draggableElement-undraggable', !this.draggable );
        }
 };
 
@@ -4465,6 +4465,1425 @@ OO.ui.CapsuleMultiselectWidget.prototype.focus = function () {
        return this;
 };
 
+/**
+ * TagItemWidgets are used within a {@link OO.ui.TagMultiselectWidget
+ * TagMultiselectWidget} to display the selected items.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.mixin.ItemWidget
+ * @mixins OO.ui.mixin.LabelElement
+ * @mixins OO.ui.mixin.FlaggedElement
+ * @mixins OO.ui.mixin.TabIndexedElement
+ * @mixins OO.ui.mixin.DraggableElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration object
+ * @cfg {boolean} [valid=true] Item is valid
+ */
+OO.ui.TagItemWidget = function OoUiTagItemWidget( config ) {
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.TagItemWidget.parent.call( this, config );
+
+       // Mixin constructors
+       OO.ui.mixin.ItemWidget.call( this );
+       OO.ui.mixin.LabelElement.call( this, config );
+       OO.ui.mixin.FlaggedElement.call( this, config );
+       OO.ui.mixin.TabIndexedElement.call( this, config );
+       OO.ui.mixin.DraggableElement.call( this, config );
+
+       this.valid = config.valid === undefined ? true : !!config.valid;
+
+       this.closeButton = new OO.ui.ButtonWidget( {
+               framed: false,
+               indicator: 'clear',
+               tabIndex: -1
+       } );
+       this.closeButton.setDisabled( this.isDisabled() );
+
+       // Events
+       this.closeButton
+               .connect( this, { click: 'remove' } );
+       this.$element
+               .on( 'click', this.select.bind( this ) )
+               .on( 'keydown', this.onKeyDown.bind( this ) )
+               // Prevent propagation of mousedown; the tag item "lives" in the
+               // clickable area of the TagMultiselectWidget, which listens to
+               // mousedown to open the menu or popup. We want to prevent that
+               // for clicks specifically on the tag itself, so the actions taken
+               // are more deliberate. When the tag is clicked, it will emit the
+               // selection event (similar to how #OO.ui.MultioptionWidget emits 'change')
+               // and can be handled separately.
+               .on( 'mousedown', function ( e ) { e.stopPropagation(); } );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-tagItemWidget' )
+               .append( this.$label, this.closeButton.$element );
+};
+
+/* Initialization */
+
+OO.inheritClass( OO.ui.TagItemWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.ItemWidget );
+OO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.LabelElement );
+OO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.FlaggedElement );
+OO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.TabIndexedElement );
+OO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.DraggableElement );
+
+/* Events */
+
+/**
+ * @event remove
+ *
+ * A remove action was performed on the item
+ */
+
+/**
+ * @event navigate
+ * @param {string} direction Direction of the movement, forward or backwards
+ *
+ * A navigate action was performed on the item
+ */
+
+/**
+ * @event select
+ *
+ * The tag widget was selected. This can occur when the widget
+ * is either clicked or enter was pressed on it.
+ */
+
+/**
+ * @event valid
+ * @param {boolean} isValid Item is valid
+ *
+ * Item validity has changed
+ */
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.TagItemWidget.prototype.setDisabled = function ( state ) {
+       // Parent method
+       OO.ui.TagItemWidget.parent.prototype.setDisabled.call( this, state );
+
+       if ( this.closeButton ) {
+               this.closeButton.setDisabled( state );
+       }
+       return this;
+};
+
+/**
+ * Handle removal of the item
+ *
+ * This is mainly for extensibility concerns, so other children
+ * of this class can change the behavior if they need to. This
+ * is called by both clicking the 'remove' button but also
+ * on keypress, which is harder to override if needed.
+ *
+ * @fires remove
+ */
+OO.ui.TagItemWidget.prototype.remove = function () {
+       if ( !this.isDisabled() ) {
+               this.emit( 'remove' );
+       }
+};
+
+/**
+ * Handle a keydown event on the widget
+ *
+ * @fires navigate
+ * @fires remove
+ * @return {boolean|undefined} false to stop the operation
+ */
+OO.ui.TagItemWidget.prototype.onKeyDown = function ( e ) {
+       var movement;
+
+       if ( e.keyCode === OO.ui.Keys.BACKSPACE || e.keyCode === OO.ui.Keys.DELETE ) {
+               this.remove();
+               return false;
+       } else if ( e.keyCode === OO.ui.Keys.ENTER ) {
+               this.select();
+               return false;
+       } else if (
+               e.keyCode === OO.ui.Keys.LEFT ||
+               e.keyCode === OO.ui.Keys.RIGHT
+       ) {
+               if ( OO.ui.Element.static.getDir( this.$element ) === 'rtl' ) {
+                       movement = {
+                               left: 'forwards',
+                               right: 'backwards'
+                       };
+               } else {
+                       movement = {
+                               left: 'backwards',
+                               right: 'forwards'
+                       };
+               }
+
+               this.emit(
+                       'navigate',
+                       e.keyCode === OO.ui.Keys.LEFT ?
+                               movement.left : movement.right
+               );
+       }
+};
+
+/**
+ * Focuses the capsule
+ */
+OO.ui.TagItemWidget.prototype.focus = function () {
+       if ( !this.isDisabled() ) {
+               this.$element.focus();
+       }
+};
+
+/**
+ * Select this item
+ *
+ * @fires select
+ */
+OO.ui.TagItemWidget.prototype.select = function () {
+       if ( !this.isDisabled() ) {
+               this.emit( 'select' );
+       }
+};
+
+/**
+ * Set the valid state of this item
+ *
+ * @param {boolean} [valid] Item is valid
+ * @fires valid
+ */
+OO.ui.TagItemWidget.prototype.toggleValid = function ( valid ) {
+       valid = valid === undefined ? !this.valid : !!valid;
+
+       if ( this.valid !== valid ) {
+               this.valid = valid;
+
+               this.setFlags( { invalid: !this.valid } );
+
+               this.emit( 'valid', this.valid );
+       }
+};
+
+/**
+ * Check whether the item is valid
+ *
+ * @return {boolean} Item is valid
+ */
+OO.ui.TagItemWidget.prototype.isValid = function () {
+       return this.valid;
+};
+
+/**
+ * A basic tag multiselect widget, similar in concept to {@link OO.ui.ComboBoxInputWidget combo box widget}
+ * that allows the user to add multiple values that are displayed in a tag area.
+ *
+ * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
+ *
+ * This widget is a base widget; see {@link OO.ui.MenuTagMultiselectWidget MenuTagMultiselectWidget} and
+ * {@link OO.ui.PopupTagMultiselectWidget PopupTagMultiselectWidget} for the implementations that use
+ * a menu and a popup respectively.
+ *
+ *     @example
+ *     // Example: A basic TagMultiselectWidget.
+ *     var widget = new OO.ui.TagMultiselectWidget( {
+ *         inputPosition: 'outline',
+ *         allowedValues: [ 'Option 1', 'Option 2', 'Option 3' ],
+ *         selected: [ 'Option 1' ]
+ *     } );
+ *     $( 'body' ).append( widget.$element );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.mixin.GroupWidget
+ * @mixins OO.ui.mixin.DraggableGroupElement
+ * @mixins OO.ui.mixin.IndicatorElement
+ * @mixins OO.ui.mixin.IconElement
+ * @mixins OO.ui.mixin.TabIndexedElement
+ * @mixins OO.ui.mixin.FlaggedElement
+ *
+ * @constructor
+ * @param {Object} config Configuration object
+ * @cfg {Object} [input] Configuration options for the input widget
+ * @cfg {boolean} [inputPosition='inline'] Position of the input. Options are:
+ *     - inline: The input is invisible, but exists inside the tag list, so
+ *             the user types into the tag groups to add tags.
+ *     - outline: The input is underneath the tag area.
+ *     - none: No input supplied
+ * @cfg {boolean} [allowEditTags=true] Allow editing of the tags by clicking them
+ * @cfg {boolean} [allowArbitrary=false] Allow data items to be added even if
+ *  not present in the menu.
+ * @cfg {Object[]} [allowedValues] An array representing the allowed items
+ *  by their datas.
+ * @cfg {boolean} [allowDuplicates=false] Allow duplicate items to be added
+ * @cfg {boolean} [allowDisplayInvalidTags=false] Allow the display of
+ *  invalid tags. These tags will display with an invalid state, and
+ *  the widget as a whole will have an invalid state if any invalid tags
+ *  are present.
+ * @cfg {boolean} [allowReordering=true] Allow reordering of the items
+ * @cfg {Object[]|String[]} [selected] A set of selected tags. If given,
+ *  these will appear in the tag list on initialization, as long as they
+ *  pass the validity tests.
+ */
+OO.ui.TagMultiselectWidget = function OoUiTagMultiselectWidget( config ) {
+       var inputEvents,
+               rAF = window.requestAnimationFrame || setTimeout,
+               widget = this,
+               $tabFocus = $( '<span>' )
+                       .addClass( 'oo-ui-tagMultiselectWidget-focusTrap' );
+
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.TagMultiselectWidget.parent.call( this, config );
+
+       // Mixin constructors
+       OO.ui.mixin.GroupWidget.call( this, config );
+       OO.ui.mixin.IndicatorElement.call( this, config );
+       OO.ui.mixin.IconElement.call( this, config );
+       OO.ui.mixin.TabIndexedElement.call( this, config );
+       OO.ui.mixin.FlaggedElement.call( this, config );
+       OO.ui.mixin.DraggableGroupElement.call( this, config );
+
+       this.toggleDraggable(
+               config.allowReordering === undefined ?
+                       true : !!config.allowReordering
+       );
+
+       this.inputPosition = this.constructor.static.allowedInputPositions.indexOf( config.inputPosition ) > -1 ?
+                       config.inputPosition : 'inline';
+       this.allowEditTags = config.allowEditTags === undefined ? true : !!config.allowEditTags;
+       this.allowArbitrary = !!config.allowArbitrary;
+       this.allowDuplicates = !!config.allowDuplicates;
+       this.allowedValues = config.allowedValues || [];
+       this.allowDisplayInvalidTags = config.allowDisplayInvalidTags;
+       this.hasInput = this.inputPosition !== 'none';
+       this.height = null;
+       this.valid = true;
+
+       this.$content = $( '<div>' )
+               .addClass( 'oo-ui-tagMultiselectWidget-content' );
+       this.$handle = $( '<div>' )
+               .addClass( 'oo-ui-tagMultiselectWidget-handle' )
+               .append(
+                       this.$indicator,
+                       this.$icon,
+                       this.$content
+                               .append(
+                                       this.$group
+                                               .addClass( 'oo-ui-tagMultiselectWidget-group' )
+                               )
+               );
+
+       // Events
+       this.aggregate( {
+               remove: 'itemRemove',
+               navigate: 'itemNavigate',
+               select: 'itemSelect'
+       } );
+       this.connect( this, {
+               itemRemove: 'onTagRemove',
+               itemSelect: 'onTagSelect',
+               itemNavigate: 'onTagNavigate',
+               change: 'onChangeTags'
+       } );
+       this.$handle.on( {
+               mousedown: this.onMouseDown.bind( this )
+       } );
+
+       // Initialize
+       this.$element
+               .addClass( 'oo-ui-tagMultiselectWidget' )
+               .addClass( 'oo-ui-tagMultiselectWidget-inputPosition-' + this.inputPosition )
+               .append( this.$handle );
+
+       if ( this.hasInput ) {
+               this.input = new OO.ui.TextInputWidget( $.extend( {
+                       placeholder: config.placeholder,
+                       classes: [ 'oo-ui-tagMultiselectWidget-input' ]
+               }, config.input ) );
+               this.input.setDisabled( this.isDisabled() );
+
+               inputEvents = {
+                       focus: this.onInputFocus.bind( this ),
+                       blur: this.onInputBlur.bind( this ),
+                       'propertychange change click mouseup keydown keyup input cut paste select focus':
+                               OO.ui.debounce( this.updateInputSize.bind( this ) ),
+                       keydown: this.onInputKeyDown.bind( this ),
+                       keypress: this.onInputKeyPress.bind( this )
+               };
+
+               this.input.$input.on( inputEvents );
+
+               if ( this.inputPosition === 'outline' ) {
+                       // Override max-height for the input widget
+                       // in the case the widget is outline so it can
+                       // stretch all the way if the widet is wide
+                       this.input.$element.css( 'max-width', 'inherit' );
+                       this.$element.append( this.input.$element );
+               } else {
+                       // HACK: When the widget is using 'inline' input, the
+                       // behavior needs to only use the $input itself
+                       // so we style and size it accordingly (otherwise
+                       // the styling and sizing can get very convoluted
+                       // when the wrapping divs and other elements)
+                       // We are taking advantage of still being able to
+                       // call the widget itself for operations like
+                       // .getValue() and setDisabled() and .focus() but
+                       // having only the $input attached to the DOM
+                       this.$content.append( this.input.$input );
+               }
+       }
+
+       this.setTabIndexedElement(
+               this.hasInput ?
+                       this.input.$input :
+                       $tabFocus
+       );
+
+       if ( config.selected ) {
+               this.setValue( config.selected );
+       }
+
+       // HACK: Input size needs to be calculated after everything
+       // else is rendered
+       rAF( function () {
+               if ( widget.hasInput ) {
+                       widget.updateInputSize();
+               }
+       } );
+};
+
+/* Initialization */
+
+OO.inheritClass( OO.ui.TagMultiselectWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.GroupWidget );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.DraggableGroupElement );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.IndicatorElement );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.IconElement );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.TabIndexedElement );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.FlaggedElement );
+
+/* Static properties */
+
+/**
+ * Allowed input positions.
+ * - inline: The input is inside the tag list
+ * - outline: The input is under the tag list
+ * - none: There is no input
+ *
+ * @property {Array}
+ */
+OO.ui.TagMultiselectWidget.static.allowedInputPositions = [ 'inline', 'outline', 'none' ];
+
+/* Methods */
+
+/**
+ * Handle mouse down events.
+ *
+ * @private
+ * @param {jQuery.Event} e Mouse down event
+ * @return {boolean} False to prevent defaults
+ */
+OO.ui.TagMultiselectWidget.prototype.onMouseDown = function ( e ) {
+       if ( !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) {
+               this.focus();
+               return false;
+       }
+};
+
+/**
+ * Handle key press events.
+ *
+ * @private
+ * @param {jQuery.Event} e Key press event
+ * @return {boolean} Whether to prevent defaults
+ */
+OO.ui.TagMultiselectWidget.prototype.onInputKeyPress = function ( e ) {
+       var stopOrContinue,
+               withMetaKey = e.metaKey || e.ctrlKey;
+
+       if ( !this.isDisabled() ) {
+               if ( e.which === OO.ui.Keys.ENTER ) {
+                       stopOrContinue = this.doInputEnter( e, withMetaKey );
+               }
+
+               // Make sure the input gets resized.
+               setTimeout( this.updateInputSize.bind( this ), 0 );
+               return stopOrContinue;
+       }
+};
+
+/**
+ * Handle key down events.
+ *
+ * @private
+ * @param {jQuery.Event} e Key down event
+ * @return {boolean}
+ */
+OO.ui.TagMultiselectWidget.prototype.onInputKeyDown = function ( e ) {
+       var movement, direction,
+               withMetaKey = e.metaKey || e.ctrlKey;
+
+       if ( !this.isDisabled() ) {
+               // 'keypress' event is not triggered for Backspace
+               if ( e.keyCode === OO.ui.Keys.BACKSPACE ) {
+                       return this.doInputBackspace( e, withMetaKey );
+               } else if ( e.keyCode === OO.ui.Keys.ESCAPE ) {
+                       return this.doInputEscape( e );
+               } else if (
+                       e.keyCode === OO.ui.Keys.LEFT ||
+                       e.keyCode === OO.ui.Keys.RIGHT
+               ) {
+                       if ( OO.ui.Element.static.getDir( this.$element ) === 'rtl' ) {
+                               movement = {
+                                       left: 'forwards',
+                                       right: 'backwards'
+                               };
+                       } else {
+                               movement = {
+                                       left: 'backwards',
+                                       right: 'forwards'
+                               };
+                       }
+                       direction = e.keyCode === OO.ui.Keys.LEFT ?
+                               movement.left : movement.right;
+
+                       return this.doInputArrow( e, direction, withMetaKey );
+               }
+       }
+};
+
+/**
+ * Respond to input focus event
+ */
+OO.ui.TagMultiselectWidget.prototype.onInputFocus = function () {};
+
+/**
+ * Respond to input blur event
+ */
+OO.ui.TagMultiselectWidget.prototype.onInputBlur = function () {};
+
+/**
+ * Perform an action after the enter key on the input
+ *
+ * @param {jQuery.Event} e Event data
+ * @param {boolean} [withMetaKey] Whether this key was pressed with
+ * a meta key like 'ctrl'
+ * @return {boolean} Whether to prevent defaults
+ */
+OO.ui.TagMultiselectWidget.prototype.doInputEnter = function () {
+       this.addTagFromInput();
+       return false;
+};
+
+/**
+ * Perform an action responding to the enter key on the input
+ *
+ * @param {jQuery.Event} e Event data
+ * @param {boolean} [withMetaKey] Whether this key was pressed with
+ * a meta key like 'ctrl'
+ * @return {boolean} Whether to prevent defaults
+ */
+OO.ui.TagMultiselectWidget.prototype.doInputBackspace = function () {
+       var items, item;
+
+       if (
+               this.inputPosition === 'inline' &&
+               this.input.getValue() === '' &&
+               !this.isEmpty()
+       ) {
+               // Delete the last item
+               items = this.getItems();
+               item = items[ items.length - 1 ];
+               this.input.setValue( item.getData() );
+               this.removeItems( [ item ] );
+
+               return false;
+       }
+};
+
+/**
+ * Perform an action after the escape key on the input
+ *
+ * @param {jQuery.Event} e Event data
+ * @return {boolean} Whether to prevent defaults
+ */
+OO.ui.TagMultiselectWidget.prototype.doInputEscape = function () {
+       this.clearInput();
+};
+
+/**
+ * Perform an action after the arrow key on the input, select the previous
+ * or next item from the input.
+ * See #getPreviousItem and #getNextItem
+ *
+ * @param {jQuery.Event} e Event data
+ * @param {string} direction Direction of the movement; forwards or backwards
+ * @param {boolean} [withMetaKey] Whether this key was pressed with
+ *  a meta key like 'ctrl'
+ * @return {boolean} Whether to prevent defaults
+ */
+OO.ui.TagMultiselectWidget.prototype.doInputArrow = function ( direction ) {
+       if (
+               this.inputPosition === 'inline' &&
+               !this.isEmpty()
+       ) {
+               if ( direction === 'backwards' ) {
+                       // Get previous item
+                       this.getPreviousItem().focus();
+               } else {
+                       // Get next item
+                       this.getNextItem().focus();
+               }
+       }
+};
+
+/**
+ * Respond to item select event
+ */
+OO.ui.TagMultiselectWidget.prototype.onTagSelect = function ( item ) {
+       if ( this.hasInput && this.allowEditTags ) {
+               if ( this.input.getValue() ) {
+                       this.addTagFromInput();
+               }
+               // 1. Get the label of the tag into the input
+               this.input.setValue( item.getData() );
+               // 2. Remove the tag
+               this.removeItems( [ item ] );
+               // 3. Focus the input
+               this.focus();
+       }
+};
+
+/**
+ * Respond to change event, where items were added, removed, or cleared.
+ */
+OO.ui.TagMultiselectWidget.prototype.onChangeTags = function () {
+       this.toggleValid( this.checkValidity() );
+       if ( this.hasInput ) {
+               this.updateInputSize();
+       }
+       this.updateIfHeightChanged();
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.TagMultiselectWidget.prototype.setDisabled = function ( isDisabled ) {
+       // Parent method
+       OO.ui.TagMultiselectWidget.parent.prototype.setDisabled.call( this, isDisabled );
+
+       if ( this.hasInput && this.input ) {
+               this.input.setDisabled( !!isDisabled );
+       }
+
+       if ( this.items ) {
+               this.getItems().forEach( function ( item ) {
+                       item.setDisabled( !!isDisabled );
+               } );
+       }
+};
+
+/**
+ * Respond to tag remove event
+ * @param {OO.ui.TagItemWidget} item Removed tag
+ */
+OO.ui.TagMultiselectWidget.prototype.onTagRemove = function ( item ) {
+       this.removeTagByData( item.getData() );
+};
+
+/**
+ * Respond to navigate event on the tag
+ *
+ * @param {OO.ui.TagItemWidget} item Removed tag
+ * @param {string} direction Direction of movement; 'forwards' or 'backwards'
+ */
+OO.ui.TagMultiselectWidget.prototype.onTagNavigate = function ( item, direction ) {
+       if ( direction === 'forwards' ) {
+               this.getNextItem( item ).focus();
+       } else {
+               this.getPreviousItem( item ).focus();
+       }
+};
+
+/**
+ * Add tag from input value
+ */
+OO.ui.TagMultiselectWidget.prototype.addTagFromInput = function () {
+       var val = this.input.getValue(),
+               isValid = this.isAllowedData( val );
+
+       if ( !val ) {
+               return;
+       }
+
+       if ( isValid || this.allowDisplayInvalidTags ) {
+               this.addTag( val );
+               this.clearInput();
+               this.focus();
+       }
+};
+
+/**
+ * Clear the input
+ */
+OO.ui.TagMultiselectWidget.prototype.clearInput = function () {
+       this.input.setValue( '' );
+};
+
+/**
+ * Check whether the given value is a duplicate of an existing
+ * tag already in the list.
+ *
+ * @param {string|Object} data Requested value
+ * @return {boolean} Value is duplicate
+ */
+OO.ui.TagMultiselectWidget.prototype.isDuplicateData = function ( data ) {
+       return !!this.getItemFromData( data );
+};
+
+/**
+ * Check whether a given value is allowed to be added
+ *
+ * @param {string|Object} data Requested value
+ * @return {boolean} Value exists in the allowed values list
+ */
+OO.ui.TagMultiselectWidget.prototype.isAllowedData = function ( data ) {
+       var hash = OO.getHash( data );
+
+       if ( this.allowArbitrary ) {
+               return true;
+       }
+
+       if (
+               !this.allowDuplicates &&
+               this.isDuplicateData( data )
+       ) {
+               return false;
+       }
+
+       // Check with allowed values
+       if (
+               this.getAllowedValues().some( function ( value ) {
+                       return hash === OO.getHash( value );
+               } )
+       ) {
+               return true;
+       }
+
+       return false;
+};
+
+/**
+ * Get the allowed values list
+ *
+ * @return {string[]} Allowed data values
+ */
+OO.ui.TagMultiselectWidget.prototype.getAllowedValues = function () {
+       return this.allowedValues;
+};
+
+/**
+ * Add a value to the allowed values list
+ *
+ * @param {string} value Allowed data value
+ */
+OO.ui.TagMultiselectWidget.prototype.addAllowedValue = function ( value ) {
+       if ( this.allowedValues.indexOf( value ) === -1 ) {
+               this.allowedValues.push( value );
+       }
+};
+
+/**
+ * Focus the widget
+ */
+OO.ui.TagMultiselectWidget.prototype.focus = function () {
+       if ( this.hasInput ) {
+               this.input.focus();
+       }
+};
+
+/**
+ * Get the datas of the currently selected items
+ *
+ * @return {string[]|Object[]} Datas of currently selected items
+ */
+OO.ui.TagMultiselectWidget.prototype.getValue = function () {
+       return this.getItems()
+               .filter( function ( item ) {
+                       return item.isValid();
+               } )
+               .map( function ( item ) {
+                       return item.getData();
+               } );
+};
+
+/**
+ * Set the value of this widget by datas.
+ *
+ * @param {string|string[]|Object|Object[]} value An object representing the data
+ *  and label of the value. If the widget allows arbitrary values,
+ *  the items will be added as-is. Otherwise, the data value will
+ *  be checked against allowedValues.
+ *  This object must contain at least a data key. Example:
+ *  { data: 'foo', label: 'Foo item' }
+ *  For multiple items, use an array of objects. For example:
+ *   [
+ *      { data: 'foo', label: 'Foo item' },
+ *      { data: 'bar', label: 'Bar item' }
+ *      ]
+ *  Value can also be added with plaintext array, for example:
+ *  [ 'foo', 'bar', 'bla' ] or a single string, like 'foo'
+ */
+OO.ui.TagMultiselectWidget.prototype.setValue = function ( valueObject ) {
+       valueObject = Array.isArray( valueObject ) ? valueObject : [ valueObject ];
+
+       this.clearItems();
+       valueObject.forEach( function ( obj ) {
+               if ( typeof obj === 'string' ) {
+                       this.addTag( obj );
+               } else {
+                       this.addTag( obj.data, obj.label );
+               }
+       }.bind( this ) );
+};
+
+/**
+ * Add tag to the display area
+ *
+ * @param {string|Object} data Tag data
+ * @param {string} [label] Tag label. If no label is provided, the
+ *  stringified version of the data will be used instead.
+ * @return {boolean} Item was added successfully
+ */
+OO.ui.TagMultiselectWidget.prototype.addTag = function ( data, label ) {
+       var newItemWidget,
+               isValid = this.isAllowedData( data );
+
+       if ( isValid || this.allowDisplayInvalidTags ) {
+               newItemWidget = this.createTagItemWidget( data, label );
+               newItemWidget.toggleValid( isValid );
+               this.addItems( [ newItemWidget ] );
+       }
+};
+
+/**
+ * Remove tag by its data property.
+ *
+ * @param {string|Object} data Tag data
+ */
+OO.ui.TagMultiselectWidget.prototype.removeTagByData = function ( data ) {
+       var item = this.getItemFromData( data );
+
+       this.removeItems( [ item ] );
+};
+
+/**
+ * Construct a OO.ui.TagItemWidget (or a subclass thereof) from given label and data.
+ *
+ * @protected
+ * @param {string} data Item data
+ * @param {string} label The label text.
+ * @return {OO.ui.TagItemWidget}
+ */
+OO.ui.TagMultiselectWidget.prototype.createTagItemWidget = function ( data, label ) {
+       label = label || data;
+
+       return new OO.ui.TagItemWidget( { data: data, label: label } );
+};
+
+/**
+ * Given an item, returns the item after it. If the item is already the
+ * last item, return `this.input`. If no item is passed, returns the
+ * very first item.
+ *
+ * @protected
+ * @param {OO.ui.TagItemWidget} [item] Tag item
+ * @return {OO.ui.Widget} The next widget available.
+ */
+OO.ui.TagMultiselectWidget.prototype.getNextItem = function ( item ) {
+       var itemIndex = this.items.indexOf( item );
+
+       if ( item === undefined || itemIndex === -1 ) {
+               return this.items[ 0 ];
+       }
+
+       if ( itemIndex === this.items.length - 1 ) { // Last item
+               if ( this.hasInput ) {
+                       return this.input;
+               } else {
+                       // Return first item
+                       return this.items[ 0 ];
+               }
+       } else {
+               return this.items[ itemIndex + 1 ];
+       }
+};
+
+/**
+ * Given an item, returns the item before it. If the item is already the
+ * first item, return `this.input`. If no item is passed, returns the
+ * very last item.
+ *
+ * @protected
+ * @param {OO.ui.TagItemWidget} [item] Tag item
+ * @return {OO.ui.Widget} The previous widget available.
+ */
+OO.ui.TagMultiselectWidget.prototype.getPreviousItem = function ( item ) {
+       var itemIndex = this.items.indexOf( item );
+
+       if ( item === undefined || itemIndex === -1 ) {
+               return this.items[ this.items.length - 1 ];
+       }
+
+       if ( itemIndex === 0 ) {
+               if ( this.hasInput ) {
+                       return this.input;
+               } else {
+                       // Return the last item
+                       return this.items[ this.items.length - 1 ];
+               }
+       } else {
+               return this.items[ itemIndex - 1 ];
+       }
+};
+
+/**
+ * Update the dimensions of the text input field to encompass all available area.
+ * This is especially relevant for when the input is at the edge of a line
+ * and should get smaller. The usual operation (as an inline-block with min-width)
+ * does not work in that case, pushing the input downwards to the next line.
+ *
+ * @private
+ */
+OO.ui.TagMultiselectWidget.prototype.updateInputSize = function () {
+       var $lastItem, direction, contentWidth, currentWidth, bestWidth;
+       if ( this.inputPosition === 'inline' && !this.isDisabled() ) {
+               this.input.$input.css( 'width', '1em' );
+               $lastItem = this.$group.children().last();
+               direction = OO.ui.Element.static.getDir( this.$handle );
+
+               // Get the width of the input with the placeholder text as
+               // the value and save it so that we don't keep recalculating
+               if (
+                       this.contentWidthWithPlaceholder === undefined &&
+                       this.input.getValue() === '' &&
+                       this.input.$input.attr( 'placeholder' ) !== undefined
+               ) {
+                       this.input.setValue( this.input.$input.attr( 'placeholder' ) );
+                       this.contentWidthWithPlaceholder = this.input.$input[ 0 ].scrollWidth;
+                       this.input.setValue( '' );
+
+               }
+
+               // Always keep the input wide enough for the placeholder text
+               contentWidth = Math.max(
+                       this.input.$input[ 0 ].scrollWidth,
+                       // undefined arguments in Math.max lead to NaN
+                       ( this.contentWidthWithPlaceholder === undefined ) ?
+                               0 : this.contentWidthWithPlaceholder
+               );
+               currentWidth = this.input.$input.width();
+
+               if ( contentWidth < currentWidth ) {
+                       this.updateIfHeightChanged();
+                       // All is fine, don't perform expensive calculations
+                       return;
+               }
+
+               if ( $lastItem.length === 0 ) {
+                       bestWidth = this.$content.innerWidth();
+               } else {
+                       bestWidth = direction === 'ltr' ?
+                               this.$content.innerWidth() - $lastItem.position().left - $lastItem.outerWidth() :
+                               $lastItem.position().left;
+               }
+
+               // Some safety margin for sanity, because I *really* don't feel like finding out where the few
+               // pixels this is off by are coming from.
+               bestWidth -= 10;
+               if ( contentWidth > bestWidth ) {
+                       // This will result in the input getting shifted to the next line
+                       bestWidth = this.$content.innerWidth() - 10;
+               }
+               this.input.$input.width( Math.floor( bestWidth ) );
+               this.updateIfHeightChanged();
+       } else {
+               this.updateIfHeightChanged();
+       }
+};
+
+/**
+ * Determine if widget height changed, and if so,
+ * emit the resize event. This is useful for when there are either
+ * menus or popups attached to the bottom of the widget, to allow
+ * them to change their positioning in case the widget moved down
+ * or up.
+ *
+ * @private
+ */
+OO.ui.TagMultiselectWidget.prototype.updateIfHeightChanged = function () {
+       var height = this.$element.height();
+       if ( height !== this.height ) {
+               this.height = height;
+               this.emit( 'resize' );
+       }
+};
+
+/**
+ * Check whether all items in the widget are valid
+ *
+ * @return {boolean} Widget is valid
+ */
+OO.ui.TagMultiselectWidget.prototype.checkValidity = function () {
+       return this.getItems().every( function ( item ) {
+               return item.isValid();
+       } );
+};
+
+/**
+ * Set the valid state of this item
+ *
+ * @param {boolean} [valid] Item is valid
+ * @fires valid
+ */
+OO.ui.TagMultiselectWidget.prototype.toggleValid = function ( valid ) {
+       valid = valid === undefined ? !this.valid : !!valid;
+
+       if ( this.valid !== valid ) {
+               this.valid = valid;
+
+               this.setFlags( { invalid: !this.valid } );
+
+               this.emit( 'valid', this.valid );
+       }
+};
+
+/**
+ * Get the current valid state of the widget
+ *
+ * @return {boolean} Widget is valid
+ */
+OO.ui.TagMultiselectWidget.prototype.isValid = function () {
+       return this.valid;
+};
+
+/**
+ * PopupTagMultiselectWidget is a {@link OO.ui.TagMultiselectWidget OO.ui.TagMultiselectWidget} intended
+ * to use a popup. The popup can be configured to have a default input to insert values into the widget.
+ *
+ * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
+ *
+ *     @example
+ *     // Example: A basic PopupTagMultiselectWidget.
+ *     var widget = new OO.ui.PopupTagMultiselectWidget();
+ *     $( 'body' ).append( widget.$element );
+ *
+ *     // Example: A PopupTagMultiselectWidget with an external popup.
+ *     var popupInput = new OO.ui.TextInputWidget(),
+ *         widget = new OO.ui.PopupTagMultiselectWidget( {
+ *            popupInput: popupInput,
+ *            popup: {
+ *               $content: popupInput.$element
+ *            }
+ *         } );
+ *     $( 'body' ).append( widget.$element );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
+ *
+ * @class
+ * @extends OO.ui.TagMultiselectWidget
+ * @mixins OO.ui.mixin.PopupElement
+ *
+ * @param {Object} config Configuration object
+ * @cfg {jQuery} [$overlay] An overlay for the popup
+ * @cfg {Object} [popup] Configuration options for the popup
+ * @cfg {OO.ui.InputWidget} [popupInput] An input widget inside the popup that will be
+ *  focused when the popup is opened and will be used as replacement for the
+ *  general input in the widget.
+ */
+OO.ui.PopupTagMultiselectWidget = function OoUiPopupTagMultiselectWidget( config ) {
+       var defaultInput,
+               defaultConfig = { popup: {} };
+
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.PopupTagMultiselectWidget.parent.call( this, $.extend( { inputPosition: 'none' }, config ) );
+
+       this.$overlay = config.$overlay || this.$element;
+
+       if ( !config.popup ) {
+               // For the default base implementation, we give a popup
+               // with an input widget inside it. For any other use cases
+               // the popup needs to be populated externally and the
+               // event handled to add tags separately and manually
+               defaultInput = new OO.ui.TextInputWidget();
+
+               defaultConfig.popupInput = defaultInput;
+               defaultConfig.popup.$content = defaultInput.$element;
+
+               this.$element.addClass( 'oo-ui-popupTagMultiselectWidget-defaultPopup' );
+       }
+
+       // Add overlay, and add that to the autoCloseIgnore
+       defaultConfig.popup.$overlay = this.$overlay;
+       defaultConfig.popup.$autoCloseIgnore = this.hasInput ?
+               this.input.$element.add( this.$overlay ) : this.$overlay;
+
+       // Allow extending any of the above
+       config = $.extend( defaultConfig, config );
+
+       // Mixin constructors
+       OO.ui.mixin.PopupElement.call( this, config );
+
+       if ( this.hasInput ) {
+               this.input.$input.on( 'focus', this.popup.toggle.bind( this.popup, true ) );
+       }
+
+       // Configuration options
+       this.popupInput = config.popupInput;
+       if ( this.popupInput ) {
+               this.popupInput.connect( this, {
+                       enter: 'onPopupInputEnter'
+               } );
+       }
+
+       // Events
+       this.popup.connect( this, { toggle: 'onPopupToggle' } );
+       this.$tabIndexed
+               .on( 'focus', this.focus.bind( this ) );
+
+       // Initialize
+       this.$element
+               .append( this.popup.$element )
+               .addClass( 'oo-ui-popupTagMultiselectWidget' );
+};
+
+/* Initialization */
+
+OO.inheritClass( OO.ui.PopupTagMultiselectWidget, OO.ui.TagMultiselectWidget );
+OO.mixinClass( OO.ui.PopupTagMultiselectWidget, OO.ui.mixin.PopupElement );
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.PopupTagMultiselectWidget.prototype.focus = function () {
+       // Since the parent deals with input focus, only
+       // call the parent method if our input isn't in the
+       // popup
+       if ( !this.popupInput ) {
+               // Parent method
+               OO.ui.PopupTagMultiselectWidget.parent.prototype.focus.call( this );
+       }
+
+       this.popup.toggle( true );
+};
+
+/**
+ * Respond to popup toggle event
+ *
+ * @param {boolean} isVisible Popup is visible
+ */
+OO.ui.PopupTagMultiselectWidget.prototype.onPopupToggle = function ( isVisible ) {
+       if ( isVisible && this.popupInput ) {
+               this.popupInput.focus();
+       }
+};
+
+/**
+ * Respond to popup input enter event
+ */
+OO.ui.PopupTagMultiselectWidget.prototype.onPopupInputEnter = function () {
+       if ( this.popupInput ) {
+               this.addTagByPopupValue( this.popupInput.getValue() );
+               this.popupInput.setValue( '' );
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.PopupTagMultiselectWidget.prototype.onTagSelect = function ( item ) {
+       if ( this.popupInput && this.allowEditTags ) {
+               this.popupInput.setValue( item.getData() );
+               this.removeItems( [ item ] );
+
+               this.popup.toggle( true );
+               this.popupInput.focus();
+       } else {
+               // Parent
+               OO.ui.PopupTagMultiselectWidget.parent.prototype.onTagSelect.call( this, item );
+       }
+};
+
+/**
+ * Add a tag by the popup value.
+ * Whatever is responsible for setting the value in the popup should call
+ * this method to add a tag, or use the regular methods like #addTag or
+ * #setValue directly.
+ *
+ * @param {string} data The value of item
+ * @param {string} [label] The label of the tag. If not given, the data is used.
+ */
+OO.ui.PopupTagMultiselectWidget.prototype.addTagByPopupValue = function ( data, label ) {
+       this.addTag( data, label );
+};
+
+/**
+ * MenuTagMultiselectWidget is a {@link OO.ui.TagMultiselectWidget OO.ui.TagMultiselectWidget} intended
+ * to use a menu of selectable options.
+ *
+ * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
+ *
+ *     @example
+ *     // Example: A basic MenuTagMultiselectWidget.
+ *     var widget = new OO.ui.MenuTagMultiselectWidget( {
+ *         inputPosition: 'outline',
+ *         options: [
+ *            { data: 'option1', label: 'Option 1' },
+ *            { data: 'option2', label: 'Option 2' },
+ *            { data: 'option3', label: 'Option 3' },
+ *         ],
+ *         selected: [ 'option1', 'option2' ]
+ *     } );
+ *     $( 'body' ).append( widget.$element );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
+ *
+ * @class
+ * @extends OO.ui.TagMultiselectWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration object
+ * @cfg {Object} [menu] Configuration object for the menu widget
+ * @cfg {jQuery} [$overlay] An overlay for the menu
+ * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`
+ */
+OO.ui.MenuTagMultiselectWidget = function OoUiMenuTagMultiselectWidget( config ) {
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.MenuTagMultiselectWidget.parent.call( this, config );
+
+       this.$overlay = config.$overlay || this.$element;
+
+       this.menu = this.createMenuWidget( $.extend( {
+               widget: this,
+               input: this.hasInput ? this.input : null,
+               $input: this.hasInput ? this.input.$input : null,
+               filterFromInput: !!this.hasInput,
+               $autoCloseIgnore: this.hasInput ?
+                       this.input.$element.add( this.$overlay ) : this.$overlay,
+               $container: this.hasInput && this.inputPosition === 'outline' ?
+                       this.input.$element : this.$element,
+               $overlay: this.$overlay,
+               disabled: this.isDisabled()
+       }, config.menu ) );
+       this.addOptions( config.options || [] );
+
+       // Events
+       this.menu.connect( this, {
+               choose: 'onMenuChoose',
+               toggle: 'onMenuToggle'
+       } );
+       if ( this.hasInput ) {
+               this.input.connect( this, { change: 'onInputChange' } );
+       }
+       this.connect( this, { resize: 'onResize' } );
+
+       // Initialization
+       this.$overlay
+               .append( this.menu.$element );
+       this.$element
+               .addClass( 'oo-ui-menuTagMultiselectWidget' );
+};
+
+/* Initialization */
+
+OO.inheritClass( OO.ui.MenuTagMultiselectWidget, OO.ui.TagMultiselectWidget );
+
+/* Methods */
+
+/**
+ * Respond to resize event
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onResize = function () {
+       // Reposition the menu
+       this.menu.position();
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onInputFocus = function () {
+       // Parent method
+       OO.ui.MenuTagMultiselectWidget.parent.prototype.onInputFocus.call( this );
+
+       this.menu.toggle( true );
+};
+
+/**
+ * Respond to input change event
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onInputChange = function () {
+       this.menu.toggle( true );
+};
+
+/**
+ * Respond to menu choose event
+ *
+ * @param {OO.ui.OptionWidget} menuItem Chosen menu item
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onMenuChoose = function ( menuItem ) {
+       // Add tag
+       this.addTag( menuItem.getData(), menuItem.getLabel() );
+};
+
+/**
+ * Respond to menu toggle event. Reset item highlights on hide.
+ *
+ * @param {boolean} isVisible The menu is visible
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onMenuToggle = function ( isVisible ) {
+       if ( !isVisible ) {
+               this.menu.selectItem( null );
+               this.menu.highlightItem( null );
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onTagSelect = function ( tagItem ) {
+       var menuItem = this.menu.getItemFromData( tagItem.getData() );
+       // Override the base behavior from TagMultiselectWidget; the base behavior
+       // in TagMultiselectWidget is to remove the tag to edit it in the input,
+       // but in our case, we want to utilize the menu selection behavior, and
+       // definitely not remove the item.
+
+       // Select the menu item
+       this.menu.selectItem( menuItem );
+
+       this.focus();
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.addTagFromInput = function () {
+       var inputValue = this.input.getValue(),
+               highlightedItem = this.menu.getHighlightedItem(),
+               item = this.menu.getItemFromData( inputValue );
+
+       // Override the parent method so we add from the menu
+       // rather than directly from the input
+
+       // Look for a highlighted item first
+       if ( highlightedItem ) {
+               this.addTag( highlightedItem.getData(), highlightedItem.getLabel() );
+       } else if ( item ) {
+               // Look for the element that fits the data
+               this.addTag( item.getData(), item.getLabel() );
+       } else {
+               // Otherwise, add the tag - the method will only add if the
+               // tag is valid or if invalid tags are allowed
+               this.addTag( inputValue );
+       }
+};
+
+/**
+ * Return the visible items in the menu. This is mainly used for when
+ * the menu is filtering results.
+ *
+ * @return {OO.ui.MenuOptionWidget[]} Visible results
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.getMenuVisibleItems = function () {
+       return this.menu.getItems().filter( function ( menuItem ) {
+               return menuItem.isVisible();
+       } );
+};
+
+/**
+ * Create the menu for this widget. This is in a separate method so that
+ * child classes can override this without polluting the constructor with
+ * unnecessary extra objects that will be overidden.
+ *
+ * @param {Object} menuConfig Configuration options
+ * @return {OO.ui.MenuSelectWidget} Menu widget
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.createMenuWidget = function ( menuConfig ) {
+       return new OO.ui.FloatingMenuSelectWidget( menuConfig );
+};
+
+/**
+ * Add options to the menu
+ *
+ * @param {Object[]} options Object defining options
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.addOptions = function ( menuOptions ) {
+       var widget = this,
+               items = menuOptions.map( function ( obj ) {
+                       return widget.createMenuOptionWidget( obj.data, obj.label );
+               } );
+
+       this.menu.addItems( items );
+};
+
+/**
+ * Create a menu option widget.
+ *
+ * @param {string} data Item data
+ * @param {string} [label] Item label
+ * @return {OO.ui.OptionWidget} Option widget
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.createMenuOptionWidget = function ( data, label ) {
+       return new OO.ui.MenuOptionWidget( {
+               data: data,
+               label: label || data
+       } );
+};
+
+/**
+ * Get the menu
+ *
+ * @return {OO.ui.MenuSelectWidget} Menu
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.getMenu = function () {
+       return this.menu;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.isAllowedData = function ( data ) {
+       return OO.ui.MenuTagMultiselectWidget.parent.prototype.isAllowedData.call( this, data ) &&
+               !!this.menu.getItemFromData( data );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.focus = function () {
+       // Parent method
+       OO.ui.MenuTagMultiselectWidget.parent.prototype.focus.call( this );
+
+       if ( !this.isDisabled() ) {
+               this.menu.toggle( true );
+       }
+};
+
 /**
  * SelectFileWidgets allow for selecting files, using the HTML5 File API. These
  * widgets can be configured with {@link OO.ui.mixin.IconElement icons} and {@link
index 4842a46..013d52d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:41Z
+ * Date: 2017-04-11T22:51:10Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
   background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
   top: 1em;
   bottom: 1em;
   max-height: 100%;
-  max-height: calc(100% - 2em);
+  max-height: calc( 100% - 2em );
   border: 1px solid #ccc;
   border-radius: 0.5em;
   box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
index beca510..1cb55d6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:41Z
+ * Date: 2017-04-11T22:51:10Z
  */
 .oo-ui-window {
   background: transparent;
index 1cbec34..b23949f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.20.2
+ * OOjs UI v0.21.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-30T20:34:37Z
+ * Date: 2017-04-11T22:51:05Z
  */
 ( function ( OO ) {
 
@@ -60,14 +60,6 @@ OO.ui.ActionWidget = function OoUiActionWidget( config ) {
 OO.inheritClass( OO.ui.ActionWidget, OO.ui.ButtonWidget );
 OO.mixinClass( OO.ui.ActionWidget, OO.ui.mixin.PendingElement );
 
-/* Events */
-
-/**
- * A resize event is emitted when the size of the widget changes.
- *
- * @event resize
- */
-
 /* Methods */
 
 /**
@@ -102,90 +94,6 @@ OO.ui.ActionWidget.prototype.getModes = function () {
        return this.modes.slice();
 };
 
-/**
- * Emit a resize event if the size has changed.
- *
- * @private
- * @chainable
- */
-OO.ui.ActionWidget.prototype.propagateResize = function () {
-       var width, height;
-
-       if ( this.isElementAttached() ) {
-               width = this.$element.width();
-               height = this.$element.height();
-
-               if ( width !== this.width || height !== this.height ) {
-                       this.width = width;
-                       this.height = height;
-                       this.emit( 'resizePrivate' );
-                       if ( this.emit( 'resize' ) ) {
-                               OO.ui.warnDeprecation( 'ActionWidget: resize event is deprecated. See T129162.' );
-                       }
-               }
-       }
-
-       return this;
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.ActionWidget.prototype.setIcon = function () {
-       // Mixin method
-       OO.ui.mixin.IconElement.prototype.setIcon.apply( this, arguments );
-       this.propagateResize();
-
-       return this;
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.ActionWidget.prototype.setLabel = function () {
-       // Mixin method
-       OO.ui.mixin.LabelElement.prototype.setLabel.apply( this, arguments );
-       this.propagateResize();
-
-       return this;
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.ActionWidget.prototype.setFlags = function () {
-       // Mixin method
-       OO.ui.mixin.FlaggedElement.prototype.setFlags.apply( this, arguments );
-       this.propagateResize();
-
-       return this;
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.ActionWidget.prototype.clearFlags = function () {
-       // Mixin method
-       OO.ui.mixin.FlaggedElement.prototype.clearFlags.apply( this, arguments );
-       this.propagateResize();
-
-       return this;
-};
-
-/**
- * Toggle the visibility of the action button.
- *
- * @param {boolean} [show] Show button, omit to toggle visibility
- * @chainable
- */
-OO.ui.ActionWidget.prototype.toggle = function () {
-       // Parent method
-       OO.ui.ActionWidget.parent.prototype.toggle.apply( this, arguments );
-       this.propagateResize();
-
-       return this;
-};
-
 /* eslint-disable no-unused-vars */
 /**
  * ActionSets manage the behavior of the {@link OO.ui.ActionWidget action widgets} that comprise them.
@@ -320,14 +228,6 @@ OO.ui.ActionSet.static.specialFlags = [ 'safe', 'primary' ];
  * @param {OO.ui.ActionWidget} action Action that was clicked
  */
 
-/**
- * @event resize
- *
- * A 'resize' event is emitted when an action widget is resized.
- *
- * @param {OO.ui.ActionWidget} action Action that was resized
- */
-
 /**
  * @event add
  *
@@ -566,11 +466,6 @@ OO.ui.ActionSet.prototype.add = function ( actions ) {
                        click: [ 'emit', 'click', action ],
                        toggle: [ 'onActionChange' ]
                } );
-               action.on( 'resizePrivate', function ( action ) {
-                       if ( this.emit( 'resize', action ) ) {
-                               OO.ui.warnDeprecation( 'ActionSet: resize event is deprecated. See T129162.' );
-                       }
-               }, [ action ], this );
                this.list.push( action );
        }
        this.organized = false;
@@ -2842,6 +2737,7 @@ OO.ui.MessageDialog.prototype.getActionProcess = function ( action ) {
  * @param {Object} [data] Dialog opening data
  * @param {jQuery|string|Function|null} [data.title] Description of the action being confirmed
  * @param {jQuery|string|Function|null} [data.message] Description of the action's consequence
+ * @param {string} [data.size] Symbolic name of the dialog size, see OO.ui.Window
  * @param {Object[]} [data.actions] List of OO.ui.ActionOptionWidget configuration options for each
  *   action item
  */
@@ -2857,6 +2753,7 @@ OO.ui.MessageDialog.prototype.getSetupProcess = function ( data ) {
                        this.message.setLabel(
                                data.message !== undefined ? data.message : this.constructor.static.message
                        );
+                       this.size = data.size !== undefined ? data.size : this.constructor.static.size;
                }, this );
 };
 
@@ -3408,6 +3305,8 @@ OO.ui.getWindowManager = function () {
  *         console.log( 'User closed the dialog.' );
  *     } );
  *
+ *     OO.ui.alert( 'Something larger happened!', { size: 'large' } );
+ *
  * @param {jQuery|string} text Message text to display
  * @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess
  * @return {jQuery.Promise} Promise resolved when the user closes the dialog
index 9dd3404..c194497 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <path d="M11 12h4V7h-4v5zm-5 2h9v-1H6v1zm0 2h9v-1H6v1zm0 2h9v-1H6v1zm4-9H6v1h4V9zm0 2H6v1h4v-1zm0-4H6v1h4V7zM4 5h13v16H7c-1.7 0-3-1.3-3-3V5z"/>
     <path d="M18 4v14h2V2H7v2" fill-rule="evenodd"/>
index b57dae2..40a9348 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <path d="M13 12H9V7h4v5zm5 2H9v-1h9v1zm0 2H9v-1h9v1zm0 2H9v-1h9v1zm-4-9h4v1h-4V9zm0 2h4v1h-4v-1zm0-4h4v1h-4V7zm6-2H7v16h10c1.7 0 3-1.3 3-3V5z"/>
     <path d="M6 4v14H4V2h13v2" fill-rule="evenodd"/>
index 884e55c..86b004f 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M11 12h4V7h-4v5zm-5 2h9v-1H6v1zm0 2h9v-1H6v1zm0 2h9v-1H6v1zm4-9H6v1h4V9zm0 2H6v1h4v-1zm0-4H6v1h4V7zM4 5h13v16H7c-1.7 0-3-1.3-3-3V5z"/>
     <path d="M18 4v14h2V2H7v2" fill-rule="evenodd"/>
index 599aa69..838655b 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M11 12h4V7h-4v5zm-5 2h9v-1H6v1zm0 2h9v-1H6v1zm0 2h9v-1H6v1zm4-9H6v1h4V9zm0 2H6v1h4v-1zm0-4H6v1h4V7zM4 5h13v16H7c-1.7 0-3-1.3-3-3V5z"/>
     <path d="M18 4v14h2V2H7v2" fill-rule="evenodd"/>
index 9dd3404..c194497 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <path d="M11 12h4V7h-4v5zm-5 2h9v-1H6v1zm0 2h9v-1H6v1zm0 2h9v-1H6v1zm4-9H6v1h4V9zm0 2H6v1h4v-1zm0-4H6v1h4V7zM4 5h13v16H7c-1.7 0-3-1.3-3-3V5z"/>
     <path d="M18 4v14h2V2H7v2" fill-rule="evenodd"/>
index 64b9181..e2793b5 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M13 12H9V7h4v5zm5 2H9v-1h9v1zm0 2H9v-1h9v1zm0 2H9v-1h9v1zm-4-9h4v1h-4V9zm0 2h4v1h-4v-1zm0-4h4v1h-4V7zm6-2H7v16h10c1.7 0 3-1.3 3-3V5z"/>
     <path d="M6 4v14H4V2h13v2" fill-rule="evenodd"/>
index 18799af..bf3d169 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M13 12H9V7h4v5zm5 2H9v-1h9v1zm0 2H9v-1h9v1zm0 2H9v-1h9v1zm-4-9h4v1h-4V9zm0 2h4v1h-4v-1zm0-4h4v1h-4V7zm6-2H7v16h10c1.7 0 3-1.3 3-3V5z"/>
     <path d="M6 4v14H4V2h13v2" fill-rule="evenodd"/>
index b57dae2..40a9348 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <path d="M13 12H9V7h4v5zm5 2H9v-1h9v1zm0 2H9v-1h9v1zm0 2H9v-1h9v1zm-4-9h4v1h-4V9zm0 2h4v1h-4v-1zm0-4h4v1h-4V7zm6-2H7v16h10c1.7 0 3-1.3 3-3V5z"/>
     <path d="M6 4v14H4V2h13v2" fill-rule="evenodd"/>
index 582adce..ae66af4 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png differ
index e194d0d..b5e6144 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
-    <g id="down">
-        <path id="arrow" d="M1 4h10L6 9 1 4"/>
-    </g>
+       <path d="M11.05 3.996l-.965-1.053-4.035 3.86-3.947-3.86L1.05 3.996l5 5 5-5"/>
 </g></svg>
index af67c7a..34f5041 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png differ
index f5c76f3..d3e55d1 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="down">
-        <path id="arrow" d="M1 4h10L6 9 1 4"/>
-    </g>
+       <path d="M11.05 3.996l-.965-1.053-4.035 3.86-3.947-3.86L1.05 3.996l5 5 5-5"/>
 </svg>
index 05578be..68bf475 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png differ
index 9e0e569..78f4b51 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
-    <g id="ltr">
-        <path id="arrow" d="M4 1v10l5-5-5-5"/>
-    </g>
+       <path d="M4.026 11l-1.052-.965L6.832 6 2.974 2.053 4.026 1l5 5-5 5"/>
 </g></svg>
index d7a4111..cadc38f 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.png differ
index 059372d..e99855b 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="ltr">
-        <path id="arrow" d="M4 1v10l5-5-5-5"/>
-    </g>
+       <path d="M4.026 11l-1.052-.965L6.832 6 2.974 2.053 4.026 1l5 5-5 5"/>
 </svg>
index 9731658..fae56f1 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.png differ
index d032b05..bc0ff6f 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
-    <g id="rtl">
-        <path id="arrow" d="M8 11V1L3 6l5 5"/>
-    </g>
+       <path d="M7.974 11l1.052-.965L5.168 6l3.858-3.947L7.974 1l-5 5 5 5"/>
 </g></svg>
index afceed6..5a4c0b6 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.png differ
index c6498e8..1647501 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="rtl">
-        <path id="arrow" d="M8 11V1L3 6l5 5"/>
-    </g>
+       <path d="M7.974 11l1.052-.965L5.168 6l3.858-3.947L7.974 1l-5 5 5 5"/>
 </svg>
index 218a700..56eeea4 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.png differ
index 3b79abb..3c81ae5 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
-    <g id="up">
-        <path id="arrow" d="M1 8h10L6 3 1 8"/>
-    </g>
+       <path d="M11 7.974l-.965 1.052L6 5.168 2.053 9.026 1 7.974l5-5 5 5"/>
 </g></svg>
index ee12d6e..672b7f3 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.png differ
index 5eada07..ca93281 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="up">
-        <path id="arrow" d="M1 8h10L6 3 1 8"/>
-    </g>
+       <path d="M11 7.974l-.965 1.052L6 5.168 2.053 9.026 1 7.974l5-5 5 5"/>
 </svg>
index df32417..1b99365 100644 (file)
@@ -6,18 +6,6 @@
                "invert": {
                        "color": "#fff",
                        "global": true
-               },
-               "progressive": {
-                       "color": "#36c"
-               },
-               "constructive": {
-                       "color": "#36c"
-               },
-               "destructive": {
-                       "color": "#d33"
-               },
-               "warning": {
-                       "color": "#ff5d00"
                }
        },
        "images": {
index 8062849..6eccc05 100644 (file)
  */
 ( function ( mw, $ ) {
        var msg,
-               win = window,
-               ua = navigator.userAgent.toLowerCase(),
-               onloadFuncts = [],
                loadedScripts = {};
 
-       /**
-        * User-agent sniffing.
-        *
-        * @deprecated since 1.17 Use jquery.client instead
-        */
-
-       msg = 'Use feature detection or module jquery.client instead.';
-
-       mw.log.deprecate( win, 'clientPC', ua, msg );
-
-       // Ignored dummy values
-       mw.log.deprecate( win, 'is_gecko', false, msg );
-       mw.log.deprecate( win, 'is_chrome_mac', false, msg );
-       mw.log.deprecate( win, 'is_chrome', false, msg );
-       mw.log.deprecate( win, 'webkit_version', false, msg );
-       mw.log.deprecate( win, 'is_safari_win', false, msg );
-       mw.log.deprecate( win, 'is_safari', false, msg );
-       mw.log.deprecate( win, 'webkit_match', false, msg );
-       mw.log.deprecate( win, 'is_ff2', false, msg );
-       mw.log.deprecate( win, 'ff2_bugs', false, msg );
-       mw.log.deprecate( win, 'is_ff2_win', false, msg );
-       mw.log.deprecate( win, 'is_ff2_x11', false, msg );
-       mw.log.deprecate( win, 'opera95_bugs', false, msg );
-       mw.log.deprecate( win, 'opera7_bugs', false, msg );
-       mw.log.deprecate( win, 'opera6_bugs', false, msg );
-       mw.log.deprecate( win, 'is_opera_95', false, msg );
-       mw.log.deprecate( win, 'is_opera_preseven', false, msg );
-       mw.log.deprecate( win, 'is_opera', false, msg );
-       mw.log.deprecate( win, 'ie6_bugs', false, msg );
+       function wikiUrlencode( page ) {
+               return encodeURIComponent( String( page ) )
+                       .replace( /'/g, '%27' )
+                       .replace( /%20/g, '_' )
+                       // wfUrlencode replacements
+                       .replace( /%3B/g, ';' )
+                       .replace( /%40/g, '@' )
+                       .replace( /%24/g, '$' )
+                       .replace( /%21/g, '!' )
+                       .replace( /%2A/g, '*' )
+                       .replace( /%28/g, '(' )
+                       .replace( /%29/g, ')' )
+                       .replace( /%2C/g, ',' )
+                       .replace( /%2F/g, '/' )
+                       .replace( /%7E/g, '~' )
+                       .replace( /%3A/g, ':' );
+       }
 
        /**
-        * DOM utilities for handling of events, text nodes and selecting elements
-        *
         * @deprecated since 1.17 Use jQuery instead
         */
-       msg = 'Use jQuery instead.';
-
-       // Ignored dummy values
-       mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
-       mw.log.deprecate( win, 'onloadFuncts', [], msg );
-       mw.log.deprecate( win, 'runOnloadHook', $.noop, msg );
-       mw.log.deprecate( win, 'changeText', $.noop, msg );
-       mw.log.deprecate( win, 'killEvt', $.noop, msg );
-       mw.log.deprecate( win, 'addHandler', $.noop, msg );
-       mw.log.deprecate( win, 'hookEvent', $.noop, msg );
-       mw.log.deprecate( win, 'addClickHandler', $.noop, msg );
-       mw.log.deprecate( win, 'removeHandler', $.noop, msg );
-       mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg );
-       mw.log.deprecate( win, 'getInnerText', function () { return ''; }, msg );
-
-       // Run a function after the window onload event is fired
-       mw.log.deprecate( win, 'addOnloadHook', function ( hookFunct ) {
-               if ( onloadFuncts ) {
-                       onloadFuncts.push( hookFunct );
-               } else {
-                       // If func queue is gone the event has happened already,
-                       // run immediately instead of queueing.
-                       hookFunct();
-               }
-       }, msg );
-
-       $( win ).on( 'load', function () {
-               var i, functs;
-
-               // Don't run twice
-               if ( !onloadFuncts ) {
-                       return;
-               }
-
-               // Deference and clear onloadFuncts before running any
-               // hooks to make sure we don't miss any addOnloadHook
-               // calls.
-               functs = onloadFuncts.slice();
-               onloadFuncts = undefined;
-
-               // Execute the queued functions
-               for ( i = 0; i < functs.length; i++ ) {
-                       functs[ i ]();
-               }
-       } );
-
-       /**
-        * Toggle checkboxes with shift selection
-        *
-        * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
-        */
-       msg = 'Use jquery.checkboxShiftClick instead.';
-       mw.log.deprecate( win, 'checkboxes', [], msg );
-       mw.log.deprecate( win, 'lastCheckbox', null, msg );
-       mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
-       mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg );
-       mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
-
-       /**
-        * Add a button to the default editor toolbar
-        *
-        * @deprecated since 1.17 Use mw.toolbar instead
-        */
-       mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
-       mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
-
-       /**
-        * Spinner creation, injection and removal
-        *
-        * @deprecated since 1.18 Use jquery.spinner instead
-        */
-       mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
-       mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
-
-       /**
-        * Escape utilities
-        *
-        * @deprecated since 1.18 Use mw.html instead
-        */
-       mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
-       mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
-
-       /**
-        * Display a message to the user
-        *
-        * @deprecated since 1.17 Use mediawiki.notify instead
-        * @param {string|HTMLElement} message To be put inside the message box
-        */
-       mw.log.deprecate( win, 'jsMsg', function ( message ) {
-               if ( !arguments.length || message === '' || message === null ) {
-                       return true;
-               }
-               if ( typeof message !== 'object' ) {
-                       message = $.parseHTML( message );
-               }
-               mw.notify( message, { autoHide: true, tag: 'legacy' } );
-               return true;
-       }, 'Use mediawiki.notify instead.' );
-
-       /**
-        * Misc. utilities
-        *
-        * @deprecated since 1.17 Use mediawiki.util or jquery.accessKeyLabel instead
-        */
-       msg = 'Use mediawiki.util instead.';
-       mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
-       mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
-       msg = 'Use jquery.accessKeyLabel instead.';
-       mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
-       mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
-       // mw.util.updateTooltipAccessKeys already generates a deprecation message.
-       win.updateTooltipAccessKeys = function () {
-               return mw.util.updateTooltipAccessKeys.apply( null, arguments );
-       };
+       mw.log.deprecate( window, 'addOnloadHook', function ( fn ) {
+               $( function () { fn(); } );
+       }, 'Use jQuery instead.' );
 
        /**
         * Wikipage import methods
        }
 
        function importScript( page ) {
-               var uri = mw.config.get( 'wgScript' ) + '?title=' +
-                       mw.util.wikiUrlencode( page ) +
+               var uri = mw.config.get( 'wgScript' ) + '?title=' + wikiUrlencode( page ) +
                        '&action=raw&ctype=text/javascript';
                return importScriptURI( uri );
        }
        }
 
        function importStylesheet( page ) {
-               var uri = mw.config.get( 'wgScript' ) + '?title=' +
-                       mw.util.wikiUrlencode( page ) +
+               var uri = mw.config.get( 'wgScript' ) + '?title=' + wikiUrlencode( page ) +
                        '&action=raw&ctype=text/css';
                return importStylesheetURI( uri );
        }
 
        msg = 'Use mw.loader instead.';
-       mw.log.deprecate( win, 'loadedScripts', loadedScripts, msg );
-       mw.log.deprecate( win, 'importScriptURI', importScriptURI, msg );
-       mw.log.deprecate( win, 'importStylesheetURI', importStylesheetURI, msg );
+       mw.log.deprecate( window, 'loadedScripts', loadedScripts, msg );
+       mw.log.deprecate( window, 'importScriptURI', importScriptURI, msg );
+       mw.log.deprecate( window, 'importStylesheetURI', importStylesheetURI, msg );
        // Not quite deprecated yet.
-       win.importScript = importScript;
-       win.importStylesheet = importStylesheet;
+       window.importScript = importScript;
+       window.importStylesheet = importStylesheet;
 
-       // Replace document.write/writeln with basic html parsing that appends
-       // to the <body> to avoid blanking pages. Added JavaScript will not run.
+       /**
+        * Replace document.write/writeln with basic html parsing that appends
+        * to the <body> to avoid blanking pages. Added JavaScript will not run.
+        *
+        * @deprecated since 1.26
+        */
        $.each( [ 'write', 'writeln' ], function ( idx, method ) {
                mw.log.deprecate( document, method, function () {
                        $( 'body' ).append( $.parseHTML( Array.prototype.join.call( arguments, '' ) ) );
index f04cc85..8fd1553 100644 (file)
         * @param {Array} filters Filter group definition
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters ) {
-               var i, filterItem, selectedFilterNames, filterConflictResult, groupConflictResult, subsetNames,
+               var i, filterItem, filterConflictResult, groupConflictResult, subsetNames,
                        model = this,
                        items = [],
                        supersetMap = {},
                                groupConflictMap[ group ] = data.conflicts;
                        }
 
-                       selectedFilterNames = [];
                        for ( i = 0; i < data.filters.length; i++ ) {
                                data.filters[ i ].subset = data.filters[ i ].subset || [];
                                data.filters[ i ].subset = data.filters[ i ].subset.map( function ( el ) {
                                        // Store the default parameter state
                                        // For this group type, parameter values are direct
                                        model.defaultParams[ data.filters[ i ].name ] = Number( !!data.filters[ i ].default );
-                               } else if (
-                                       data.type === 'string_options' &&
-                                       data.filters[ i ].default
-                               ) {
-                                       selectedFilterNames.push( data.filters[ i ].name );
                                }
 
                                model.groups[ group ].addItems( filterItem );
                                items.push( filterItem );
                        }
 
-                       if ( data.type === 'string_options' ) {
+                       if ( data.type === 'string_options' && data.default ) {
                                // Store the default parameter group state
                                // For this group, the parameter is group name and value is the names
                                // of selected items
-                               model.defaultParams[ group ] = model.sanitizeStringOptionGroup( group, selectedFilterNames ).join( model.groups[ group ].getSeparator() );
+                               model.defaultParams[ group ] = model.sanitizeStringOptionGroup(
+                                       group,
+                                       data.default.split( model.groups[ group ].getSeparator() )
+                               ).join( model.groups[ group ].getSeparator() );
                        }
                } );
 
                                                        paramValues.length === model.groups[ group ].getItemCount()
                                                ) ?
                                                // All true (either because all values are written or the term 'all' is written)
-                                               // is the same as all filters set to false
-                                               false :
+                                               // is the same as all filters set to true
+                                               true :
                                                // Otherwise, the filter is selected only if it appears in the parameter values
                                                paramValues.indexOf( filterItem.getParamName() ) > -1;
                                }
index d774ad2..18fb4e6 100644 (file)
 
                        & > .oo-ui-buttonElement-button {
                                font-weight: normal;
+                               // Override OOUI's definitions for button
+                               border-color: transparent;
+                               padding: 0;
+
+                               &:focus {
+                                       box-shadow: none;
+                                       outline: 0;
+                               }
                        }
                }
 
index bc752b5..2a47fa2 100644 (file)
 .mw-widget-mediaResultWidget-thumbnail {
        opacity: 0;
        display: inline-block;
-       /* stylelint-disable no-unsupported-browser-features */
        -webkit-transition: opacity 400ms;
        -moz-transition: opacity 400ms;
        transition: opacity 400ms;
-       /* stylelint-enable no-unsupported-browser-features */
 }
 
 .mw-widget-mediaResultWidget-done .mw-widget-mediaResultWidget-thumbnail,
@@ -35,7 +33,7 @@
 }
 
 .mw-widget-mediaResultWidget-crop {
-       background-size: cover; /* stylelint-disable-line no-unsupported-browser-features */
+       background-size: cover;
        background-position: center center;
 }
 
@@ -56,7 +54,7 @@
 .mw-widget-mediaResultWidget-error .mw-widget-mediaResultWidget-thumbnail {
        /* @embed */
        background-image: url( broken-image.png );
-       background-size: auto; /* stylelint-disable-line no-unsupported-browser-features */
+       background-size: auto;
        background-position: center center;
        background-repeat: no-repeat;
 }
@@ -69,7 +67,7 @@
        overflow: hidden;
        padding: 0.5em;
        color: #fff;
-       text-shadow: 1px 1px #000; /* stylelint-disable-line no-unsupported-browser-features */
+       text-shadow: 1px 1px #000;
        line-height: 1.125em;
        background-color: rgba( 0, 0, 0, 0.5 );
        text-overflow: ellipsis;
index c6938e8..5cbd2ec 100644 (file)
@@ -65,7 +65,7 @@
                this.$results.on( 'scroll', this.onResultsScroll.bind( this ) );
                this.$query.append( this.noItemsMessage.$element );
                this.results.connect( this, {
-                       add: 'onResultsAdd',
+                       change: 'onResultsChange',
                        remove: 'onResultsRemove'
                } );
 
         *
         * @param {mw.widgets.MediaResultWidget[]} items An array of item elements
         */
-       mw.widgets.MediaSearchWidget.prototype.onResultsAdd = function ( items ) {
+       mw.widgets.MediaSearchWidget.prototype.onResultsChange = function ( items ) {
                var search = this;
 
+               if ( !items.length ) {
+                       return;
+               }
+
                // Add method to a queue; this queue will only run when the widget
                // is visible
                this.layoutQueue.push( function () {
index 86a9a0a..08807fb 100644 (file)
         * @member mw.hook
         */
        $( function () {
-               var loading = $.grep( mw.loader.getModuleNames(), function ( module ) {
+               var loading, modules;
+
+               modules = $.grep( mw.loader.getModuleNames(), function ( module ) {
                        return mw.loader.getState( module ) === 'loading';
                } );
                // We only need a callback, not any actual module. First try a single using()
                // for all loading modules. If one fails, fall back to tracking each module
                // separately via $.when(), this is expensive.
-               loading = mw.loader.using( loading ).then( null, function () {
-                       var all = loading.map( function ( module ) {
+               loading = mw.loader.using( modules ).then( null, function () {
+                       var all = modules.map( function ( module ) {
                                return mw.loader.using( module ).then( null, function () {
                                        return $.Deferred().resolve();
                                } );
index 147de92..633798d 100644 (file)
@@ -1,7 +1,8 @@
 .mw-notification-area {
        top: 0;
        right: 0;
-       padding: 1em 1em 0 0;
+       /* Padding on all sides so drop shadows aren't cut by overflow: hidden */
+       padding: 1em;
        width: 20em;
        line-height: 1.35;
        z-index: 10000;
index 4849f5a..d36c4a0 100644 (file)
                defaults: {
                        autoHide: true,
                        autoHideSeconds: 'short',
-                       tag: false,
-                       title: undefined,
-                       type: false
+                       tag: null,
+                       title: null,
+                       type: null
                },
 
                /**
index 0955c23..9ef6c43 100644 (file)
@@ -3,56 +3,60 @@
 
        // Table of contents toggle
        mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               var $toc, $tocTitle, $tocToggleLink, $tocList, hideToc;
-               $toc = $content.find( '#toc' );
-               $tocTitle = $content.find( '#toctitle' );
-               $tocToggleLink = $content.find( '#togglelink' );
-               $tocList = $toc.find( 'ul' ).eq( 0 );
+               $content.find( '.toc' ).addBack( '.toc' ).each( function () {
+                       var hideToc,
+                               $this = $( this ),
+                               // .toctitle is new so may not exist in HTML caches for a few weeks,
+                               // so keep checking for #toctitle for now
+                               $tocTitle = $this.find( '.toctitle, #toctitle' ),
+                               $tocToggleLink = $this.find( '.togglelink' ),
+                               $tocList = $this.find( 'ul' ).eq( 0 );
 
-               // Hide/show the table of contents element
-               function toggleToc() {
-                       if ( $tocList.is( ':hidden' ) ) {
-                               $tocList.slideDown( 'fast' );
-                               $tocToggleLink.text( mw.msg( 'hidetoc' ) );
-                               $toc.removeClass( 'tochidden' );
-                               mw.cookie.set( 'hidetoc', null );
-                       } else {
-                               $tocList.slideUp( 'fast' );
-                               $tocToggleLink.text( mw.msg( 'showtoc' ) );
-                               $toc.addClass( 'tochidden' );
-                               mw.cookie.set( 'hidetoc', '1' );
+                       // Hide/show the table of contents element
+                       function toggleToc() {
+                               if ( $tocList.is( ':hidden' ) ) {
+                                       $tocList.slideDown( 'fast' );
+                                       $tocToggleLink.text( mw.msg( 'hidetoc' ) );
+                                       $this.removeClass( 'tochidden' );
+                                       mw.cookie.set( 'hidetoc', null );
+                               } else {
+                                       $tocList.slideUp( 'fast' );
+                                       $tocToggleLink.text( mw.msg( 'showtoc' ) );
+                                       $this.addClass( 'tochidden' );
+                                       mw.cookie.set( 'hidetoc', '1' );
+                               }
                        }
-               }
 
-               // Only add it if there is a complete TOC and it doesn't
-               // have a toggle added already
-               if ( $toc.length && $tocTitle.length && $tocList.length && !$tocToggleLink.length ) {
-                       hideToc = mw.cookie.get( 'hidetoc' ) === '1';
+                       // Only add it if there is a complete TOC and it doesn't
+                       // have a toggle added already
+                       if ( $tocTitle.length && $tocList.length && !$tocToggleLink.length ) {
+                               hideToc = mw.cookie.get( 'hidetoc' ) === '1';
 
-                       $tocToggleLink = $( '<a role="button" tabindex="0" id="togglelink"></a>' )
-                               .text( mw.msg( hideToc ? 'showtoc' : 'hidetoc' ) )
-                               .on( 'click keypress', function ( e ) {
-                                       if (
-                                               e.type === 'click' ||
-                                               e.type === 'keypress' && e.which === 13
-                                       ) {
-                                               toggleToc();
-                                       }
-                               } );
+                               $tocToggleLink = $( '<a role="button" tabindex="0" class="togglelink"></a>' )
+                                       .text( mw.msg( hideToc ? 'showtoc' : 'hidetoc' ) )
+                                       .on( 'click keypress', function ( e ) {
+                                               if (
+                                                       e.type === 'click' ||
+                                                       e.type === 'keypress' && e.which === 13
+                                               ) {
+                                                       toggleToc();
+                                               }
+                                       } );
 
-                       $tocTitle.append(
-                               $tocToggleLink
-                                       .wrap( '<span class="toctoggle"></span>' )
-                                       .parent()
-                                               .prepend( '&nbsp;[' )
-                                               .append( ']&nbsp;' )
-                       );
+                               $tocTitle.append(
+                                       $tocToggleLink
+                                               .wrap( '<span class="toctoggle"></span>' )
+                                               .parent()
+                                                       .prepend( '&nbsp;[' )
+                                                       .append( ']&nbsp;' )
+                               );
 
-                       if ( hideToc ) {
-                               $tocList.hide();
-                               $toc.addClass( 'tochidden' );
+                               if ( hideToc ) {
+                                       $tocList.hide();
+                                       $this.addClass( 'tochidden' );
+                               }
                        }
-               }
+               } );
        } );
 
 }( mediaWiki, jQuery ) );
index 7bf2ce2..e12c136 100644 (file)
@@ -15458,7 +15458,7 @@ Section headings with TOC
 Some text
 ===Another headline===
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
 <ul>
@@ -15501,7 +15501,7 @@ __FORCETOC__
 == Headline 2 ==
 == Headline ==
 !! html/php
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Headline_2"><span class="tocnumber">1</span> <span class="toctext">Headline 2</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Headline"><span class="tocnumber">2</span> <span class="toctext">Headline</span></a></li>
@@ -15532,7 +15532,7 @@ Handling of sections up to level 6 and beyond
 ========= Level 9 Heading=========
 ========== Level 10 Heading==========
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
 <ul>
@@ -15585,7 +15585,7 @@ TOC regression (T11764)
 == title 2 ==
 === title 2.1 ===
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -15620,7 +15620,7 @@ TOC for heading containing <span id="..."></span> (T96153)
 __FORCETOC__
 ==<span id="old-anchor"></span>New title==
 !! html/php
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#New_title"><span class="tocnumber">1</span> <span class="toctext">New title</span></a></li>
 </ul>
@@ -15642,7 +15642,7 @@ wgMaxTocLevel=3
 == title 2 ==
 === title 2.1 ===
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -15678,7 +15678,7 @@ wgMaxTocLevel=3
 ====Section 1.1.1.1====
 ==Section 2==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
 <ul>
@@ -15771,7 +15771,7 @@ __TOC__
 === title 1.1 ===
 == title 2 ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -15838,7 +15838,7 @@ section 5
 !! html
 <p>The tooltips shall not show entities to the user (ie. be double escaped)
 </p>
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#text_.3E_text"><span class="tocnumber">1</span> <span class="toctext">text &gt; text</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#text_.3C_text"><span class="tocnumber">2</span> <span class="toctext">text &lt; text</span></a></li>
@@ -15897,7 +15897,7 @@ section 6
 !! html
 <p>Id should not contain + for spaces
 </p>
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Space_between_Text"><span class="tocnumber">1</span> <span class="toctext">Space between Text</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Space-Entity_between_Text"><span class="tocnumber">2</span> <span class="toctext">Space-Entity&#32;between&#32;Text</span></a></li>
@@ -15943,7 +15943,7 @@ Headers with excess '=' characters
 =''italic'' heading==
 ==''italic'' heading=
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#.3Dfoo"><span class="tocnumber">2</span> <span class="toctext">=foo</span></a></li>
@@ -15973,7 +15973,7 @@ HTML headers vs TOC (T25393)
 == Header 2.2 ==
 __NOEDITSECTION__
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a>
 <ul>
@@ -17751,7 +17751,7 @@ Fuzz testing: Parser14
 http://__TOC__
 !! html
 <h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+http://<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
 </ul>
@@ -17762,7 +17762,7 @@ http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>http://</p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
@@ -19129,6 +19129,10 @@ File:File:Foobar.jpg
                </div></li>
 </ul>
 
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" type="123" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"type":"123","summary":"345"},"body":{"extsrc":"\nFile:File:Foobar.jpg\n"}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:File:Foobar.jpg</span></div><div class="gallerytext"></div></li>
+</ul>
 !! end
 
 ## Parsoid thinks the "centre" here is a property, not a caption.
@@ -19676,17 +19680,17 @@ File:Test.png
 !! end
 
 !! test
-Gallery with class attribute
+Gallery with class and style attributes
 !! options
 parsoid={
   "nativeGallery": true
 }
 !! wikitext
-<gallery class="center">
+<gallery class="center" style="text-align: center;">
 File:Foobar.jpg
 </gallery>
 !! html/php
-<ul class="gallery mw-gallery-traditional center">
+<ul class="gallery mw-gallery-traditional center" style="text-align: center;">
                <li class="gallerybox" style="width: 155px"><div style="width: 155px">
                        <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
                        <div class="gallerytext">
@@ -19695,11 +19699,36 @@ File:Foobar.jpg
 </ul>
 
 !! html/parsoid
-<ul class="gallery mw-gallery-traditional center" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"class":"center"},"body":{}}'>
+<ul class="gallery mw-gallery-traditional center" style="text-align: center;" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"class":"center","style":"text-align: center;"},"body":{}}'>
 <li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
 </ul>
 !! end
 
+!! test
+Gallery in slideshow mode
+!! options
+parsoid={
+  "nativeGallery": true
+}
+!! wikitext
+<gallery mode="slideshow" showthumbnails="">
+File:Foobar.jpg
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-slideshow" data-showthumbnails="1">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-slideshow" data-showthumbnails="1" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"mode":"slideshow","showthumbnails":""},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px;"><span typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
 !! test
 HTML Hex character encoding (spells the word "JavaScript")
 !! options
@@ -20216,7 +20245,7 @@ Out-of-order TOC heading levels
 =====5=====
 ==2==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
 <ul>
@@ -22198,7 +22227,7 @@ title=[[Main Page]]
 __TOC__
 == ''Lost'' episodes ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
 </ul>
@@ -22216,7 +22245,7 @@ title=[[Main Page]]
 __TOC__
 == '''should be bold''' then normal text ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
 </ul>
@@ -22234,7 +22263,7 @@ title=[[Main Page]]
 __TOC__
 == Image [[Image:foobar.jpg]] ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
 </ul>
@@ -22252,7 +22281,7 @@ title=[[Main Page]]
 __TOC__
 == <blockquote>Quote</blockquote> ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
 </ul>
@@ -22263,7 +22292,7 @@ __TOC__
 !! html+tidy
 <p></p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
@@ -22288,7 +22317,7 @@ __TOC__
 <small>Hanc marginis exiguitas non caperet.</small>
 QED
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
 </ul>
@@ -22308,7 +22337,7 @@ __TOC__
 
 == <i>Foo</i> <blockquote>Bar</blockquote> ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
@@ -22321,7 +22350,7 @@ __TOC__
 !! html+tidy
 <p></p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
@@ -22350,7 +22379,7 @@ __TOC__
 
 == <sup class="a > b">Evilbye</sup> ==
 !! html/php
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></span></a></li>
@@ -22381,7 +22410,7 @@ __TOC__
 
 == <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#C.2B.2B"><span class="tocnumber">1</span> <span class="toctext"><span dir="ltr">C++</span></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#.D7.96.D7.91.D7.A0.D7.92.21"><span class="tocnumber">2</span> <span class="toctext"><span dir="rtl">זבנג!</span></span></a></li>
@@ -22405,7 +22434,7 @@ T74884: bdi element in ToC
 __TOC__
 == <bdi>test</bdi> ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#test"><span class="tocnumber">1</span> <span class="toctext"><bdi>test</bdi></span></a></li>
 </ul>
@@ -22421,7 +22450,7 @@ T35715: s/strike element in ToC
 __TOC__
 == <s>test</s> test <strike>test</strike> ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#test_test_test"><span class="tocnumber">1</span> <span class="toctext"><s>test</s> test <strike>test</strike></span></a></li>
 </ul>
@@ -22440,7 +22469,7 @@ Empty <p> tag in TOC, removed by Sanitizer (T92892)
 __TOC__
 == x ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#x"><span class="tocnumber">1</span> <span class="toctext">x</span></a></li>
 </ul>
@@ -22451,7 +22480,7 @@ __TOC__
 !! html+tidy
 <p></p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
 |}
 !! end
 
+!! test
+Anchor without href scenarios
+!! options
+parsoid={ "modes": ["html2wt"], "suppressErrors": true }
+!! html/parsoid
+<a class="bc"></a>
+<a class="no">dice</a>
+<a name="foo"></a>
+!! wikitext
+
+dice
+<span name="foo"></span>
+!! end
+
 # -----------------------------------------------------------------
 # End of section for Parsoid-only html2wt tests for serialization
 # of new content
index 68b91bf..a8a8f4d 100644 (file)
@@ -27,6 +27,7 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                $options += [
                        'lang' => 'en',
                        'dir' => 'ltr',
+                       'skin' => 'vector',
                        'modules' => 'startup',
                        'only' => 'scripts',
                ];
@@ -35,7 +36,7 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                                'lang' => $options['lang'],
                                'modules' => $options['modules'],
                                'only' => $options['only'],
-                               'skin' => 'vector',
+                               'skin' => $options['skin'],
                                'target' => 'phpunit',
                ] );
                $ctx = $this->getMockBuilder( 'ResourceLoaderContext' )
diff --git a/tests/phpunit/data/resourceloader/oouiimagemodule/apex/icons.json b/tests/phpunit/data/resourceloader/oouiimagemodule/apex/icons.json
new file mode 100644 (file)
index 0000000..4fe3d81
--- /dev/null
@@ -0,0 +1,6 @@
+{
+       "prefix": "oo-ui-icon",
+       "images": {
+               "search": { "file": "images/icons/search.svg" }
+       }
+}
diff --git a/tests/phpunit/data/resourceloader/oouiimagemodule/apex/images/icons/search.svg b/tests/phpunit/data/resourceloader/oouiimagemodule/apex/images/icons/search.svg
new file mode 100644 (file)
index 0000000..6952997
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="search">
+        <path id="magnifying-glass-apex" d="M18.87 18.375l-3.987-3.99-.286-.17a5.774 5.774 0 0 0 1.082-3.372C15.67 7.616 13.06 5 9.84 5A5.843 5.843 0 0 0 4 10.844a5.84 5.84 0 0 0 5.842 5.842c1.26 0 2.423-.403 3.377-1.08l.16.286 3.99 3.987c.32.31.91.24 1.33-.18.41-.42.49-1.01.17-1.33zM9.837 14.56a3.72 3.72 0 0 1-3.718-3.717c0-2.05 1.67-3.72 3.72-3.72s3.72 1.668 3.72 3.72a3.722 3.722 0 0 1-3.72 3.718z"/>
+    </g>
+</svg>
diff --git a/tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/icons.json b/tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/icons.json
new file mode 100644 (file)
index 0000000..4fe3d81
--- /dev/null
@@ -0,0 +1,6 @@
+{
+       "prefix": "oo-ui-icon",
+       "images": {
+               "search": { "file": "images/icons/search.svg" }
+       }
+}
diff --git a/tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/images/icons/search.svg b/tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/images/icons/search.svg
new file mode 100644 (file)
index 0000000..40438ea
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="search">
+        <path id="magnifying-glass-mediawiki" d="M10.5 4a6.5 6.5 0 1 0 2.844 12.344L16 19c1.4 1.4 2.5 1.5 4 0l-4.438-4.438A6.426 6.426 0 0 0 17 10.5 6.5 6.5 0 0 0 10.5 4zm0 2a4.5 4.5 0 1 1 0 9 4.5 4.5 0 0 1 0-9z"/>
+    </g>
+</svg>
index 59441ce..7571e26 100644 (file)
@@ -472,13 +472,93 @@ class OutputPageTest extends MediaWikiTestCase {
                $this->assertEquals( [ 0 => 'Test' ], $outputPage->getCategories( 'hidden' ) );
        }
 
+       /**
+        * @dataProvider provideLinkHeaders
+        * @covers OutputPage::addLinkHeader
+        * @covers OutputPage::getLinkHeader
+        */
+       public function testLinkHeaders( $headers, $result ) {
+               $outputPage = $this->newInstance();
+
+               foreach ( $headers as $header ) {
+                       $outputPage->addLinkHeader( $header );
+               }
+
+               $this->assertEquals( $result, $outputPage->getLinkHeader() );
+       }
+
+       public function provideLinkHeaders() {
+               return [
+                       [
+                               [],
+                               false
+                       ],
+                       [
+                               [ '<https://foo/bar.jpg>;rel=preload;as=image' ],
+                               'Link: <https://foo/bar.jpg>;rel=preload;as=image',
+                       ],
+                       [
+                               [ '<https://foo/bar.jpg>;rel=preload;as=image','<https://foo/baz.jpg>;rel=preload;as=image' ],
+                               'Link: <https://foo/bar.jpg>;rel=preload;as=image,<https://foo/baz.jpg>;rel=preload;as=image',
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider providePreloadLinkHeaders
+        * @covers OutputPage::addLogoPreloadLinkHeaders
+        */
+       public function testPreloadLinkHeaders( $config, $result ) {
+               $out = TestingAccessWrapper::newFromObject( $this->newInstance( $config ) );
+               $out->addLogoPreloadLinkHeaders();
+
+               $this->assertEquals( $result, $out->getLinkHeader() );
+       }
+
+       public function providePreloadLinkHeaders() {
+               return [
+                       [
+                               [
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => [
+                                               '1.5x' => '/img/one-point-five.png',
+                                               '2x' => '/img/two-x.png',
+                                       ],
+                               ],
+                               'Link: </img/default.png>;rel=preload;as=image;media=' .
+                               'not all and (min-resolution: 1.5dppx),' .
+                               '</img/one-point-five.png>;rel=preload;as=image;media=' .
+                               '(min-resolution: 1.5dppx) and (max-resolution: 1.999999dppx),' .
+                               '</img/two-x.png>;rel=preload;as=image;media=(min-resolution: 2dppx)'
+                       ],
+                       [
+                               [
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => false,
+                               ],
+                               'Link: </img/default.png>;rel=preload;as=image'
+                       ],
+                       [
+                               [
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => [
+                                               '2x' => '/img/two-x.png',
+                                       ],
+                               ],
+                               'Link: </img/default.png>;rel=preload;as=image;media=' .
+                               'not all and (min-resolution: 2dppx),' .
+                               '</img/two-x.png>;rel=preload;as=image;media=(min-resolution: 2dppx)'
+                       ],
+               ];
+       }
+
        /**
         * @return OutputPage
         */
-       private function newInstance() {
+       private function newInstance( $config = [] ) {
                $context = new RequestContext();
 
-               $context->setConfig( new HashConfig( [
+               $context->setConfig( new HashConfig( $config + [
                        'AppleTouchIcon' => false,
                        'DisableLangConversion' => true,
                        'EnableAPI' => false,
index 9121178..e20cc7b 100644 (file)
@@ -518,11 +518,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->getUserPermissionsErrors( 'bogus',
                                $this->user ) );
 
-               $this->setUserPerm( 'editusercssjs' );
-               $this->assertEquals( [ [ 'badaccess-group0' ] ],
-                       $this->title->getUserPermissionsErrors( 'bogus',
-                               $this->user ) );
-
                $this->setUserPerm( [ 'edituserjs', 'editusercss' ] );
                $this->assertEquals( [ [ 'badaccess-group0' ] ],
                        $this->title->getUserPermissionsErrors( 'bogus',
index ad1deee..8a2146a 100644 (file)
@@ -96,4 +96,83 @@ class ApiPageSetTest extends ApiTestCase {
                        $pageSet->getNormalizedTitlesAsResult()
                );
        }
+
+       public function testSpecialRedirects() {
+               $id1 = self::editPage( 'UTApiPageSet', 'UTApiPageSet in the default language' )
+                       ->value['revision']->getTitle()->getArticleID();
+               $id2 = self::editPage( 'UTApiPageSet/de', 'UTApiPageSet in German' )
+                       ->value['revision']->getTitle()->getArticleID();
+
+               $user = $this->getTestUser()->getUser();
+               $userName = $user->getName();
+               $userDbkey = str_replace( ' ', '_', $userName );
+               $request = new FauxRequest( [
+                       'titles' => join( '|', [
+                               'Special:MyContributions',
+                               'Special:MyPage',
+                               'Special:MyTalk/subpage',
+                               'Special:MyLanguage/UTApiPageSet',
+                       ] ),
+               ] );
+               $context = new RequestContext();
+               $context->setRequest( $request );
+               $context->setUser( $user );
+
+               $main = new ApiMain( $context );
+               $pageSet = new ApiPageSet( $main );
+               $pageSet->execute();
+
+               $this->assertEquals( [
+               ], $pageSet->getRedirectTitlesAsResult() );
+               $this->assertEquals( [
+                       [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
+                       [ 'ns' => -1, 'title' => 'Special:MyPage', 'special' => true ],
+                       [ 'ns' => -1, 'title' => 'Special:MyTalk/subpage', 'special' => true ],
+                       [ 'ns' => -1, 'title' => 'Special:MyLanguage/UTApiPageSet', 'special' => true ],
+               ], $pageSet->getInvalidTitlesAndRevisions() );
+               $this->assertEquals( [
+               ], $pageSet->getAllTitlesByNamespace() );
+
+               $request->setVal( 'redirects', 1 );
+               $main = new ApiMain( $context );
+               $pageSet = new ApiPageSet( $main );
+               $pageSet->execute();
+
+               $this->assertEquals( [
+                       [ 'from' => 'Special:MyPage', 'to' => "User:$userName" ],
+                       [ 'from' => 'Special:MyTalk/subpage', 'to' => "User talk:$userName/subpage" ],
+                       [ 'from' => 'Special:MyLanguage/UTApiPageSet', 'to' => 'UTApiPageSet' ],
+               ], $pageSet->getRedirectTitlesAsResult() );
+               $this->assertEquals( [
+                       [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
+                       [ 'ns' => 2, 'title' => "User:$userName", 'missing' => true ],
+                       [ 'ns' => 3, 'title' => "User talk:$userName/subpage", 'missing' => true ],
+               ], $pageSet->getInvalidTitlesAndRevisions() );
+               $this->assertEquals( [
+                       0 => [ 'UTApiPageSet' => $id1 ],
+                       2 => [ $userDbkey => -2 ],
+                       3 => [ "$userDbkey/subpage" => -3 ],
+               ], $pageSet->getAllTitlesByNamespace() );
+
+               $context->setLanguage( 'de' );
+               $main = new ApiMain( $context );
+               $pageSet = new ApiPageSet( $main );
+               $pageSet->execute();
+
+               $this->assertEquals( [
+                       [ 'from' => 'Special:MyPage', 'to' => "User:$userName" ],
+                       [ 'from' => 'Special:MyTalk/subpage', 'to' => "User talk:$userName/subpage" ],
+                       [ 'from' => 'Special:MyLanguage/UTApiPageSet', 'to' => 'UTApiPageSet/de' ],
+               ], $pageSet->getRedirectTitlesAsResult() );
+               $this->assertEquals( [
+                       [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
+                       [ 'ns' => 2, 'title' => "User:$userName", 'missing' => true ],
+                       [ 'ns' => 3, 'title' => "User talk:$userName/subpage", 'missing' => true ],
+               ], $pageSet->getInvalidTitlesAndRevisions() );
+               $this->assertEquals( [
+                       0 => [ 'UTApiPageSet/de' => $id2 ],
+                       2 => [ $userDbkey => -2 ],
+                       3 => [ "$userDbkey/subpage" => -3 ],
+               ], $pageSet->getAllTitlesByNamespace() );
+       }
 }
index b95462a..97e9b26 100644 (file)
@@ -28,6 +28,7 @@
 use Wikimedia\Rdbms\TransactionProfiler;
 use Wikimedia\Rdbms\DatabaseDomain;
 use Wikimedia\Rdbms\MySQLMasterPos;
+use Wikimedia\Rdbms\DatabaseMysqlBase;
 
 /**
  * Fake class around abstract class so we can call concrete methods.
index 10bf028..b90b1ad 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 
 use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DatabaseSqlite;
 
 class DatabaseSqliteMock extends DatabaseSqlite {
        private $lastQuery;
index f768d06..9d12b10 100644 (file)
@@ -6,7 +6,7 @@ class DnsSrvDiscovererTest extends PHPUnit_Framework_TestCase {
         * @dataProvider provideRecords
         */
        public function testPickServer( $params, $expected ) {
-               $discoverer = new DnsSrvDiscoverer( '_etcd._tcp.eqiad.wmnet' );
+               $discoverer = new DnsSrvDiscoverer( 'etcd-tcp.example.net' );
                $record = $discoverer->pickServer( $params );
 
                $this->assertEquals( $expected, $record );
@@ -18,26 +18,26 @@ class DnsSrvDiscovererTest extends PHPUnit_Framework_TestCase {
                        [
                                [ // record list
                                        [
-                                               'target' => 'conf1003.eqiad.wmnet',
+                                               'target' => 'conf03.example.net',
                                                'port' => 'SRV',
                                                'pri' => 0,
                                                'weight' => 1,
                                        ],
                                        [
-                                               'target' => 'conf1002.eqiad.wmnet',
+                                               'target' => 'conf02.example.net',
                                                'port' => 'SRV',
                                                'pri' => 1,
                                                'weight' => 1,
                                        ],
                                        [
-                                               'target' => 'conf1001.eqiad.wmnet',
+                                               'target' => 'conf01.example.net',
                                                'port' => 'SRV',
                                                'pri' => 2,
                                                'weight' => 1,
                                        ],
                                ], // selected record
                                [
-                                       'target' => 'conf1003.eqiad.wmnet',
+                                       'target' => 'conf03.example.net',
                                        'port' => 'SRV',
                                        'pri' => 0,
                                        'weight' => 1,
@@ -46,38 +46,38 @@ class DnsSrvDiscovererTest extends PHPUnit_Framework_TestCase {
                        [
                                [ // record list
                                        [
-                                               'target' => 'conf1003or2.eqiad.wmnet',
+                                               'target' => 'conf03or2.example.net',
                                                'port' => 'SRV',
                                                'pri' => 0,
                                                'weight' => 1,
                                        ],
                                        [
-                                               'target' => 'conf1003or2.eqiad.wmnet',
+                                               'target' => 'conf03or2.example.net',
                                                'port' => 'SRV',
                                                'pri' => 0,
                                                'weight' => 1,
                                        ],
                                        [
-                                               'target' => 'conf1001.eqiad.wmnet',
+                                               'target' => 'conf01.example.net',
                                                'port' => 'SRV',
                                                'pri' => 2,
                                                'weight' => 1,
                                        ],
                                        [
-                                               'target' => 'conf1004.eqiad.wmnet',
+                                               'target' => 'conf04.example.net',
                                                'port' => 'SRV',
                                                'pri' => 2,
                                                'weight' => 1,
                                        ],
                                        [
-                                               'target' => 'conf1005.eqiad.wmnet',
+                                               'target' => 'conf05.example.net',
                                                'port' => 'SRV',
                                                'pri' => 3,
                                                'weight' => 1,
                                        ],
                                ], // selected record
                                [
-                                       'target' => 'conf1003or2.eqiad.wmnet',
+                                       'target' => 'conf03or2.example.net',
                                        'port' => 'SRV',
                                        'pri' => 0,
                                        'weight' => 1,
@@ -85,4 +85,56 @@ class DnsSrvDiscovererTest extends PHPUnit_Framework_TestCase {
                        ],
                ];
        }
+
+       public function testRemoveServer() {
+               $dsd = new DnsSrvDiscoverer( 'localhost' );
+
+               $servers = [
+                       [
+                               'target' => 'conf01.example.net',
+                               'port' => 35,
+                               'pri' => 2,
+                               'weight' => 1,
+                       ],
+                       [
+                               'target' => 'conf04.example.net',
+                               'port' => 74,
+                               'pri' => 2,
+                               'weight' => 1,
+                       ],
+                       [
+                               'target' => 'conf05.example.net',
+                               'port' => 77,
+                               'pri' => 3,
+                               'weight' => 1,
+                       ],
+               ];
+               $server = $servers[1];
+
+               $expected = [
+                       [
+                               'target' => 'conf01.example.net',
+                               'port' => 35,
+                               'pri' => 2,
+                               'weight' => 1,
+                       ],
+                       [
+                               'target' => 'conf05.example.net',
+                               'port' => 77,
+                               'pri' => 3,
+                               'weight' => 1,
+                       ],
+               ];
+
+               $this->assertEquals(
+                       $expected,
+                       $dsd->removeServer( $server, $servers ),
+                       "Correct server removed"
+               );
+               $this->assertEquals(
+                       $expected,
+                       $dsd->removeServer( $server, $servers ),
+                       "Nothing to remove"
+               );
+       }
 }
index d132183..f8ce24e 100644 (file)
@@ -63,7 +63,7 @@ class ObjectCacheTest extends MediaWikiTestCase {
        }
 
        /** @covers ObjectCache::newAnything */
-       public function txestNewAnythingNoAccel() {
+       public function testNewAnythingNoAccel() {
                $this->setMwGlobals( [
                        'wgMainCacheType' => CACHE_ACCEL
                ] );
@@ -79,4 +79,37 @@ class ObjectCacheTest extends MediaWikiTestCase {
                        'Fallback to DB if available types fall back to Empty'
                );
        }
+
+       /** @covers ObjectCache::newAnything */
+       public function testNewAnythingNoAccelNoDb() {
+               $this->overrideMwServices(); // Ensures restore on tear down
+               MediaWiki\MediaWikiServices::disableStorageBackend();
+
+               $this->setMwGlobals( [
+                       'wgMainCacheType' => CACHE_ACCEL
+               ] );
+
+               $this->setCacheConfig( [
+                       // Mock APC not being installed (T160519, T147161)
+                       CACHE_ACCEL => [ 'class' => 'EmptyBagOStuff' ]
+               ] );
+
+               $this->assertInstanceOf(
+                       EmptyBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'Fallback to none if available types and DB are unavailable'
+               );
+       }
+
+       /** @covers ObjectCache::newAnything */
+       public function testNewAnythingNothingNoDb() {
+               $this->overrideMwServices();
+               MediaWiki\MediaWikiServices::disableStorageBackend();
+
+               $this->assertInstanceOf(
+                       EmptyBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'No available types or DB. Fallback to none.'
+               );
+       }
 }
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderOOUIImageModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderOOUIImageModuleTest.php
new file mode 100644 (file)
index 0000000..4e482c8
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * @group ResourceLoader
+ */
+class ResourceLoaderOOUIImageModuleTest extends ResourceLoaderTestCase {
+
+       /**
+        * @covers ResourceLoaderOOUIImageModule::loadFromDefinition
+        */
+       public function testNonDefaultSkin() {
+               $module = new ResourceLoaderOOUIImageModule( [
+                       'class' => 'ResourceLoaderOOUIImageModule',
+                       'name' => 'icons',
+                       'rootPath' => 'tests/phpunit/data/resourceloader/oouiimagemodule',
+               ] );
+
+               // Pretend that 'fakemonobook' is a real skin using the Apex theme
+               SkinFactory::getDefaultInstance()->register(
+                       'fakemonobook',
+                       'FakeMonoBook',
+                       function () {
+                       }
+               );
+               $r = new ReflectionMethod( 'ExtensionRegistry', 'exportExtractedData' );
+               $r->setAccessible( true );
+               $r->invoke( ExtensionRegistry::getInstance(), [
+                       'globals' => [],
+                       'defines' => [],
+                       'callbacks' => [],
+                       'credits' => [],
+                       'autoloaderPaths' => [],
+                       'attributes' => [
+                               'SkinOOUIThemes' => [
+                                       'fakemonobook' => 'Apex',
+                               ],
+                       ],
+               ] );
+
+               $styles = $module->getStyles( $this->getResourceLoaderContext( [ 'skin' => 'fakemonobook' ] ) );
+               $this->assertRegExp(
+                       '/magnifying-glass-apex/',
+                       $styles['all'],
+                       'Generated styles use the non-default image (embed)'
+               );
+               $this->assertRegExp(
+                       '/fakemonobook/',
+                       $styles['all'],
+                       'Generated styles use the non-default image (link)'
+               );
+
+               $styles = $module->getStyles( $this->getResourceLoaderContext() );
+               $this->assertRegExp(
+                       '/magnifying-glass-mediawiki/',
+                       $styles['all'],
+                       'Generated styles use the default image (embed)'
+               );
+               $this->assertRegExp(
+                       '/vector/',
+                       $styles['all'],
+                       'Generated styles use the default image (link)'
+               );
+       }
+
+}
index 405fdcf..27d3825 100644 (file)
                                title: 'Group 3',
                                type: 'string_options',
                                separator: ',',
+                               default: 'filter8',
                                filters: [
                                        {
                                                name: 'filter7',
                                        {
                                                name: 'filter8',
                                                label: 'Group 3: Filter 2',
-                                               description: 'Description of Filter 2 in Group 3',
-                                               default: true
+                                               description: 'Description of Filter 2 in Group 3'
                                        },
                                        {
                                                name: 'filter9',
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               group3__filter7: false,
-                               group3__filter8: false,
-                               group3__filter9: false
+                               group3__filter7: true,
+                               group3__filter8: true,
+                               group3__filter9: true
                        } ),
-                       'A \'string_options\' parameter containing all values, results in all filters of the group as unchecked.'
+                       'A \'string_options\' parameter containing all values, results in all filters of the group as checked.'
                );
 
                model.toggleFiltersSelected(
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               group3__filter7: false,
-                               group3__filter8: false,
-                               group3__filter9: false
+                               group3__filter7: true,
+                               group3__filter8: true,
+                               group3__filter9: true
                        } ),
-                       'A \'string_options\' parameter containing the value \'all\', results in all filters of the group as unchecked.'
+                       'A \'string_options\' parameter containing the value \'all\', results in all filters of the group as checked.'
                );
 
                model.toggleFiltersSelected(
index 297f0fd..70a7e35 100644 (file)
@@ -12,7 +12,7 @@
                assert.strictEqual( $( '#toc' ).length, 0, 'There is no table of contents on the page at the beginning' );
 
                tocHtml = '<div id="toc" class="toc">' +
-                       '<div id="toctitle">' +
+                       '<div id="toctitle" class="toctitle">' +
                        '<h2>Contents</h2>' +
                        '</div>' +
                        '<ul><li></li></ul>' +
@@ -21,7 +21,7 @@
                mw.hook( 'wikipage.content' ).fire( $( '#qunit-fixture' ) );
 
                $tocList = $( '#toc ul:first' );
-               $toggleLink = $( '#togglelink' );
+               $toggleLink = $( '#toc .togglelink' );
 
                assert.strictEqual( $toggleLink.length, 1, 'Toggle link is added to the table of contents' );