Merge "resourceloader: ResourceLoaderGetConfigVars is passed skin"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 29 Oct 2018 01:56:40 +0000 (01:56 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 29 Oct 2018 01:56:40 +0000 (01:56 +0000)
504 files changed:
.gitignore
RELEASE-NOTES-1.32
RELEASE-NOTES-1.33
autoload.php
composer.json
docs/hooks.txt
includes/AutoLoader.php
includes/Block.php
includes/DefaultSettings.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/MovePage.php
includes/OutputPage.php
includes/actions/RollbackAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiEditPage.php
includes/api/ApiFormatBase.php
includes/api/ApiHelp.php
includes/api/ApiParse.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiRollback.php
includes/api/i18n/ar.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/ko.json
includes/api/i18n/lb.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/sv.json
includes/api/i18n/uk.json
includes/auth/AuthManagerAuthPlugin.php
includes/auth/LegacyHookPreAuthenticationProvider.php
includes/block/BlockRestriction.php [new file with mode: 0644]
includes/block/Restriction/AbstractRestriction.php [new file with mode: 0644]
includes/block/Restriction/PageRestriction.php [new file with mode: 0644]
includes/block/Restriction/Restriction.php [new file with mode: 0644]
includes/cache/BacklinkCache.php
includes/cache/MessageCache.php
includes/cache/localisation/LCStoreCDB.php
includes/cache/localisation/LCStoreStaticArray.php
includes/changes/ChangesListBooleanFilter.php
includes/changes/ChangesListFilterGroup.php
includes/changetags/ChangeTags.php
includes/compat/normal/UtfNormal.php [deleted file]
includes/debug/logger/monolog/KafkaHandler.php
includes/deferred/JobQueueEnqueueUpdate.php [new file with mode: 0644]
includes/deferred/MergeableUpdate.php
includes/deferred/UserEditCountUpdate.php [new file with mode: 0644]
includes/export/WikiExporter.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/RepoGroup.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/fields/HTMLFormFieldWithButton.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/htmlform/fields/HTMLTitlesMultiselectField.php [new file with mode: 0644]
includes/http/MWHttpRequest.php
includes/import/WikiImporter.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/MysqlInstaller.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerExistingWiki.php
includes/installer/WebInstallerOptions.php
includes/installer/i18n/ar.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/fr.json
includes/installer/i18n/ia.json
includes/installer/i18n/ja.json
includes/installer/i18n/nb.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/sv.json
includes/installer/i18n/vi.json
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobRunner.php
includes/libs/CSSMin.php
includes/libs/Cookie.php
includes/libs/CryptRand.php
includes/libs/JavaScriptMinifier.php
includes/libs/mime/MimeAnalyzer.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/RedisBagOStuff.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMssql.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/lbfactory/LBFactoryMulti.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/virtualrest/ParsoidVirtualRESTService.php
includes/libs/virtualrest/RestbaseVirtualRESTService.php
includes/logging/BlockLogFormatter.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/mail/EmailNotification.php
includes/mail/MailAddress.php
includes/media/IPTC.php
includes/media/MediaHandler.php
includes/objectcache/ObjectCache.php
includes/page/Article.php
includes/page/WikiPage.php
includes/parser/DateFormatter.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/preferences/DefaultPreferencesFactory.php
includes/registration/ExtensionProcessor.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderEditToolbarModule.php [deleted file]
includes/search/SearchEngine.php
includes/shell/Shell.php
includes/site/HashSiteStore.php
includes/skins/BaseTemplate.php
includes/skins/Skin.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialBlock.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialGoToInterwiki.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserrights.php
includes/specials/formfields/UploadSourceField.php
includes/specials/pagers/BlockListPager.php
includes/upload/UploadBase.php
includes/user/User.php
includes/utils/MWCryptRand.php
includes/utils/MWFileProps.php
includes/widget/TitlesMultiselectWidget.php [new file with mode: 0644]
includes/widget/search/InterwikiSearchResultSetWidget.php
languages/ConverterRule.php
languages/Language.php
languages/LanguageConverter.php
languages/i18n/ace.json
languages/i18n/ady-cyrl.json
languages/i18n/aeb-arab.json
languages/i18n/af.json
languages/i18n/ais.json
languages/i18n/aln.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/ang.json
languages/i18n/anp.json
languages/i18n/ar.json
languages/i18n/arn.json
languages/i18n/arq.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ase.json
languages/i18n/ast.json
languages/i18n/atj.json
languages/i18n/avk.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bar.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/bo.json
languages/i18n/bpy.json
languages/i18n/bqi.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/btm.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ceb.json
languages/i18n/ckb.json
languages/i18n/co.json
languages/i18n/cps.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/csb.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de-formal.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dtp.json
languages/i18n/dty.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en-gb.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es-formal.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frc.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fur.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gag.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gcr.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/gor.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/gv.json
languages/i18n/ha.json
languages/i18n/hak.json
languages/i18n/haw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hil.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/ht.json
languages/i18n/hu-formal.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ie.json
languages/i18n/ig.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jam.json
languages/i18n/jut.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kaa.json
languages/i18n/kab.json
languages/i18n/kbd-cyrl.json
languages/i18n/khw.json
languages/i18n/kiu.json
languages/i18n/kjp.json
languages/i18n/kk-arab.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/km.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/kw.json
languages/i18n/ky.json
languages/i18n/la.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lfn.json
languages/i18n/lg.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/lki.json
languages/i18n/lmo.json
languages/i18n/lo.json
languages/i18n/loz.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lus.json
languages/i18n/luz.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/map-bms.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/mhr.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mni.json
languages/i18n/mnw.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/mwl.json
languages/i18n/my.json
languages/i18n/myv.json
languages/i18n/mzn.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/nso.json
languages/i18n/oc.json
languages/i18n/olo.json
languages/i18n/or.json
languages/i18n/os.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pcd.json
languages/i18n/pfl.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/qug.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sat.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sdc.json
languages/i18n/se.json
languages/i18n/sei.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/shi.json
languages/i18n/shn.json
languages/i18n/shy-latn.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/so.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/srn.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/tet.json
languages/i18n/tg-cyrl.json
languages/i18n/tg-latn.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/ts.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/tyv.json
languages/i18n/udm.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/vro.json
languages/i18n/wa.json
languages/i18n/war.json
languages/i18n/wo.json
languages/i18n/wuu.json
languages/i18n/xal.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zea.json
languages/i18n/zgh.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAr.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesDe.php
languages/messages/MessagesEn.php
languages/messages/MessagesFa.php
languages/messages/MessagesKsh.php
languages/messages/MessagesRu.php
maintenance/Maintenance.php
maintenance/dictionary/mediawiki.dic
maintenance/jsduck/categories.json
maintenance/populateCategory.php
resources/Resources.php
resources/src/mediawiki.base/mediawiki.base.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.highlightCircles.seenunseen.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less
resources/src/mediawiki.skinning/images/external-link-icons.svg [deleted file]
resources/src/mediawiki.special.block.js
resources/src/mediawiki.special.block.less [new file with mode: 0644]
resources/src/mediawiki.toolbar/images/ar/button_bold.png [deleted file]
resources/src/mediawiki.toolbar/images/ar/button_headline.png [deleted file]
resources/src/mediawiki.toolbar/images/ar/button_italic.png [deleted file]
resources/src/mediawiki.toolbar/images/ar/button_link.png [deleted file]
resources/src/mediawiki.toolbar/images/ar/button_nowiki.png [deleted file]
resources/src/mediawiki.toolbar/images/be-tarask/button_bold.png [deleted file]
resources/src/mediawiki.toolbar/images/be-tarask/button_italic.png [deleted file]
resources/src/mediawiki.toolbar/images/be-tarask/button_link.png [deleted file]
resources/src/mediawiki.toolbar/images/de/button_bold.png [deleted file]
resources/src/mediawiki.toolbar/images/de/button_italic.png [deleted file]
resources/src/mediawiki.toolbar/images/en/button_bold.png [deleted file]
resources/src/mediawiki.toolbar/images/en/button_extlink.png [deleted file]
resources/src/mediawiki.toolbar/images/en/button_headline.png [deleted file]
resources/src/mediawiki.toolbar/images/en/button_hr.png [deleted file]
resources/src/mediawiki.toolbar/images/en/button_image.png [deleted file]
resources/src/mediawiki.toolbar/images/en/button_italic.png [deleted file]
resources/src/mediawiki.toolbar/images/en/button_link.png [deleted file]
resources/src/mediawiki.toolbar/images/en/button_media.png [deleted file]
resources/src/mediawiki.toolbar/images/en/button_nowiki.png [deleted file]
resources/src/mediawiki.toolbar/images/en/button_sig.png [deleted file]
resources/src/mediawiki.toolbar/images/fa/button_bold.png [deleted file]
resources/src/mediawiki.toolbar/images/fa/button_headline.png [deleted file]
resources/src/mediawiki.toolbar/images/fa/button_italic.png [deleted file]
resources/src/mediawiki.toolbar/images/fa/button_link.png [deleted file]
resources/src/mediawiki.toolbar/images/fa/button_nowiki.png [deleted file]
resources/src/mediawiki.toolbar/images/ksh/LICENSE [deleted file]
resources/src/mediawiki.toolbar/images/ksh/button_italic.png [deleted file]
resources/src/mediawiki.toolbar/images/ru/LICENSE [deleted file]
resources/src/mediawiki.toolbar/images/ru/button_bold.png [deleted file]
resources/src/mediawiki.toolbar/images/ru/button_italic.png [deleted file]
resources/src/mediawiki.toolbar/images/ru/button_link.png [deleted file]
resources/src/mediawiki.toolbar/toolbar.js [deleted file]
resources/src/mediawiki.toolbar/toolbar.less [deleted file]
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitlesMultiselectWidget.js [new file with mode: 0644]
resources/src/startup/startup.js
tests/common/TestsAutoLoader.php
tests/parser/extraParserTests.txt
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/Revision/MutableRevisionRecordTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiQueryBlocksTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiQueryInfoTest.php
tests/phpunit/includes/api/ApiQueryUserInfoTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiStashEditTest.php
tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php [deleted file]
tests/phpunit/includes/block/BlockRestrictionTest.php [new file with mode: 0644]
tests/phpunit/includes/block/Restriction/PageRestrictionTest.php [new file with mode: 0644]
tests/phpunit/includes/block/Restriction/RestrictionTestCase.php [new file with mode: 0644]
tests/phpunit/includes/linker/LinkRendererTest.php
tests/phpunit/includes/logging/BlockLogFormatterTest.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/search/SearchNearMatcherTest.php
tests/phpunit/includes/specials/SpecialBlockTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/pagers/BlockListPagerTest.php [new file with mode: 0644]
tests/phpunit/includes/user/UserTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/classes/LanguageSrTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js

index 35c8fc6..44f739e 100644 (file)
@@ -21,7 +21,7 @@ project.index
 sublime-*
 sftp-config.json
 ## Visual Studio Code
-*.vscode
+*.vscode/
 
 # MediaWiki install & usage
 /cache
index 9e86cb0..8ccc9c2 100644 (file)
@@ -60,6 +60,10 @@ production.
 * $wgPopularPasswordFile — The location of the default popular passwords file
   has been moved to be in line with other non-PHP files used by libraries and
   classes.
+* $wgEnableImageWhitelist is now disabled by default, as it opens up a hole for
+  potential privacy leaks by administrators. You can check
+  "MediaWiki:External image whitelist" on your wiki to see whether the feature
+  was ever used, and whether it needs to be re-enabled.
 
 ==== Removed configuration ====
 * $wgEnableAPI and $wgEnableWriteAPI – These settings, deprecated in 1.31,
@@ -133,25 +137,39 @@ production.
 === External library changes in 1.32 ===
 
 ==== New external libraries ====
-* Added wikimedia/xmp-reader 0.6.0.
-* Added Add pear/Net_SMTP 1.8.0.
-* …
+* Added pear/Net_SMTP v1.8.0.
+* Added wikimedia/xmp-reader v0.6.0.
+
+* Added cache/integration-tests v0.16.0 (dev-only).
+* Added giorgiosironi/eris v0.10.0 (dev-only).
+* Added seld/jsonlint v1.7.1 (dev-only).
+
+* Added EasyDeflate (unversioned).
 
 ==== Changed external libraries ====
-* Updated qunitjs from 2.4.0 to 2.6.2.
-* Updated wikimedia/scoped-callback from 1.0.0 to 2.0.0.
+* Updated OOUI from v0.26.3 to v0.29.2.
+* Updated wikimedia/base-convert from v1.0.1 to v2.0.0.
+* Updated wikimedia/remex-html from v1.0.3 to v2.0.1.
+* Updated wikimedia/scoped-callback from v1.0.0 to v2.0.0.
 ** ScopedCallback objects can no longer be serialized.
-* Updated wikimedia/wrappedstring from 2.3.0 to 3.0.1.
-* Updated mediawiki/mediawiki-codesniffer from v20.0.0 to v21.0.0.
-* Updated composer/spdx-licenses from 1.3.0 to 1.4.0.
-* Updated jquery.i18n from 1.0.4 to 1.0.5.
-* Updated wikimedia/timestamp from 1.0.0 to 2.2.0.
-* Updated wikimedia/remex-html from 1.0.3 to 2.0.1.
+* Updated wikimedia/timestamp from v1.0.0 to v2.2.0.
+* Updated wikimedia/wrappedstring from v2.3.0 to v3.0.1.
+
+* Updated composer/spdx-licenses from v1.3.0 to v1.4.0 (dev-only).
+* Updated mediawiki/mediawiki-codesniffer from v18.0.0 to v22.0.0 (dev-only).
+* Updated psy/psysh from v0.8.11 to v0.9.6 (dev-only).
+
+* Updated CLDRPluralRuleParser from v0.1.0 to v1.3.2-pre.
 * Updated jquery from v3.2.1 to v3.3.1.
+* Updated jquery.client from v2.0.0 to v2.0.1.
+* Updated jquery.i18n from v1.0.4 to v1.0.5.
+* Updated mustache.js from v0.8.2-d9aa703 to v1.0.0.
+* Updated OOjs from v2.2.0 to v2.2.2.
+* Updated qunitjs from v2.4.0 to v2.6.2.
+* Updated sinonjs from v1.17.3 to v1.17.7.
 
 ==== Removed external libraries ====
 * pear/mail_mime-decode was removed.
-* …
 
 === Bug fixes in 1.32 ===
 * SpecialPage::execute() will now only call checkLoginSecurityLevel() if
@@ -420,6 +438,26 @@ because of Phabricator reports.
   * ApiUsageException::getCodeString() (deprecated in 1.29)
   * ApiUsageException::getMessageArray() (deprecated in 1.29)
 * Class UsageException, deprecated in 1.29, has been removed.
+* MediaWiki no longer has a 'JavaScript-powered' wikitext toolbar built in. The
+  old "bulletin board style toolbar", known as "the 2006 wikitext editor", has
+  been removed, and instead sysadmins will be required to choose one (or more)
+  of the several extensions available for this purpose if they need the
+  functionality. The MediaWiki "tarball" releases have included the replacement
+  extension for this, the WikiEditor extension aka "the 2010 wikitext editor",
+  for many years now. As part of this, several parts of MediaWiki have been
+  removed or simplified:
+  * The user option 'showtoolbar' (shown as "Show edit toolbar") is no longer
+    available; if an extension adds a toolbar via the EditPageBeforeEditToolbar
+    hook, it will be shown; extensions should provide a specific user preference
+    to disable themselves as needed.
+  * The public methods Language::getImageFile() and ::getImageFiles(), and the
+    related specification of $imageFiles within individual languages' code file,
+    as well as the referenced static media assets, all of which were only used
+    inside MediaWiki itself for providing the icons for the old toolbar, have
+    been removed without explicit deprecation.
+  * The internal ResourceLoader module "mediawiki.toolbar", which is unused
+    except by MediaWiki itself and back-compatibility code, has been removed.
+  * The internal ResourceLoaderEditToolbarModule class has been removed.
 
 === Deprecations in 1.32 ===
 * HTMLForm::setSubmitProgressive() is deprecated. No need to call it. Submit
@@ -621,7 +659,8 @@ because of Phabricator reports.
 == Compatibility ==
 MediaWiki 1.32 requires PHP 7.0.0 or later. Although HHVM 3.18.5 or later is
 supported, it is generally advised to use PHP 7.0.0 or later for long term
-support.
+support. MediaWiki requires that the mbstring, xml, ctype, json, iconv and
+fileinfo PHP extensions are loaded to work.
 
 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
index d48322e..999cda8 100644 (file)
@@ -8,6 +8,9 @@ production.
 === Configuration changes in 1.33 ===
 
 ==== New configuration ====
+* $wgEnablePartialBlocks – This enables the Partial Blocks feature, which gives
+  accounts with block permissions the ability to block users, IPs, and IP ranges
+  from editing specific pages, while allowing them to edit the rest of the wiki.
 * …
 
 ==== Changed configuration ====
@@ -54,6 +57,15 @@ because of Phabricator reports.
   The parameters $tooltip and $lang are mandatory. Omitting the parameters is
   deprecated since 1.32.
 * Language::truncate(), deprecated in 1.31, has been removed.
+* UtfNormal, deprecated in 1.25, was removed. Use UtfNormal\Validator directly
+  instead.
+* (T197179) In OOUI HTMLForm fields, the parameters 'notice', 'notice-messages',
+  and 'notice-message', which were deprecated in 1.32, were removed. Instead,
+  use 'help', 'help-message', and 'help-messages'.
+* (T197179) HTMLFormField::getNotices(), deprecated in 1.32, was removed.
+* The "Parsoid v1" compatibility mappings in ParsoidVirtualRESTService and
+  RestbaseVirtualRESTService, deprecated since 1.26, have been removed.
+  Use the RESTBase v1 or Parsoid v3 API instead.
 * …
 
 === Deprecations in 1.33 ===
@@ -66,6 +78,11 @@ because of Phabricator reports.
   applied for Arabic and Malayalam in the future.  Please enable these on
   your local wiki (if you have them explicitly set to false) and run
   maintenance/cleanupTitles.php to fix any existing page titles.
+* The LegacyHookPreAuthenticationProvider class, deprecated since its creation
+  in 1.27 as part of the AuthManager re-write, now emits deprecation warnings.
+  This will help identify the issue if you added it to $wgAuthManagerConfig.
+* wfSplitWikiId() is now deprecated. Cache key generation should have the wiki
+  domain ID as a key component and use makeGlobalKey().
 * …
 
 === Other changes in 1.33 ===
index 3e6b4a2..6df039c 100644 (file)
@@ -613,6 +613,7 @@ $wgAutoloadLocalClasses = [
        'HTMLTextField' => __DIR__ . '/includes/htmlform/fields/HTMLTextField.php',
        'HTMLTextFieldWithButton' => __DIR__ . '/includes/htmlform/fields/HTMLTextFieldWithButton.php',
        'HTMLTitleTextField' => __DIR__ . '/includes/htmlform/fields/HTMLTitleTextField.php',
+       'HTMLTitlesMultiselectField' => __DIR__ . '/includes/htmlform/fields/HTMLTitlesMultiselectField.php',
        'HTMLUserTextField' => __DIR__ . '/includes/htmlform/fields/HTMLUserTextField.php',
        'HTMLUsersMultiselectField' => __DIR__ . '/includes/htmlform/fields/HTMLUsersMultiselectField.php',
        'HTTPFileStreamer' => __DIR__ . '/includes/libs/filebackend/HTTPFileStreamer.php',
@@ -705,6 +706,7 @@ $wgAutoloadLocalClasses = [
        'JobQueueAggregatorRedis' => __DIR__ . '/includes/jobqueue/aggregator/JobQueueAggregatorRedis.php',
        'JobQueueConnectionError' => __DIR__ . '/includes/jobqueue/JobQueue.php',
        'JobQueueDB' => __DIR__ . '/includes/jobqueue/JobQueueDB.php',
+       'JobQueueEnqueueUpdate' => __DIR__ . '/includes/deferred/JobQueueEnqueueUpdate.php',
        'JobQueueError' => __DIR__ . '/includes/jobqueue/JobQueue.php',
        'JobQueueFederated' => __DIR__ . '/includes/jobqueue/JobQueueFederated.php',
        'JobQueueGroup' => __DIR__ . '/includes/jobqueue/JobQueueGroup.php',
@@ -937,6 +939,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Widget\\SelectWithInputWidget' => __DIR__ . '/includes/widget/SelectWithInputWidget.php',
        'MediaWiki\\Widget\\SizeFilterWidget' => __DIR__ . '/includes/widget/SizeFilterWidget.php',
        'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
+       'MediaWiki\\Widget\\TitlesMultiselectWidget' => __DIR__ . '/includes/widget/TitlesMultiselectWidget.php',
        'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
        'MediaWiki\\Widget\\UsersMultiselectWidget' => __DIR__ . '/includes/widget/UsersMultiselectWidget.php',
        'MemcLockManager' => __DIR__ . '/includes/libs/lockmanager/MemcLockManager.php',
@@ -1211,7 +1214,6 @@ $wgAutoloadLocalClasses = [
        'ResourceLoader' => __DIR__ . '/includes/resourceloader/ResourceLoader.php',
        'ResourceLoaderClientHtml' => __DIR__ . '/includes/resourceloader/ResourceLoaderClientHtml.php',
        'ResourceLoaderContext' => __DIR__ . '/includes/resourceloader/ResourceLoaderContext.php',
-       'ResourceLoaderEditToolbarModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderEditToolbarModule.php',
        'ResourceLoaderFileModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderFileModule.php',
        'ResourceLoaderFilePath' => __DIR__ . '/includes/resourceloader/ResourceLoaderFilePath.php',
        'ResourceLoaderForeignApiModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderForeignApiModule.php',
@@ -1542,6 +1544,7 @@ $wgAutoloadLocalClasses = [
        'UserBlockedError' => __DIR__ . '/includes/exception/UserBlockedError.php',
        'UserCache' => __DIR__ . '/includes/cache/UserCache.php',
        'UserDupes' => __DIR__ . '/maintenance/userDupes.inc',
+       'UserEditCountUpdate' => __DIR__ . '/includes/deferred/UserEditCountUpdate.php',
        'UserGroupExpiryJob' => __DIR__ . '/includes/jobqueue/jobs/UserGroupExpiryJob.php',
        'UserGroupMembership' => __DIR__ . '/includes/user/UserGroupMembership.php',
        'UserMailer' => __DIR__ . '/includes/mail/UserMailer.php',
@@ -1552,7 +1555,6 @@ $wgAutoloadLocalClasses = [
        'UserRightsProxy' => __DIR__ . '/includes/user/UserRightsProxy.php',
        'UserrightsPage' => __DIR__ . '/includes/specials/SpecialUserrights.php',
        'UsersPager' => __DIR__ . '/includes/specials/pagers/UsersPager.php',
-       'UtfNormal' => __DIR__ . '/includes/compat/normal/UtfNormal.php',
        'UzConverter' => __DIR__ . '/languages/classes/LanguageUz.php',
        'VFormHTMLForm' => __DIR__ . '/includes/htmlform/VFormHTMLForm.php',
        'ValidateRegistrationFile' => __DIR__ . '/maintenance/validateRegistrationFile.php',
index d7a25e3..5663198 100644 (file)
@@ -20,6 +20,7 @@
                "composer/semver": "1.4.2",
                "cssjanus/cssjanus": "1.2.0",
                "ext-ctype": "*",
+               "ext-fileinfo": "*",
                "ext-iconv": "*",
                "ext-json": "*",
                "ext-mbstring": "*",
@@ -34,7 +35,7 @@
                "psr/log": "1.0.2",
                "wikimedia/assert": "0.2.2",
                "wikimedia/at-ease": "1.2.0",
-               "wikimedia/base-convert": "1.0.1",
+               "wikimedia/base-convert": "2.0.0",
                "wikimedia/cdb": "1.4.1",
                "wikimedia/cldr-plural-rule-parser": "1.0.0",
                "wikimedia/composer-merge-plugin": "1.4.1",
@@ -76,7 +77,6 @@
        "suggest": {
                "ext-apcu": "Local data cache for greatly improved performance",
                "ext-curl": "Improved http communication abilities",
-               "ext-fileinfo": "Improved mime magic detection",
                "ext-intl": "ICU integration",
                "ext-wikidiff2": "Diff accelerator",
                "monolog/monolog": "Flexible debug logging system",
index 96ddf1d..f9ae150 100644 (file)
@@ -1480,11 +1480,10 @@ textarea in the edit form.
 &$buttons: Array of edit buttons "Save", "Preview", "Live", and "Diff"
 &$tabindex: HTML tabindex of the last edit check/button
 
-'EditPageBeforeEditToolbar': Allows modifying the edit toolbar above the
-textarea in the edit form.
-Hook subscribers can return false to avoid the default toolbar code being
-loaded.
-&$toolbar: The toolbar HTML
+'EditPageBeforeEditToolbar': Allow adding an edit toolbar above the textarea in
+the edit form.
+&$toolbar: The toolbar HTML, initially an empty `<div id="toolbar"></div>`
+Hook subscribers can return false to have no toolbar HTML be loaded.
 
 'EditPageCopyrightWarning': Allow for site and per-namespace customization of
 contribution/copyright notice.
index e4e59da..677fd01 100644 (file)
@@ -130,6 +130,7 @@ class AutoLoader {
        public static function getAutoloadNamespaces() {
                return [
                        'MediaWiki\\Auth\\' => __DIR__ . '/auth/',
+                       'MediaWiki\\Block\\' => __DIR__ . '/block/',
                        'MediaWiki\\Edit\\' => __DIR__ . '/edit/',
                        'MediaWiki\\EditPage\\' => __DIR__ . '/editpage/',
                        'MediaWiki\\Linker\\' => __DIR__ . '/linker/',
index bf8bad1..befc50c 100644 (file)
@@ -22,6 +22,8 @@
 
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
+use MediaWiki\Block\BlockRestriction;
+use MediaWiki\Block\Restriction\Restriction;
 use MediaWiki\MediaWikiServices;
 
 class Block {
@@ -79,6 +81,12 @@ class Block {
        /** @var string|null */
        private $systemBlockType;
 
+       /** @var bool */
+       private $isSitewide;
+
+       /** @var Restriction[] */
+       private $restrictions;
+
        # TYPE constants
        const TYPE_USER = 1;
        const TYPE_IP = 2;
@@ -129,6 +137,7 @@ class Block {
                        'allowUsertalk'   => false,
                        'byText'          => '',
                        'systemBlock'     => null,
+                       'sitewide'        => true,
                ];
 
                if ( func_num_args() > 1 || !is_array( $options ) ) {
@@ -165,6 +174,7 @@ class Block {
                $this->mHideName = (bool)$options['hideName'];
                $this->isHardblock( !$options['anonOnly'] );
                $this->isAutoblocking( (bool)$options['enableAutoblock'] );
+               $this->isSitewide( (bool)$options['sitewide'] );
 
                # Prevention measures
                $this->prevents( 'sendemail', (bool)$options['blockEmail'] );
@@ -236,6 +246,7 @@ class Block {
                        'ipb_block_email',
                        'ipb_allow_usertalk',
                        'ipb_parent_block_id',
+                       'ipb_sitewide',
                ] + CommentStore::getStore()->getFields( 'ipb_reason' );
        }
 
@@ -266,6 +277,7 @@ class Block {
                                'ipb_block_email',
                                'ipb_allow_usertalk',
                                'ipb_parent_block_id',
+                               'ipb_sitewide',
                        ] + $commentQuery['fields'] + $actorQuery['fields'],
                        'joins' => $commentQuery['joins'] + $actorQuery['joins'],
                ];
@@ -292,6 +304,10 @@ class Block {
                        && $this->prevents( 'sendemail' ) == $block->prevents( 'sendemail' )
                        && $this->prevents( 'editownusertalk' ) == $block->prevents( 'editownusertalk' )
                        && $this->mReason == $block->mReason
+                       && $this->isSitewide() == $block->isSitewide()
+                       // Block::getRestrictions() may perform a database query, so keep it at
+                       // the end.
+                       && BlockRestriction::equals( $this->getRestrictions(), $block->getRestrictions() )
                );
        }
 
@@ -477,6 +493,7 @@ class Block {
 
                $this->isHardblock( !$row->ipb_anon_only );
                $this->isAutoblocking( $row->ipb_enable_autoblock );
+               $this->isSitewide( (bool)$row->ipb_sitewide );
 
                $this->prevents( 'createaccount', $row->ipb_create_account );
                $this->prevents( 'sendemail', $row->ipb_block_email );
@@ -510,7 +527,11 @@ class Block {
                }
 
                $dbw = wfGetDB( DB_MASTER );
+
+               BlockRestriction::deleteByParentBlockId( $this->getId() );
                $dbw->delete( 'ipblocks', [ 'ipb_parent_block_id' => $this->getId() ], __METHOD__ );
+
+               BlockRestriction::deleteByBlockId( $this->getId() );
                $dbw->delete( 'ipblocks', [ 'ipb_id' => $this->getId() ], __METHOD__ );
 
                return $dbw->affectedRows() > 0;
@@ -546,7 +567,12 @@ class Block {
 
                $dbw->insert( 'ipblocks', $row, __METHOD__, [ 'IGNORE' ] );
                $affected = $dbw->affectedRows();
-               $this->mId = $dbw->insertId();
+               if ( $affected ) {
+                       $this->setId( $dbw->insertId() );
+                       if ( $this->restrictions ) {
+                               BlockRestriction::insert( $this->restrictions );
+                       }
+               }
 
                # Don't collide with expired blocks.
                # Do this after trying to insert to avoid locking.
@@ -564,9 +590,13 @@ class Block {
                        );
                        if ( $ids ) {
                                $dbw->delete( 'ipblocks', [ 'ipb_id' => $ids ], __METHOD__ );
+                               BlockRestriction::deleteByBlockId( $ids );
                                $dbw->insert( 'ipblocks', $row, __METHOD__, [ 'IGNORE' ] );
                                $affected = $dbw->affectedRows();
-                               $this->mId = $dbw->insertId();
+                               $this->setId( $dbw->insertId() );
+                               if ( $this->restrictions ) {
+                                       BlockRestriction::insert( $this->restrictions );
+                               }
                        }
                }
 
@@ -598,14 +628,24 @@ class Block {
 
                $dbw->startAtomic( __METHOD__ );
 
-               $dbw->update(
+               $result = $dbw->update(
                        'ipblocks',
                        $this->getDatabaseArray( $dbw ),
                        [ 'ipb_id' => $this->getId() ],
                        __METHOD__
                );
 
-               $affected = $dbw->affectedRows();
+               // Only update the restrictions if they have been modified.
+               if ( $this->restrictions !== null ) {
+                       // An empty array should remove all of the restrictions.
+                       if ( empty( $this->restrictions ) ) {
+                               $success = BlockRestriction::deleteByBlockId( $this->getId() );
+                       } else {
+                               $success = BlockRestriction::update( $this->restrictions );
+                       }
+                       // Update the result. The first false is the result, otherwise, true.
+                       $result = $result && $success;
+               }
 
                if ( $this->isAutoblocking() ) {
                        // update corresponding autoblock(s) (T50813)
@@ -615,8 +655,14 @@ class Block {
                                [ 'ipb_parent_block_id' => $this->getId() ],
                                __METHOD__
                        );
+
+                       // Only update the restrictions if they have been modified.
+                       if ( $this->restrictions !== null ) {
+                               BlockRestriction::updateByParentBlockId( $this->getId(), $this->restrictions );
+                       }
                } else {
                        // autoblock no longer required, delete corresponding autoblock(s)
+                       BlockRestriction::deleteByParentBlockId( $this->getId() );
                        $dbw->delete(
                                'ipblocks',
                                [ 'ipb_parent_block_id' => $this->getId() ],
@@ -626,12 +672,12 @@ class Block {
 
                $dbw->endAtomic( __METHOD__ );
 
-               if ( $affected ) {
+               if ( $result ) {
                        $auto_ipd_ids = $this->doRetroactiveAutoblock();
                        return [ 'id' => $this->mId, 'autoIds' => $auto_ipd_ids ];
                }
 
-               return false;
+               return $result;
        }
 
        /**
@@ -662,7 +708,8 @@ class Block {
                        'ipb_deleted'          => intval( $this->mHideName ), // typecast required for SQLite
                        'ipb_block_email'      => $this->prevents( 'sendemail' ),
                        'ipb_allow_usertalk'   => !$this->prevents( 'editownusertalk' ),
-                       'ipb_parent_block_id'  => $this->mParentBlockId
+                       'ipb_parent_block_id'  => $this->mParentBlockId,
+                       'ipb_sitewide'         => $this->isSitewide(),
                ] + CommentStore::getStore()->insert( $dbw, 'ipb_reason', $this->mReason )
                        + ActorMigration::newMigration()->getInsertValues( $dbw, 'ipb_by', $this->getBlocker() );
 
@@ -865,6 +912,8 @@ class Block {
                $autoblock->mHideName = $this->mHideName;
                $autoblock->prevents( 'editownusertalk', $this->prevents( 'editownusertalk' ) );
                $autoblock->mParentBlockId = $this->mId;
+               $autoblock->isSitewide( $this->isSitewide() );
+               $autoblock->setRestrictions( $this->getRestrictions() );
 
                if ( $this->mExpiry == 'infinity' ) {
                        # Original block was indefinite, start an autoblock now
@@ -1014,6 +1063,22 @@ class Block {
                return $this->mId;
        }
 
+       /**
+        * Set the block ID
+        *
+        * @param int $blockId
+        * @return int
+        */
+       private function setId( $blockId ) {
+               $this->mId = (int)$blockId;
+
+               if ( is_array( $this->restrictions ) ) {
+                       $this->restrictions = BlockRestriction::setBlockId( $blockId, $this->restrictions );
+               }
+
+               return $this;
+       }
+
        /**
         * Get the system block type, if any
         * @since 1.29
@@ -1061,6 +1126,18 @@ class Block {
                        : false;
        }
 
+       /**
+        * Indicates that the block is a sitewide block. This means the user is
+        * prohibited from editing any page on the site (other than their own talk
+        * page).
+        *
+        * @param null|bool $x
+        * @return bool
+        */
+       public function isSitewide( $x = null ) {
+               return wfSetVar( $this->isSitewide, $x );
+       }
+
        /**
         * Get/set whether the Block prevents a given action
         *
@@ -1069,7 +1146,10 @@ class Block {
         * @return bool|null Null for unrecognized rights.
         */
        public function prevents( $action, $x = null ) {
-               global $wgBlockDisablesLogin;
+               $config = RequestContext::getMain()->getConfig();
+               $blockDisablesLogin = $config->get( 'BlockDisablesLogin' );
+               $blockAllowsUTEdit = $config->get( 'BlockAllowsUTEdit' );
+
                $res = null;
                switch ( $action ) {
                        case 'edit':
@@ -1082,14 +1162,22 @@ class Block {
                        case 'sendemail':
                                $res = wfSetVar( $this->mBlockEmail, $x );
                                break;
+                       case 'upload':
+                               // Until T6995 is completed
+                               $res = $this->isSitewide();
+                               break;
                        case 'editownusertalk':
                                $res = wfSetVar( $this->mDisableUsertalk, $x );
+                               // edit own user talk can be disabled by config
+                               if ( !$blockAllowsUTEdit ) {
+                                       $res = true;
+                               }
                                break;
                        case 'read':
                                $res = false;
                                break;
                }
-               if ( !$res && $wgBlockDisablesLogin ) {
+               if ( !$res && $blockDisablesLogin ) {
                        // If a block would disable login, then it should
                        // prevent any action that all users cannot do
                        $anon = new User;
@@ -1145,6 +1233,7 @@ class Block {
                                        $fname
                                );
                                if ( $ids ) {
+                                       BlockRestriction::deleteByBlockId( $ids );
                                        $dbw->delete( 'ipblocks', [ 'ipb_id' => $ids ], $fname );
                                }
                        }
@@ -1614,6 +1703,29 @@ class Block {
         * @return array
         */
        public function getPermissionsError( IContextSource $context ) {
+               $params = $this->getBlockErrorParams( $context );
+
+               $msg = 'blockedtext';
+               if ( $this->getSystemBlockType() !== null ) {
+                       $msg = 'systemblockedtext';
+               } elseif ( $this->mAuto ) {
+                       $msg = 'autoblockedtext';
+               } elseif ( !$this->isSitewide() ) {
+                       $msg = 'blockedtext-partial';
+               }
+
+               array_unshift( $params, $msg );
+
+               return $params;
+       }
+
+       /**
+        * Get block information used in different block error messages
+        *
+        * @param IContextSource $context
+        * @return array
+        */
+       public function getBlockErrorParams( IContextSource $context ) {
                $blocker = $this->getBlocker();
                if ( $blocker instanceof User ) { // local user
                        $blockerUserpage = $blocker->getUserPage();
@@ -1630,14 +1742,10 @@ class Block {
                /* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
                 * This could be a username, an IP range, or a single IP. */
                $intended = $this->getTarget();
-
                $systemBlockType = $this->getSystemBlockType();
-
                $lang = $context->getLanguage();
+
                return [
-                       $systemBlockType !== null
-                               ? 'systemblockedtext'
-                               : ( $this->mAuto ? 'autoblockedtext' : 'blockedtext' ),
                        $link,
                        $reason,
                        $context->getRequest()->getIP(),
@@ -1648,4 +1756,70 @@ class Block {
                        $lang->userTimeAndDate( $this->mTimestamp, $context->getUser() ),
                ];
        }
+
+       /**
+        * Get Restrictions.
+        *
+        * Getting the restrictions will perform a database query if the restrictions
+        * are not already loaded.
+        *
+        * @return Restriction[]
+        */
+       public function getRestrictions() {
+               if ( $this->restrictions === null ) {
+                       // If the block id has not been set, then do not attempt to load the
+                       // restrictions.
+                       if ( !$this->mId ) {
+                               return [];
+                       }
+                       $this->restrictions = BlockRestriction::loadByBlockId( $this->mId );
+               }
+
+               return $this->restrictions;
+       }
+
+       /**
+        * Set Restrictions.
+        *
+        * @param Restriction[] $restrictions
+        *
+        * @return self
+        */
+       public function setRestrictions( array $restrictions ) {
+               $this->restrictions = array_filter( $restrictions, function ( $restriction ) {
+                       return $restriction instanceof Restriction;
+               } );
+
+               return $this;
+       }
+
+       /**
+        * Checks if a block prevents an edit on a given article
+        *
+        * @param \Title $title
+        * @return bool
+        */
+       public function preventsEdit( \Title $title ) {
+               $blocked = $this->isSitewide();
+
+               // user talk page has it's own rules
+               // This check happens before partial blocks because the flag
+               // to allow user to edit their user talk page could be
+               // overwritten by a partial block restriction (E.g. user talk namespace)
+               $user = $this->getTarget();
+               if ( $title->equals( $user->getTalkPage() ) ) {
+                       $blocked = $this->prevents( 'editownusertalk' );
+               }
+
+               if ( !$this->isSitewide() ) {
+                       $restrictions = $this->getRestrictions();
+                       foreach ( $restrictions as $restriction ) {
+                               if ( $restriction->matches( $title ) ) {
+                                       $blocked = true;
+                               }
+                       }
+               }
+
+               return $blocked;
+       }
 }
index 20d965d..82dbecf 100644 (file)
@@ -4245,8 +4245,10 @@ $wgAllowExternalImagesFrom = '';
  *
  * Set this to true to enable the on-wiki whitelist (MediaWiki:External image whitelist)
  * Or false to disable it
+ *
+ * @since 1.14
  */
-$wgEnableImageWhitelist = true;
+$wgEnableImageWhitelist = false;
 
 /**
  * A different approach to the above: simply allow the "<img>" tag to be used.
@@ -4571,10 +4573,6 @@ $wgAuthManagerConfig = null;
  */
 $wgAuthManagerAutoConfig = [
        'preauth' => [
-               MediaWiki\Auth\LegacyHookPreAuthenticationProvider::class => [
-                       'class' => MediaWiki\Auth\LegacyHookPreAuthenticationProvider::class,
-                       'sort' => 0,
-               ],
                MediaWiki\Auth\ThrottlePreAuthenticationProvider::class => [
                        'class' => MediaWiki\Auth\ThrottlePreAuthenticationProvider::class,
                        'sort' => 0,
@@ -4891,7 +4889,6 @@ $wgDefaultUserOptions = [
        'rows' => 25, // @deprecated since 1.29 No longer used in core
        'showhiddencats' => 0,
        'shownumberswatching' => 1,
-       'showtoolbar' => 1,
        'skin' => false,
        'stubthreshold' => 0,
        'thumbsize' => 5,
@@ -9031,6 +9028,16 @@ $wgChangeTagsSchemaMigrationStage = MIGRATION_WRITE_BOTH;
  */
 $wgTagStatisticsNewTable = false;
 
+/**
+ * Flag to enable Partial Blocks. This allows an admin to prevent a user from editing specific pages
+ * or namespaces.
+ *
+ * @since 1.32
+ * @deprecated 1.32
+ * @var bool
+ */
+$wgEnablePartialBlocks = false;
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 90db70f..a79b974 100644 (file)
@@ -2479,13 +2479,6 @@ ERROR;
                $out->addModuleStyles( 'mediawiki.editfont.styles' );
 
                $user = $this->context->getUser();
-               if ( $user->getOption( 'showtoolbar' ) ) {
-                       // The addition of default buttons is handled by getEditToolbar() which
-                       // has its own dependency on this module. The call here ensures the module
-                       // is loaded in time (it has position "top") for other modules to register
-                       // buttons (e.g. extensions, gadgets, user scripts).
-                       $out->addModules( 'mediawiki.toolbar' );
-               }
 
                if ( $user->getOption( 'uselivepreview' ) ) {
                        $out->addModules( 'mediawiki.action.edit.preview' );
@@ -2788,13 +2781,8 @@ ERROR;
 
                $out->addHTML( $this->editFormTextTop );
 
-               $showToolbar = true;
                if ( $this->wasDeletedSinceLastEdit() ) {
-                       if ( $this->formtype == 'save' ) {
-                               // Hide the toolbar and edit area, user can click preview to get it back
-                               // Add an confirmation checkbox and explanation.
-                               $showToolbar = false;
-                       } else {
+                       if ( $this->formtype !== 'save' ) {
                                $out->wrapWikiMsg( "<div class='error mw-deleted-while-editing'>\n$1\n</div>",
                                        'deletedwhileediting' );
                        }
@@ -2932,7 +2920,7 @@ ERROR;
                        $out->addHTML( $editConflictHelper->getEditFormHtmlBeforeContent() );
                }
 
-               if ( !$this->mTitle->isUserConfigPage() && $showToolbar && $user->getOption( 'showtoolbar' ) ) {
+               if ( !$this->mTitle->isUserConfigPage() ) {
                        $out->addHTML( self::getEditToolbar( $this->mTitle ) );
                }
 
@@ -4088,145 +4076,20 @@ ERROR;
        }
 
        /**
-        * Shows a bulletin board style toolbar for common editing functions.
-        * It can be disabled in the user preferences.
+        * Allow extensions to provide a toolbar.
         *
         * @param Title|null $title Title object for the page being edited (optional)
-        * @return string
+        * @return string|null
         */
        public static function getEditToolbar( $title = null ) {
-               global $wgOut, $wgEnableUploads, $wgForeignFileRepos;
-
-               $imagesAvailable = $wgEnableUploads || count( $wgForeignFileRepos );
-               $showSignature = true;
-               if ( $title ) {
-                       $showSignature = MWNamespace::wantSignatures( $title->getNamespace() );
-               }
-
-               $contLang = MediaWikiServices::getInstance()->getContentLanguage();
-
-               /**
-                * $toolarray is an array of arrays each of which includes the
-                * opening tag, the closing tag, optionally a sample text that is
-                * inserted between the two when no selection is highlighted
-                * and.  The tip text is shown when the user moves the mouse
-                * over the button.
-                *
-                * Images are defined in ResourceLoaderEditToolbarModule.
-                */
-               $toolarray = [
-                       [
-                               'id'     => 'mw-editbutton-bold',
-                               'open'   => '\'\'\'',
-                               'close'  => '\'\'\'',
-                               'sample' => wfMessage( 'bold_sample' )->text(),
-                               'tip'    => wfMessage( 'bold_tip' )->text(),
-                       ],
-                       [
-                               'id'     => 'mw-editbutton-italic',
-                               'open'   => '\'\'',
-                               'close'  => '\'\'',
-                               'sample' => wfMessage( 'italic_sample' )->text(),
-                               'tip'    => wfMessage( 'italic_tip' )->text(),
-                       ],
-                       [
-                               'id'     => 'mw-editbutton-link',
-                               'open'   => '[[',
-                               'close'  => ']]',
-                               'sample' => wfMessage( 'link_sample' )->text(),
-                               'tip'    => wfMessage( 'link_tip' )->text(),
-                       ],
-                       [
-                               'id'     => 'mw-editbutton-extlink',
-                               'open'   => '[',
-                               'close'  => ']',
-                               'sample' => wfMessage( 'extlink_sample' )->text(),
-                               'tip'    => wfMessage( 'extlink_tip' )->text(),
-                       ],
-                       [
-                               'id'     => 'mw-editbutton-headline',
-                               'open'   => "\n== ",
-                               'close'  => " ==\n",
-                               'sample' => wfMessage( 'headline_sample' )->text(),
-                               'tip'    => wfMessage( 'headline_tip' )->text(),
-                       ],
-                       $imagesAvailable ? [
-                               'id'     => 'mw-editbutton-image',
-                               'open'   => '[[' . $contLang->getNsText( NS_FILE ) . ':',
-                               'close'  => ']]',
-                               'sample' => wfMessage( 'image_sample' )->text(),
-                               'tip'    => wfMessage( 'image_tip' )->text(),
-                       ] : false,
-                       $imagesAvailable ? [
-                               'id'     => 'mw-editbutton-media',
-                               'open'   => '[[' . $contLang->getNsText( NS_MEDIA ) . ':',
-                               'close'  => ']]',
-                               'sample' => wfMessage( 'media_sample' )->text(),
-                               'tip'    => wfMessage( 'media_tip' )->text(),
-                       ] : false,
-                       [
-                               'id'     => 'mw-editbutton-nowiki',
-                               'open'   => "<nowiki>",
-                               'close'  => "</nowiki>",
-                               'sample' => wfMessage( 'nowiki_sample' )->text(),
-                               'tip'    => wfMessage( 'nowiki_tip' )->text(),
-                       ],
-                       $showSignature ? [
-                               'id'     => 'mw-editbutton-signature',
-                               'open'   => wfMessage( 'sig-text', '~~~~' )->inContentLanguage()->text(),
-                               'close'  => '',
-                               'sample' => '',
-                               'tip'    => wfMessage( 'sig_tip' )->text(),
-                       ] : false,
-                       [
-                               'id'     => 'mw-editbutton-hr',
-                               'open'   => "\n----\n",
-                               'close'  => '',
-                               'sample' => '',
-                               'tip'    => wfMessage( 'hr_tip' )->text(),
-                       ]
-               ];
-
-               $script = '';
-               foreach ( $toolarray as $tool ) {
-                       if ( !$tool ) {
-                               continue;
-                       }
-
-                       $params = [
-                               // Images are defined in ResourceLoaderEditToolbarModule
-                               false,
-                               // Note that we use the tip both for the ALT tag and the TITLE tag of the image.
-                               // Older browsers show a "speedtip" type message only for ALT.
-                               // Ideally these should be different, realistically they
-                               // probably don't need to be.
-                               $tool['tip'],
-                               $tool['open'],
-                               $tool['close'],
-                               $tool['sample'],
-                               $tool['id'],
-                       ];
+               $startingToolbar = '<div id="toolbar"></div>';
+               $toolbar = $startingToolbar;
 
-                       $script .= Xml::encodeJsCall(
-                               'mw.toolbar.addButton',
-                               $params,
-                               ResourceLoader::inDebugMode()
-                       );
-               }
-
-               $toolbar = '<div id="toolbar"></div>';
-
-               if ( Hooks::run( 'EditPageBeforeEditToolbar', [ &$toolbar ] ) ) {
-                       // Only add the old toolbar cruft to the page payload if the toolbar has not
-                       // been over-written by a hook caller
-                       $nonce = $wgOut->getCSPNonce();
-                       $wgOut->addScript( Html::inlineScript(
-                               ResourceLoader::makeInlineCodeWithModule( 'mediawiki.toolbar', $script ),
-                               $nonce
-                       ) );
+               if ( !Hooks::run( 'EditPageBeforeEditToolbar', [ &$toolbar ] ) ) {
+                       return null;
                };
-
-               return $toolbar;
+               // Don't add a pointless `<div>` to the page unless a hook caller populated it
+               return ( $toolbar === $startingToolbar ) ? null : $toolbar;
        }
 
        /**
index 4531b54..6e95871 100644 (file)
@@ -2656,6 +2656,7 @@ function wfWikiID() {
  * @param string $wiki
  *
  * @return array
+ * @deprecated 1.32
  */
 function wfSplitWikiID( $wiki ) {
        $bits = explode( '-', $wiki, 2 );
index bc57637..35a8c90 100644 (file)
@@ -43,7 +43,7 @@ class MediaWiki {
        private $config;
 
        /**
-        * @var String Cache what action this request is
+        * @var string Cache what action this request is
         */
        private $action;
 
@@ -704,11 +704,12 @@ class MediaWiki {
         * @since 1.26
         */
        public function doPostOutputShutdown( $mode = 'normal' ) {
+               // Record backend request timing
+               $timing = $this->context->getTiming();
+               $timing->mark( 'requestShutdown' );
+
                // Perform the last synchronous operations...
                try {
-                       // Record backend request timing
-                       $timing = $this->context->getTiming();
-                       $timing->mark( 'requestShutdown' );
                        // Show visible profiling data if enabled (which cannot be post-send)
                        Profiler::instance()->logDataPageOutputOnly();
                } catch ( Exception $e ) {
@@ -899,9 +900,6 @@ class MediaWiki {
                        __METHOD__
                );
 
-               // Important: this must be the last deferred update added (T100085, T154425)
-               DeferredUpdates::addCallableUpdate( [ JobQueueGroup::class, 'pushLazyJobs' ] );
-
                // Do any deferred jobs; preferring to run them now if a client will not wait on them
                DeferredUpdates::doUpdates( $blocksHttpClient ? 'enqueue' : 'run' );
 
index 0acd55a..f3ca7d4 100644 (file)
@@ -518,6 +518,7 @@ class MediaWikiServices extends ServiceContainer {
         * @return CryptRand
         */
        public function getCryptRand() {
+               wfDeprecated( __METHOD__, '1.32' );
                return $this->getService( 'CryptRand' );
        }
 
index ecd12c6..5213fc1 100644 (file)
@@ -543,6 +543,13 @@ class MovePage {
                $nullRevId = $nullRevision->insertOn( $dbw );
                $logEntry->setAssociatedRevId( $nullRevId );
 
+               /**
+                * T163966
+                * Increment user_editcount during page moves
+                * Moved from SpecialMovepage.php per T195550
+                */
+               $user->incEditCount();
+
                if ( !$redirectContent ) {
                        // Clean up the old title *before* reset article id - T47348
                        WikiPage::onArticleDelete( $this->oldTitle );
index 3a0a529..ca3f6a3 100644 (file)
@@ -1758,6 +1758,7 @@ class OutputPage extends ContextSource {
         *    or else addWikiTextAsContent() if $interface is false.
         */
        public function addWikiText( $text, $linestart = true, $interface = true ) {
+               wfDeprecated( __METHOD__, '1.32' );
                $title = $this->getTitle();
                if ( !$title ) {
                        throw new MWException( 'Title is null' );
@@ -1936,6 +1937,10 @@ class OutputPage extends ContextSource {
        ) {
                global $wgParser;
 
+               if ( !$tidy ) {
+                       wfDeprecated( 'disabling tidy', '1.32' );
+               }
+
                $popts = $this->parserOptions();
                $oldTidy = $popts->setTidy( $tidy );
                $popts->setInterfaceMessage( (bool)$interface );
@@ -4110,8 +4115,8 @@ class OutputPage extends ContextSource {
         * Helper function to setup the PHP implementation of OOUI to use in this request.
         *
         * @since 1.26
-        * @param String $skinName The Skin name to determine the correct OOUI theme
-        * @param String $dir Language direction
+        * @param string $skinName The Skin name to determine the correct OOUI theme
+        * @param string $dir Language direction
         */
        public static function setupOOUI( $skinName = 'default', $dir = 'ltr' ) {
                $themes = ResourceLoaderOOUIModule::getSkinThemeMap();
index dc7b00e..7b41262 100644 (file)
@@ -69,6 +69,11 @@ class RollbackAction extends FormlessAction {
                        ] );
                }
 
+               // @TODO: remove this hack once rollback uses POST (T88044)
+               $trxLimits = $this->context->getConfig()->get( 'TrxProfilerLimits' );
+               $trxProfiler = Profiler::instance()->getTransactionProfiler();
+               $trxProfiler->setExpectations( $trxLimits['POST'], __METHOD__ );
+
                $data = null;
                $errors = $this->page->doRollback(
                        $from,
index bb86536..1ca54c1 100644 (file)
@@ -1853,6 +1853,12 @@ abstract class ApiBase extends ContextSource {
                                        'blocked',
                                        [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
                                ) );
+                       } elseif ( is_array( $error ) && $error[0] === 'blockedtext-partial' && $user->getBlock() ) {
+                               $status->fatal( ApiMessage::create(
+                                       'apierror-blocked-partial',
+                                       'blocked',
+                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
+                               ) );
                        } elseif ( is_array( $error ) && $error[0] === 'autoblockedtext' && $user->getBlock() ) {
                                $status->fatal( ApiMessage::create(
                                        'apierror-autoblocked',
@@ -2027,6 +2033,12 @@ abstract class ApiBase extends ContextSource {
                                'autoblocked',
                                [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) ]
                        );
+               } elseif ( !$block->isSitewide() ) {
+                       $this->dieWithError(
+                               'apierror-blocked-partial',
+                               'blocked',
+                               [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) ]
+                       );
                } else {
                        $this->dieWithError(
                                'apierror-blocked',
index 8f40283..3581ac8 100644 (file)
@@ -54,6 +54,30 @@ class ApiBlock extends ApiBase {
                        }
                }
 
+               $editingRestriction = 'sitewide';
+               $pageRestrictions = '';
+               if ( $this->getConfig()->get( 'EnablePartialBlocks' ) ) {
+                       if ( $params['pagerestrictions'] ) {
+                               $count = count( $params['pagerestrictions'] );
+                               if ( $count > 10 ) {
+                                       $this->dieWithError(
+                                               $this->msg(
+                                                       'apierror-integeroutofrange-abovebotmax',
+                                                       'pagerestrictions',
+                                                       10,
+                                                       $count
+                                               )
+                                       );
+                               }
+                       }
+
+                       if ( $params['partial'] ) {
+                               $editingRestriction = 'partial';
+                       }
+
+                       $pageRestrictions = implode( "\n", $params['pagerestrictions'] );
+               }
+
                if ( $params['userid'] !== null ) {
                        $username = User::whoIs( $params['userid'] );
 
@@ -107,6 +131,8 @@ class ApiBlock extends ApiBase {
                        'Watch' => $params['watchuser'],
                        'Confirm' => true,
                        'Tags' => $params['tags'],
+                       'EditingRestriction' => $editingRestriction,
+                       'PageRestrictions' => $pageRestrictions,
                ];
 
                $retval = SpecialBlock::processForm( $data, $this->getContext() );
@@ -137,6 +163,11 @@ class ApiBlock extends ApiBase {
                $res['allowusertalk'] = $params['allowusertalk'];
                $res['watchuser'] = $params['watchuser'];
 
+               if ( $this->getConfig()->get( 'EnablePartialBlocks' ) ) {
+                       $res['partial'] = $params['partial'];
+                       $res['pagerestrictions'] = $params['pagerestrictions'];
+               }
+
                $this->getResult()->addValue( null, $this->getModuleName(), $res );
        }
 
@@ -149,7 +180,7 @@ class ApiBlock extends ApiBase {
        }
 
        public function getAllowedParams() {
-               return [
+               $params = [
                        'user' => [
                                ApiBase::PARAM_TYPE => 'user',
                        ],
@@ -171,6 +202,15 @@ class ApiBlock extends ApiBase {
                                ApiBase::PARAM_ISMULTI => true,
                        ],
                ];
+
+               if ( $this->getConfig()->get( 'EnablePartialBlocks' ) ) {
+                       $params['partial'] = false;
+                       $params['pagerestrictions'] = [
+                               ApiBase::PARAM_ISMULTI => true,
+                       ];
+               }
+
+               return $params;
        }
 
        public function needsToken() {
index 83f72e5..5e5efa5 100644 (file)
@@ -414,11 +414,7 @@ class ApiEditPage extends ApiBase {
                        // obvious that this is even possible.
                        // @codeCoverageIgnoreStart
                        case EditPage::AS_BLOCKED_PAGE_FOR_USER:
-                               $this->dieWithError(
-                                       'apierror-blocked',
-                                       'blocked',
-                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
-                               );
+                               $this->dieBlocked( $user->getBlock() );
 
                        case EditPage::AS_READ_ONLY_PAGE:
                                $this->dieReadOnly();
index 234fcfd..9d69145 100644 (file)
@@ -252,6 +252,7 @@ abstract class ApiFormatBase extends ApiBase {
                        $out = new OutputPage( $context );
                        $context->setOutput( $out );
 
+                       $out->setRobotPolicy( 'noindex,nofollow' );
                        $out->addModuleStyles( 'mediawiki.apipretty' );
                        $out->setPageTitle( $context->msg( 'api-format-title' ) );
 
index 72509c2..84fcbef 100644 (file)
@@ -44,6 +44,7 @@ class ApiHelp extends ApiBase {
                $context->setLanguage( $this->getMain()->getLanguage() );
                $context->setTitle( SpecialPage::getTitleFor( 'ApiHelp' ) );
                $out = new OutputPage( $context );
+               $out->setRobotPolicy( 'noindex,nofollow' );
                $out->setCopyrightUrl( 'https://www.mediawiki.org/wiki/Special:MyLanguage/Copyright' );
                $context->setOutput( $out );
 
index a78cb7f..148ac67 100644 (file)
@@ -625,7 +625,7 @@ class ApiParse extends ApiBase {
         * This mimicks the behavior of EditPage in formatting a summary
         *
         * @param Title $title of the page being parsed
-        * @param Array $params the API parameters of the request
+        * @param array $params The API parameters of the request
         * @return Content|bool
         */
        private function formatSummary( $title, $params ) {
index 08c13e7..3cd2ace 100644 (file)
@@ -20,6 +20,9 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IResultWrapper;
+use MediaWiki\Block\BlockRestriction;
+
 /**
  * Query module to enumerate all user blocks
  *
@@ -48,6 +51,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                $fld_reason = isset( $prop['reason'] );
                $fld_range = isset( $prop['range'] );
                $fld_flags = isset( $prop['flags'] );
+               $fld_restrictions = isset( $prop['restrictions'] );
 
                $result = $this->getResult();
 
@@ -64,8 +68,9 @@ class ApiQueryBlocks extends ApiQueryBase {
                $this->addFieldsIf( 'ipb_expiry', $fld_expiry );
                $this->addFieldsIf( [ 'ipb_range_start', 'ipb_range_end' ], $fld_range );
                $this->addFieldsIf( [ 'ipb_anon_only', 'ipb_create_account', 'ipb_enable_autoblock',
-                       'ipb_block_email', 'ipb_deleted', 'ipb_allow_usertalk' ],
+                       'ipb_block_email', 'ipb_deleted', 'ipb_allow_usertalk', 'ipb_sitewide' ],
                        $fld_flags );
+               $this->addFieldsIf( 'ipb_sitewide', $fld_restrictions );
 
                if ( $fld_reason ) {
                        $commentQuery = $commentStore->getJoin( 'ipb_reason' );
@@ -180,6 +185,11 @@ class ApiQueryBlocks extends ApiQueryBase {
 
                $res = $this->select( __METHOD__ );
 
+               $restrictions = [];
+               if ( $fld_restrictions ) {
+                       $restrictions = $this->getRestrictionData( $res, $params['limit'] );
+               }
+
                $count = 0;
                foreach ( $res as $row ) {
                        if ( ++$count > $params['limit'] ) {
@@ -227,7 +237,16 @@ class ApiQueryBlocks extends ApiQueryBase {
                                $block['noemail'] = (bool)$row->ipb_block_email;
                                $block['hidden'] = (bool)$row->ipb_deleted;
                                $block['allowusertalk'] = (bool)$row->ipb_allow_usertalk;
+                               $block['partial'] = !(bool)$row->ipb_sitewide;
+                       }
+
+                       if ( $fld_restrictions ) {
+                               $block['restrictions'] = [];
+                               if ( !$row->ipb_sitewide && isset( $restrictions[$row->ipb_id] ) ) {
+                                       $block['restrictions'] = $restrictions[$row->ipb_id];
+                               }
                        }
+
                        $fit = $result->addValue( [ 'query', $this->getModuleName() ], null, $block );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'continue', "$row->ipb_timestamp|$row->ipb_id" );
@@ -256,6 +275,52 @@ class ApiQueryBlocks extends ApiQueryBase {
                return $name;
        }
 
+       /**
+        * Retrieves the restrictions based on the query result.
+        *
+        * @param IResultWrapper $result
+        * @param int $limit
+        *
+        * @return array
+        */
+       private static function getRestrictionData( IResultWrapper $result, $limit ) {
+               $partialIds = [];
+               $count = 0;
+               foreach ( $result as $row ) {
+                       if ( ++$count <= $limit && !$row->ipb_sitewide ) {
+                               $partialIds[] = (int)$row->ipb_id;
+                       }
+               }
+
+               $restrictions = BlockRestriction::loadByBlockId( $partialIds );
+
+               $data = [];
+               $keys = [
+                       'page' => 'pages',
+                       'ns' => 'namespaces',
+               ];
+               foreach ( $restrictions as $restriction ) {
+                       $key = $keys[$restriction->getType()];
+                       $id = $restriction->getBlockId();
+                       switch ( $restriction->getType() ) {
+                               case 'page':
+                                       $value = [ 'id' => $restriction->getValue() ];
+                                       self::addTitleInfo( $value, $restriction->getTitle() );
+                                       break;
+                               default:
+                                       $value = $restriction->getValue();
+                       }
+
+                       if ( !isset( $data[$id][$key] ) ) {
+                               $data[$id][$key] = [];
+                               ApiResult::setIndexedTagName( $data[$id][$key], $restriction->getType() );
+                       }
+                       $data[$id][$key][] = $value;
+               }
+
+               return $data;
+       }
+
        public function getAllowedParams() {
                $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' );
 
@@ -308,7 +373,8 @@ class ApiQueryBlocks extends ApiQueryBase {
                                        'expiry',
                                        'reason',
                                        'range',
-                                       'flags'
+                                       'flags',
+                                       'restrictions',
                                ],
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
index c9f528c..c00010a 100644 (file)
@@ -169,11 +169,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                        $this->limit = 1;
                                }
                        }
-                       if ( isset( $params['section'] ) ) {
-                               $this->section = $params['section'];
-                       } else {
-                               $this->section = false;
-                       }
+                       $this->section = $params['section'] ?? false;
                }
 
                $userMax = $this->parseContent ? 1 : ( $smallLimit ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1 );
index fa151c9..44e2703 100644 (file)
@@ -70,6 +70,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                $vals['blockreason'] = $block->mReason;
                $vals['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $block->mTimestamp );
                $vals['blockexpiry'] = ApiResult::formatExpiry( $block->getExpiry(), 'infinite' );
+               $vals['blockpartial'] = !$block->isSitewide();
                if ( $block->getSystemBlockType() !== null ) {
                        $vals['systemblocktype'] = $block->getSystemBlockType();
                }
index d2ff790..db57f7e 100644 (file)
@@ -55,6 +55,11 @@ class ApiRollback extends ApiBase {
                        }
                }
 
+               // @TODO: remove this hack once rollback uses POST (T88044)
+               $trxLimits = $this->getConfig()->get( 'TrxProfilerLimits' );
+               $trxProfiler = Profiler::instance()->getTransactionProfiler();
+               $trxProfiler->setExpectations( $trxLimits['POST'], __METHOD__ );
+
                $retval = $pageObj->doRollback(
                        $this->getRbUser( $params ),
                        $summary,
@@ -69,10 +74,7 @@ class ApiRollback extends ApiBase {
                        $this->dieStatus( $this->errorArrayToStatus( $retval, $user ) );
                }
 
-               $watch = 'preferences';
-               if ( isset( $params['watchlist'] ) ) {
-                       $watch = $params['watchlist'];
-               }
+               $watch = $params['watchlist'] ?? 'preferences';
 
                // Watch pages
                $this->setWatch( $watch, $titleObj, 'watchrollback' );
index a4aa5fc..c75238c 100644 (file)
@@ -45,6 +45,8 @@
        "apihelp-block-param-reblock": "إذا كان المستخدم محظوراً بالفعل، يستبدل الحظر القائم.",
        "apihelp-block-param-watchuser": "مشاهدة صفحة المستخدم ونقاش IP.",
        "apihelp-block-param-tags": "تغيير الوسوم للتطبيق على الإدخال في سجل الحظر.",
+       "apihelp-block-param-partial": "منع المستخدم من صفحات أو نطاقات محددة بدلا من الموقع بأكمله.",
+       "apihelp-block-param-pagerestrictions": "قائمة العناوين لمنع المستخدم من التحرير، ينطبق فقط عندما يتم تعيين \"partial\" على صحيح.",
        "apihelp-block-example-ip-simple": "منع عنوان IP <kbd>192.0.2.5</kbd> لمدة ثلاثة أيام بسبب >المخالفة الأولى</kbd>.",
        "apihelp-block-example-user-complex": "منع المستخدم <kbd>المخرب</kbd> لأجل غير مسمى بسبب <kbd>التخريب</kbd>، ومنع إنشاء حساب جديد وإرسال بريد إلكتروني.",
        "apihelp-changeauthenticationdata-summary": "تغيير بيانات المصادقة للمستخدم الحالي.",
        "apihelp-query+blocks-paramvalue-prop-reason": "يضيف السبب المعطى للمنع.",
        "apihelp-query+blocks-paramvalue-prop-range": "يضيف نطاق عناوين الآيبي المتأثرة بالمنع.",
        "apihelp-query+blocks-paramvalue-prop-flags": "يوسم المنع بـ(المنع التلقائي والمجهولون فقط وما إلى ذلك).",
+       "apihelp-query+blocks-paramvalue-prop-restrictions": "يضيف قيود المنع الجزئي إذا لم يكن المنع على مستوى الموقع.",
        "apihelp-query+blocks-param-show": "إظهار العناصر التي تستوفي هذه المعايير فقط،\nعلى سبيل المثال، لمشاهدة عمليات المنع غير المحددة فقط على عناوين آيبي; اضبط <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "قائمة المنع.",
        "apihelp-query+blocks-example-users": "إدراج عمليات منع المستخدمين <kbd>Alice</kbd> و<kbd>Bob</kbd>.",
        "apierror-bad-watchlist-token": "رمز قائمة مراقبة غير صحيح مقدم; يُرجَى تعيين رمز مميز في [[Special:Preferences]].",
        "apierror-blockedfrommail": "لقد تم منعك من إرسال البريد الإلكتروني.",
        "apierror-blocked": "لقد تم منعك من التحرير.",
+       "apierror-blocked-partial": "لقد تم منعك من تحرير هذه الصفحة.",
        "apierror-botsnotsupported": "هذه الواجهة غير مدعومة للبوتات.",
        "apierror-cannot-async-upload-file": "لا يمكن الجمع بين الوسيطين <var>async</var> و<var>file</var>، إذا كنت تريد معالجة غير متزامنة لملفك المرفوع، فارفعه أولاً إلى المخبأ (باستخدام الوسيط <var>stash</var>) ثم انشر الملف المتقطع بشكل غير متزامن (باستخدام <var>filekey</var> و<var>async</var>).",
        "apierror-cannotreauthenticate": "هذا الإجراء غير متاح لأن هويتك لا يمكن التحقق منها.",
index 0eb6749..e6f6baf 100644 (file)
@@ -52,6 +52,8 @@
        "apihelp-block-param-reblock": "Falls der Benutzer bereits gesperrt ist, die vorhandene Sperre überschreiben.",
        "apihelp-block-param-watchuser": "Benutzer- und Diskussionsseiten des Benutzers oder der IP-Adresse beobachten.",
        "apihelp-block-param-tags": "Auf den Eintrag im Sperr-Logbuch anzuwendende Änderungsmarkierungen.",
+       "apihelp-block-param-partial": "Sperrt den Benutzer für spezielle Seiten oder Namensräume und nicht für die gesamte Website.",
+       "apihelp-block-param-pagerestrictions": "Liste der Titel, die für den Benutzer gesperrt werden sollen. Nur zutreffend, wenn „partial“ auf true gesetzt ist.",
        "apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd> für drei Tage mit der Begründung „First strike“ (erste Verwarnung) sperren",
        "apihelp-block-example-user-complex": "Benutzer <kbd>Vandal</kbd> unbeschränkt sperren mit der Begründung „Vandalism“ (Vandalismus), Erstellung neuer Benutzerkonten sowie Versand von E-Mails verhindern.",
        "apihelp-changeauthenticationdata-summary": "Ändert die Authentifizierungsdaten für den aktuellen Benutzer.",
        "apihelp-query+blocks-paramvalue-prop-reason": "Fügt den angegebenen Grund für die Sperrung hinzu.",
        "apihelp-query+blocks-paramvalue-prop-range": "Fügt den von der Sperrung betroffenen Bereich von IP-Adressen hinzu.",
        "apihelp-query+blocks-paramvalue-prop-flags": "Markiert die Sperre mit (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-paramvalue-prop-restrictions": "Ergänzt die Beschränkungen der teilweisen Sperre, falls diese nicht für die gesamte Website ist.",
        "apihelp-query+blocks-param-show": "Zeige nur Elemente, die diese Kriterien erfüllen. Um zum Beispiel unbestimmte Sperren von IP-Adressen zu sehen, setzte <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Sperren auflisten",
        "apihelp-query+blocks-example-users": "Listet Sperren der Benutzer <kbd>Alice</kbd> und <kbd>Bob</kbd> auf.",
        "apierror-badmodule-nosubmodules": "Das Modul <kbd>$1</kbd> hat keine Untermodule.",
        "apierror-badparameter": "Ungültiger Wert für den Parameter <var>$1</var>.",
        "apierror-badquery": "Ungültige Abfrage.",
+       "apierror-blocked-partial": "Du wurdest für das Bearbeiten dieser Seite gesperrt.",
        "apierror-cannot-async-upload-file": "Die Parameter <var>async</var> und <var>file</var> können nicht kombiniert werden. Falls du eine asynchrone Verarbeitung deiner hochgeladenen Datei wünschst, lade sie zuerst mithilfe des Parameters <var>stash</var> auf den Speicher hoch. Veröffentliche anschließend die gespeicherte Datei asynchron mithilfe <var>filekey</var> und <var>async</var>.",
        "apierror-compare-maintextrequired": "Der Parameter <var>$1text-main</var> ist erforderlich, wenn <var>$1slots</var> <kbd>main</kbd> enthält (kann nicht den Hauptschlitz löschen).",
        "apierror-compare-nofromrevision": "Keine Version „from“. <var>fromrev</var>, <var>fromtitle</var> oder <var>fromid</var> angeben.",
index 25bf3f7..588dbef 100644 (file)
@@ -40,6 +40,8 @@
        "apihelp-block-param-reblock": "If the user is already blocked, overwrite the existing block.",
        "apihelp-block-param-watchuser": "Watch the user's or IP address's user and talk pages.",
        "apihelp-block-param-tags": "Change tags to apply to the entry in the block log.",
+       "apihelp-block-param-partial": "Block user from specific pages or namespaces rather than the entire site.",
+       "apihelp-block-param-pagerestrictions": "List of titles to block the user from editing. Only applies when 'partial' is set to true.",
        "apihelp-block-example-ip-simple": "Block IP address <kbd>192.0.2.5</kbd> for three days with reason <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Block user <kbd>Vandal</kbd> indefinitely with reason <kbd>Vandalism</kbd>, and prevent new account creation and email sending.",
 
        "apihelp-query+blocks-paramvalue-prop-reason": "Adds the reason given for the block.",
        "apihelp-query+blocks-paramvalue-prop-range": "Adds the range of IP addresses affected by the block.",
        "apihelp-query+blocks-paramvalue-prop-flags": "Tags the ban with (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-paramvalue-prop-restrictions": "Adds the partial block restrictions if the block is not sitewide.",
        "apihelp-query+blocks-param-show": "Show only items that meet these criteria.\nFor example, to see only indefinite blocks on IP addresses, set <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "List blocks.",
        "apihelp-query+blocks-example-users": "List blocks of users <kbd>Alice</kbd> and <kbd>Bob</kbd>.",
        "apierror-bad-watchlist-token": "Incorrect watchlist token provided. Please set a correct token in [[Special:Preferences]].",
        "apierror-blockedfrommail": "You have been blocked from sending email.",
        "apierror-blocked": "You have been blocked from editing.",
+       "apierror-blocked-partial": "You have been blocked from editing this page.",
        "apierror-botsnotsupported": "This interface is not supported for bots.",
        "apierror-cannot-async-upload-file": "The parameters <var>async</var> and <var>file</var> cannot be combined. If you want asynchronous processing of your uploaded file, first upload it to stash (using the <var>stash</var> parameter) and then publish the stashed file asynchronously (using <var>filekey</var> and <var>async</var>).",
        "apierror-cannotreauthenticate": "This action is not available as your identity cannot be verified.",
index 074432b..1af75a0 100644 (file)
@@ -65,6 +65,8 @@
        "apihelp-block-param-reblock": "Si l’utilisateur est déjà bloqué, écraser le blocage existant.",
        "apihelp-block-param-watchuser": "Surveiller les pages utilisateur et de discussion de l’utilisateur ou de l’adresse IP.",
        "apihelp-block-param-tags": "Modifier les balises à appliquer à l’entrée du journal des blocages.",
+       "apihelp-block-param-partial": "Bloquer un utilisateur pour des pages ou des espaces de nom spécifiques plutôt que pour tout un site.",
+       "apihelp-block-param-pagerestrictions": "Liste des titres pour lesquels bloquer l’utilisateur en modification. Ne s’applique que quand 'partiel' est mis à vrai.",
        "apihelp-block-example-ip-simple": "Bloquer l’adresse IP <kbd>192.0.2.5</kbd> pour trois jours avec le motif <kbd>Premier avertissement</kbd>.",
        "apihelp-block-example-user-complex": "Bloquer indéfiniment l’utilisateur <kbd>Vandal</kbd> avec le motif <kbd>Vandalism</kbd>, et empêcher la création de nouveau compte et l'envoi de courriel.",
        "apihelp-changeauthenticationdata-summary": "Modifier les données d’authentification pour l’utilisateur actuel.",
        "apihelp-query+blocks-paramvalue-prop-reason": "Ajoute le motif du blocage.",
        "apihelp-query+blocks-paramvalue-prop-range": "Ajoute la plage d’adresses IP affectée par le blocage.",
        "apihelp-query+blocks-paramvalue-prop-flags": "Marque le bannissement avec (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-paramvalue-prop-restrictions": "Ajoute les restrictions de blocage partiel si le blocage n’est pas pour tout le site.",
        "apihelp-query+blocks-param-show": "Afficher uniquement les éléments correspondant à ces critères.\nPar exemple, pour voir uniquement les blocages infinis sur les adresses IP, mettre <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Lister les blocages",
        "apihelp-query+blocks-example-users": "Lister les blocages des utilisateurs <kbd>Alice</kbd> et <kbd>Bob</kbd>.",
        "apierror-bad-watchlist-token": "Jeton de liste de suivi fourni non valide. Veuillez mettre un jeton valide dans [[Special:Preferences]].",
        "apierror-blockedfrommail": "Vous avez été bloqué pour l’envoi de courriel.",
        "apierror-blocked": "Vous avez été bloqué pour modifier.",
+       "apierror-blocked-partial": "Vous avez été bloqué pour la modification de cette page.",
        "apierror-botsnotsupported": "Cette interface n’est pas prise en charge pour les robots.",
        "apierror-cannot-async-upload-file": "Les paramètres <var>async</var> et <var>file</var> ne peuvent pas être combinés. Si vous voulez un traitement asynchrone de votre fichier téléversé, importez-le d’abord dans la réserve (en utilisant le paramètre <var>stash</var>) puis publiez le fichier importé de façon asynchrone (en utilisant <var>filekey</var> et <var>async</var>).",
        "apierror-cannotreauthenticate": "Cette action n’est pas disponible car votre identité ne peut pas être vérifiée.",
index 12c2262..b9f8868 100644 (file)
@@ -50,6 +50,8 @@
        "apihelp-block-param-reblock": "사용자가 이미 차단된 경우, 기존 차단 설정을 바꿉니다.",
        "apihelp-block-param-watchuser": "해당 사용자 또는 IP 주소의 사용자 문서 및 토론 문서를 주시합니다.",
        "apihelp-block-param-tags": "차단 기록의 항목에 적용할 태그를 변경합니다.",
+       "apihelp-block-param-partial": "사이트 전체가 아닌 특정 문서나 이름공간에서 사용자를 차단합니다.",
+       "apihelp-block-param-pagerestrictions": "사용자의 편집을 차단할 제목 목록입니다. '부분'이 true로 설정되어 있을 때에만 적용됩니다.",
        "apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd>에 대해 <kbd>First strike</kbd>라는 이유로 3일 간 차단하기",
        "apihelp-block-example-user-complex": "사용자 <kbd>Vandal</kbd>을 <kbd>Vandalism</kbd>이라는 이유로 무기한 차단하며 계정 생성 및 이메일 발송을 막기",
        "apihelp-changeauthenticationdata-summary": "현재 사용자의 인증 데이터를 변경합니다.",
        "apierror-badtoken": "잘못된 CSRF 토큰.",
        "apierror-blockedfrommail": "이메일 보내기에서 차단되어 있습니다.",
        "apierror-blocked": "편집에서 차단되어 있습니다.",
+       "apierror-blocked-partial": "이 문서의 편집에서 차단되어 있습니다.",
        "apierror-botsnotsupported": "이 인터페이스는 봇을 위해 지원되지 않습니다.",
        "apierror-cannotviewtitle": "$1을(를) 볼 권한이 없습니다.",
        "apierror-cantblock": "사용자를 차단할 권한이 없습니다.",
index f68bd69..b959a6d 100644 (file)
        "apierror-articleexists": "Den Artikel deen dir probéiert hutt unzeleeë gouf schonn ugeluecht.",
        "apierror-autoblocked": "Är IP-Adress gouf automatesch gespaart well se vun engem gespaarte Benotzer benotzt gouf.",
        "apierror-badip": "IP-Parameter ass net valabel.",
+       "apierror-blocked-partial": "Dir gouft gespaart fir dës säit z'änneren.",
        "apierror-cantblock": "Dir hutt net d'Recht fir Benotzer ze spären.",
        "apierror-cantimport": "Dir hutt net déi néideg Rechter fir Säiten z'importéieren.",
        "apierror-copyuploadbadurl": "D'Eroplueden ass vun dëser URL net erlaabt.",
index 67888b6..df7ab40 100644 (file)
@@ -48,6 +48,8 @@
        "apihelp-block-param-reblock": "Se o usuário já estiver bloqueado, sobrescrever o bloqueio existente.",
        "apihelp-block-param-watchuser": "Vigiar as páginas de usuário e de discussão, do usuário ou do endereço IP.",
        "apihelp-block-param-tags": "Alterar as tags para se inscrever na entrada no registro de bloqueio.",
+       "apihelp-block-param-partial": "Bloquear o usuário de acessar a páginas ou espaços nominais específicos, em vez de a todo o site.",
+       "apihelp-block-param-pagerestrictions": "Lista de títulos que o bloqueio impedirá o usuário de editar. Só se aplica quando 'partial' (parcial) estiver definido como 'true' (verdadeiro).",
        "apihelp-block-example-ip-simple": "Bloquear endereço IP <kbd>192.0.2.5</kbd> por três dias com razão <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear usuário <kbd>Vandal</kbd> indefinidamente com razão <kbd>Vandalism</kbd> e o impedir de criar nova conta e de enviar e-mails.",
        "apihelp-changeauthenticationdata-summary": "Alterar os dados de autenticação para o usuário atual.",
        "apihelp-query+blocks-paramvalue-prop-reason": "Adiciona a razão dada para o bloqueio.",
        "apihelp-query+blocks-paramvalue-prop-range": "Adiciona o intervalo de endereços IP afetados pelo bloqueio.",
        "apihelp-query+blocks-paramvalue-prop-flags": "Etiqueta a proibição com (autobloqueio, anononly, etc.).",
+       "apihelp-query+blocks-paramvalue-prop-restrictions": "Adiciona as restrições parciais do bloqueio se este não for para todo o site.",
        "apihelp-query+blocks-param-show": "Mostre apenas itens que atendam a esses critérios. Por exemplo, para ver apenas blocos indefinidos nos endereços IP, defina <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Listar bloqueios.",
        "apihelp-query+blocks-example-users": "Liste os bloqueios dos usuários <kbd>Alice</kbd> e <kbd>Bob</kbd>.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Fornece o modo como o título da página é exibido.",
        "apihelp-query+info-paramvalue-prop-varianttitles": "Fornece o título de apresentação em todas as variantes da língua de conteúdo da wiki.",
        "apihelp-query+info-param-testactions": "Testa se o usuário atual pode executar determinadas ações na página.",
+       "apihelp-query+info-param-testactionsdetail": "Nível de detalhe de <var>$1testactions</var>. Use os parâmetros <var>errorformat</var> e <var>errorlang</var> do [[Special:ApiHelp/main|módulo principal]] para controlar o formato das mensagens devolvidas.",
        "apihelp-query+info-paramvalue-testactionsdetail-boolean": "Retorna um valor booleano para cada ação.",
        "apihelp-query+info-paramvalue-testactionsdetail-full": "Retornar mensagens descrevendo por que a ação não é permitida ou uma matriz vazia, se for permitida.",
        "apihelp-query+info-paramvalue-testactionsdetail-quick": "Como <kbd>completo</kbd>, mas pulando verificação de caros.",
        "apierror-bad-watchlist-token": "Foi fornecido um token da lista de páginas vigiadas incorreto. Defina um token correto em [[Special:Preferences]].",
        "apierror-blockedfrommail": "Você foi bloqueado de enviar e-mail.",
        "apierror-blocked": "Você foi bloqueado de editar.",
+       "apierror-blocked-partial": "Você foi impedido de editar esta página.",
        "apierror-botsnotsupported": "Esta interface não é suportada por bots.",
        "apierror-cannot-async-upload-file": "Os parâmetros <var>async</var> e <var>file</var> não podem ser combinados. Se você deseja o processamento assíncrono do seu arquivo carregado, primeiro faça o upload para armazenar (usando o parâmetro <var>stash</var>) e depois publique o arquivo armazenado de forma assíncrona (usando <var>filekey</var> e <var>async</var>).",
        "apierror-cannotreauthenticate": "Esta ação não está disponível porque sua identidade não pode ser verificada.",
index 38cdaf2..666caf4 100644 (file)
@@ -43,6 +43,8 @@
        "apihelp-block-param-reblock": "Se o utilizador já está bloqueado, sobrescrever o bloco existente.",
        "apihelp-block-param-watchuser": "Vigiar as páginas de utilizador e de discussão, do utilizador ou do endereço IP.",
        "apihelp-block-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de bloqueios.",
+       "apihelp-block-param-partial": "Bloquear o utilizador de aceder a páginas ou espaços nominais específicos, em vez de a todo o ''site''.",
+       "apihelp-block-param-pagerestrictions": "Lista de títulos que o bloqueio impedirá o utilizador de editar. Só se aplica quando 'partial' (parcial) estiver definido como 'true' (verdadeiro).",
        "apihelp-block-example-ip-simple": "Bloquear o endereço IP <kbd>192.0.2.5</kbd> por três dias com o motivo <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear o utilizador <kbd>Vandal</kbd> indefinidamente com o motivo <kbd>Vandalism</kbd>, e impedir a criação de nova conta e o envio de correio eletrónico.",
        "apihelp-changeauthenticationdata-summary": "Alterar os dados de autenticação do utilizador atual.",
        "apihelp-query+blocks-paramvalue-prop-reason": "Adiciona o motivo apresentado para o bloqueio.",
        "apihelp-query+blocks-paramvalue-prop-range": "Adiciona o intervalo de endereços IP afetado pelo bloqueio.",
        "apihelp-query+blocks-paramvalue-prop-flags": "Etiqueta o bloqueio com (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-paramvalue-prop-restrictions": "Adiciona as restrições parciais do bloqueio se este não for para todo o ''site''.",
        "apihelp-query+blocks-param-show": "Mostrar só os bloqueios que preenchem estes critérios.\nPor exemplo, para ver só bloqueios indefinidos de endereços IP, defina <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Listar bloqueios.",
        "apihelp-query+blocks-example-users": "Listar os bloqueios dos utilizadores <kbd>Alice</kbd> e <kbd>Bob</kbd>.",
        "apihelp-query+info-paramvalue-prop-notificationtimestamp": "A data e hora das notificações de alterações de cada página vigiada.",
        "apihelp-query+info-paramvalue-prop-subjectid": "O identificador da página progenitora de cada página de discussão.",
        "apihelp-query+info-paramvalue-prop-url": "Fornece um URL completo, um URL de edição e o URL canónico, para cada página.",
-       "apihelp-query+info-paramvalue-prop-readable": "Indica se o utilizador pode ler esta página.",
+       "apihelp-query+info-paramvalue-prop-readable": "Indica se o utilizador pode ler esta página. Em vez deste parâmetro, use <kbd>intestactions=read</kbd>.",
        "apihelp-query+info-paramvalue-prop-preload": "Fornece o texto devolvido por EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Fornece a forma como o título da página é apresentado.",
        "apihelp-query+info-paramvalue-prop-varianttitles": "Fornece o título de apresentação em todas as variantes da língua de conteúdo da wiki.",
        "apihelp-query+info-param-testactions": "Testar se o utilizador pode realizar certas operações na página.",
+       "apihelp-query+info-param-testactionsdetail": "Nível de detalhe de <var>$1testactions</var>. Use os parâmetros <var>errorformat</var> e <var>errorlang</var> do [[Special:ApiHelp/main|módulo principal]] para controlar o formato das mensagens devolvidas.",
+       "apihelp-query+info-paramvalue-testactionsdetail-boolean": "Devolver um valor booliano para cada ação.",
+       "apihelp-query+info-paramvalue-testactionsdetail-full": "Devolver mensagens que descrevem porque a ação não é permitida, ou uma matriz vazia se ela for permitida.",
+       "apihelp-query+info-paramvalue-testactionsdetail-quick": "Como <kbd>full</kbd> mas saltando verificações exigentes.",
        "apihelp-query+info-param-token": "Em substituição, usar [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-query+info-example-simple": "Obter informações sobre a página <kbd>Main Page</kbd>.",
        "apihelp-query+info-example-protection": "Obter informação geral e de proteção sobre a página <kbd>Main Page</kbd>.",
        "apierror-assertnameduserfailed": "A asserção de que o utilizador é \"$1\" falhou.",
        "apierror-assertuserfailed": "A asserção de que o utilizador está autenticado falhou.",
        "apierror-autoblocked": "O seu endereço IP foi bloqueado automaticamente, porque foi usado por um utilizador bloqueado.",
+       "apierror-bad-badfilecontexttitle": "Título inválido no parâmetro <var>$1badfilecontexttitle</var>.",
        "apierror-badconfig-resulttoosmall": "O valor de <code>$wgAPIMaxResultSize</code> nesta wiki é demasiado pequeno para conter informação básica de resultados.",
        "apierror-badcontinue": "Parâmetro de continuação inválido. Deve passar o valor original devolvido pela consulta anterior.",
        "apierror-baddiff": "Não foi possível obter a lista de diferenças. Uma das revisões, ou ambas, não existem, ou não tem permissão para vê-las.",
        "apierror-bad-watchlist-token": "A chave secreta da lista de páginas vigiadas que foi fornecida está incorreta. Configure uma chave correta em [[Special:Preferences]], por favor.",
        "apierror-blockedfrommail": "Foi-lhe bloqueada a capacidade de enviar correio eletrónico.",
        "apierror-blocked": "Foi-lhe bloqueada a capacidade de editar.",
+       "apierror-blocked-partial": "Foi-lhe bloqueada a capacidade de editar esta página.",
        "apierror-botsnotsupported": "Esta interface não é suportada para robôs.",
        "apierror-cannot-async-upload-file": "Os parâmetros <var>async</var> e <var>file</var> não podem ser combinados. Se pretende o processamento assíncrono do seu ficheiro carregado, carregue-o primeiro na área de ficheiros escondidos (usando o parâmetro <var>stash</var>) e depois publique de forma assíncrona este ficheiro escondido (usando <var>filekey</var> e <var>async</var>).",
        "apierror-cannotreauthenticate": "Esta operação não está disponível porque não é possível verificar a sua identidade.",
index d279330..4f68de0 100644 (file)
@@ -48,6 +48,8 @@
        "apihelp-block-param-reblock": "{{doc-apihelp-param|block|reblock}}",
        "apihelp-block-param-watchuser": "{{doc-apihelp-param|block|watchuser}}",
        "apihelp-block-param-tags": "{{doc-apihelp-param|block|tags}}",
+       "apihelp-block-param-partial": "{{doc-apihelp-param|block|partial}}",
+       "apihelp-block-param-pagerestrictions": "{{doc-apihelp-param|block|pagerestrictions}}",
        "apihelp-block-example-ip-simple": "{{doc-apihelp-example|block}}",
        "apihelp-block-example-user-complex": "{{doc-apihelp-example|block}}",
        "apihelp-changeauthenticationdata-summary": "{{doc-apihelp-summary|changeauthenticationdata}}",
        "apihelp-query+blocks-paramvalue-prop-reason": "{{doc-apihelp-paramvalue|query+blocks|prop|reason}}",
        "apihelp-query+blocks-paramvalue-prop-range": "{{doc-apihelp-paramvalue|query+blocks|prop|range}}",
        "apihelp-query+blocks-paramvalue-prop-flags": "{{doc-apihelp-paramvalue|query+blocks|prop|flags}}",
+       "apihelp-query+blocks-paramvalue-prop-restrictions": "{{doc-apihelp-paramvalue|query+blocks|prop|restrictions}}",
        "apihelp-query+blocks-param-show": "{{doc-apihelp-param|query+blocks|show}}",
        "apihelp-query+blocks-example-simple": "{{doc-apihelp-example|query+blocks}}",
        "apihelp-query+blocks-example-users": "{{doc-apihelp-example|query+blocks}}",
        "apierror-bad-watchlist-token": "{{doc-apierror}}",
        "apierror-blockedfrommail": "{{doc-apierror}}",
        "apierror-blocked": "{{doc-apierror}}",
+       "apierror-blocked-partial": "{{doc-apierror}}",
        "apierror-botsnotsupported": "{{doc-apierror}}",
        "apierror-cannot-async-upload-file": "{{doc-apierror}}",
        "apierror-cannotreauthenticate": "{{doc-apierror}}",
index 1cb6f5c..811ccc7 100644 (file)
        "apihelp-query+imageusage-example-simple": "Visa sidor med hjälp av [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageusage-example-generator": "Hämta information om sidor med hjälp av [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+info-summary": "Få grundläggande sidinformation.",
+       "apihelp-query+info-paramvalue-prop-readable": "Om användaren kan läsa denna sida. Använd <kbd>intestactions=read</kbd> istället.",
        "apihelp-query+info-paramvalue-prop-varianttitles": "Ger visningstiteln i alla variationer på webbplatsens innehållsspråk.",
+       "apihelp-query+info-paramvalue-testactionsdetail-boolean": "Returnera ett booleskt värde för varje åtgärd.",
        "apihelp-query+iwbacklinks-param-limit": "Hur många sidor att returnera totalt.",
        "apihelp-query+iwbacklinks-param-dir": "Riktningen att lista mot.",
        "apihelp-query+iwlinks-param-dir": "Riktningen att lista mot.",
index eb5e4fb..e98a0ba 100644 (file)
@@ -13,7 +13,8 @@
                        "Максим Підліснюк",
                        "AS",
                        "Umherirrender",
-                       "Choomaq"
+                       "Choomaq",
+                       "Zoranzoki21"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Документація]]\n* [[mw:Special:MyLanguage/API:FAQ|ЧаПи]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Список розсилки]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Оголошення API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Баґи і запити]\n</div>\n<strong>Статус:</strong> Усі функції, вказані на цій сторінці, мають працювати, але API далі перебуває в активній розробці і може змінитися у будь-який момент. Підпишіться на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ список розсилки mediawiki-api-announce], щоб помічати оновлення.\n\n<strong>Хибні запити:</strong> Коли до API надсилаються хибні запити, буде відіслано HTTP-шапку з ключем «MediaWiki-API-Error», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на сторінці [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Помилки й попередження]].\n\n<p class=\"mw-apisandbox-link\"><strong>Тестування:</strong> Для зручності тестування запитів API, див. [[Special:ApiSandbox]].</p>",
        "apihelp-opensearch-param-limit": "Максимальна кількість результатів для виведення.",
        "apihelp-opensearch-param-namespace": "Простори назв, у яких шукати. Ігнорується, якщо <var>$1search</var> починається з валідного префікса простору назв.",
        "apihelp-opensearch-param-suggest": "Нічого не робити, якщо <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> хибний.",
-       "apihelp-opensearch-param-redirects": "Як обробляти перенаправлення:\n;return:Видати саме перенаправлення.\n;resolve:Видати цільову сторінку. Може видати менше, ніж $1limit результат{{PLURAL:$1limit||и|ів}}.\nЗ історичних причин, за замовчуванням стоїть «return» для $1format=json і «resolve» — для інших форматів.",
+       "apihelp-opensearch-param-redirects": "Як обробляти перенаправлення:\n;return:Видати саме перенаправлення.\n;resolve:Видати цільову сторінку. Може видати менше, ніж $1limit результат{{PLURAL:$1|limit||и|ів}}.\nЗ історичних причин, за замовчуванням стоїть «return» для $1format=json і «resolve» — для інших форматів.",
        "apihelp-opensearch-param-format": "Формат виводу.",
        "apihelp-opensearch-param-warningsaserror": "Якщо при <kbd>format=json</kbd> з'являються попередження, видати помилку API замість того, щоб їх ігнорувати.",
        "apihelp-opensearch-example-te": "Знайти сторінки, що починаються з <kbd>Te</kbd>.",
index 01d992f..008639c 100644 (file)
@@ -79,11 +79,7 @@ class AuthManagerAuthPlugin extends \AuthPlugin {
        }
 
        public function getDomain() {
-               if ( isset( $this->domain ) ) {
-                       return $this->domain;
-               } else {
-                       return 'invaliddomain';
-               }
+               return $this->domain ?? 'invaliddomain';
        }
 
        public function validDomain( $domain ) {
index ad88564..5f55ec5 100644 (file)
 
 namespace MediaWiki\Auth;
 
-use LoginForm;
-use StatusValue;
-use User;
-
 /**
  * A pre-authentication provider to call some legacy hooks.
  * @ingroup Auth
@@ -32,149 +28,7 @@ use User;
  * @deprecated since 1.27
  */
 class LegacyHookPreAuthenticationProvider extends AbstractPreAuthenticationProvider {
-
-       public function testForAuthentication( array $reqs ) {
-               $req = AuthenticationRequest::getRequestByClass( $reqs, PasswordAuthenticationRequest::class );
-               if ( $req ) {
-                       $user = User::newFromName( $req->username );
-                       $password = $req->password;
-               } else {
-                       $user = null;
-                       foreach ( $reqs as $req ) {
-                               if ( $req->username !== null ) {
-                                       $user = User::newFromName( $req->username );
-                                       break;
-                               }
-                       }
-                       if ( !$user ) {
-                               $this->logger->debug( __METHOD__ . ': No username in $reqs, skipping hooks' );
-                               return StatusValue::newGood();
-                       }
-
-                       // Something random for the 'AbortLogin' hook.
-                       $password = wfRandomString( 32 );
-               }
-
-               $msg = null;
-               if ( !\Hooks::run( 'LoginUserMigrated', [ $user, &$msg ], '1.27' ) ) {
-                       return $this->makeFailResponse(
-                               $user, LoginForm::USER_MIGRATED, $msg, 'LoginUserMigrated'
-                       );
-               }
-
-               $abort = LoginForm::ABORTED;
-               $msg = null;
-               if ( !\Hooks::run( 'AbortLogin', [ $user, $password, &$abort, &$msg ], '1.27' ) ) {
-                       return $this->makeFailResponse( $user, $abort, $msg, 'AbortLogin' );
-               }
-
-               return StatusValue::newGood();
-       }
-
-       public function testForAccountCreation( $user, $creator, array $reqs ) {
-               $abortError = '';
-               $abortStatus = null;
-               if ( !\Hooks::run( 'AbortNewAccount', [ $user, &$abortError, &$abortStatus ], '1.27' ) ) {
-                       // Hook point to add extra creation throttles and blocks
-                       $this->logger->debug( __METHOD__ . ': a hook blocked creation' );
-                       if ( $abortStatus === null ) {
-                               // Report back the old string as a raw message status.
-                               // This will report the error back as 'createaccount-hook-aborted'
-                               // with the given string as the message.
-                               // To return a different error code, return a StatusValue object.
-                               $msg = wfMessage( 'createaccount-hook-aborted' )->rawParams( $abortError );
-                               return StatusValue::newFatal( $msg );
-                       } else {
-                               // For MediaWiki 1.23+ and updated hooks, return the Status object
-                               // returned from the hook.
-                               $ret = StatusValue::newGood();
-                               $ret->merge( $abortStatus );
-                               return $ret;
-                       }
-               }
-
-               return StatusValue::newGood();
-       }
-
-       public function testUserForCreation( $user, $autocreate, array $options = [] ) {
-               if ( $autocreate !== false ) {
-                       $abortError = '';
-                       if ( !\Hooks::run( 'AbortAutoAccount', [ $user, &$abortError ], '1.27' ) ) {
-                               // Hook point to add extra creation throttles and blocks
-                               $this->logger->debug( __METHOD__ . ": a hook blocked auto-creation: $abortError\n" );
-                               return $this->makeFailResponse(
-                                       $user, LoginForm::ABORTED, $abortError, 'AbortAutoAccount'
-                               );
-                       }
-               }
-
-               return StatusValue::newGood();
-       }
-
-       /**
-        * Construct an appropriate failure response
-        * @param User $user
-        * @param int $constant One of the LoginForm::… constants
-        * @param string|null $msg Optional message key, will be derived from $constant otherwise
-        * @param string $hook Name of the hook for error logging and exception messages
-        * @return StatusValue
-        */
-       private function makeFailResponse( User $user, $constant, $msg, $hook ) {
-               switch ( $constant ) {
-                       case LoginForm::SUCCESS:
-                               // WTF?
-                               $this->logger->debug( "$hook is SUCCESS?!" );
-                               return StatusValue::newGood();
-
-                       case LoginForm::NEED_TOKEN:
-                               return StatusValue::newFatal( $msg ?: 'nocookiesforlogin' );
-
-                       case LoginForm::WRONG_TOKEN:
-                               return StatusValue::newFatal( $msg ?: 'sessionfailure' );
-
-                       case LoginForm::NO_NAME:
-                       case LoginForm::ILLEGAL:
-                               return StatusValue::newFatal( $msg ?: 'noname' );
-
-                       case LoginForm::WRONG_PLUGIN_PASS:
-                       case LoginForm::WRONG_PASS:
-                               return StatusValue::newFatal( $msg ?: 'wrongpassword' );
-
-                       case LoginForm::NOT_EXISTS:
-                               return StatusValue::newFatal( $msg ?: 'nosuchusershort', wfEscapeWikiText( $user->getName() ) );
-
-                       case LoginForm::EMPTY_PASS:
-                               return StatusValue::newFatal( $msg ?: 'wrongpasswordempty' );
-
-                       case LoginForm::RESET_PASS:
-                               return StatusValue::newFatal( $msg ?: 'resetpass_announce' );
-
-                       case LoginForm::THROTTLED:
-                               $throttle = $this->config->get( 'PasswordAttemptThrottle' );
-                               return StatusValue::newFatal(
-                                       $msg ?: 'login-throttled',
-                                       \Message::durationParam( $throttle['seconds'] )
-                               );
-
-                       case LoginForm::USER_BLOCKED:
-                               return StatusValue::newFatal(
-                                       $msg ?: 'login-userblocked', wfEscapeWikiText( $user->getName() )
-                               );
-
-                       case LoginForm::ABORTED:
-                               return StatusValue::newFatal(
-                                       $msg ?: 'login-abort-generic', wfEscapeWikiText( $user->getName() )
-                               );
-
-                       case LoginForm::USER_MIGRATED:
-                               $error = $msg ?: 'login-migrated-generic';
-                               return StatusValue::newFatal( ...(array)$error );
-
-                       // @codeCoverageIgnoreStart
-                       case LoginForm::CREATE_BLOCKED: // Can never happen
-                       default:
-                               throw new \DomainException( __METHOD__ . ": Unhandled case value from $hook" );
-               }
-                       // @codeCoverageIgnoreEnd
+       public function __construct() {
+               wfDeprecated( self::class, '1.27' );
        }
 }
diff --git a/includes/block/BlockRestriction.php b/includes/block/BlockRestriction.php
new file mode 100644 (file)
index 0000000..3ce682b
--- /dev/null
@@ -0,0 +1,417 @@
+<?php
+/**
+ * Block restriction interface.
+ *
+ * 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
+ */
+
+namespace MediaWiki\Block;
+
+use MediaWiki\Block\Restriction\PageRestriction;
+use MediaWiki\Block\Restriction\Restriction;
+use Wikimedia\Rdbms\IResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
+class BlockRestriction {
+
+       /**
+        * Retrieves the restrictions from the database by block id.
+        *
+        * @param int|array $blockId
+        * @param IDatabase|null $db
+        * @param array $options Options to pass to the select query.
+        * @return Restriction[]
+        */
+       public static function loadByBlockId( $blockId, IDatabase $db = null ) {
+               if ( is_null( $blockId ) || $blockId === [] ) {
+                       return [];
+               }
+
+               $db = $db ?: wfGetDb( DB_REPLICA );
+
+               $result = $db->select(
+                       [ 'ipblocks_restrictions', 'page' ],
+                       [ 'ir_ipb_id', 'ir_type', 'ir_value', 'page_namespace', 'page_title' ],
+                       [ 'ir_ipb_id' => $blockId ],
+                       __METHOD__,
+                       [],
+                       [ 'page' => [ 'LEFT JOIN', [ 'ir_type' => PageRestriction::TYPE_ID, 'ir_value=page_id' ] ] ]
+               );
+
+               return self::resultToRestrictions( $result );
+       }
+
+       /**
+        * Inserts the restrictions into the database.
+        *
+        * @param Restriction[] $restrictions
+        * @return bool
+        */
+       public static function insert( array $restrictions ) {
+               if ( empty( $restrictions ) ) {
+                       return false;
+               }
+
+               $rows = [];
+               foreach ( $restrictions as $restriction ) {
+                       if ( !$restriction instanceof Restriction ) {
+                               continue;
+                       }
+                       $rows[] = $restriction->toRow();
+               }
+
+               if ( empty( $rows ) ) {
+                       return false;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               return $dbw->insert(
+                       'ipblocks_restrictions',
+                       $rows,
+                       __METHOD__,
+                       [ 'IGNORE' ]
+               );
+       }
+
+       /**
+        * Updates the list of restrictions. This method does not allow removing all
+        * of the restrictions. To do that, use ::deleteByBlockId().
+        *
+        * @param Restriction[] $restrictions
+        * @return bool
+        */
+       public static function update( array $restrictions ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $dbw->startAtomic( __METHOD__ );
+
+               // Organize the restrictions by blockid.
+               $restrictionList = self::restrictionsByBlockId( $restrictions );
+
+               // Load the existing restrictions and organize by block id. Any block ids
+               // that were passed into this function will be used to load all of the
+               // existing restrictions. This list might be the same, or may be completely
+               // different.
+               $existingList = [];
+               $blockIds = array_keys( $restrictionList );
+               if ( !empty( $blockIds ) ) {
+                       $result = $dbw->select(
+                               [ 'ipblocks_restrictions', 'page' ],
+                               [ 'ir_ipb_id', 'ir_type', 'ir_value' ],
+                               [ 'ir_ipb_id' => $blockIds ],
+                               __METHOD__,
+                               [ 'FOR UPDATE' ]
+                       );
+
+                       $existingList = self::restrictionsByBlockId(
+                               self::resultToRestrictions( $result )
+                       );
+               }
+
+               $result = true;
+               // Perform the actions on a per block-id basis.
+               foreach ( $restrictionList as $blockId => $blockRestrictions ) {
+                       // Insert all of the restrictions first, ignoring ones that already exist.
+                       $success = self::insert( $blockRestrictions );
+
+                       // Update the result. The first false is the result, otherwise, true.
+                       $result = $success && $result;
+
+                       $restrictionsToRemove = self::restrictionsToRemove(
+                               $existingList[$blockId] ?? [],
+                               $restrictions
+                       );
+
+                       // Nothing to remove.
+                       if ( empty( $restrictionsToRemove ) ) {
+                               continue;
+                       }
+
+                       $success = self::delete( $restrictionsToRemove );
+
+                       // Update the result. The first false is the result, otherwise, true.
+                       $result = $success && $result;
+               }
+
+               $dbw->endAtomic( __METHOD__ );
+
+               return $result;
+       }
+
+       /**
+        * Updates the list of restrictions by parent id.
+        *
+        * @param int $parentBlockId
+        * @param Restriction[] $restrictions
+        * @return bool
+        */
+       public static function updateByParentBlockId( $parentBlockId, array $restrictions ) {
+               // If removing all of the restrictions, then just delete them all.
+               if ( empty( $restrictions ) ) {
+                       return self::deleteByParentBlockId( $parentBlockId );
+               }
+
+               $parentBlockId = (int)$parentBlockId;
+
+               $db = wfGetDb( DB_MASTER );
+
+               $db->startAtomic( __METHOD__ );
+
+               $blockIds = $db->selectFieldValues(
+                       'ipblocks',
+                       'ipb_id',
+                       [ 'ipb_parent_block_id' => $parentBlockId ],
+                       __METHOD__,
+                       [ 'FOR UPDATE' ]
+               );
+
+               $result = true;
+               foreach ( $blockIds as $id ) {
+                       $success = self::update( self::setBlockId( $id, $restrictions ) );
+                       // Update the result. The first false is the result, otherwise, true.
+                       $result = $success && $result;
+               }
+
+               $db->endAtomic( __METHOD__ );
+
+               return $result;
+       }
+
+       /**
+        * Delete the restrictions.
+        *
+        * @param Restriction[]|null $restrictions
+        * @throws MWException
+        * @return bool
+        */
+       public static function delete( array $restrictions ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $result = true;
+               foreach ( $restrictions as $restriction ) {
+                       if ( !$restriction instanceof Restriction ) {
+                               continue;
+                       }
+
+                       $success = $dbw->delete(
+                               'ipblocks_restrictions',
+                               // The restriction row is made up of a compound primary key. Therefore,
+                               // the row and the delete conditions are the same.
+                               $restriction->toRow(),
+                               __METHOD__
+                       );
+                       // Update the result. The first false is the result, otherwise, true.
+                       $result = $success && $result;
+               }
+
+               return $result;
+       }
+
+       /**
+        * Delete the restrictions by Block ID.
+        *
+        * @param int|array $blockId
+        * @throws MWException
+        * @return bool
+        */
+       public static function deleteByBlockId( $blockId ) {
+               $dbw = wfGetDB( DB_MASTER );
+               return $dbw->delete(
+                       'ipblocks_restrictions',
+                       [ 'ir_ipb_id' => $blockId ],
+                       __METHOD__
+               );
+       }
+
+       /**
+        * Delete the restrictions by Parent Block ID.
+        *
+        * @param int|array $parentBlockId
+        * @throws MWException
+        * @return bool
+        */
+       public static function deleteByParentBlockId( $parentBlockId ) {
+               $dbw = wfGetDB( DB_MASTER );
+               return $dbw->deleteJoin(
+                       'ipblocks_restrictions',
+                       'ipblocks',
+                       'ir_ipb_id',
+                       'ipb_id',
+                       [ 'ipb_parent_block_id' => $parentBlockId ],
+                       __METHOD__
+               );
+       }
+
+       /**
+        * Checks if two arrays of Restrictions are effectively equal. This is a loose
+        * equality check as the restrictions do not have to contain the same block
+        * ids.
+        *
+        * @param Restriction[] $a
+        * @param Restriction[] $b
+        * @return bool
+        */
+       public static function equals( array $a, array $b ) {
+               $filter = function ( $restriction ) {
+                       return $restriction instanceof Restriction;
+               };
+
+               // Ensure that every item in the array is a Restriction. This prevents a
+               // fatal error from calling Restriction::getHash if something in the array
+               // is not a restriction.
+               $a = array_filter( $a, $filter );
+               $b = array_filter( $b, $filter );
+
+               $aCount = count( $a );
+               $bCount = count( $b );
+
+               // If the count is different, then they are obviously a different set.
+               if ( $aCount !== $bCount ) {
+                       return false;
+               }
+
+               // If both sets contain no items, then they are the same set.
+               if ( $aCount === 0 && $bCount === 0 ) {
+                       return true;
+               }
+
+               $hasher = function ( $r ) {
+                       return $r->getHash();
+               };
+
+               $aHashes = array_map( $hasher, $a );
+               $bHashes = array_map( $hasher, $b );
+
+               sort( $aHashes );
+               sort( $bHashes );
+
+               return $aHashes === $bHashes;
+       }
+
+       /**
+        * Set the blockId on a set of restrictions and return a new set.
+        *
+        * @param int $blockId
+        * @param Restriction[] $restrictions
+        * @return Restriction[]
+        */
+       public static function setBlockId( $blockId, array $restrictions ) {
+               $blockRestrictions = [];
+
+               foreach ( $restrictions as $restriction ) {
+                       if ( !$restriction instanceof Restriction ) {
+                               continue;
+                       }
+
+                       // Clone the restriction so any references to the current restriction are
+                       // not suddenly changed to a different blockId.
+                       $restriction = clone $restriction;
+                       $restriction->setBlockId( $blockId );
+
+                       $blockRestrictions[] = $restriction;
+               }
+
+               return $blockRestrictions;
+       }
+
+       /**
+        * Get the restrictions that should be removed, which are existing
+        * restrictions that are not in the new list of restrictions.
+        *
+        * @param Restriction[] $existing
+        * @param Restriction[] $new
+        * @return array
+        */
+       private static function restrictionsToRemove( array $existing, array $new ) {
+               return array_filter( $existing, function ( $e ) use ( $new ) {
+                       foreach ( $new as $restriction ) {
+                               if ( !$restriction instanceof Restriction ) {
+                                       continue;
+                               }
+
+                               if ( $restriction->equals( $e ) ) {
+                                       return false;
+                               }
+                       }
+
+                       return true;
+               } );
+       }
+
+       /**
+        * Converts an array of restrictions to an associative array of restrictions
+        * where the keys are the block ids.
+        *
+        * @param Restriction[] $restrictions
+        * @return array
+        */
+       private static function restrictionsByBlockId( array $restrictions ) {
+               $blockRestrictions = [];
+
+               foreach ( $restrictions as $restriction ) {
+                       // Ensure that all of the items in the array are restrictions.
+                       if ( !$restriction instanceof Restriction ) {
+                               continue;
+                       }
+
+                       if ( !isset( $blockRestrictions[$restriction->getBlockId()] ) ) {
+                               $blockRestrictions[$restriction->getBlockId()] = [];
+                       }
+
+                       $blockRestrictions[$restriction->getBlockId()][] = $restriction;
+               }
+
+               return $blockRestrictions;
+       }
+
+       /**
+        * Convert an Result Wrapper to an array of restrictions.
+        *
+        * @param IResultWrapper $result
+        * @return Restriction[]
+        */
+       private static function resultToRestrictions( IResultWrapper $result ) {
+               $restrictions = [];
+               foreach ( $result as $row ) {
+                       $restriction = self::rowToRestriction( $row );
+
+                       if ( !$restriction ) {
+                               continue;
+                       }
+
+                       $restrictions[] = $restriction;
+               }
+
+               return $restrictions;
+       }
+
+       /**
+        * Convert a result row from the database into a restriction object.
+        *
+        * @param \stdClass $row
+        * @return Restriction|null
+        */
+       private static function rowToRestriction( \stdClass $row ) {
+               switch ( $row->ir_type ) {
+                       case PageRestriction::TYPE_ID:
+                               return PageRestriction::newFromRow( $row );
+                       default:
+                               return null;
+               }
+       }
+}
diff --git a/includes/block/Restriction/AbstractRestriction.php b/includes/block/Restriction/AbstractRestriction.php
new file mode 100644 (file)
index 0000000..88a6a0f
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Abstract block restriction.
+ *
+ * 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
+ */
+
+namespace MediaWiki\Block\Restriction;
+
+abstract class AbstractRestriction implements Restriction {
+
+       /**
+        * @var int
+        */
+       protected $blockId;
+
+       /**
+        * @var int
+        */
+       protected $value;
+
+       /**
+        * Create Restriction.
+        *
+        * @param int $blockId
+        * @param int $value
+        */
+       public function __construct( $blockId, $value ) {
+               $this->blockId = (int)$blockId;
+               $this->value = (int)$value;
+       }
+
+       /**
+        * {@inheritdoc}
+        */
+       public function getBlockId() {
+               return $this->blockId;
+       }
+
+       /**
+        * {@inheritdoc}
+        */
+       public function setBlockId( $blockId ) {
+               $this->blockId = (int)$blockId;
+
+               return $this;
+       }
+
+       /**
+        * {@inheritdoc}
+        */
+       public function getValue() {
+               return $this->value;
+       }
+
+       /**
+        * {@inheritdoc}
+        */
+       public static function newFromRow( \stdClass $row ) {
+               return new static( $row->ir_ipb_id, $row->ir_value );
+       }
+
+       /**
+        * {@inheritdoc}
+        */
+       public function toRow() {
+               return [
+                       'ir_ipb_id' => $this->getBlockId(),
+                       'ir_type' => $this->getTypeId(),
+                       'ir_value' => $this->getValue(),
+               ];
+       }
+
+       /**
+        * {@inheritdoc}
+        */
+       public function equals( Restriction $other ) {
+               return $this->getHash() === $other->getHash();
+       }
+
+       /**
+        * {@inheritdoc}
+        */
+       public function getHash() {
+               return $this->getType() . '-' . $this->getValue();
+       }
+}
diff --git a/includes/block/Restriction/PageRestriction.php b/includes/block/Restriction/PageRestriction.php
new file mode 100644 (file)
index 0000000..209b148
--- /dev/null
@@ -0,0 +1,99 @@
+<?php
+/**
+ * A Block restriction object of type 'Page'.
+ *
+ * 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
+ */
+
+namespace MediaWiki\Block\Restriction;
+
+class PageRestriction extends AbstractRestriction {
+
+       const TYPE = 'page';
+       const TYPE_ID = 1;
+
+       /**
+        * @var \Title
+        */
+       protected $title;
+
+       /**
+        * {@inheritdoc}
+        */
+       public function matches( \Title $title ) {
+               return $title->equals( $this->getTitle() );
+       }
+
+       /**
+        * {@inheritdoc}
+        */
+       public function getType() {
+               return self::TYPE;
+       }
+
+       /**
+        * {@inheritdoc}
+        */
+       public function getTypeId() {
+               return self::TYPE_ID;
+       }
+
+       /**
+        * Set the title.
+        *
+        * @param \Title $title
+        * @return self
+        */
+       public function setTitle( \Title $title ) {
+               $this->title = $title;
+
+               return $this;
+       }
+
+       /**
+        * Get Title.
+        *
+        * @return \Title|null
+        */
+       public function getTitle() {
+               if ( !$this->title ) {
+                       $this->title = \Title::newFromID( $this->value );
+               }
+
+               return $this->title;
+       }
+
+       /**
+        * {@inheritdoc}
+        */
+       public static function newFromRow( \stdClass $row ) {
+               $restriction = parent::newFromRow( $row );
+
+               // If the page_namespace and the page_title were provided, add the title to
+               // the restriction.
+               if ( isset( $row->page_namespace ) && isset( $row->page_title ) ) {
+                       // Clone the row so it is not mutated.
+                       $row = clone $row;
+                       $row->page_id = $row->ir_value;
+                       $title = \Title::newFromRow( $row );
+                       $restriction->setTitle( $title );
+               }
+
+               return $restriction;
+       }
+}
diff --git a/includes/block/Restriction/Restriction.php b/includes/block/Restriction/Restriction.php
new file mode 100644 (file)
index 0000000..f1cc1b0
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Block restriction interface.
+ *
+ * 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
+ */
+
+namespace MediaWiki\Block\Restriction;
+
+interface Restriction {
+
+       /**
+        * Gets the id of the block.
+        *
+        * @return int
+        */
+       public function getBlockId();
+
+       /**
+        * Sets the id of the block.
+        *
+        * @param int $blockId
+        * @return self
+        */
+       public function setBlockId( $blockId );
+
+       /**
+        * Gets the value of the restriction.
+        *
+        * @return int
+        */
+       public function getValue();
+
+       /**
+        * Gets the type of restriction
+        *
+        * @return string
+        */
+       public function getType();
+
+       /**
+        * Gets the id of the type of restriction. This id is used in the database.
+        *
+        * @return string
+        */
+       public function getTypeId();
+
+       /**
+        * Creates a new Restriction from a database row.
+        *
+        * @return self
+        */
+       public static function newFromRow( \stdClass $row );
+
+       /**
+        * Convert a restriction object into a row array for insertion.
+        *
+        * @return array
+        */
+       public function toRow();
+
+       /**
+        * Determine if a restriction matches a given title.
+        *
+        * @param \Title $title
+        * @return bool
+        */
+       public function matches( \Title $title );
+
+       /**
+        * Determine if a restriction equals another restriction.
+        *
+        * @param Restriction $other
+        * @return bool
+        */
+       public function equals( Restriction $other );
+
+       /**
+        * Create a unique hash of the block restriction based on the type and value.
+        *
+        * @return string
+        */
+       public function getHash();
+
+}
index 48809d0..1407271 100644 (file)
@@ -567,7 +567,7 @@ class BacklinkCache {
        /**
         * Returns check key for the backlinks cache for a particular title
         *
-        * @return String
+        * @return string
         */
        private function makeCheckKey() {
                return $this->wanCache->makeKey(
index 869f768..5ada42f 100644 (file)
@@ -198,6 +198,7 @@ class MessageCache {
                                // either.
                                $po = ParserOptions::newFromAnon();
                                $po->setAllowUnsafeRawHtml( false );
+                               $po->setTidy( true );
                                return $po;
                        }
 
@@ -206,6 +207,8 @@ class MessageCache {
                        // from malicious sources. As a precaution, disable
                        // the <html> parser tag when parsing messages.
                        $this->mParserOptions->setAllowUnsafeRawHtml( false );
+                       // For the same reason, tidy the output!
+                       $this->mParserOptions->setTidy( true );
                }
 
                return $this->mParserOptions;
@@ -513,7 +516,7 @@ class MessageCache {
                foreach ( $res as $row ) {
                        $name = $this->contLang->lcfirst( $row->page_title );
                        // Include entries/stubs for all keys in $mostused in adaptive mode
-                       if ( $wgAdaptiveMessageCache || isset( $overridable[$name] ) ) {
+                       if ( $wgAdaptiveMessageCache || $this->isMainCacheable( $name, $overridable ) ) {
                                $cache[$row->page_title] = '!TOO BIG';
                        }
                        // At least include revision ID so page changes are reflected in the hash
@@ -535,7 +538,7 @@ class MessageCache {
                foreach ( $res as $row ) {
                        $name = $this->contLang->lcfirst( $row->page_title );
                        // Include entries/stubs for all keys in $mostused in adaptive mode
-                       if ( $wgAdaptiveMessageCache || isset( $overridable[$name] ) ) {
+                       if ( $wgAdaptiveMessageCache || $this->isMainCacheable( $name, $overridable ) ) {
                                $text = Revision::getRevisionText( $row );
                                if ( $text === false ) {
                                        // Failed to fetch data; possible ES errors?
@@ -571,6 +574,17 @@ class MessageCache {
                return $cache;
        }
 
+       /**
+        * @param string $name Message name with lowercase first letter
+        * @param array $overridable Map of (key => unused) for software-defined messages
+        * @return bool
+        */
+       private function isMainCacheable( $name, array $overridable ) {
+               // Include common conversion table pages. This also avoids problems with
+               // Installer::parse() bailing out due to disallowed DB queries (T207979).
+               return ( isset( $overridable[$name] ) || strpos( $name, 'conversiontable/' ) === 0 );
+       }
+
        /**
         * Updates cache as necessary when message page is changed
         *
@@ -1039,7 +1053,8 @@ class MessageCache {
                        );
                } else {
                        // Message page either does not exist or does not override a software message
-                       if ( !isset( $this->overridable[$this->contLang->lcfirst( $title )] ) ) {
+                       $name = $this->contLang->lcfirst( $title );
+                       if ( !$this->isMainCacheable( $name, $this->overridable ) ) {
                                // Message page does not override any software-defined message. A custom
                                // message might be defined to have content or settings specific to the wiki.
                                // Load the message page, utilizing the individual message cache as needed.
index 78a4863..246a3dd 100644 (file)
@@ -50,11 +50,7 @@ class LCStoreCDB implements LCStore {
        function __construct( $conf = [] ) {
                global $wgCacheDirectory;
 
-               if ( isset( $conf['directory'] ) ) {
-                       $this->directory = $conf['directory'];
-               } else {
-                       $this->directory = $wgCacheDirectory;
-               }
+               $this->directory = $conf['directory'] ?? $wgCacheDirectory;
        }
 
        public function get( $code, $key ) {
index 3b6da73..c5a2512 100644 (file)
@@ -41,11 +41,7 @@ class LCStoreStaticArray implements LCStore {
        public function __construct( $conf = [] ) {
                global $wgCacheDirectory;
 
-               if ( isset( $conf['directory'] ) ) {
-                       $this->directory = $conf['directory'];
-               } else {
-                       $this->directory = $wgCacheDirectory;
-               }
+               $this->directory = $conf['directory'] ?? $wgCacheDirectory;
        }
 
        public function startWrite( $code ) {
index c781d71..5bb1db9 100644 (file)
@@ -112,11 +112,7 @@ class ChangesListBooleanFilter extends ChangesListFilter {
                        $this->showHide = $filterDefinition['showHide'];
                }
 
-               if ( isset( $filterDefinition['isReplacedInStructuredUi'] ) ) {
-                       $this->isReplacedInStructuredUi = $filterDefinition['isReplacedInStructuredUi'];
-               } else {
-                       $this->isReplacedInStructuredUi = false;
-               }
+               $this->isReplacedInStructuredUi = $filterDefinition['isReplacedInStructuredUi'] ?? false;
 
                if ( isset( $filterDefinition['default'] ) ) {
                        $this->setDefault( $filterDefinition['default'] );
@@ -128,11 +124,7 @@ class ChangesListBooleanFilter extends ChangesListFilter {
                        $this->queryCallable = $filterDefinition['queryCallable'];
                }
 
-               if ( isset( $filterDefinition['activeValue'] ) ) {
-                       $this->activeValue = $filterDefinition['activeValue'];
-               } else {
-                       $this->activeValue = true;
-               }
+               $this->activeValue = $filterDefinition['activeValue'] ?? true;
        }
 
        /**
index 9d30537..deec915 100644 (file)
@@ -174,11 +174,7 @@ abstract class ChangesListFilterGroup {
                }
 
                $this->type = $groupDefinition['type'];
-               if ( isset( $groupDefinition['priority'] ) ) {
-                       $this->priority = $groupDefinition['priority'];
-               } else {
-                       $this->priority = self::DEFAULT_PRIORITY;
-               }
+               $this->priority = $groupDefinition['priority'] ?? self::DEFAULT_PRIORITY;
 
                $this->isFullCoverage = $groupDefinition['isFullCoverage'];
 
index 1d303c7..b28983f 100644 (file)
@@ -351,13 +351,15 @@ class ChangeTags {
                                foreach ( $tagsToAdd as $tag ) {
                                        $changeTagMapping[$tag] = $changeTagDefStore->acquireId( $tag );
                                }
-
-                               $dbw->update(
-                                       'change_tag_def',
-                                       [ 'ctd_count = ctd_count + 1' ],
-                                       [ 'ctd_name' => $tagsToAdd ],
-                                       __METHOD__
-                               );
+                               // T207881: update the counts at the end of the transaction
+                               $dbw->onTransactionPreCommitOrIdle( function () use ( $dbw, $tagsToAdd ) {
+                                       $dbw->update(
+                                               'change_tag_def',
+                                               [ 'ctd_count = ctd_count + 1' ],
+                                               [ 'ctd_name' => $tagsToAdd ],
+                                               __METHOD__
+                                       );
+                               } );
                        }
 
                        $tagsRows = [];
@@ -408,18 +410,21 @@ class ChangeTags {
                                );
                                $dbw->delete( 'change_tag', $conds, __METHOD__ );
                                if ( $dbw->affectedRows() && $wgChangeTagsSchemaMigrationStage > MIGRATION_OLD ) {
-                                       $dbw->update(
-                                               'change_tag_def',
-                                               [ 'ctd_count = ctd_count - 1' ],
-                                               [ 'ctd_name' => $tag ],
-                                               __METHOD__
-                                       );
-
-                                       $dbw->delete(
-                                               'change_tag_def',
-                                               [ 'ctd_name' => $tag, 'ctd_count' => 0, 'ctd_user_defined' => 0 ],
-                                               __METHOD__
-                                       );
+                                       // T207881: update the counts at the end of the transaction
+                                       $dbw->onTransactionPreCommitOrIdle( function () use ( $dbw, $tag ) {
+                                               $dbw->update(
+                                                       'change_tag_def',
+                                                       [ 'ctd_count = ctd_count - 1' ],
+                                                       [ 'ctd_name' => $tag ],
+                                                       __METHOD__
+                                               );
+
+                                               $dbw->delete(
+                                                       'change_tag_def',
+                                                       [ 'ctd_name' => $tag, 'ctd_count' => 0, 'ctd_user_defined' => 0 ],
+                                                       __METHOD__
+                                               );
+                                       } );
                                }
                        }
                }
diff --git a/includes/compat/normal/UtfNormal.php b/includes/compat/normal/UtfNormal.php
deleted file mode 100644 (file)
index bce1ea6..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-/**
- * Unicode normalization routines
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup UtfNormal
- */
-
-/**
- * @defgroup UtfNormal UtfNormal
- */
-
-use UtfNormal\Validator;
-
-/**
- * Unicode normalization routines for working with UTF-8 strings.
- * Currently assumes that input strings are valid UTF-8!
- *
- * Not as fast as I'd like, but should be usable for most purposes.
- * UtfNormal::toNFC() will bail early if given ASCII text or text
- * it can quickly determine is already normalized.
- *
- * All functions can be called static.
- *
- * See description of forms at https://www.unicode.org/reports/tr15/
- *
- * @deprecated since 1.25, use UtfNormal\Validator directly
- * @ingroup UtfNormal
- */
-class UtfNormal {
-       /**
-        * The ultimate convenience function! Clean up invalid UTF-8 sequences,
-        * and convert to normal form C, canonical composition.
-        *
-        * Fast return for pure ASCII strings; some lesser optimizations for
-        * strings containing only known-good characters. Not as fast as toNFC().
-        *
-        * @param string $string a UTF-8 string
-        * @return string a clean, shiny, normalized UTF-8 string
-        */
-       static function cleanUp( $string ) {
-               wfDeprecated( __METHOD__, '1.25' );
-               return Validator::cleanUp( $string );
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form C, canonical composition.
-        * Fast return for pure ASCII strings; some lesser optimizations for
-        * strings containing only known-good characters.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form C
-        */
-       static function toNFC( $string ) {
-               wfDeprecated( __METHOD__, '1.25' );
-               return Validator::toNFC( $string );
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form D, canonical decomposition.
-        * Fast return for pure ASCII strings.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form D
-        */
-       static function toNFD( $string ) {
-               wfDeprecated( __METHOD__, '1.25' );
-               return Validator::toNFD( $string );
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form KC, compatibility composition.
-        * This may cause irreversible information loss, use judiciously.
-        * Fast return for pure ASCII strings.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form KC
-        */
-       static function toNFKC( $string ) {
-               wfDeprecated( __METHOD__, '1.25' );
-               return Validator::toNFKC( $string );
-       }
-
-       /**
-        * Convert a UTF-8 string to normal form KD, compatibility decomposition.
-        * This may cause irreversible information loss, use judiciously.
-        * Fast return for pure ASCII strings.
-        *
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return string a UTF-8 string in normal form KD
-        */
-       static function toNFKD( $string ) {
-               wfDeprecated( __METHOD__, '1.25' );
-               return Validator::toNFKD( $string );
-       }
-
-       /**
-        * Returns true if the string is _definitely_ in NFC.
-        * Returns false if not or uncertain.
-        * @param string $string a valid UTF-8 string. Input is not validated.
-        * @return bool
-        */
-       static function quickIsNFC( $string ) {
-               wfDeprecated( __METHOD__, '1.25' );
-               return Validator::quickIsNFC( $string );
-       }
-
-       /**
-        * Returns true if the string is _definitely_ in NFC.
-        * Returns false if not or uncertain.
-        * @param string &$string a UTF-8 string, altered on output to be valid UTF-8 safe for XML.
-        * @return bool
-        */
-       static function quickIsNFCVerify( &$string ) {
-               wfDeprecated( __METHOD__, '1.25' );
-               return Validator::quickIsNFCVerify( $string );
-       }
-}
index 8e71131..ef447d1 100644 (file)
@@ -254,11 +254,7 @@ class KafkaHandler extends AbstractProcessingHandler {
         * @param array $records List of records to append
         */
        protected function addMessages( $channel, array $records ) {
-               if ( isset( $this->options['alias'][$channel] ) ) {
-                       $topic = $this->options['alias'][$channel];
-               } else {
-                       $topic = "monolog_$channel";
-               }
+               $topic = $this->options['alias'][$channel] ?? "monolog_$channel";
                $partition = $this->getRandomPartition( $topic );
                if ( $partition !== null ) {
                        $this->produce->setMessages( $topic, $partition, $records );
diff --git a/includes/deferred/JobQueueEnqueueUpdate.php b/includes/deferred/JobQueueEnqueueUpdate.php
new file mode 100644 (file)
index 0000000..1691da2
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Handler for triggering the enqueuing of lazy-pushed jobs
+ *
+ * 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
+ */
+
+use Wikimedia\Assert\Assert;
+
+/**
+ * Enqueue lazy-pushed jobs that have accumulated from JobQueueGroup
+ *
+ * @ingroup JobQueue
+ * @since 1.33
+ */
+class JobQueueEnqueueUpdate implements DeferrableUpdate, MergeableUpdate {
+       /** @var array[] Map of (domain ID => IJobSpecification[]) */
+       private $jobsByDomain;
+
+       /**
+        * @param string $domain DB domain ID
+        * @param IJobSpecification[] $jobs
+        */
+       public function __construct( $domain, array $jobs ) {
+               $this->jobsByDomain[$domain] = $jobs;
+       }
+
+       public function merge( MergeableUpdate $update ) {
+               /** @var JobQueueEnqueueUpdate $update */
+               Assert::parameterType( __CLASS__, $update, '$update' );
+
+               foreach ( $update->jobsByDomain as $domain => $jobs ) {
+                       $this->jobsByDomain[$domain] = $this->jobsByDomain[$domain] ?? [];
+                       $this->jobsByDomain[$domain] = array_merge( $this->jobsByDomain[$domain], $jobs );
+               }
+       }
+
+       public function doUpdate() {
+               foreach ( $this->jobsByDomain as $domain => $jobs ) {
+                       $group = JobQueueGroup::singleton( $domain );
+                       try {
+                               $group->push( $jobs );
+                       } catch ( Exception $e ) {
+                               // Get in as many jobs as possible and let other post-send updates happen
+                               MWExceptionHandler::logException( $e );
+                       }
+               }
+       }
+}
index 8eeef13..6ae2bcc 100644 (file)
@@ -1,8 +1,17 @@
 <?php
 
 /**
- * Interface that deferrable updates can implement. DeferredUpdates uses this to merge
- * all pending updates of PHP class into a single update by calling merge().
+ * Interface that deferrable updates can implement to signal that updates can be combined.
+ *
+ * DeferredUpdates uses this to merge all pending updates of PHP class into a single update
+ * by calling merge(). Note that upon merge(), the combined update goes to the back of the FIFO
+ * queue so that such updates occur after related non-mergeable deferred updates. For example,
+ * suppose updates that purge URLs can be merged, and the calling pattern is:
+ *   - a) DeferredUpdates::addUpdate( $purgeCdnUrlsA );
+ *   - b) DeferredUpdates::addUpdate( $deleteContentUrlsB );
+ *   - c) DeferredUpdates::addUpdate( $purgeCdnUrlsB )
+ *
+ * The purges for urls A and B will all happen after the $deleteContentUrlsB update.
  *
  * @since 1.27
  */
diff --git a/includes/deferred/UserEditCountUpdate.php b/includes/deferred/UserEditCountUpdate.php
new file mode 100644 (file)
index 0000000..5194e4f
--- /dev/null
@@ -0,0 +1,113 @@
+<?php
+/**
+ * User edit count incrementing.
+ *
+ * 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
+ */
+
+use Wikimedia\Assert\Assert;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Handles increment the edit count for a given set of users
+ */
+class UserEditCountUpdate implements DeferrableUpdate, MergeableUpdate {
+       /** @var array[] Map of (user ID => ('increment': int, 'instances': User[])) */
+       private $infoByUser;
+
+       /**
+        * @param User $user
+        * @param int $increment
+        */
+       public function __construct( User $user, $increment ) {
+               if ( !$user->getId() ) {
+                       throw new RuntimeException( "Got user ID of zero" );
+               }
+               $this->infoByUser = [
+                       $user->getId() => [ 'increment' => $increment, 'instances' => [ $user ] ]
+               ];
+       }
+
+       public function merge( MergeableUpdate $update ) {
+               /** @var UserEditCountUpdate $update */
+               Assert::parameterType( __CLASS__, $update, '$update' );
+
+               foreach ( $update->infoByUser as $userId => $info ) {
+                       if ( !isset( $this->infoByUser[$userId] ) ) {
+                               $this->infoByUser[$userId] = [ 'increment' => 0, 'instances' => [] ];
+                       }
+                       // Merge the increment amount
+                       $this->infoByUser[$userId]['increment'] += $info['increment'];
+                       // Merge the list of User instances to update in doUpdate()
+                       foreach ( $info['instances'] as $user ) {
+                               if ( !in_array( $user, $this->infoByUser[$userId]['instances'], true ) ) {
+                                       $this->infoByUser[$userId]['instances'][] = $user;
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Purges the list of URLs passed to the constructor.
+        */
+       public function doUpdate() {
+               $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+               $dbw = $lb->getConnection( DB_MASTER );
+
+               ( new AutoCommitUpdate( $dbw, __METHOD__, function () use ( $lb, $dbw ) {
+                       foreach ( $this->infoByUser as $userId => $info ) {
+                               $dbw->update(
+                                       'user',
+                                       [ 'user_editcount=user_editcount+' . (int)$info['increment'] ],
+                                       [ 'user_id' => $userId, 'user_editcount IS NOT NULL' ],
+                                       __METHOD__
+                               );
+                               /** @var User[] $affectedInstances */
+                               $affectedInstances = $info['instances'];
+                               // Lazy initialization check...
+                               if ( $dbw->affectedRows() == 0 ) {
+                                       // No rows will be "affected" if user_editcount is NULL.
+                                       // Check if the generic "replica" connection is not the master.
+                                       $dbr = $lb->getConnection( DB_REPLICA );
+                                       if ( $dbr !== $dbw ) {
+                                               // This method runs after the new revisions were committed.
+                                               // Wait for the replica to catch up so they will all be counted.
+                                               $dbr->flushSnapshot( __METHOD__ );
+                                               $lb->safeWaitForMasterPos( $dbr );
+                                       }
+                                       $affectedInstances[0]->initEditCountInternal();
+                               }
+                               $newCount = (int)$dbw->selectField(
+                                       'user',
+                                       [ 'user_editcount' ],
+                                       [ 'user_id' => $userId ],
+                                       __METHOD__
+                               );
+
+                               // Update the edit count in the instance caches. This is mostly useful
+                               // for maintenance scripts, where deferred updates might run immediately
+                               // and user instances might be reused for a long time.
+                               foreach ( $affectedInstances as $affectedInstance ) {
+                                       $affectedInstance->setEditCountInternal( $newCount );
+                               }
+                               // Clear the edit count in user cache too
+                               $affectedInstances[0]->invalidateCache();
+                       }
+               } ) )->doUpdate();
+       }
+}
index 1f2b81d..32f7519 100644 (file)
@@ -55,7 +55,7 @@ class WikiExporter {
        const TEXT = 0;
        const STUB = 1;
 
-       const BATCH_SIZE = 1000;
+       const BATCH_SIZE = 50000;
 
        /** @var int */
        public $text;
@@ -367,8 +367,9 @@ class WikiExporter {
                } elseif ( $this->history & self::FULL ) {
                        # Full history dumps...
                        # query optimization for history stub dumps
-                       if ( $this->text == self::STUB && $orderRevs ) {
+                       if ( $this->text == self::STUB ) {
                                $tables = $revQuery['tables'];
+                               $opts[] = 'STRAIGHT_JOIN';
                                $opts['USE INDEX']['revision'] = 'rev_page_id';
                                unset( $join['revision'] );
                                $join['page'] = [ 'INNER JOIN', 'rev_page=page_id' ];
index 455d38f..3225625 100644 (file)
@@ -137,6 +137,9 @@ class FileRepo {
        /** @var string Secret key to pass as an X-Swift-Secret header to the proxied thumb service */
        protected $thumbProxySecret;
 
+       /** @var WANObjectCache */
+       protected $wanCache;
+
        /**
         * @param array|null $info
         * @throws MWException
@@ -200,6 +203,8 @@ class FileRepo {
                }
 
                $this->supportsSha1URLs = !empty( $info['supportsSha1URLs'] );
+
+               $this->wanCache = $info['wanCache'] ?? WANObjectCache::newEmpty();
        }
 
        /**
@@ -1507,7 +1512,7 @@ class FileRepo {
         * @throws MWException
         */
        protected function resolveToStoragePath( $path ) {
-               if ( $this->isVirtualUrl( $path ) ) {
+               if ( self::isVirtualUrl( $path ) ) {
                        return $this->resolveVirtualUrl( $path );
                }
 
@@ -1818,7 +1823,7 @@ class FileRepo {
        /**
         * Get a key on the primary cache for this repository.
         * Returns false if the repository's cache is not accessible at this site.
-        * The parameters are the parts of the key, as for wfMemcKey().
+        * The parameters are the parts of the key.
         *
         * STUB
         * @return bool
@@ -1830,7 +1835,7 @@ class FileRepo {
        /**
         * Get a key for this repo in the local cache domain. These cache keys are
         * not shared with remote instances of the repo.
-        * The parameters are the parts of the key, as for wfMemcKey().
+        * The parameters are the parts of the key.
         *
         * @return string
         */
@@ -1838,7 +1843,7 @@ class FileRepo {
                $args = func_get_args();
                array_unshift( $args, 'filerepo', $this->getName() );
 
-               return wfMemcKey( ...$args );
+               return $this->wanCache->makeKey( ...$args );
        }
 
        /**
index c20df76..9e4b6df 100644 (file)
@@ -22,7 +22,6 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
-use MediaWiki\MediaWikiServices;
 
 /**
  * A foreign repository with a remote MediaWiki with an API thingy
@@ -333,7 +332,6 @@ class ForeignAPIRepo extends FileRepo {
         * @return bool|string
         */
        function getThumbUrlFromCache( $name, $width, $height, $params = "" ) {
-               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                // We can't check the local cache using FileRepo functions because
                // we override fileExistsBatch(). We have to use the FileBackend directly.
                $backend = $this->getBackend(); // convenience
@@ -346,7 +344,7 @@ class ForeignAPIRepo extends FileRepo {
                $sizekey = "$width:$height:$params";
 
                /* Get the array of urls that we already know */
-               $knownThumbUrls = $cache->get( $key );
+               $knownThumbUrls = $this->wanCache->get( $key );
                if ( !$knownThumbUrls ) {
                        /* No knownThumbUrls for this file */
                        $knownThumbUrls = [];
@@ -392,7 +390,7 @@ class ForeignAPIRepo extends FileRepo {
                        if ( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
                                /* Use our current and already downloaded thumbnail */
                                $knownThumbUrls[$sizekey] = $localUrl;
-                               $cache->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
+                               $this->wanCache->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
 
                                return $localUrl;
                        }
@@ -417,9 +415,9 @@ class ForeignAPIRepo extends FileRepo {
                $knownThumbUrls[$sizekey] = $localUrl;
 
                $ttl = $mtime
-                       ? $cache->adaptiveTTL( $mtime, $this->apiThumbCacheExpiry )
+                       ? $this->wanCache->adaptiveTTL( $mtime, $this->apiThumbCacheExpiry )
                        : $this->apiThumbCacheExpiry;
-               $cache->set( $key, $knownThumbUrls, $ttl );
+               $this->wanCache->set( $key, $knownThumbUrls, $ttl );
                wfDebug( __METHOD__ . " got local thumb $localUrl, saving to cache \n" );
 
                return $localUrl;
@@ -570,22 +568,21 @@ class ForeignAPIRepo extends FileRepo {
                        $url = $this->makeUrl( $query, 'api' );
                }
 
-               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
-               return $cache->getWithSetCallback(
+               return $this->wanCache->getWithSetCallback(
                        $this->getLocalCacheKey( static::class, $target, md5( $url ) ),
                        $cacheTTL,
-                       function ( $curValue, &$ttl ) use ( $url, $cache ) {
+                       function ( $curValue, &$ttl ) use ( $url ) {
                                $html = self::httpGet( $url, 'default', [], $mtime );
                                if ( $html !== false ) {
-                                       $ttl = $mtime ? $cache->adaptiveTTL( $mtime, $ttl ) : $ttl;
+                                       $ttl = $mtime ? $this->wanCache->adaptiveTTL( $mtime, $ttl ) : $ttl;
                                } else {
-                                       $ttl = $cache->adaptiveTTL( $mtime, $ttl );
+                                       $ttl = $this->wanCache->adaptiveTTL( $mtime, $ttl );
                                        $html = null; // caches negatives
                                }
 
                                return $html;
                        },
-                       [ 'pcTTL' => $cache::TTL_PROC_LONG ]
+                       [ 'pcTTL' => WANObjectCache::TTL_PROC_LONG ]
                );
        }
 
index 302b194..ad6ec47 100644 (file)
@@ -23,7 +23,7 @@
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IDatabase;
-use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\ILoadBalancer;
 
 /**
  * A foreign repository with a MediaWiki database accessible via the configured LBFactory
@@ -34,12 +34,6 @@ class ForeignDBViaLBRepo extends LocalRepo {
        /** @var string */
        protected $wiki;
 
-       /** @var string */
-       protected $dbName;
-
-       /** @var string */
-       protected $tablePrefix;
-
        /** @var array */
        protected $fileFactory = [ ForeignDBFile::class, 'newFromTitle' ];
 
@@ -55,7 +49,6 @@ class ForeignDBViaLBRepo extends LocalRepo {
        function __construct( $info ) {
                parent::__construct( $info );
                $this->wiki = $info['wiki'];
-               list( $this->dbName, $this->tablePrefix ) = wfSplitWikiID( $this->wiki );
                $this->hasSharedCache = $info['hasSharedCache'];
        }
 
@@ -83,10 +76,11 @@ class ForeignDBViaLBRepo extends LocalRepo {
        }
 
        /**
-        * @return LoadBalancer
+        * @return ILoadBalancer
         */
        protected function getDBLoadBalancer() {
                $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+
                return $lbFactory->getMainLB( $this->wiki );
        }
 
index c889e56..b3eae90 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -201,7 +201,7 @@ class LocalRepo extends FileRepo {
                }
 
                $method = __METHOD__;
-               $redirDbKey = MediaWikiServices::getInstance()->getMainWANObjectCache()->getWithSetCallback(
+               $redirDbKey = $this->wanCache->getWithSetCallback(
                        $memcKey,
                        $expiry,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $method, $title ) {
@@ -275,7 +275,7 @@ class LocalRepo extends FileRepo {
                        );
                };
 
-               $applyMatchingFiles = function ( ResultWrapper $res, &$searchSet, &$finalFiles )
+               $applyMatchingFiles = function ( IResultWrapper $res, &$searchSet, &$finalFiles )
                        use ( $fileMatchesSearch, $flags )
                {
                        $contLang = MediaWikiServices::getInstance()->getContentLanguage();
@@ -500,14 +500,14 @@ class LocalRepo extends FileRepo {
        /**
         * Get a key on the primary cache for this repository.
         * Returns false if the repository's cache is not accessible at this site.
-        * The parameters are the parts of the key, as for wfMemcKey().
+        * The parameters are the parts of the key.
         *
         * @return string
         */
        function getSharedCacheKey( /*...*/ ) {
                $args = func_get_args();
 
-               return wfMemcKey( ...$args );
+               return $this->wanCache->makeKey( ...$args );
        }
 
        /**
@@ -521,7 +521,7 @@ class LocalRepo extends FileRepo {
                if ( $key ) {
                        $this->getMasterDB()->onTransactionPreCommitOrIdle(
                                function () use ( $key ) {
-                                       MediaWikiServices::getInstance()->getMainWANObjectCache()->delete( $key );
+                                       $this->wanCache->delete( $key );
                                },
                                __METHOD__
                        );
index f3fed57..b6c70ab 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup FileRepo
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Prioritized list of file repositories
  *
@@ -61,6 +63,7 @@ class RepoGroup {
                        return self::$instance;
                }
                global $wgLocalFileRepo, $wgForeignFileRepos;
+               /** @var array $wgLocalFileRepo */
                self::$instance = new RepoGroup( $wgLocalFileRepo, $wgForeignFileRepos );
 
                return self::$instance;
@@ -164,7 +167,7 @@ class RepoGroup {
                        }
                }
 
-               $image = $image ?: false; // type sanity
+               $image = $image instanceof File ? $image : false; // type sanity
                # Cache file existence or non-existence
                if ( $useCache && ( !$image || $image->isCacheable() ) ) {
                        $this->cache->setField( $dbkey, $timeKey, $image );
@@ -317,7 +320,7 @@ class RepoGroup {
        /**
         * Get the repo instance with a given key.
         * @param string|int $index
-        * @return bool|LocalRepo
+        * @return bool|FileRepo
         */
        function getRepo( $index ) {
                if ( !$this->reposInitialised ) {
@@ -354,7 +357,10 @@ class RepoGroup {
         * @return LocalRepo
         */
        function getLocalRepo() {
-               return $this->getRepo( 'local' );
+               /** @var LocalRepo $repo */
+               $repo = $this->getRepo( 'local' );
+
+               return $repo;
        }
 
        /**
@@ -413,6 +419,9 @@ class RepoGroup {
        protected function newRepo( $info ) {
                $class = $info['class'];
 
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $info['wanCache'] = $cache;
+
                return new $class( $info );
        }
 
index 52a18eb..c6882c4 100644 (file)
@@ -81,9 +81,6 @@ use Wikimedia\ObjectFactory;
  *    'help-inline'         -- Whether help text (defined using options above) will be shown
  *                             inline after the input field, rather than in a popup.
  *                             Defaults to true. Only used by OOUI form fields.
- *    'notice'              -- (deprecated, use 'help' instead)
- *    'notice-messages'     -- (deprecated, use 'help-messages' instead)
- *    'notice-message'      -- (deprecated, use 'help-message' instead)
  *    'required'            -- passed through to the object, indicating that it
  *                             is a required field.
  *    'size'                -- the length of text fields
@@ -175,6 +172,7 @@ class HTMLForm extends ContextSource {
                'title' => HTMLTitleTextField::class,
                'user' => HTMLUserTextField::class,
                'usersmultiselect' => HTMLUsersMultiselectField::class,
+               'titlesmultiselect' => HTMLTitlesMultiselectField::class,
        ];
 
        public $mFieldData;
index 8902995..5f99aa0 100644 (file)
@@ -462,16 +462,6 @@ abstract class HTMLFormField {
                if ( isset( $params['hide-if'] ) ) {
                        $this->mHideIf = $params['hide-if'];
                }
-
-               if ( isset( $this->mParams['notice-message'] ) ) {
-                       wfDeprecated( "'notice-message' parameter in HTMLForm", '1.32' );
-               }
-               if ( isset( $this->mParams['notice-messages'] ) ) {
-                       wfDeprecated( "'notice-messages' parameter in HTMLForm", '1.32' );
-               }
-               if ( isset( $this->mParams['notice'] ) ) {
-                       wfDeprecated( "'notice' parameter in HTMLForm", '1.32' );
-               }
        }
 
        /**
@@ -617,17 +607,11 @@ abstract class HTMLFormField {
                        $error = new OOUI\HtmlSnippet( $error );
                }
 
-               $notices = $this->getNotices( 'skip deprecation' );
-               foreach ( $notices as &$notice ) {
-                       $notice = new OOUI\HtmlSnippet( $notice );
-               }
-
                $config = [
                        'classes' => [ "mw-htmlform-field-$fieldType", $this->mClass ],
                        'align' => $this->getLabelAlignOOUI(),
                        'help' => ( $help !== null && $help !== '' ) ? new OOUI\HtmlSnippet( $help ) : null,
                        'errors' => $errors,
-                       'notices' => $notices,
                        'infusable' => $infusable,
                        'helpInline' => $this->isHelpInline(),
                ];
@@ -926,37 +910,6 @@ abstract class HTMLFormField {
                return $errors;
        }
 
-       /**
-        * Determine notices to display for the field.
-        *
-        * @since 1.28
-        * @deprecated since 1.32
-        * @param string $skipDeprecation Pass 'skip deprecation' to avoid the deprecation
-        *   warning (since 1.32)
-        * @return string[]
-        */
-       public function getNotices( $skipDeprecation = null ) {
-               if ( $skipDeprecation !== 'skip deprecation' ) {
-                       wfDeprecated( __METHOD__, '1.32' );
-               }
-
-               $notices = [];
-
-               if ( isset( $this->mParams['notice-message'] ) ) {
-                       $notices[] = $this->getMessage( $this->mParams['notice-message'] )->parse();
-               }
-
-               if ( isset( $this->mParams['notice-messages'] ) ) {
-                       foreach ( $this->mParams['notice-messages'] as $msg ) {
-                               $notices[] = $this->getMessage( $msg )->parse();
-                       }
-               } elseif ( isset( $this->mParams['notice'] ) ) {
-                       $notices[] = $this->mParams['notice'];
-               }
-
-               return $notices;
-       }
-
        /**
         * @return string HTML
         */
index 716a092..03e479b 100644 (file)
@@ -66,8 +66,8 @@ class HTMLFormFieldWithButton extends HTMLFormField {
 
        /**
         * Combines the passed element with a button.
-        * @param String $element Element to combine the button with.
-        * @return String
+        * @param string $element Element to combine the button with.
+        * @return string
         */
        public function getElement( $element ) {
                return $element . "\u{00A0}" . $this->getInputHTML( '' );
index e9ecc40..477cc4c 100644 (file)
@@ -228,11 +228,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        }
 
        public function getDefault() {
-               if ( isset( $this->mDefault ) ) {
-                       return $this->mDefault;
-               } else {
-                       return [];
-               }
+               return $this->mDefault ?? [];
        }
 
        public function filterDataForSubmit( $data ) {
diff --git a/includes/htmlform/fields/HTMLTitlesMultiselectField.php b/includes/htmlform/fields/HTMLTitlesMultiselectField.php
new file mode 100644 (file)
index 0000000..c93c940
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+
+use MediaWiki\Widget\TitlesMultiselectWidget;
+
+/**
+ * Implements a tag multiselect input field for titles.
+ *
+ * Besides the parameters recognized by HTMLTitleTextField, additional recognized
+ * parameters are:
+ *  default - (optional) Array of usernames to use as preset data
+ *  placeholder - (optional) Custom placeholder message for input
+ *
+ * The result is the array of titles
+ *
+ * This widget is a duplication of HTMLUsersMultiselectField, except for:
+ * - The configuration variable changed to 'titles' (from 'users')
+ * - OOUI modules were adjusted for the TitlesMultiselectWidget
+ * - The PHP version instantiates a MediaWiki\Widget\TitlesMultiselectWidget
+ *
+ * @note This widget is not likely to remain functional in non-OOUI forms.
+ */
+class HTMLTitlesMultiselectField extends HTMLTitleTextField {
+       public function __construct( $params ) {
+               $params += [
+                       // This overrides the default from HTMLTitleTextField
+                       'required' => false,
+               ];
+
+               parent::__construct( $params );
+       }
+
+       public function loadDataFromRequest( $request ) {
+               $value = $request->getText( $this->mName, $this->getDefault() );
+
+               $titlesArray = explode( "\n", $value );
+               // Remove empty lines
+               $titlesArray = array_values( array_filter( $titlesArray, function ( $title ) {
+                       return trim( $title ) !== '';
+               } ) );
+               // This function is expected to return a string
+               return implode( "\n", $titlesArray );
+       }
+
+       public function validate( $value, $alldata ) {
+               if ( !$this->mParams['exists'] ) {
+                       return true;
+               }
+
+               if ( is_null( $value ) ) {
+                       return false;
+               }
+
+               // $value is a string, because HTMLForm fields store their values as strings
+               $titlesArray = explode( "\n", $value );
+
+               if ( isset( $this->mParams['max'] ) ) {
+                       if ( count( $titlesArray ) > $this->mParams['max'] ) {
+                               return $this->msg( 'htmlform-int-toohigh', $this->mParams['max'] );
+                       }
+               }
+
+               foreach ( $titlesArray as $title ) {
+                       $result = parent::validate( $title, $alldata );
+                       if ( $result !== true ) {
+                               return $result;
+                       }
+               }
+
+               return true;
+       }
+
+       public function getInputHTML( $value ) {
+               $this->mParent->getOutput()->enableOOUI();
+               return $this->getInputOOUI( $value );
+       }
+
+       public function getInputOOUI( $value ) {
+               $params = [
+                       'id' => $this->mID,
+                       'name' => $this->mName,
+                       'dir' => $this->mDir,
+               ];
+
+               if ( isset( $this->mParams['disabled'] ) ) {
+                       $params['disabled'] = $this->mParams['disabled'];
+               }
+
+               if ( isset( $this->mParams['default'] ) ) {
+                       $params['default'] = $this->mParams['default'];
+               }
+
+               if ( isset( $this->mParams['placeholder'] ) ) {
+                       $params['placeholder'] = $this->mParams['placeholder'];
+               } else {
+                       $params['placeholder'] = $this->msg( 'mw-widgets-titlesmultiselect-placeholder' )->plain();
+               }
+
+               if ( !is_null( $value ) ) {
+                       // $value is a string, but the widget expects an array
+                       $params['default'] = $value === '' ? [] : explode( "\n", $value );
+               }
+
+               // Make the field auto-infusable when it's used inside a legacy HTMLForm rather than OOUIHTMLForm
+               $params['infusable'] = true;
+               $params['classes'] = [ 'mw-htmlform-field-autoinfuse' ];
+               $widget = new TitlesMultiselectWidget( $params );
+               $widget->setAttributes( [ 'data-mw-modules' => implode( ',', $this->getOOUIModules() ) ] );
+
+               return $widget;
+       }
+
+       protected function shouldInfuseOOUI() {
+               return true;
+       }
+
+       protected function getOOUIModules() {
+               return [ 'mediawiki.widgets.TitlesMultiselectWidget' ];
+       }
+
+}
index 257955c..435c34d 100644 (file)
@@ -97,11 +97,7 @@ abstract class MWHttpRequest implements LoggerAwareInterface {
                $this->url = wfExpandUrl( $url, PROTO_HTTP );
                $this->parsedUrl = wfParseUrl( $this->url );
 
-               if ( isset( $options['logger'] ) ) {
-                       $this->logger = $options['logger'];
-               } else {
-                       $this->logger = new NullLogger();
-               }
+               $this->logger = $options['logger'] ?? new NullLogger();
 
                if ( !$this->parsedUrl || !Http::isValidURI( $this->url ) ) {
                        $this->status = StatusValue::newFatal( 'http-invalid-url', $url );
index 00a7b52..9098981 100644 (file)
@@ -914,11 +914,7 @@ class WikiImporter {
 
                        $revision->setText( $text );
                }
-               if ( isset( $revisionInfo['timestamp'] ) ) {
-                       $revision->setTimestamp( $revisionInfo['timestamp'] );
-               } else {
-                       $revision->setTimestamp( wfTimestampNow() );
-               }
+               $revision->setTimestamp( $revisionInfo['timestamp'] ?? wfTimestampNow() );
 
                if ( isset( $revisionInfo['comment'] ) ) {
                        $revision->setComment( $revisionInfo['comment'] );
index 0194822..f5d01d6 100644 (file)
@@ -164,10 +164,7 @@ abstract class DatabaseUpdater {
 
                // This will automatically add "AutoloadClasses" to $wgAutoloadClasses
                $data = $registry->readFromQueue( $queue );
-               $hooks = [];
-               if ( isset( $data['globals']['wgHooks']['LoadExtensionSchemaUpdates'] ) ) {
-                       $hooks = $data['globals']['wgHooks']['LoadExtensionSchemaUpdates'];
-               }
+               $hooks = $data['globals']['wgHooks']['LoadExtensionSchemaUpdates'] ?? [];
                if ( $vars && isset( $vars['wgHooks']['LoadExtensionSchemaUpdates'] ) ) {
                        $hooks = array_merge_recursive( $hooks, $vars['wgHooks']['LoadExtensionSchemaUpdates'] );
                }
index d51ea2e..029f67d 100644 (file)
@@ -537,11 +537,7 @@ abstract class Installer {
         * @return mixed
         */
        public function getVar( $name, $default = null ) {
-               if ( !isset( $this->settings[$name] ) ) {
-                       return $default;
-               } else {
-                       return $this->settings[$name];
-               }
+               return $this->settings[$name] ?? $default;
        }
 
        /**
@@ -1505,9 +1501,8 @@ abstract class Installer {
                $data = $registry->readFromQueue( $queue );
                $wgAutoloadClasses += $data['autoload'];
 
-               $hooksWeWant = isset( $wgHooks['LoadExtensionSchemaUpdates'] ) ?
-                       /** @suppress PhanUndeclaredVariable $wgHooks is set by DefaultSettings */
-                       $wgHooks['LoadExtensionSchemaUpdates'] : [];
+               /** @suppress PhanUndeclaredVariable $wgHooks is set by DefaultSettings */
+               $hooksWeWant = $wgHooks['LoadExtensionSchemaUpdates'] ?? [];
 
                if ( isset( $data['globals']['wgHooks']['LoadExtensionSchemaUpdates'] ) ) {
                        $hooksWeWant = array_merge_recursive(
index 1b0780b..e9a2d03 100644 (file)
@@ -192,11 +192,7 @@ class MysqlInstaller extends DatabaseInstaller {
                                        $existingSchema = false;
                                        $this->parent->showMessage( 'config-unknown-collation' );
                                }
-                               if ( isset( $row->Engine ) ) {
-                                       $existingEngine = $row->Engine;
-                               } else {
-                                       $existingEngine = $row->Type;
-                               }
+                               $existingEngine = $row->Engine ?? $row->Type;
                        }
                } else {
                        $existingSchema = false;
index d8281b0..f555c0f 100644 (file)
@@ -178,17 +178,9 @@ class WebInstaller extends Installer {
                        return $this->session;
                }
 
-               if ( isset( $session['happyPages'] ) ) {
-                       $this->happyPages = $session['happyPages'];
-               } else {
-                       $this->happyPages = [];
-               }
+               $this->happyPages = $session['happyPages'] ?? [];
 
-               if ( isset( $session['skippedPages'] ) ) {
-                       $this->skippedPages = $session['skippedPages'];
-               } else {
-                       $this->skippedPages = [];
-               }
+               $this->skippedPages = $session['skippedPages'] ?? [];
 
                $lowestUnhappy = $this->getLowestUnhappy();
 
@@ -468,11 +460,7 @@ class WebInstaller extends Installer {
         * @return array
         */
        public function getSession( $name, $default = null ) {
-               if ( !isset( $this->session[$name] ) ) {
-                       return $default;
-               } else {
-                       return $this->session[$name];
-               }
+               return $this->session[$name] ?? $default;
        }
 
        /**
@@ -932,11 +920,7 @@ class WebInstaller extends Installer {
                if ( !isset( $params['labelAttribs'] ) ) {
                        $params['labelAttribs'] = [];
                }
-               if ( isset( $params['rawtext'] ) ) {
-                       $labelText = $params['rawtext'];
-               } else {
-                       $labelText = $this->parse( wfMessage( $params['label'] )->text() );
-               }
+               $labelText = $params['rawtext'] ?? $this->parse( wfMessage( $params['label'] )->text() );
 
                return "<div class=\"config-input-check\">\n" .
                        $params['help'] .
@@ -978,11 +962,7 @@ class WebInstaller extends Installer {
        public function getRadioSet( $params ) {
                $items = $this->getRadioElements( $params );
 
-               if ( !isset( $params['label'] ) ) {
-                       $label = '';
-               } else {
-                       $label = $params['label'];
-               }
+               $label = $params['label'] ?? '';
 
                if ( !isset( $params['controlName'] ) ) {
                        $params['controlName'] = 'config_' . $params['var'];
index 0c7428f..f25d57c 100644 (file)
@@ -154,16 +154,8 @@ class WebInstallerExistingWiki extends WebInstallerPage {
                        return $status;
                }
 
-               if ( isset( $vars['wgDBadminuser'] ) ) {
-                       $this->setVar( '_InstallUser', $vars['wgDBadminuser'] );
-               } else {
-                       $this->setVar( '_InstallUser', $vars['wgDBuser'] );
-               }
-               if ( isset( $vars['wgDBadminpassword'] ) ) {
-                       $this->setVar( '_InstallPassword', $vars['wgDBadminpassword'] );
-               } else {
-                       $this->setVar( '_InstallPassword', $vars['wgDBpassword'] );
-               }
+               $this->setVar( '_InstallUser', $vars['wgDBadminuser'] ?? $vars['wgDBuser'] );
+               $this->setVar( '_InstallPassword', $vars['wgDBadminpassword'] ?? $vars['wgDBpassword'] );
 
                // Test the database connection
                $status = $installer->getConnection();
index 382ed3b..953295a 100644 (file)
@@ -490,11 +490,8 @@ class WebInstallerOptions extends WebInstallerPage {
                        // config-license-cc-0, config-license-pd, config-license-gfdl, config-license-none,
                        // config-license-cc-choose
                        $entry = $this->parent->licenses[$code];
-                       if ( isset( $entry['text'] ) ) {
-                               $this->setVar( 'wgRightsText', $entry['text'] );
-                       } else {
-                               $this->setVar( 'wgRightsText', wfMessage( 'config-license-' . $code )->text() );
-                       }
+                       $this->setVar( 'wgRightsText',
+                               $entry['text'] ?? wfMessage( 'config-license-' . $code )->text() );
                        $this->setVar( 'wgRightsUrl', $entry['url'] );
                        $this->setVar( 'wgRightsIcon', $entry['icon'] );
                } else {
index 8112ccb..47d9f48 100644 (file)
        "config-help": "مساعدة",
        "config-help-tooltip": "اضغط للتوسيع",
        "config-nofile": "لا يمكن العثور على الملف \"$1\". هل حُذف؟",
-       "config-extension-link": "هل كنت تعلم أن الويكي الخاصة بك تدعم [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions الامتدادات]؟\n\nيمكنك تصفح [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category الامتدادات حسب التصنيف] أو [https://www.mediawiki.org/wiki/Extension_Matrix مصفوفة الامتدادت] لترى القائمة الكاملة للامتدادات.",
+       "config-extension-link": "هل كنت تعلم أن الويكي الخاص بك تدعم [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions الامتدادات]؟\n\nيمكنك تصفح [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category الامتدادات حسب التصنيف].",
        "config-skins-screenshots": "$1 (لقطات شاشة: $2)",
        "config-extensions-requires": "$1 (يتطلب $2)",
        "config-screenshot": "لقطة شاشة",
index 4acde23..f76ffab 100644 (file)
        "config-help": "дапамога",
        "config-help-tooltip": "націсьніце, каб разгарнуць",
        "config-nofile": "Файл «$1» ня знойдзены. Ці быў ён выдалены?",
-       "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў] або [https://www.mediawiki.org/wiki/Extension_Matrix матрыцу пашырэньняў], каб пабачыць поўны сьпіс.",
+       "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў].",
        "config-skins-screenshots": "$1 (здымкі экрану: $2)",
        "config-extensions-requires": "$1 (патрабуе $2)",
        "config-screenshot": "здымак экрану",
index 95fd726..ecddb39 100644 (file)
        "config-help": "aide",
        "config-help-tooltip": "cliquer pour agrandir",
        "config-nofile": "Le fichier « $1 » est introuvable. A-t-il été supprimé ?",
-       "config-extension-link": "Saviez-vous que votre wiki prend en charge [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions par catégorie] ou la [https://www.mediawiki.org/wiki/Extension_Matrix matrice des extensions] pour voir la liste complète des extensions.",
+       "config-extension-link": "Saviez-vous que votre wiki prend en charge [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions par catégorie].",
        "config-skins-screenshots": "$1 (captures d’écran : $2)",
        "config-extensions-requires": "$1 (nécessite $2)",
        "config-screenshot": "Captures d’écrans",
index b526d5a..c336c06 100644 (file)
        "config-help": "adjuta",
        "config-help-tooltip": "clicca pro displicar",
        "config-nofile": "Le file \"$1\" non poteva esser trovate. Ha illo essite delite?",
-       "config-extension-link": "Sapeva tu que tu wiki supporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nTu pote explorar le [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensiones per category] o le [https://www.mediawiki.org/wiki/Extension_Matrix matrice de extensiones] pro vider le lista complete de extensiones.",
+       "config-extension-link": "Sapeva tu que tu wiki supporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nTu pote explorar le [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensiones per categoria].",
        "config-skins-screenshots": "$1 (capturas de schermo: $2)",
        "config-extensions-requires": "$1 (require $2)",
        "config-screenshot": "captura de schermo",
index 3ad6073..a649a81 100644 (file)
@@ -23,7 +23,8 @@
                        "ネイ",
                        "Suchichi02",
                        "Omotecho",
-                       "Yusuke1109"
+                       "Yusuke1109",
+                       "Aefgh39622"
                ]
        },
        "config-desc": "MediaWiki のインストーラー",
        "config-install-mainpage-failed": "メインページを挿入できませんでした: $1",
        "config-install-done": "<strong>おめでとうございます!</strong>\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、ウィキをインストールした基準ディレクトリ (index.phpと同じディレクトリ) に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n<strong>注意:</strong> この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、<strong>[$2 ウィキに入る]</strong>ことができます。",
        "config-install-done-path": "<strong>おめでとうございます!</strong>\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、<code>$4</code> に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n<strong>注意:</strong> この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、<strong>[$2 ウィキに入る]</strong>ことができます。",
-       "config-install-success": "MediaWikiが正常にインストールされました。\n今すぐ<$1$2>にアクセスしてあなたのwikiを表示できます。\nご質問がある場合は、よくある質問リストをご覧ください:\n<https://www.mediawiki.org/wiki/Manual:FAQ>または\nそのページにリンクされているサポートフォーラム",
+       "config-install-success": "MediaWikiが正常にインストールされました。\n今すぐ<$1$2>にアクセスしてあなたのwikiを表示できます。\nご質問がある場合は、よくある質問リストをご覧ください:\n<https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ>または\nそのページにリンクされているサポートフォーラム",
        "config-download-localsettings": "<code>LocalSettings.php</code> をダウンロード",
        "config-help": "ヘルプ",
        "config-help-tooltip": "クリックで展開",
        "config-nofile": "ファイル「$1」が見つかりませんでした。削除された可能性があります。",
-       "config-extension-link": "ã\81\82ã\81ªã\81\9fã\81®ã\82¦ã\82£ã\82­ã\81¯[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions æ\8b¡å¼µæ©\9fè\83½]ã\82\92ã\82µã\83\9dã\83¼ã\83\88ã\81\97ã\81¦ã\81\84ã\82\8bã\81\93ã\81¨ã\82\92ã\81\94å­\98ç\9f¥ã\81§ã\81\99ã\81\8b?\n\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category ã\82«ã\83\86ã\82´ã\83ªå\88¥ã\81§æ\8b¡å¼µæ©\9fè\83½ã\82\92è¦\8bã\82\8b\81\8b[https://www.mediawiki.org/wiki/Extension_Matrix æ\8b¡å¼µæ©\9fè\83½ã\81®ã\83\9eã\83\88ã\83ªã\83\83ã\82¯ã\82¹]で拡張機能すべてのリストをご覧になれます。",
+       "config-extension-link": "ã\81\94å\88©ç\94¨ã\81®ã\82¦ã\82£ã\82­ã\81¯[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions æ\8b¡å¼µæ©\9fè\83½]ã\82\92ã\82µã\83\9dã\83¼ã\83\88ã\81\97ã\81¦ã\81\84ã\82\8bã\81\93ã\81¨ã\82\92ã\81\94å­\98ç\9f¥ã\81§ã\81\97ã\81\9fã\81\8b?\n\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category ã\80\8cã\82«ã\83\86ã\82´ã\83ªå\88¥ã\81§æ\8b¡å¼µæ©\9fè\83½ã\82\92è¦\8bã\82\8bã\80\8d\81\8b[https://www.mediawiki.org/wiki/Extension_Matrix ã\80\8cæ\8b¡å¼µæ©\9fè\83½ã\81®ã\83\9eã\83\88ã\83ªã\83\83ã\82¯ã\82¹ã\80\8d\81®ã\83\9aã\83¼ã\82¸で拡張機能すべてのリストをご覧になれます。",
        "config-skins-screenshots": "$1 (スクリーンショット: $2)",
        "config-extensions-requires": "$1($2が必要)",
        "config-screenshot": "スクリーンショット",
index 1e88f7b..fef5391 100644 (file)
        "config-install-mainpage-failed": "Kunne ikke sette inn hovedside: $1",
        "config-install-done": "<strong>Gratulrerer!</strong>\nDu har lykkes i å installere MediaWiki.\n\nInstallasjonsprogrammet har generert en <code>LocalSettings.php</code>-fil.\nDen inneholder alle dine konfigureringer.\n\nDu må laste den ned og legge den på hovedfolderen for din wiki-installasjon (der index.php ligger). Nedlastingen skulle ha startet automatisk.\n\nHvis ingen nedlasting ble tilbudt, eller du avbrøt den, kan du få den i gang ved å klikke på lenken under:\n\n$3\n\n<strong>OBS:</strong> Hvis du ikke gjør dette nå, vil den genererte konfigurasjonsfilen ikke være tilgjengelig for deg senere.\n\nNår dette er gjort, kan du <strong>[$2 gå inn i wikien]</strong>.",
        "config-install-done-path": "<strong>Gratulerer!</strong>\nDu har installert MediaWiki.\n\nInstallereren har generert en <code>LocalSettings.php</code>-fil.\nDen inneholder all konfigurasjonen for wikien.\n\nDu må laste den ned og legge den i <code>$4</code>. Nedlastingen skal ha startet automatisk.\n\nOm nedlastingen ikke ble startet, eller om du avbrøt den, kan du starte på nytt ved å klikke lenken nedenfor:\n\n$3\n\n<strong>Merk:</strong> Om du ikke gjør dette nå vil den genererte konfigurasjonen ikke være tilgjengelig senere.\n\nNår dette er gjort kan du <strong>[$2 gå til wikien din]</strong>.",
-       "config-install-success": "MediaWiki har blitt installert. Du kan nå\nbesøke <$1$2> for å se wikien din.\nOm du har spørsmål, sjekk de ofte stilte spørsmålene:\n<https://www.mediawiki.org/wiki/Manual:FAQ> eller bruk et av\nsupportforumene som lenkes til fra den siden.",
+       "config-install-success": "MediaWiki har blitt installert. Du kan nå\nbesøke <$1$2> for å se wikien din.\nOm du har spørsmål, sjekk de ofte stilte spørsmålene:\n<https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ> eller bruk et av\nsupportforumene som lenkes til fra den siden.",
        "config-download-localsettings": "Last ned <code>LocalSettings.php</code>",
        "config-help": "hjelp",
        "config-help-tooltip": "klikk for å utvide",
        "config-nofile": "Filen \"$1\" ble ikke funnet. Kan den være blitt slettet?",
-       "config-extension-link": "Visste du at wikien din kan brukes sammen med en mengde [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions utvidelser]?\n\nDu kan sjekke gjennom [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category utvidelser per kategori] eller [https://www.mediawiki.org/wiki/Extension_Matrix utvidelsesmatrisen] for å se den komplette listen av utvidelser.",
+       "config-extension-link": "Visste du at wikien din kan brukes sammen med en mengde [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions utvidelser]?\n\nDu kan sjekke gjennom [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category utvidelser per kategori] for å se den komplette listen av utvidelser.",
        "config-skins-screenshots": "$1 (skjermbilder: $2)",
        "config-extensions-requires": "$1 (krever $2)",
        "config-screenshot": "skjermbilde",
+       "config-extension-not-found": "Kunne ikke finne registreringsfil for utvidelsen «$1»",
+       "config-extension-dependency": "En avhengighetsfeil inntraff under installering av utvidelsen «$1»: $2",
        "mainpagetext": "<strong>MediaWiki har blitt installert.</strong>",
        "mainpagedocfooter": "Sjekk [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents brukerveiledningen] for å få informasjon om hvordan du bruker wiki-programvaren.\n\n==Hvordan komme igang==\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Innstillingsliste]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ofte stilte spørsmål om MediaWiki]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Tilpass MediaWiki for ditt språk]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Lær deg å beskytte deg mot spam på wikien din]"
 }
index e4a3734..9d6fe7c 100644 (file)
        "config-help": "ajuda",
        "config-help-tooltip": "clique para expandir",
        "config-nofile": "O arquivo \"$1\" não foi encontrado. Ele foi apagado?",
-       "config-extension-link": "Você sabia que sua wiki suporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nVocê pode explorar as [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria] ou visitar a [https://www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.",
+       "config-extension-link": "Você sabia que sua wiki suporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nVocê pode explorar as [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria]",
        "config-skins-screenshots": "$1 (screenshots: $2)",
        "config-extensions-requires": "$1 (requer $2)",
        "config-screenshot": "screenshot",
index 0495d50..c4c8c43 100644 (file)
@@ -60,7 +60,7 @@
        "config-help-restart": "Deseja limpar todos os dados gravados que introduziu e reiniciar o processo de instalação?",
        "config-restart": "Sim, reiniciar",
        "config-welcome": "=== Verificações do ambiente ===\nSerão agora realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.\nLembre-se de fornecer esta informação se necessitar de pedir ajuda para concluir a instalação.",
-       "config-copyright": "=== Direitos de autor e Condições de uso ===\n\n$1\n\nEste programa é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [https://www.gnu.org/copyleft/gpl.html leia-a na internet].",
+       "config-copyright": "=== Direitos de autor e Condições de utilização ===\n\n$1\n\nEste programa é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [https://www.gnu.org/copyleft/gpl.html leia-a na Internet].",
        "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/pt Ajuda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/pt Manual técnico]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Leia-me</doclink>\n* <doclink href=ReleaseNotes>Notas de lançamento</doclink>\n* <doclink href=Copying>Cópia</doclink>\n* <doclink href=UpgradeDoc>Atualização</doclink>",
        "config-env-good": "O ambiente foi verificado.\nPode instalar o MediaWiki.",
        "config-env-bad": "O ambiente foi verificado.\nNão pode instalar o MediaWiki.",
        "config-help": "ajuda",
        "config-help-tooltip": "clique para expandir",
        "config-nofile": "Não foi possível encontrar o ficheiro \"$1\". Terá sido apagado?",
-       "config-extension-link": "Sabia que a sua wiki suporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nPode consultar as [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria] ou a [https://www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa de extensões.",
+       "config-extension-link": "Sabia que a sua wiki suporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nPode consultar as [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria].",
        "config-skins-screenshots": "$1 (capturas de ecrã: $2)",
        "config-extensions-requires": "$1 (requer $2)",
        "config-screenshot": "captura de ecrã",
index 58c40ce..430602b 100644 (file)
        "config-help": "помоћ",
        "config-help-tooltip": "кликните да бисте проширили",
        "config-nofile": "Није могуће пронаћи датотеку „$1”. Да није избрисана?",
-       "config-extension-link": "Јесте ли знали да ваш вики подржава [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатке]?\n\nМожете их прегледати [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категорији] или помоћу [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix-а] да бисте видели потпуни списак.",
+       "config-extension-link": "Јесте ли знали да ваш вики подржава [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатке]?\n\nМожете их прегледати [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категорији].",
        "config-skins-screenshots": "„$1” (снимци екрана: $2)",
        "config-skins-screenshot": "$1 ($2)",
        "config-extensions-requires": "$1 (захтева $2)",
index dd2e51f..1f82d3b 100644 (file)
        "config-install-mainpage-failed": "Kunde inte infoga huvudsidan: $1",
        "config-install-done": "<strong>Grattis!</strong>\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen <code>LocalSettings.php</code>.\nDet innehåller alla dina konfigurationer.\n\nDu kommer att behöva ladda ner den och placera den i roten för din wiki-installation (samma katalog som index.php). Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka på länken nedan:\n\n$3\n\n<strong>OBS</strong>: Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du <strong>[$2 gå in på din wiki]</strong>",
        "config-install-done-path": "<strong>Grattis!</strong>\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen <code>LocalSettings.php</code>.\nDet innehåller alla dina konfigurationer.\n\nDu kommer att behöva ladda ner den och placera den i <code>$4</code>. Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka på länken nedan:\n\n$3\n\n<strong>OBS</strong>: Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du <strong>[$2 gå in på din wiki]</strong>",
-       "config-install-success": "MediaWiki har installerats. Du kan nu besöka <$1$2> för att se din wiki.\nOm du undrar någonting, kolla in vår lista över vanliga ställda frågor:\n<https://www.mediawiki.org/wiki/Manual:FAQ> eller använda något supportforum som länkas på sidan.",
+       "config-install-success": "MediaWiki har installerats. Du kan nu besöka <$1$2> för att se din wiki.\nOm du undrar någonting, kolla in vår lista över vanliga ställda frågor:\n<https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ> eller använda något supportforum som länkas på sidan.",
        "config-download-localsettings": "Ladda ner <code>LocalSettings.php</code>",
        "config-help": "hjälp",
        "config-help-tooltip": "klicka för att expandera",
        "config-skins-screenshots": "$1 (skärmbilder: $2)",
        "config-extensions-requires": "$1 (kräver $2)",
        "config-screenshot": "skärmbild",
+       "config-extension-not-found": "Kunde inte hitta registreringsfilen för tillägget \"$1\"",
+       "config-extension-dependency": "En beroendefel inträffade när tillägget \"$1\" installerades: $2",
        "mainpagetext": "<strong>MediaWiki har installerats utan problem.</strong>",
        "mainpagedocfooter": "Information om hur wiki-programvaran används finns i [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents användarguiden].\n\n== Att komma igång ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista över konfigurationsinställningar]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postlista för nya versioner av MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisera MediaWiki för ditt språk]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Läs om hur du bekämpar spam på din wiki]"
 }
index ca87d60..ed80af6 100644 (file)
@@ -7,22 +7,23 @@
                        "Dinhxuanduyet",
                        "Nguyên Lê",
                        "Macofe",
-                       "Leducthn"
+                       "Leducthn",
+                       "Vinhtantran"
                ]
        },
        "config-desc": "Trình cài đặt MediaWiki",
        "config-title": "Cài đặt MediaWiki $1",
        "config-information": "Thông tin",
-       "config-localsettings-upgrade": "Một tập tin <code>LocalSettings.php</code> đã được phát hiện.\nĐể nâng cấp bản cài đặt này, xin nhập giá trị của <code>$wgUpgradeKey</code> trong hộp thoại bên dưới đây.\nBạn sẽ tìm thấy nó trong <code>LocalSettings.php</code>.",
-       "config-localsettings-cli-upgrade": "Một tập tin <code>LocalSettings.php</code> đã được phát hiện.\nĐể nâng cấp bản cài đặt này, hãy chạy <code>update.php</code> thay thế.",
-       "config-localsettings-key": "Chìa khóa nâng cấp:",
-       "config-localsettings-badkey": "Bạn đã cung cấp một chìa khóa nâng cấp sai.",
-       "config-upgrade-key-missing": "Một bản cài đặt MediaWiki sẵn đã được phát hiện.\nĐể nâng cấp bản cài đặt này, hãy thêm dòng sau vào cuối <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-upgrade": "Phát hiện tập tin <code>LocalSettings.php</code>.\nĐể nâng cấp bản cài đặt này, xin nhập giá trị của <code>$wgUpgradeKey</code> trong hộp thoại bên dưới đây.\nBạn sẽ tìm thấy nó trong <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Phát hiện tập tin <code>LocalSettings.php</code>.\nĐể nâng cấp bản cài đặt này, hãy chạy <code>update.php</code> thay thế.",
+       "config-localsettings-key": "Khóa nâng cấp:",
+       "config-localsettings-badkey": "Bạn đã cung cấp một khóa nâng cấp sai.",
+       "config-upgrade-key-missing": "Phát hiện thấy đã có sẵn một bản cài đặt MediaWiki.\nĐể nâng cấp bản cài đặt này, hãy thêm dòng sau vào cuối <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Tập tin <code>LocalSettings.php</code> đã tồn tại hình như không hoàn chỉnh.\nBiến $1 chưa được đặt.\nXin hãy thay đổi <code>LocalSettings.php</code> để đặt biến này, rồi bấm “{{int:Config-continue}}”.",
-       "config-localsettings-connection-error": "Đã xuất hiện lỗi khi kết nối với cơ sở dữ liệu dùng cấu hình trong <code>LocalSettings.php</code>. Xin hãy sửa lại cấu hình và thử lại.\n\n$1",
+       "config-localsettings-connection-error": "Đã xuất hiện lỗi khi kết nối với cơ sở dữ liệu với cấu hình ghi trong <code>LocalSettings.php</code>. Xin hãy sửa lại cấu hình và thử lại.\n\n$1",
        "config-session-error": "Lỗi khi bắt đầu phiên làm việc: $1",
        "config-session-expired": "Dữ liệu phiên làm việc của bạn dường như đã hết hạn. Các phiên làm việc được cấu hình để kéo dài $1. Để tăng thời gian này, đặt <code>session.gc_maxlifetime</code> trong php.ini, rồi khởi động lại quá trình cài đặt.",
-       "config-no-session": "Đã mất dữ liệu phiên làm việc của bạn! Kiểm tra tập tin php.ini và đảm bảo rằng <code>session.save_path</code> đã được đặt thành một thư mục thích hợp.",
+       "config-no-session": "Đã mất dữ liệu phiên làm việc của bạn! Kiểm tra tập tin php.ini và đảm bảo rằng <code>session.save_path</code> đã được đặt vào một thư mục thích hợp.",
        "config-your-language": "Ngôn ngữ của bạn:",
        "config-your-language-help": "Chọn một ngôn ngữ để sử dụng trong quá trình cài đặt.",
        "config-wiki-language": "Ngôn ngữ của wiki:",
@@ -37,8 +38,8 @@
        "config-page-name": "Tên",
        "config-page-options": "Tùy chọn",
        "config-page-install": "Cài đặt",
-       "config-page-complete": "Xong rồi!",
-       "config-page-restart": "Bắt đầu cài đặt lại",
+       "config-page-complete": "Đã xong!",
+       "config-page-restart": "Tái khởi động cài đặt",
        "config-page-readme": "Đọc trước",
        "config-page-releasenotes": "Thông báo phát hành",
        "config-page-copying": "Sao chép",
        "config-install-mainpage-failed": "Không thể chèn trang đầu: $1",
        "config-install-done": "<strong>Xin chúc mừng!</strong>\nBạn đã cài đặt MediaWiki.\n\nBộ cài đặt đã tạo ra một tập tin <code>LocalSettings.php</code>.\nTập tin này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó trong thư mục cài đặt wiki của bạn (cùng thư mục với index.php). Việc tải về có lẽ sẽ được khởi động tự động.\n\nNếu bản tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\n<strong>Lưu ý:</strong> Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể <strong>[$2 truy cập trang wiki của bạn]</strong>.",
        "config-install-done-path": "<strong>Xin chúc mừng!</strong>\nBạn đã cài đặt MediaWiki.\n\nBộ cài đặt đã tạo ra một tập tin <code>LocalSettings.php</code>.\nTập tin này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó tại <code>$4</code>. Việc tải về có lẽ sẽ được khởi động tự động.\n\nNếu bản tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\n<strong>Lưu ý:</strong> Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể <strong>[$2 truy cập trang wiki của bạn]</strong>.",
-       "config-install-success": "MediaWiki đã được cài đặt thành công. Bây giờ bạn có thể mở <$1$2> để xem wiki của bạn.\nNếu bạn có thắc mắc, hãy đọc các câu thường hỏi:\n<https://www.mediawiki.org/wiki/Manual:FAQ?uselang=vi> hoặc ghé vào một diễn đàn hỗ trợ được liệt kê tại trang đó.",
+       "config-install-success": "MediaWiki đã được cài đặt thành công. Bây giờ bạn có thể mở <$1$2> để xem wiki của bạn.\nNếu bạn có thắc mắc, hãy đọc các câu thường hỏi:\n<https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ?uselang=vi> hoặc ghé vào một diễn đàn hỗ trợ được liệt kê tại trang đó.",
        "config-download-localsettings": "Tải về <code>LocalSettings.php</code>",
        "config-help": "Trợ giúp",
        "config-help-tooltip": "nhấn chuột để mở rộng",
        "config-nofile": "Không tìm thấy tập tin “$1”. Nó có phải bị xóa không?",
-       "config-extension-link": "Bạn có biết rằng wiki của bạn có hỗ trợ [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions mở rộng]?\n\nBạn có thể truy cập [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category phần mở rộng theo thể loại] hoặc [https://www.mediawiki.org/wiki/Extension_Matrix Ma trận Mở rộng] để xem danh sách đầy đủ các phần mở rộng.",
+       "config-extension-link": "Bạn có biết rằng wiki của bạn có hỗ trợ [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions phần mở rộng]?\n\nBạn có thể truy cập [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category phần mở rộng theo thể loại].",
        "config-skins-screenshots": "$1 (ảnh chụp màn hình: $2)",
        "config-extensions-requires": "$1 (cần $2)",
        "config-screenshot": "ảnh chụp màn hình",
+       "config-extension-not-found": "Không tìm thấy tập tin đăng ký của bộ mở rộng \"$1$",
+       "config-extension-dependency": "Lỗi thiếu phần phụ thuộc xảy ra khi đang cài đặt bộ mở rộng \"$1\": $2",
        "mainpagetext": "'''MediaWiki đã được cài đặt.'''",
        "mainpagedocfooter": "Xin đọc [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Tìm hiểu cách chống spam tại wiki của bạn]"
 }
index 820c492..040ed4b 100644 (file)
@@ -43,9 +43,6 @@ class JobQueueGroup {
        /** @var array Map of (bucket => (queue => JobQueue, types => list of types) */
        protected $coalescedQueues;
 
-       /** @var Job[] */
-       protected $bufferedJobs = [];
-
        const TYPE_DEFAULT = 1; // integer; jobs popped by default
        const TYPE_ANY = 2; // integer; any job
 
@@ -105,11 +102,7 @@ class JobQueueGroup {
                global $wgJobTypeConf;
 
                $conf = [ 'wiki' => $this->wiki, 'type' => $type ];
-               if ( isset( $wgJobTypeConf[$type] ) ) {
-                       $conf = $conf + $wgJobTypeConf[$type];
-               } else {
-                       $conf = $conf + $wgJobTypeConf['default'];
-               }
+               $conf += $wgJobTypeConf[$type] ?? $wgJobTypeConf['default'];
                $conf['aggregator'] = JobQueueAggregator::singleton();
                if ( !isset( $conf['readOnlyReason'] ) ) {
                        $conf['readOnlyReason'] = $this->readOnlyReason;
@@ -203,7 +196,7 @@ class JobQueueGroup {
                // Throw errors now instead of on push(), when other jobs may be buffered
                $this->assertValidJobs( $jobs );
 
-               $this->bufferedJobs = array_merge( $this->bufferedJobs, $jobs );
+               DeferredUpdates::addUpdate( new JobQueueEnqueueUpdate( $this->wiki, $jobs ) );
        }
 
        /**
@@ -211,17 +204,10 @@ class JobQueueGroup {
         *
         * @return void
         * @since 1.26
+        * @deprecated Since 1.33 Not needed anymore
         */
        public static function pushLazyJobs() {
-               foreach ( self::$instances as $group ) {
-                       try {
-                               $group->push( $group->bufferedJobs );
-                               $group->bufferedJobs = [];
-                       } catch ( Exception $e ) {
-                               // Get in as many jobs as possible and let other post-send updates happen
-                               MWExceptionHandler::logException( $e );
-                       }
-               }
+               wfDeprecated( __METHOD__, '1.33' );
        }
 
        /**
@@ -464,12 +450,4 @@ class JobQueueGroup {
                        }
                }
        }
-
-       function __destruct() {
-               $n = count( $this->bufferedJobs );
-               if ( $n > 0 ) {
-                       $type = implode( ', ', array_unique( array_map( 'get_class', $this->bufferedJobs ) ) );
-                       trigger_error( __METHOD__ . ": $n buffered job(s) of type(s) $type never inserted." );
-               }
-       }
 }
index 39b5b3b..676659f 100644 (file)
@@ -290,8 +290,6 @@ class JobRunner implements LoggerAwareInterface {
                        $status = $job->run();
                        $error = $job->getLastError();
                        $this->commitMasterChanges( $lbFactory, $job, $fnameTrxOwner );
-                       // Important: this must be the last deferred update added (T100085, T154425)
-                       DeferredUpdates::addCallableUpdate( [ JobQueueGroup::class, 'pushLazyJobs' ] );
                        // Run any deferred update tasks; doUpdates() manages transactions itself
                        DeferredUpdates::doUpdates();
                } catch ( Exception $e ) {
index 92a4f9e..3129c5b 100644 (file)
@@ -202,11 +202,7 @@ class CSSMin {
        public static function getMimeType( $file ) {
                // Infer the MIME-type from the file extension
                $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) );
-               if ( isset( self::$mimeTypes[$ext] ) ) {
-                       return self::$mimeTypes[$ext];
-               }
-
-               return mime_content_type( realpath( $file ) );
+               return self::$mimeTypes[$ext] ?? mime_content_type( realpath( $file ) );
        }
 
        /**
index c0ab0a0..b7636b1 100644 (file)
@@ -58,11 +58,7 @@ class Cookie {
                        $this->expires = strtotime( $attr['expires'] );
                }
 
-               if ( isset( $attr['path'] ) ) {
-                       $this->path = $attr['path'];
-               } else {
-                       $this->path = '/';
-               }
+               $this->path = $attr['path'] ?? '/';
 
                if ( isset( $attr['domain'] ) ) {
                        if ( self::validateCookieDomain( $attr['domain'] ) ) {
index a1bbd09..da0cae2 100644 (file)
@@ -46,6 +46,7 @@ class CryptRand {
         * @return string
         */
        protected function initialRandomState() {
+               wfDeprecated( __METHOD__, '1.32' );
                return '';
        }
 
@@ -59,6 +60,7 @@ class CryptRand {
         * @author Tim Starling
         */
        protected function driftHash( $data ) {
+               wfDeprecated( __METHOD__, '1.32' );
                return '';
        }
 
@@ -70,6 +72,7 @@ class CryptRand {
         * @return string A new weak random state
         */
        protected function randomState() {
+               wfDeprecated( __METHOD__, '1.32' );
                return '';
        }
 
@@ -83,6 +86,7 @@ class CryptRand {
         * @return bool Always true
         */
        public function wasStrong() {
+               wfDeprecated( __METHOD__, '1.32' );
                return true;
        }
 
@@ -96,6 +100,7 @@ class CryptRand {
         * @return string Raw binary random data
         */
        public function generate( $bytes ) {
+               wfDeprecated( __METHOD__, '1.32' );
                $bytes = floor( $bytes );
                return random_bytes( $bytes );
        }
@@ -108,6 +113,7 @@ class CryptRand {
         * @return string Hexadecimal random data
         */
        public function generateHex( $chars ) {
+               wfDeprecated( __METHOD__, '1.32' );
                return MWCryptRand::generateHex( $chars );
        }
 }
index 73f3e70..f67387b 100644 (file)
@@ -92,7 +92,7 @@ class JavaScriptMinifier {
         * Returns minified JavaScript code.
         *
         * @param string $s JavaScript code to minify
-        * @return String Minified code
+        * @return string Minified code
         */
        public static function minify( $s ) {
                // First we declare a few tables that contain our parsing rules
index 77c377b..b93084a 100644 (file)
@@ -753,11 +753,7 @@ EOT;
                $xml = new XmlTypeCheck( $file );
                if ( $xml->wellFormed ) {
                        $xmlTypes = $this->xmlTypes;
-                       if ( isset( $xmlTypes[$xml->getRootElement()] ) ) {
-                               return $xmlTypes[$xml->getRootElement()];
-                       } else {
-                               return 'application/xml';
-                       }
+                       return $xmlTypes[$xml->getRootElement()] ?? 'application/xml';
                }
 
                /**
index 82ae5ae..c6bcc7a 100644 (file)
@@ -112,11 +112,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
         * @param array $params
         */
        public function __construct( array $params = [] ) {
-               if ( isset( $params['logger'] ) ) {
-                       $this->setLogger( $params['logger'] );
-               } else {
-                       $this->setLogger( new NullLogger() );
-               }
+               $this->setLogger( $params['logger'] ?? new NullLogger() );
 
                if ( isset( $params['keyspace'] ) ) {
                        $this->keyspace = $params['keyspace'];
index a8047b0..a473210 100644 (file)
@@ -81,11 +81,7 @@ class RedisBagOStuff extends BagOStuff {
                        $this->serverTagMap[is_int( $key ) ? $server : $key] = $server;
                }
 
-               if ( isset( $params['automaticFailover'] ) ) {
-                       $this->automaticFailover = $params['automaticFailover'];
-               } else {
-                       $this->automaticFailover = true;
-               }
+               $this->automaticFailover = $params['automaticFailover'] ?? true;
 
                $this->attrMap[self::ATTR_SYNCWRITES] = self::QOS_SYNCWRITES_NONE;
        }
index c436b64..16e8d8b 100644 (file)
@@ -719,19 +719,27 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                switch ( $type ) {
                        case self::ESTIMATE_DB_APPLY:
-                               $this->ping( $rtt );
-                               $rttAdjTotal = $this->trxWriteAdjQueryCount * $rtt;
-                               $applyTime = max( $this->trxWriteAdjDuration - $rttAdjTotal, 0 );
-                               // For omitted queries, make them count as something at least
-                               $omitted = $this->trxWriteQueryCount - $this->trxWriteAdjQueryCount;
-                               $applyTime += self::TINY_WRITE_SEC * $omitted;
-
-                               return $applyTime;
+                               return $this->pingAndCalculateLastTrxApplyTime();
                        default: // everything
                                return $this->trxWriteDuration;
                }
        }
 
+       /**
+        * @return float Time to apply writes to replicas based on trxWrite* fields
+        */
+       private function pingAndCalculateLastTrxApplyTime() {
+               $this->ping( $rtt );
+
+               $rttAdjTotal = $this->trxWriteAdjQueryCount * $rtt;
+               $applyTime = max( $this->trxWriteAdjDuration - $rttAdjTotal, 0 );
+               // For omitted queries, make them count as something at least
+               $omitted = $this->trxWriteQueryCount - $this->trxWriteAdjQueryCount;
+               $applyTime += self::TINY_WRITE_SEC * $omitted;
+
+               return $applyTime;
+       }
+
        public function pendingWriteCallers() {
                return $this->trxLevel ? $this->trxWriteCallers : [];
        }
@@ -3972,10 +3980,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        // Avoid fatals if close() was called
                        $this->assertOpen();
 
-                       $writeTime = $this->pendingWriteQueryDuration( self::ESTIMATE_DB_APPLY );
                        $this->doRollback( $fname );
                        $this->trxStatus = self::STATUS_TRX_NONE;
                        $this->trxAtomicLevels = [];
+                       // Estimate the RTT via a query now that trxStatus is OK
+                       $writeTime = $this->pingAndCalculateLastTrxApplyTime();
 
                        if ( $this->trxDoneWrites ) {
                                $this->trxProfiler->transactionWritingOut(
index 61367f5..de102a7 100644 (file)
@@ -987,10 +987,7 @@ class DatabaseMssql extends Database {
         */
        public function getServerVersion() {
                $server_info = sqlsrv_server_info( $this->conn );
-               $version = 'Error';
-               if ( isset( $server_info['SQLServerVersion'] ) ) {
-                       $version = $server_info['SQLServerVersion'];
-               }
+               $version = $server_info['SQLServerVersion'] ?? 'Error';
 
                return $version;
        }
index 1973322..3d3f855 100644 (file)
@@ -595,15 +595,7 @@ interface IDatabase {
         * Execute a SELECT query constructed using the various parameters provided.
         * See below for full details of the parameters.
         *
-        * @param string|array $table Table name
-        * @param string|array $vars Field names
-        * @param string|array $conds Conditions
-        * @param string $fname Caller function name
-        * @param array $options Query options
-        * @param array $join_conds Join conditions
-        *
-        *
-        * @param string|array $table
+        * @param string|array $table Table name(s)
         *
         * May be either an array of table names, or a single string holding a table
         * name. If an array is given, table aliases can be specified, for example:
@@ -638,7 +630,7 @@ interface IDatabase {
         * Do not use untrusted user input as a table name. Alias names should
         * not have characters outside of the Basic multilingual plane.
         *
-        * @param string|array $vars
+        * @param string|array $vars Field name(s)
         *
         * May be either a field name or an array of field names. The field names
         * can be complete fragments of SQL, for direct inclusion into the SELECT
@@ -685,7 +677,9 @@ interface IDatabase {
         *
         * Use an empty array, string, or '*' to update all rows.
         *
-        * @param string|array $options
+        * @param string $fname Caller function name
+        *
+        * @param string|array $options Query options
         *
         * Optional: Array of query options. Boolean options are specified by
         * including them in the array as a string value with a numeric key, for
@@ -741,7 +735,7 @@ interface IDatabase {
         *    - SQL_NO_CACHE
         *
         *
-        * @param string|array $join_conds
+        * @param string|array $join_conds Join conditions
         *
         * Optional associative array of table-specific join conditions. In the
         * most common case, this is unnecessary, since the join condition can be
@@ -1478,6 +1472,10 @@ interface IDatabase {
        /**
         * Wait for the replica DB to catch up to a given master position
         *
+        * Note that this does not start any new transactions. If any existing transaction
+        * is flushed, and this is called, then queries will reflect the point the DB was synced
+        * up to (on success) without interference from REPEATABLE-READ snapshots.
+        *
         * @param DBMasterPos $pos
         * @param int $timeout The maximum number of seconds to wait for synchronisation
         * @return int|null Zero if the replica DB was past that position already,
index 30074ec..cc6824d 100644 (file)
@@ -203,11 +203,7 @@ class LBFactoryMulti extends LBFactory {
                        return $this->lastSection;
                }
                list( $dbName, ) = $this->getDBNameAndPrefix( $domain );
-               if ( isset( $this->sectionsByDB[$dbName] ) ) {
-                       $section = $this->sectionsByDB[$dbName];
-               } else {
-                       $section = 'DEFAULT';
-               }
+               $section = $this->sectionsByDB[$dbName] ?? 'DEFAULT';
                $this->lastSection = $section;
                $this->lastDomain = $domain;
 
@@ -221,11 +217,7 @@ class LBFactoryMulti extends LBFactory {
        public function newMainLB( $domain = false ) {
                list( $dbName, ) = $this->getDBNameAndPrefix( $domain );
                $section = $this->getSectionForDomain( $domain );
-               if ( isset( $this->groupLoadsByDB[$dbName] ) ) {
-                       $groupLoads = $this->groupLoadsByDB[$dbName];
-               } else {
-                       $groupLoads = [];
-               }
+               $groupLoads = $this->groupLoadsByDB[$dbName] ?? [];
 
                if ( isset( $this->groupLoadsBySection[$section] ) ) {
                        $groupLoads = array_merge_recursive(
@@ -370,11 +362,7 @@ class LBFactoryMulti extends LBFactory {
                        if ( isset( $groupLoadsByServer[$serverName] ) ) {
                                $serverInfo['groupLoads'] = $groupLoadsByServer[$serverName];
                        }
-                       if ( isset( $this->hostsByName[$serverName] ) ) {
-                               $serverInfo['host'] = $this->hostsByName[$serverName];
-                       } else {
-                               $serverInfo['host'] = $serverName;
-                       }
+                       $serverInfo['host'] = $this->hostsByName[$serverName] ?? $serverName;
                        $serverInfo['hostName'] = $serverName;
                        $serverInfo['load'] = $load;
                        $serverInfo += [ 'flags' => IDatabase::DBO_DEFAULT ];
index 1f3fe4c..b2b2391 100644 (file)
@@ -47,7 +47,7 @@ class LoadBalancer implements ILoadBalancer {
        private $srvCache;
        /** @var WANObjectCache */
        private $wanCache;
-       /** @var object|string Class name or object With profileIn/profileOut methods */
+       /** @var mixed Class name or object With profileIn/profileOut methods */
        private $profiler;
        /** @var TransactionProfiler */
        private $trxProfiler;
@@ -204,11 +204,7 @@ class LoadBalancer implements ILoadBalancer {
                        $this->maxLag = $params['maxLag'];
                }
 
-               if ( isset( $params['loadMonitor'] ) ) {
-                       $this->loadMonitorConfig = $params['loadMonitor'];
-               } else {
-                       $this->loadMonitorConfig = [ 'class' => 'LoadMonitorNull' ];
-               }
+               $this->loadMonitorConfig = $params['loadMonitor'] ?? [ 'class' => 'LoadMonitorNull' ];
                $this->loadMonitorConfig += [ 'lagWarnThreshold' => $this->maxLag ];
 
                foreach ( $params['servers'] as $i => $server ) {
@@ -223,22 +219,10 @@ class LoadBalancer implements ILoadBalancer {
                        }
                }
 
-               if ( isset( $params['srvCache'] ) ) {
-                       $this->srvCache = $params['srvCache'];
-               } else {
-                       $this->srvCache = new EmptyBagOStuff();
-               }
-               if ( isset( $params['wanCache'] ) ) {
-                       $this->wanCache = $params['wanCache'];
-               } else {
-                       $this->wanCache = WANObjectCache::newEmpty();
-               }
+               $this->srvCache = $params['srvCache'] ?? new EmptyBagOStuff();
+               $this->wanCache = $params['wanCache'] ?? WANObjectCache::newEmpty();
                $this->profiler = $params['profiler'] ?? null;
-               if ( isset( $params['trxProfiler'] ) ) {
-                       $this->trxProfiler = $params['trxProfiler'];
-               } else {
-                       $this->trxProfiler = new TransactionProfiler();
-               }
+               $this->trxProfiler = $params['trxProfiler'] ?? new TransactionProfiler();
 
                $this->errorLogger = $params['errorLogger'] ?? function ( Exception $e ) {
                        trigger_error( get_class( $e ) . ': ' . $e->getMessage(), E_USER_WARNING );
@@ -1001,6 +985,8 @@ class LoadBalancer implements ILoadBalancer {
                }
 
                /** @var Database $conn */
+               $conn = null;
+
                if ( isset( $this->conns[$connInUseKey][$i][$domain] ) ) {
                        // Reuse an in-use connection for the same domain
                        $conn = $this->conns[$connInUseKey][$i][$domain];
@@ -1012,22 +998,36 @@ class LoadBalancer implements ILoadBalancer {
                        $this->conns[$connInUseKey][$i][$domain] = $conn;
                        $this->connLogger->debug( __METHOD__ . ": reusing free connection $i/$domain" );
                } elseif ( !empty( $this->conns[$connFreeKey][$i] ) ) {
-                       // Reuse a free connection from another domain
-                       $conn = reset( $this->conns[$connFreeKey][$i] );
-                       $oldDomain = key( $this->conns[$connFreeKey][$i] );
-                       if ( $domainInstance->getDatabase() !== null ) {
-                               $conn->selectDomain( $domainInstance );
-                       } else {
-                               // Stay on the current database, but update the schema/prefix
-                               $conn->dbSchema( $domainInstance->getSchema() );
-                               $conn->tablePrefix( $domainInstance->getTablePrefix() );
+                       // Reuse a free connection from another domain if possible
+                       foreach ( $this->conns[$connFreeKey][$i] as $oldDomain => $conn ) {
+                               if ( $domainInstance->getDatabase() !== null ) {
+                                       // Check if changing the database will require a new connection.
+                                       // In that case, leave the connection handle alone and keep looking.
+                                       // This prevents connections from being closed mid-transaction and can
+                                       // also avoid overhead if the same database will later be requested.
+                                       if (
+                                               $conn->databasesAreIndependent() &&
+                                               $conn->getDBname() !== $domainInstance->getDatabase()
+                                       ) {
+                                               continue;
+                                       }
+                                       // Select the new database, schema, and prefix
+                                       $conn->selectDomain( $domainInstance );
+                               } else {
+                                       // Stay on the current database, but update the schema/prefix
+                                       $conn->dbSchema( $domainInstance->getSchema() );
+                                       $conn->tablePrefix( $domainInstance->getTablePrefix() );
+                               }
+                               unset( $this->conns[$connFreeKey][$i][$oldDomain] );
+                               // Note that if $domain is an empty string, getDomainID() might not match it
+                               $this->conns[$connInUseKey][$i][$conn->getDomainId()] = $conn;
+                               $this->connLogger->debug( __METHOD__ .
+                                       ": reusing free connection from $oldDomain for $domain" );
+                               break;
                        }
-                       unset( $this->conns[$connFreeKey][$i][$oldDomain] );
-                       // Note that if $domain is an empty string, getDomainID() might not match it
-                       $this->conns[$connInUseKey][$i][$conn->getDomainId()] = $conn;
-                       $this->connLogger->debug( __METHOD__ .
-                               ": reusing free connection from $oldDomain for $domain" );
-               } else {
+               }
+
+               if ( !$conn ) {
                        if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) {
                                throw new InvalidArgumentException( "No server with index '$i'." );
                        }
@@ -1223,23 +1223,13 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function getServerName( $i ) {
-               if ( isset( $this->servers[$i]['hostName'] ) ) {
-                       $name = $this->servers[$i]['hostName'];
-               } elseif ( isset( $this->servers[$i]['host'] ) ) {
-                       $name = $this->servers[$i]['host'];
-               } else {
-                       $name = '';
-               }
+               $name = $this->servers[$i]['hostName'] ?? $this->servers[$i]['host'] ?? '';
 
                return ( $name != '' ) ? $name : 'localhost';
        }
 
        public function getServerInfo( $i ) {
-               if ( isset( $this->servers[$i] ) ) {
-                       return $this->servers[$i];
-               } else {
-                       return false;
-               }
+               return $this->servers[$i] ?? false;
        }
 
        public function getServerType( $i ) {
index 3f8a11b..f7d4f7e 100644 (file)
@@ -35,8 +35,6 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
         *   * $title is optional
         *   * $revision is optional
         *
-        * There are also deprecated "v1" requests; see onParsoid1Request
-        * for details.
         * @param array $params Key/value map
         *   - url            : Parsoid server URL
         *   - domain         : Wiki domain to use
@@ -98,8 +96,7 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
                                # Map RESTBase v1 API to Parsoid v3 API (pretty easy)
                                $req['url'] = preg_replace( '#^local/v1/#', 'local/v3/', $req['url'] );
                        } elseif ( $version !== 'v3' ) {
-                               $result[$key] = $this->onParsoid1Request( $req, $idGeneratorFunc );
-                               continue;
+                               throw new Exception( "Only Parsoid v3 API is supported." );
                        }
                        if ( $targetWiki !== 'local' ) {
                                throw new Exception( "Only 'local' target wiki is currently supported" );
@@ -129,101 +126,4 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
                return $result;
        }
 
-       /**
-        * Remap a Parsoid v1 request to a Parsoid v3 request.
-        *
-        * Example Parsoid v1 requests:
-        *  GET /local/v1/page/$title/html/$oldid
-        *   * $oldid is optional
-        *  POST /local/v1/transform/html/to/wikitext/$title/$oldid
-        *   * body: array( 'html' => ... )
-        *   * $title and $oldid are optional
-        *  POST /local/v1/transform/wikitext/to/html/$title
-        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body' => true/false )
-        *   * $title is optional
-        *
-        * NOTE: the POST APIs aren't "real" Parsoid v1 APIs, they are just what
-        * Visual Editor "pretends" the V1 API is like.  A previous version of
-        * ParsoidVirtualRESTService translated these to the "real" Parsoid v1
-        * API.  We now translate these to the "real" Parsoid v3 API.
-        * @param array $req
-        * @param Closure $idGeneratorFunc
-        * @return array
-        * @throws Exception
-        * @deprecated since 1.26, upgrade your client to issue v3 requests.
-        */
-       public function onParsoid1Request( array $req, Closure $idGeneratorFunc ) {
-               wfDeprecated( __METHOD__, '1.26' );
-               $parts = explode( '/', $req['url'] );
-               list(
-                       $targetWiki, // 'local'
-                       $version, // 'v1'
-                       $reqType // 'page' or 'transform'
-               ) = $parts;
-               if ( $targetWiki !== 'local' ) {
-                       throw new Exception( "Only 'local' target wiki is currently supported" );
-               } elseif ( $version !== 'v1' ) {
-                       throw new Exception( "Only v1 and v3 are supported." );
-               } elseif ( $reqType !== 'page' && $reqType !== 'transform' ) {
-                       throw new Exception( "Request type must be either 'page' or 'transform'" );
-               }
-               $req['url'] = $this->params['url'] . $this->params['domain'] . '/v3/';
-               if ( $reqType === 'page' ) {
-                       $title = $parts[3];
-                       if ( $parts[4] !== 'html' ) {
-                               throw new Exception( "Only 'html' output format is currently supported" );
-                       }
-                       $req['url'] .= 'page/html/' . $title;
-                       if ( isset( $parts[5] ) ) {
-                               $req['url'] .= '/' . $parts[5];
-                       } elseif ( isset( $req['query']['oldid'] ) && $req['query']['oldid'] ) {
-                               $req['url'] .= '/' . $req['query']['oldid'];
-                               unset( $req['query']['oldid'] );
-                       }
-               } elseif ( $reqType === 'transform' ) {
-                       $req['url'] .= 'transform/' . $parts[3] . '/to/' . $parts[5];
-                       // the title
-                       if ( isset( $parts[6] ) ) {
-                               $req['url'] .= '/' . $parts[6];
-                       }
-                       // revision id
-                       if ( isset( $parts[7] ) ) {
-                               $req['url'] .= '/' . $parts[7];
-                       } elseif ( isset( $req['body']['oldid'] ) && $req['body']['oldid'] ) {
-                               $req['url'] .= '/' . $req['body']['oldid'];
-                               unset( $req['body']['oldid'] );
-                       }
-                       if ( $parts[4] !== 'to' ) {
-                               throw new Exception( "Part index 4 is not 'to'" );
-                       }
-                       if ( $parts[3] === 'html' && $parts[5] === 'wikitext' ) {
-                               if ( !isset( $req['body']['html'] ) ) {
-                                       throw new Exception( "You must set an 'html' body key for this request" );
-                               }
-                       } elseif ( $parts[3] == 'wikitext' && $parts[5] == 'html' ) {
-                               if ( !isset( $req['body']['wikitext'] ) ) {
-                                       throw new Exception( "You must set a 'wikitext' body key for this request" );
-                               }
-                               if ( isset( $req['body']['body'] ) ) {
-                                       $req['body']['body_only'] = $req['body']['body'];
-                                       unset( $req['body']['body'] );
-                               }
-                       } else {
-                               throw new Exception( "Transformation unsupported" );
-                       }
-               }
-               // set the appropriate proxy, timeout and headers
-               if ( $this->params['HTTPProxy'] ) {
-                       $req['proxy'] = $this->params['HTTPProxy'];
-               }
-               if ( $this->params['timeout'] != null ) {
-                       $req['reqTimeout'] = $this->params['timeout'];
-               }
-               if ( $this->params['forwardCookies'] ) {
-                       $req['headers']['Cookie'] = $this->params['forwardCookies'];
-               }
-
-               return $req;
-       }
-
 }
index d31e735..f3b7872 100644 (file)
@@ -111,7 +111,7 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
        }
 
        /**
-        * Remaps Parsoid v1/v3 requests to RESTBase v1 requests.
+        * Remaps Parsoid v3 requests to RESTBase v1 requests.
         * @param array $reqs
         * @param Closure $idGeneratorFunc
         * @return array
@@ -123,113 +123,14 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
                        $version = explode( '/', $req['url'] )[1];
                        if ( $version === 'v3' ) {
                                $result[$key] = $this->onParsoid3Request( $req, $idGeneratorFunc );
-                       } elseif ( $version === 'v1' ) {
-                               $result[$key] = $this->onParsoid1Request( $req, $idGeneratorFunc );
                        } else {
-                               throw new Exception( "Only v1 and v3 are supported." );
+                               throw new Exception( "Only Parsoid v3 is supported." );
                        }
                }
 
                return $result;
        }
 
-       /**
-        * Remap a Parsoid v1 request to a RESTBase v1 request.
-        *
-        * Example Parsoid v1 requests:
-        *  GET /local/v1/page/$title/html/$oldid
-        *   * $oldid is optional
-        *  POST /local/v1/transform/html/to/wikitext/$title/$oldid
-        *   * body: array( 'html' => ... )
-        *   * $title and $oldid are optional
-        *  POST /local/v1/transform/wikitext/to/html/$title
-        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body' => true/false )
-        *   * $title is optional
-        *
-        * NOTE: the POST APIs aren't "real" Parsoid v1 APIs, they are just what
-        * Visual Editor "pretends" the V1 API is like.  (See
-        * ParsoidVirtualRESTService.)
-        * @param array $req
-        * @param Closure $idGeneratorFunc
-        * @return array
-        * @throws Exception
-        * @deprecated since 1.26, upgrade your client to issue v3 requests.
-        */
-       public function onParsoid1Request( array $req, Closure $idGeneratorFunc ) {
-               wfDeprecated( __METHOD__, '1.26' );
-               $parts = explode( '/', $req['url'] );
-               list(
-                       $targetWiki, // 'local'
-                       $version, // 'v1'
-                       $reqType // 'page' or 'transform'
-               ) = $parts;
-               if ( $targetWiki !== 'local' ) {
-                       throw new Exception( "Only 'local' target wiki is currently supported" );
-               } elseif ( $version !== 'v1' ) {
-                       throw new Exception( "Version mismatch: should not happen." );
-               } elseif ( $reqType !== 'page' && $reqType !== 'transform' ) {
-                       throw new Exception( "Request type must be either 'page' or 'transform'" );
-               }
-               $req['url'] = $this->params['url'] . $this->params['domain'] . '/v1/' . $reqType . '/';
-               if ( $reqType === 'page' ) {
-                       $title = $parts[3];
-                       if ( $parts[4] !== 'html' ) {
-                               throw new Exception( "Only 'html' output format is currently supported" );
-                       }
-                       $req['url'] .= 'html/' . $title;
-                       if ( isset( $parts[5] ) ) {
-                               $req['url'] .= '/' . $parts[5];
-                       } elseif ( isset( $req['query']['oldid'] ) && $req['query']['oldid'] ) {
-                               $req['url'] .= '/' . $req['query']['oldid'];
-                               unset( $req['query']['oldid'] );
-                       }
-               } elseif ( $reqType === 'transform' ) {
-                       // from / to transform
-                       $req['url'] .= $parts[3] . '/to/' . $parts[5];
-                       // the title
-                       if ( isset( $parts[6] ) ) {
-                               $req['url'] .= '/' . $parts[6];
-                       }
-                       // revision id
-                       if ( isset( $parts[7] ) ) {
-                               $req['url'] .= '/' . $parts[7];
-                       } elseif ( isset( $req['body']['oldid'] ) && $req['body']['oldid'] ) {
-                               $req['url'] .= '/' . $req['body']['oldid'];
-                               unset( $req['body']['oldid'] );
-                       }
-                       if ( $parts[4] !== 'to' ) {
-                               throw new Exception( "Part index 4 is not 'to'" );
-                       }
-                       if ( $parts[3] === 'html' && $parts[5] === 'wikitext' ) {
-                               if ( !isset( $req['body']['html'] ) ) {
-                                       throw new Exception( "You must set an 'html' body key for this request" );
-                               }
-                       } elseif ( $parts[3] == 'wikitext' && $parts[5] == 'html' ) {
-                               if ( !isset( $req['body']['wikitext'] ) ) {
-                                       throw new Exception( "You must set a 'wikitext' body key for this request" );
-                               }
-                               if ( isset( $req['body']['body'] ) ) {
-                                       $req['body']['body_only'] = $req['body']['body'];
-                                       unset( $req['body']['body'] );
-                               }
-                       } else {
-                               throw new Exception( "Transformation unsupported" );
-                       }
-               }
-               // set the appropriate proxy, timeout and headers
-               if ( $this->params['HTTPProxy'] ) {
-                       $req['proxy'] = $this->params['HTTPProxy'];
-               }
-               if ( $this->params['timeout'] != null ) {
-                       $req['reqTimeout'] = $this->params['timeout'];
-               }
-               if ( $this->params['forwardCookies'] ) {
-                       $req['headers']['Cookie'] = $this->params['forwardCookies'];
-               }
-
-               return $req;
-       }
-
        /**
         * Remap a Parsoid v3 request to a RESTBase v1 request.
         *
index 3762d62..2698cbe 100644 (file)
@@ -68,6 +68,17 @@ class BlockLogFormatter extends LogFormatter {
                        );
                        $params[5] = isset( $params[5] ) ?
                                self::formatBlockFlags( $params[5], $this->context->getLanguage() ) : '';
+
+                       // block restrictions
+                       if ( isset( $params[6] ) ) {
+                               $pages = $params[6]['pages'] ?? [];
+                               $pages = array_map( function ( $page ){
+                                       return $this->makePageLink( Title::newFromText( ( $page ) ) );
+                               }, $pages );
+
+                               $params[6] = Message::rawParam( $this->context->getLanguage()->listToText( $pages ) );
+                               $params[7] = count( $pages );
+                       }
                }
 
                return $params;
@@ -188,6 +199,7 @@ class BlockLogFormatter extends LogFormatter {
                        '6:array:flags',
                        '6::flags' => '6:array:flags',
                ];
+
                foreach ( $map as $index => $key ) {
                        if ( isset( $params[$index] ) ) {
                                $params[$key] = $params[$index];
@@ -195,6 +207,8 @@ class BlockLogFormatter extends LogFormatter {
                        }
                }
 
+               ksort( $params );
+
                $subtype = $entry->getSubtype();
                if ( $subtype === 'block' || $subtype === 'reblock' ) {
                        // Defaults for old log entries missing some fields
@@ -226,7 +240,37 @@ class BlockLogFormatter extends LogFormatter {
                if ( isset( $ret['flags'] ) ) {
                        ApiResult::setIndexedTagName( $ret['flags'], 'f' );
                }
+
+               if ( isset( $ret['restrictions']['pages'] ) ) {
+                       $ret['restrictions']['pages'] = array_map( function ( $title ) {
+                               return $this->formatParameterValueForApi( 'page', 'title-link', $title );
+                       }, $ret['restrictions']['pages'] );
+                       ApiResult::setIndexedTagName( $ret['restrictions']['pages'], 'p' );
+               }
+
                return $ret;
        }
 
+       protected function getMessageKey() {
+               $type = $this->entry->getType();
+               $subtype = $this->entry->getSubtype();
+               $sitewide = $this->entry->getParameters()['sitewide'] ?? true;
+
+               $key = "logentry-$type-$subtype";
+               if ( ( $subtype === 'block' || $subtype === 'reblock' ) && !$sitewide ) {
+                       // $this->getMessageParameters is doing too much. We just need
+                       // to check the presence of restrictions ($param[6]) and calling
+                       // on parent gives us that
+                       $params = parent::getMessageParameters();
+
+                       // message changes depending on whether there are editing restrictions or not
+                       if ( isset( $params[6] ) ) {
+                               $key = "logentry-partial$type-$subtype";
+                       } else {
+                               $key = "logentry-non-editing-$type-$subtype";
+                       }
+               }
+
+               return $key;
+       }
 }
index e14c485..b3afe0b 100644 (file)
@@ -51,13 +51,7 @@ class LogFormatter {
                global $wgLogActionsHandlers;
                $fulltype = $entry->getFullType();
                $wildcard = $entry->getType() . '/*';
-               $handler = '';
-
-               if ( isset( $wgLogActionsHandlers[$fulltype] ) ) {
-                       $handler = $wgLogActionsHandlers[$fulltype];
-               } elseif ( isset( $wgLogActionsHandlers[$wildcard] ) ) {
-                       $handler = $wgLogActionsHandlers[$wildcard];
-               }
+               $handler = $wgLogActionsHandlers[$fulltype] ?? $wgLogActionsHandlers[$wildcard] ?? '';
 
                if ( $handler !== '' && is_string( $handler ) && class_exists( $handler ) ) {
                        return new $handler( $entry );
index af99940..b63f818 100644 (file)
@@ -437,11 +437,7 @@ class LogPage {
                global $wgLogNames;
 
                // BC
-               if ( isset( $wgLogNames[$this->type] ) ) {
-                       $key = $wgLogNames[$this->type];
-               } else {
-                       $key = 'log-name-' . $this->type;
-               }
+               $key = $wgLogNames[$this->type] ?? 'log-name-' . $this->type;
 
                return wfMessage( $key );
        }
@@ -454,11 +450,7 @@ class LogPage {
        public function getDescription() {
                global $wgLogHeaders;
                // BC
-               if ( isset( $wgLogHeaders[$this->type] ) ) {
-                       $key = $wgLogHeaders[$this->type];
-               } else {
-                       $key = 'log-description-' . $this->type;
-               }
+               $key = $wgLogHeaders[$this->type] ?? 'log-description-' . $this->type;
 
                return wfMessage( $key );
        }
@@ -470,14 +462,8 @@ class LogPage {
         */
        public function getRestriction() {
                global $wgLogRestrictions;
-               if ( isset( $wgLogRestrictions[$this->type] ) ) {
-                       $restriction = $wgLogRestrictions[$this->type];
-               } else {
-                       // '' always returns true with $user->isAllowed()
-                       $restriction = '';
-               }
-
-               return $restriction;
+               // '' always returns true with $user->isAllowed()
+               return $wgLogRestrictions[$this->type] ?? '';
        }
 
        /**
index d32e93f..fa5ebfc 100644 (file)
@@ -23,8 +23,8 @@
  * @author Tim Starling
  * @author Luke Welling lwelling@wikimedia.org
  */
-use MediaWiki\Linker\LinkTarget;
 
+use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
 
 /**
index 000bbe3..63a114d 100644 (file)
@@ -50,7 +50,7 @@ class MailAddress {
         * @param string|null $name Human-readable name if a string address is given
         * @param string|null $realName Human-readable real name if a string address is given
         */
-       function __construct( $address, $name = null, $realName = null ) {
+       public function __construct( $address, $name = null, $realName = null ) {
                $this->address = strval( $address );
                $this->name = strval( $name );
                $this->realName = strval( $realName );
@@ -72,25 +72,26 @@ class MailAddress {
         * @return string
         */
        function toString() {
+               if ( !$this->address ) {
+                       return '';
+               }
+
                # PHP's mail() implementation under Windows is somewhat shite, and
                # can't handle "Joe Bloggs <joe@bloggs.com>" format email addresses,
                # so don't bother generating them
-               if ( $this->address ) {
-                       if ( $this->name != '' && !wfIsWindows() ) {
-                               global $wgEnotifUseRealName;
-                               $name = ( $wgEnotifUseRealName && $this->realName !== '' ) ? $this->realName : $this->name;
-                               $quoted = UserMailer::quotedPrintable( $name );
-                               // Must only be quoted if string does not use =? encoding (T191931)
-                               if ( $quoted === $name ) {
-                                       $quoted = '"' . addslashes( $quoted ) . '"';
-                               }
-                               return "$quoted <{$this->address}>";
-                       } else {
-                               return $this->address;
-                       }
-               } else {
-                       return "";
+               if ( $this->name === '' || wfIsWindows() ) {
+                       return $this->address;
                }
+
+               global $wgEnotifUseRealName;
+               $name = ( $wgEnotifUseRealName && $this->realName !== '' ) ? $this->realName : $this->name;
+               $quoted = UserMailer::quotedPrintable( $name );
+               // Must only be quoted if string does not use =? encoding (T191931)
+               if ( $quoted === $name ) {
+                       $quoted = '"' . addslashes( $quoted ) . '"';
+               }
+
+               return "$quoted <{$this->address}>";
        }
 
        function __toString() {
index 441c515..683ded1 100644 (file)
@@ -222,11 +222,7 @@ class IPTC {
                                case '2#055':
                                        // Date created (not date digitized).
                                        // Maps to exif DateTimeOriginal
-                                       if ( isset( $parsed['2#060'] ) ) {
-                                               $time = $parsed['2#060'];
-                                       } else {
-                                               $time = [];
-                                       }
+                                       $time = $parsed['2#060'] ?? [];
                                        $timestamp = self::timeHelper( $val, $time, $c );
                                        if ( $timestamp ) {
                                                $data['DateTimeOriginal'] = $timestamp;
@@ -236,11 +232,7 @@ class IPTC {
                                case '2#062':
                                        // Date converted to digital representation.
                                        // Maps to exif DateTimeDigitized
-                                       if ( isset( $parsed['2#063'] ) ) {
-                                               $time = $parsed['2#063'];
-                                       } else {
-                                               $time = [];
-                                       }
+                                       $time = $parsed['2#063'] ?? [];
                                        $timestamp = self::timeHelper( $val, $time, $c );
                                        if ( $timestamp ) {
                                                $data['DateTimeDigitized'] = $timestamp;
@@ -249,11 +241,7 @@ class IPTC {
 
                                case '2#030':
                                        // Date released.
-                                       if ( isset( $parsed['2#035'] ) ) {
-                                               $time = $parsed['2#035'];
-                                       } else {
-                                               $time = [];
-                                       }
+                                       $time = $parsed['2#035'] ?? [];
                                        $timestamp = self::timeHelper( $val, $time, $c );
                                        if ( $timestamp ) {
                                                $data['DateTimeReleased'] = $timestamp;
@@ -262,11 +250,7 @@ class IPTC {
 
                                case '2#037':
                                        // Date expires.
-                                       if ( isset( $parsed['2#038'] ) ) {
-                                               $time = $parsed['2#038'];
-                                       } else {
-                                               $time = [];
-                                       }
+                                       $time = $parsed['2#038'] ?? [];
                                        $timestamp = self::timeHelper( $val, $time, $c );
                                        if ( $timestamp ) {
                                                $data['DateTimeExpires'] = $timestamp;
index 71db975..66a4291 100644 (file)
@@ -874,8 +874,8 @@ abstract class MediaHandler {
        /**
         * Converts a dimensions array about a potentially multipage document from an
         * exhaustive list of ordered page numbers to a list of page ranges
-        * @param Array $pagesByDimensions
-        * @return String
+        * @param array $pagesByDimensions
+        * @return string
         * @since 1.30
         */
        public static function getPageRangesByDimensions( $pagesByDimensions ) {
index 6d76d5e..ae42f80 100644 (file)
@@ -169,11 +169,7 @@ class ObjectCache {
         * @throws InvalidArgumentException
         */
        public static function newFromParams( $params ) {
-               if ( isset( $params['loggroup'] ) ) {
-                       $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] );
-               } else {
-                       $params['logger'] = LoggerFactory::getInstance( 'objectcache' );
-               }
+               $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] ?? 'objectcache' );
                if ( !isset( $params['keyspace'] ) ) {
                        $params['keyspace'] = self::getDefaultKeyspace();
                }
@@ -340,11 +336,7 @@ class ObjectCache {
                        }
                }
                $params['cache'] = self::newFromParams( $params['store'] );
-               if ( isset( $params['loggroup'] ) ) {
-                       $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] );
-               } else {
-                       $params['logger'] = LoggerFactory::getInstance( 'objectcache' );
-               }
+               $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] ?? 'objectcache' );
                if ( !$wgCommandLineMode ) {
                        // Send the statsd data post-send on HTTP requests; avoid in CLI mode (T181385)
                        $params['stats'] = $services->getStatsdDataFactory();
index af4f293..9f7f280 100644 (file)
@@ -820,7 +820,6 @@ class Article implements Page {
                // Note that the ArticleViewHeader hook is allowed to set $outputDone to a
                // ParserOutput instance.
                $pOutput = ( $outputDone instanceof ParserOutput )
-                       // phpcs:ignore MediaWiki.Usage.NestedInlineTernary.UnparenthesizedTernary -- FIXME T203805
                        ? $outputDone // object fetched by hook
                        : ( $this->mParserOutput ?: null ); // ParserOutput or null, avoid false
 
index 081af19..d03d317 100644 (file)
@@ -1045,20 +1045,22 @@ class WikiPage implements Page, IDBAccessObject {
                $dbw->startAtomic( __METHOD__ );
 
                if ( !$oldLatest || $oldLatest == $this->lockAndGetLatest() ) {
+                       $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+                       $truncatedFragment = $contLang->truncateForDatabase( $rt->getFragment(), 255 );
                        $dbw->upsert(
                                'redirect',
                                [
                                        'rd_from' => $this->getId(),
                                        'rd_namespace' => $rt->getNamespace(),
                                        'rd_title' => $rt->getDBkey(),
-                                       'rd_fragment' => $rt->getFragment(),
+                                       'rd_fragment' => $truncatedFragment,
                                        'rd_interwiki' => $rt->getInterwiki(),
                                ],
                                [ 'rd_from' ],
                                [
                                        'rd_namespace' => $rt->getNamespace(),
                                        'rd_title' => $rt->getDBkey(),
-                                       'rd_fragment' => $rt->getFragment(),
+                                       'rd_fragment' => $truncatedFragment,
                                        'rd_interwiki' => $rt->getInterwiki(),
                                ],
                                __METHOD__
@@ -2727,8 +2729,13 @@ class WikiPage implements Page, IDBAccessObject {
                        // in the job queue to avoid simultaneous deletion operations would add overhead.
                        // Number of archived revisions cannot be known beforehand, because edits can be made
                        // while deletion operations are being processed, changing the number of archivals.
-                       $archivedRevisionCount = $dbw->selectRowCount(
-                               'archive', '1', [ 'ar_page_id' => $id ], __METHOD__
+                       $archivedRevisionCount = $dbw->selectField(
+                               'archive', 'COUNT(*)',
+                               [
+                                       'ar_namespace' => $this->getTitle()->getNamespace(),
+                                       'ar_title' => $this->getTitle()->getDBkey(),
+                                       'ar_page_id' => $id
+                               ], __METHOD__
                        );
 
                        // Clone the title and wikiPage, so we have the information we need when
index de02861..fb79442 100644 (file)
@@ -213,10 +213,7 @@ class DateFormatter {
         */
        private function replace( $matches ) {
                # Extract information from $matches
-               $linked = true;
-               if ( isset( $this->mLinked ) ) {
-                       $linked = $this->mLinked;
-               }
+               $linked = $this->mLinked ?? true;
 
                $bits = [];
                $key = $this->keys[$this->mSource];
index db04077..3509200 100644 (file)
@@ -5925,7 +5925,7 @@ class Parser {
        }
 
        private function makeLegacyAnchor( $sectionName ) {
-               $fragmentMode = $this->config->get( 'FragmentMode' );
+               $fragmentMode = $this->siteConfig->get( 'FragmentMode' );
                if ( isset( $fragmentMode[1] ) && $fragmentMode[1] === 'legacy' ) {
                        // ForAttribute() and ForLink() are the same for legacy encoding
                        $id = Sanitizer::escapeIdForAttribute( $sectionName, Sanitizer::ID_FALLBACK );
index 847214a..6260de6 100644 (file)
@@ -1127,11 +1127,7 @@ class ParserOutput extends CacheTime {
         *         or null if no value was set for this key.
         */
        public function getExtensionData( $key ) {
-               if ( isset( $this->mExtensionData[$key] ) ) {
-                       return $this->mExtensionData[$key];
-               }
-
-               return null;
+               return $this->mExtensionData[$key] ?? null;
        }
 
        private static function getTimes( $clock = null ) {
index d00c40f..f4e4efa 100644 (file)
@@ -1876,10 +1876,7 @@ class PPCustomFrame_DOM extends PPFrame_DOM {
         * @return string|bool
         */
        public function getArgument( $index ) {
-               if ( !isset( $this->args[$index] ) ) {
-                       return false;
-               }
-               return $this->args[$index];
+               return $this->args[$index] ?? false;
        }
 
        public function getArguments() {
index 6d6dd89..eb869e2 100644 (file)
@@ -1702,10 +1702,7 @@ class PPCustomFrame_Hash extends PPFrame_Hash {
         * @return string|bool
         */
        public function getArgument( $index ) {
-               if ( !isset( $this->args[$index] ) ) {
-                       return false;
-               }
-               return $this->args[$index];
+               return $this->args[$index] ?? false;
        }
 
        public function getArguments() {
index f32b1b7..ad45211 100644 (file)
@@ -267,11 +267,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                                continue;
                        }
 
-                       if ( isset( $userGroupMemberships[$ueg] ) ) {
-                               $groupStringOrObject = $userGroupMemberships[$ueg];
-                       } else {
-                               $groupStringOrObject = $ueg;
-                       }
+                       $groupStringOrObject = $userGroupMemberships[$ueg] ?? $ueg;
 
                        $userG = UserGroupMembership::getLink( $groupStringOrObject, $context, 'html' );
                        $userM = UserGroupMembership::getLink( $groupStringOrObject, $context, 'html',
@@ -911,11 +907,6 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'section' => 'editing/editor',
                        'label-message' => 'tog-useeditwarning',
                ];
-               $defaultPreferences['showtoolbar'] = [
-                       'type' => 'toggle',
-                       'section' => 'editing/editor',
-                       'label-message' => 'tog-showtoolbar',
-               ];
 
                $defaultPreferences['previewonfirst'] = [
                        'type' => 'toggle',
index eb56e13..e43b3b8 100644 (file)
@@ -484,11 +484,7 @@ class ExtensionProcessor implements Processor {
         * @param string $dir
         */
        protected function extractConfig2( array $info, $dir ) {
-               if ( isset( $info['config_prefix'] ) ) {
-                       $prefix = $info['config_prefix'];
-               } else {
-                       $prefix = 'wg';
-               }
+               $prefix = $info['config_prefix'] ?? 'wg';
                if ( isset( $info['config'] ) ) {
                        foreach ( $info['config'] as $key => $data ) {
                                $value = $data['value'];
index e2b60fc..2fc81e3 100644 (file)
@@ -550,11 +550,7 @@ class ResourceLoader implements LoggerAwareInterface {
                                $object->setConfig( $this->getConfig() );
                                $object->setLogger( $this->logger );
                        } else {
-                               if ( !isset( $info['class'] ) ) {
-                                       $class = ResourceLoaderFileModule::class;
-                               } else {
-                                       $class = $info['class'];
-                               }
+                               $class = $info['class'] ?? ResourceLoaderFileModule::class;
                                /** @var ResourceLoaderModule $object */
                                $object = new $class( $info );
                                $object->setConfig( $this->getConfig() );
@@ -1364,7 +1360,7 @@ MESSAGE;
         * - new XmlJsCode( '{}' )
         * - new stdClass() // (object) []
         *
-        * @param Array $array
+        * @param array $array
         */
        private static function trimArray( array &$array ) {
                $i = count( $array );
diff --git a/includes/resourceloader/ResourceLoaderEditToolbarModule.php b/includes/resourceloader/ResourceLoaderEditToolbarModule.php
deleted file mode 100644 (file)
index 2a6af71..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * ResourceLoader module for the edit toolbar.
- *
- * 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
- */
-
-/**
- * ResourceLoader module for the edit toolbar.
- *
- * @since 1.24
- */
-class ResourceLoaderEditToolbarModule extends ResourceLoaderFileModule {
-       /**
-        * Get language-specific LESS variables for this module.
-        *
-        * @since 1.27
-        * @param ResourceLoaderContext $context
-        * @return array
-        */
-       protected function getLessVars( ResourceLoaderContext $context ) {
-               $vars = parent::getLessVars( $context );
-               $language = Language::factory( $context->getLanguage() );
-               foreach ( $language->getImageFiles() as $key => $value ) {
-                       $vars[$key] = CSSMin::serializeStringValue( $value );
-               }
-               return $vars;
-       }
-}
index ad9f934..2941f0a 100644 (file)
@@ -219,10 +219,7 @@ abstract class SearchEngine {
         * @return mixed the feature value or null if unset
         */
        public function getFeatureData( $feature ) {
-               if ( isset( $this->features[$feature] ) ) {
-                       return $this->features[$feature];
-               }
-               return null;
+               return $this->features[$feature] ?? null;
        }
 
        /**
index 0ddc443..467e4ef 100644 (file)
@@ -237,7 +237,7 @@ class Shell {
                // Give site config file a chance to run the script in a wrapper.
                // The caller may likely want to call wfBasename() on $script.
                Hooks::run( 'wfShellWikiCmd', [ &$script, &$parameters, &$options ] );
-               $cmd = isset( $options['php'] ) ? [ $options['php'] ] : [ $wgPhpCli ];
+               $cmd = [ $options['php'] ?? $wgPhpCli ];
                if ( isset( $options['wrapper'] ) ) {
                        $cmd[] = $options['wrapper'];
                }
index 6d98e72..f0a6e54 100644 (file)
@@ -87,11 +87,7 @@ class HashSiteStore implements SiteStore {
         * @return Site|null
         */
        public function getSite( $globalId, $source = 'cache' ) {
-               if ( isset( $this->sites[$globalId] ) ) {
-                       return $this->sites[$globalId];
-               } else {
-                       return null;
-               }
+               return $this->sites[$globalId] ?? null;
        }
 
        /**
index 64145ad..a71daa0 100644 (file)
@@ -371,11 +371,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * @return string
         */
        function makeLink( $key, $item, $options = [] ) {
-               if ( isset( $item['text'] ) ) {
-                       $text = $item['text'];
-               } else {
-                       $text = wfMessage( $item['msg'] ?? $key )->text();
-               }
+               $text = $item['text'] ?? wfMessage( $item['msg'] ?? $key )->text();
 
                $html = htmlspecialchars( $text );
 
index 1889167..2c71571 100644 (file)
@@ -342,10 +342,7 @@ abstract class Skin extends ContextSource {
         * @return Title
         */
        public function getRelevantTitle() {
-               if ( isset( $this->mRelevantTitle ) ) {
-                       return $this->mRelevantTitle;
-               }
-               return $this->getTitle();
+               return $this->mRelevantTitle ?? $this->getTitle();
        }
 
        /**
index 887b13a..4201f80 100644 (file)
@@ -836,7 +836,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        /**
         * Fetch the change tags list for the front end
         *
-        * @return Array Tag data
+        * @return array Tag data
         */
        protected function getChangeTagList() {
                $cache = ObjectCache::getMainWANInstance();
index b91273a..58212dd 100644 (file)
@@ -352,17 +352,11 @@ class SpecialPageFactory {
                $caseFoldedAlias = $this->contLang->caseFold( $bits[0] );
                $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias );
                $aliases = $this->getAliasList();
-               if ( isset( $aliases[$caseFoldedAlias] ) ) {
-                       $name = $aliases[$caseFoldedAlias];
-               } else {
+               if ( !isset( $aliases[$caseFoldedAlias] ) ) {
                        return [ null, null ];
                }
-
-               if ( !isset( $bits[1] ) ) { // T4087
-                       $par = null;
-               } else {
-                       $par = $bits[1];
-               }
+               $name = $aliases[$caseFoldedAlias];
+               $par = $bits[1] ?? null; // T4087
 
                return [ $name, $par ];
        }
@@ -504,11 +498,7 @@ class SpecialPageFactory {
                // @todo FIXME: Redirects broken due to this call
                $bits = explode( '/', $title->getDBkey(), 2 );
                $name = $bits[0];
-               if ( !isset( $bits[1] ) ) { // T4087
-                       $par = null;
-               } else {
-                       $par = $bits[1];
-               }
+               $par = $bits[1] ?? null; // T4087
 
                $page = $this->getPage( $name );
                if ( !$page ) {
index a60595a..6b9b9d4 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\Block\BlockRestriction;
+use MediaWiki\Block\Restriction\PageRestriction;
+
 /**
  * A special page that allows users with 'block' right to block users from
  * editing pages and other actions
@@ -137,41 +140,63 @@ class SpecialBlock extends FormSpecialPage {
 
                $conf = $this->getConfig();
                $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
+               $enablePartialBlocks = $conf->get( 'EnablePartialBlocks' );
 
-               $a = [
-                       'Target' => [
-                               'type' => 'user',
-                               'ipallowed' => true,
-                               'iprange' => true,
-                               'label-message' => 'ipaddressorusername',
-                               'id' => 'mw-bi-target',
-                               'size' => '45',
-                               'autofocus' => true,
-                               'required' => true,
-                               'validation-callback' => [ __CLASS__, 'validateTargetField' ],
-                       ],
-                       'Expiry' => [
-                               'type' => 'expiry',
-                               'label-message' => 'ipbexpiry',
-                               'required' => true,
-                               'options' => $suggestedDurations,
-                               'default' => $this->msg( 'ipb-default-expiry' )->inContentLanguage()->text(),
-                       ],
-                       'Reason' => [
-                               'type' => 'selectandother',
-                               // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
-                               // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
-                               // Unicode codepoints (or 255 UTF-8 bytes for old schema).
-                               'maxlength' => $oldCommentSchema ? 255 : CommentStore::COMMENT_CHARACTER_LIMIT,
-                               'maxlength-unit' => 'codepoints',
-                               'label-message' => 'ipbreason',
-                               'options-message' => 'ipbreason-dropdown',
-                       ],
-                       'CreateAccount' => [
-                               'type' => 'check',
-                               'label-message' => 'ipbcreateaccount',
-                               'default' => true,
-                       ],
+               $a = [];
+
+               $a['Target'] = [
+                       'type' => 'user',
+                       'ipallowed' => true,
+                       'iprange' => true,
+                       'label-message' => 'ipaddressorusername',
+                       'id' => 'mw-bi-target',
+                       'size' => '45',
+                       'autofocus' => true,
+                       'required' => true,
+                       'validation-callback' => [ __CLASS__, 'validateTargetField' ],
+               ];
+
+               if ( $enablePartialBlocks ) {
+                       $a['EditingRestriction'] = [
+                               'type' => 'radio',
+                               'label' => $this->msg( 'ipb-type-label' )->text(),
+                               'options' => [
+                                       $this->msg( 'ipb-sitewide' )->text() => 'sitewide',
+                                       $this->msg( 'ipb-partial' )->text() => 'partial',
+                               ],
+                       ];
+                       $a['PageRestrictions'] = [
+                               'type' => 'titlesmultiselect',
+                               'label' => $this->msg( 'ipb-pages-label' )->text(),
+                               'exists' => true,
+                               'max' => 10,
+                               'cssclass' => 'mw-block-page-restrictions',
+                       ];
+               }
+
+               $a['Expiry'] = [
+                       'type' => 'expiry',
+                       'label-message' => 'ipbexpiry',
+                       'required' => true,
+                       'options' => $suggestedDurations,
+                       'default' => $this->msg( 'ipb-default-expiry' )->inContentLanguage()->text(),
+               ];
+
+               $a['Reason'] = [
+                       'type' => 'selectandother',
+                       // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+                       // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+                       // Unicode codepoints (or 255 UTF-8 bytes for old schema).
+                       'maxlength' => $oldCommentSchema ? 255 : CommentStore::COMMENT_CHARACTER_LIMIT,
+                       'maxlength-unit' => 'codepoints',
+                       'label-message' => 'ipbreason',
+                       'options-message' => 'ipbreason-dropdown',
+               ];
+
+               $a['CreateAccount'] = [
+                       'type' => 'check',
+                       'label-message' => 'ipbcreateaccount',
+                       'default' => true,
                ];
 
                if ( self::canBlockEmail( $user ) ) {
@@ -327,6 +352,29 @@ class SpecialBlock extends FormSpecialPage {
                        unset( $fields['Confirm']['default'] );
                        $this->preErrors[] = [ 'ipb-blockingself', 'ipb-confirmaction' ];
                }
+
+               if ( $this->getConfig()->get( 'EnablePartialBlocks' ) ) {
+                       if ( $block instanceof Block && !$block->isSitewide() ) {
+                               $fields['EditingRestriction']['default'] = 'partial';
+                       } else {
+                               $fields['EditingRestriction']['default'] = 'sitewide';
+                       }
+
+                       if ( $block instanceof Block ) {
+                               $pageRestrictions = [];
+                               foreach ( $block->getRestrictions() as $restriction ) {
+                                       if ( $restriction->getType() !== 'page' ) {
+                                               continue;
+                                       }
+
+                                       $pageRestrictions[] = $restriction->getTitle()->getPrefixedText();
+                               }
+
+                               // Sort the restrictions so they are in alphabetical order.
+                               sort( $pageRestrictions );
+                               $fields['PageRestrictions']['default'] = implode( "\n", $pageRestrictions );
+                       }
+               }
        }
 
        /**
@@ -632,6 +680,7 @@ class SpecialBlock extends FormSpecialPage {
                global $wgBlockAllowsUTEdit, $wgHideUserContribLimit;
 
                $performer = $context->getUser();
+               $enablePartialBlocks = $context->getConfig()->get( 'EnablePartialBlocks' );
 
                // Handled by field validator callback
                // self::validateTargetField( $data['Target'] );
@@ -740,11 +789,35 @@ class SpecialBlock extends FormSpecialPage {
                $block->isAutoblocking( $data['AutoBlock'] );
                $block->mHideName = $data['HideUser'];
 
+               if (
+                       $enablePartialBlocks &&
+                       isset( $data['EditingRestriction'] ) &&
+                       $data['EditingRestriction'] === 'partial'
+                ) {
+                        $block->isSitewide( false );
+               }
+
                $reason = [ 'hookaborted' ];
                if ( !Hooks::run( 'BlockIp', [ &$block, &$performer, &$reason ] ) ) {
                        return $reason;
                }
 
+               $restrictions = [];
+               if ( $enablePartialBlocks ) {
+                       if ( !empty( $data['PageRestrictions'] ) ) {
+                               $restrictions = array_map( function ( $text ) {
+                                       $title = Title::newFromText( $text );
+                                       // Use the link cache since the title has already been loaded when
+                                       // the field was validated.
+                                       $restriction = new PageRestriction( 0, $title->getArticleId() );
+                                       $restriction->setTitle( $title );
+                                       return $restriction;
+                               }, explode( "\n", $data['PageRestrictions'] ) );
+                       }
+
+                       $block->setRestrictions( $restrictions );
+               }
+
                $priorBlock = null;
                # Try to insert block. Is there a conflicting block?
                $status = $block->insert();
@@ -784,6 +857,17 @@ class SpecialBlock extends FormSpecialPage {
                                $currentBlock->prevents( 'editownusertalk', $block->prevents( 'editownusertalk' ) );
                                $currentBlock->mReason = $block->mReason;
 
+                               if ( $enablePartialBlocks ) {
+                                       // Maintain the sitewide status. If partial blocks is not enabled,
+                                       // saving the block will result in a sitewide block.
+                                       $currentBlock->isSitewide( $block->isSitewide() );
+
+                                       // Set the block id of the restrictions.
+                                       $currentBlock->setRestrictions(
+                                               BlockRestriction::setBlockId( $currentBlock->getId(), $restrictions )
+                                       );
+                               }
+
                                $status = $currentBlock->update();
 
                                $logaction = 'reblock';
@@ -826,6 +910,13 @@ class SpecialBlock extends FormSpecialPage {
                $logParams = [];
                $logParams['5::duration'] = $data['Expiry'];
                $logParams['6::flags'] = self::blockLogFlags( $data, $type );
+               $logParams['sitewide'] = $block->isSitewide();
+
+               if ( $enablePartialBlocks && !empty( $data['PageRestrictions'] ) ) {
+                       $logParams['7::restrictions'] = [
+                               'pages' => explode( "\n", $data['PageRestrictions'] ),
+                       ];
+               }
 
                # Make log entry, if the name is hidden, put it in the suppression log
                $log_type = $data['HideUser'] ? 'suppress' : 'block';
@@ -965,7 +1056,10 @@ class SpecialBlock extends FormSpecialPage {
         * @return string
         */
        protected static function blockLogFlags( array $data, $type ) {
-               global $wgBlockAllowsUTEdit;
+               $config = RequestContext::getMain()->getConfig();
+
+               $blockAllowsUTEdit = $config->get( 'BlockAllowsUTEdit' );
+
                $flags = [];
 
                # when blocking a user the option 'anononly' is not available/has no effect
@@ -991,7 +1085,7 @@ class SpecialBlock extends FormSpecialPage {
                        $flags[] = 'noemail';
                }
 
-               if ( $wgBlockAllowsUTEdit && $data['DisableUTEdit'] ) {
+               if ( $blockAllowsUTEdit && $data['DisableUTEdit'] ) {
                        // For grepping: message block-log-flags-nousertalk
                        $flags[] = 'nousertalk';
                }
index 342f6db..aebec2f 100644 (file)
@@ -134,7 +134,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        case 'badaccess':
                                throw new PermissionsError( 'sendemail' );
                        case 'blockedemailuser':
-                               throw new UserBlockedError( $this->getUser()->mBlock );
+                               throw $this->getBlockedEmailError();
                        case 'actionthrottledtext':
                                throw new ThrottledError;
                        case 'mailnologin':
@@ -156,7 +156,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                // if the user opens Special:EmailUser/Florian (e.g.). So check, if the user did that
                // and show the "Send email to user" form directly, if so. Show the "enter username"
                // form, otherwise.
-               $this->mTargetObj = self::getTarget( $this->mTarget );
+               $this->mTargetObj = self::getTarget( $this->mTarget, $this->getUser() );
                if ( !$this->mTargetObj instanceof User ) {
                        $this->userForm( $this->mTarget );
                } else {
@@ -318,7 +318,6 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        ->setMethod( 'post' )
                        ->setSubmitCallback( [ $this, 'sendEmailForm' ] )
                        ->setFormIdentifier( 'userForm' )
-                       ->setSubmitProgressive()
                        ->setId( 'askusername' )
                        ->setWrapperLegendMsg( 'emailtarget' )
                        ->setSubmitTextMsg( 'emailusernamesubmit' )
@@ -520,4 +519,17 @@ class SpecialEmailUser extends UnlistedSpecialPage {
        protected function getGroupName() {
                return 'users';
        }
+
+       /**
+        * Builds an error message based on the block params
+        *
+        * @return ErrorPageError
+        */
+       private function getBlockedEmailError() {
+               $block = $this->getUser()->mBlock;
+               $params = $block->getBlockErrorParams( $this->getContext() );
+
+               $msg = $block->isSitewide() ? 'blockedtext' : 'blocked-email-user';
+               return new ErrorPageError( 'blockedtitle', $msg, $params );
+       }
 }
index 809a14a..22a7612 100644 (file)
@@ -71,7 +71,7 @@ class SpecialGoToInterwiki extends UnlistedSpecialPage {
        }
 
        /**
-        * @return String
+        * @return string
         */
        protected function getGroupName() {
                return 'redirects';
index b6812bc..e591da0 100644 (file)
@@ -102,7 +102,7 @@ class MediaStatisticsPage extends QueryPage {
         *
         * It's important that img_media_type come first, otherwise the
         * tables will be fragmented.
-        * @return Array Fields to sort by
+        * @return array Fields to sort by
         */
        function getOrderFields() {
                return [ 'img_media_type', 'count(*)', 'img_major_mime', 'img_minor_mime' ];
@@ -214,7 +214,7 @@ class MediaStatisticsPage extends QueryPage {
 
        /**
         * @param float $decimal A decimal percentage (ie for 12.3%, this would be 0.123)
-        * @return String The percentage formatted so that 3 significant digits are shown.
+        * @return string The percentage formatted so that 3 significant digits are shown.
         */
        protected function makePercentPretty( $decimal ) {
                $decimal *= 100;
@@ -275,7 +275,7 @@ class MediaStatisticsPage extends QueryPage {
        /**
         * Get (not output) the header row for the table
         *
-        * @return String the header row of the able
+        * @return string The header row of the table
         */
        protected function getTableHeaderRow() {
                $headers = [ 'mimetype', 'extensions', 'count', 'totalbytes' ];
index 2f6dc03..5cbad8a 100644 (file)
@@ -789,12 +789,6 @@ class MovePageForm extends UnlistedSpecialPage {
                # Deal with watches (we don't watch subpages)
                WatchAction::doWatchOrUnwatch( $this->watch, $ot, $user );
                WatchAction::doWatchOrUnwatch( $this->watch, $nt, $user );
-
-               /**
-                * T163966
-                * Increment user_editcount during page moves
-                */
-               $user->incEditCount();
        }
 
        function showLogFragment( $title ) {
index f9d6b5f..836b6df 100644 (file)
@@ -177,7 +177,7 @@ class SpecialUpload extends SpecialPage {
                }
 
                # Check blocks
-               if ( $user->isBlocked() ) {
+               if ( $user->isBlockedFromUpload() ) {
                        throw new UserBlockedError( $user->getBlock() );
                }
 
index f63c884..c82a943 100644 (file)
@@ -767,7 +767,7 @@ class UserrightsPage extends SpecialPage {
         * @param UserGroupMembership[] $usergroups Associative array of (group name as string =>
         *   UserGroupMembership object) for groups the user belongs to
         * @param User $user
-        * @return Array with 2 elements: the XHTML table element with checkxboes, and
+        * @return array Array with 2 elements: the XHTML table element with checkxboes, and
         * whether any groups are changeable
         */
        private function groupCheckboxes( $usergroups, $user ) {
index 6dc129c..f53ccea 100644 (file)
@@ -32,13 +32,10 @@ class UploadSourceField extends HTMLTextField {
                $label = Html::rawElement( 'label', [ 'for' => $id ], $this->mLabel );
 
                if ( !empty( $this->mParams['radio'] ) ) {
-                       if ( isset( $this->mParams['radio-id'] ) ) {
-                               $radioId = $this->mParams['radio-id'];
-                       } else {
+                       $radioId = $this->mParams['radio-id'] ??
                                // Old way. For the benefit of extensions that do not define
                                // the 'radio-id' key.
-                               $radioId = 'wpSourceType' . $this->mParams['upload-type'];
-                       }
+                               'wpSourceType' . $this->mParams['upload-type'];
 
                        $attribs = [
                                'name' => 'wpSourceType',
index 5789c28..74ec6b5 100644 (file)
@@ -22,6 +22,8 @@
 /**
  * @ingroup Pager
  */
+use MediaWiki\Block\BlockRestriction;
+use MediaWiki\Block\Restriction\Restriction;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IResultWrapper;
 
@@ -30,6 +32,13 @@ class BlockListPager extends TablePager {
        protected $conds;
        protected $page;
 
+       /**
+        * Array of restrictions.
+        *
+        * @var Restriction[]
+        */
+       protected $restrictions = [];
+
        /**
         * @param SpecialPage $page
         * @param array $conds
@@ -72,6 +81,8 @@ class BlockListPager extends TablePager {
                                'blocklist-nousertalk',
                                'unblocklink',
                                'change-blocklink',
+                               'blocklist-editing',
+                               'blocklist-editing-sitewide',
                        ];
 
                        foreach ( $keys as $key ) {
@@ -179,6 +190,18 @@ class BlockListPager extends TablePager {
 
                        case 'ipb_params':
                                $properties = [];
+
+                               if ( $this->getConfig()->get( 'EnablePartialBlocks' ) ) {
+                                       if ( $row->ipb_sitewide ) {
+                                               $properties[] = htmlspecialchars( $msg['blocklist-editing-sitewide'] );
+                                       }
+                               }
+
+                               if ( !$row->ipb_sitewide && $this->restrictions ) {
+                                       $list = $this->getRestrictionListHTML( $this->restrictions, $row );
+                                       $properties[] = htmlspecialchars( $msg['blocklist-editing'] ) . $list;
+                               }
+
                                if ( $row->ipb_anon_only ) {
                                        $properties[] = htmlspecialchars( $msg['anononlyblock'] );
                                }
@@ -197,7 +220,17 @@ class BlockListPager extends TablePager {
                                        $properties[] = htmlspecialchars( $msg['blocklist-nousertalk'] );
                                }
 
-                               $formatted = $language->commaList( $properties );
+                               $formatted = Html::rawElement(
+                                               'ul',
+                                               [],
+                                               implode( '', array_map( function ( $prop ) {
+                                                       return HTML::rawElement(
+                                                               'li',
+                                                               [],
+                                                               $prop
+                                                       );
+                                               }, $properties ) )
+                                       );
                                break;
 
                        default:
@@ -208,6 +241,47 @@ class BlockListPager extends TablePager {
                return $formatted;
        }
 
+       /**
+        * Get Restriction List HTML
+        *
+        * @param Restriction[] $restrictions
+        * @param stdClass $row
+        *
+        * @return string
+        */
+       private static function getRestrictionListHTML(
+               array $restrictions,
+               stdClass $row
+       ) {
+               $items = [];
+
+               foreach ( $restrictions as $restriction ) {
+                       if ( $restriction->getBlockId() !== (int)$row->ipb_id ) {
+                               continue;
+                       }
+
+                       if ( $restriction->getType() !== 'page' ) {
+                               continue;
+                       }
+
+                       $items[] = HTML::rawElement(
+                               'li',
+                               [],
+                               Linker::link( $restriction->getTitle() )
+                       );
+               }
+
+               if ( empty( $items ) ) {
+                       return '';
+               }
+
+               return Html::rawElement(
+                       'ul',
+                       [],
+                       implode( '', $items )
+               );
+       }
+
        function getQueryInfo() {
                $commentQuery = CommentStore::getStore()->getJoin( 'ipb_reason' );
                $actorQuery = ActorMigration::newMigration()->getJoin( 'ipb_by' );
@@ -232,6 +306,7 @@ class BlockListPager extends TablePager {
                                'ipb_deleted',
                                'ipb_block_email',
                                'ipb_allow_usertalk',
+                               'ipb_sitewide',
                        ] + $commentQuery['fields'] + $actorQuery['fields'],
                        'conds' => $this->conds,
                        'join_conds' => [
@@ -296,6 +371,7 @@ class BlockListPager extends TablePager {
                $lb = new LinkBatch;
                $lb->setCaller( __METHOD__ );
 
+               $partialBlocks = [];
                foreach ( $result as $row ) {
                        $lb->add( NS_USER, $row->ipb_address );
                        $lb->add( NS_USER_TALK, $row->ipb_address );
@@ -304,6 +380,16 @@ class BlockListPager extends TablePager {
                                $lb->add( NS_USER, $row->by_user_name );
                                $lb->add( NS_USER_TALK, $row->by_user_name );
                        }
+
+                       if ( !$row->ipb_sitewide ) {
+                               $partialBlocks[] = $row->ipb_id;
+                       }
+               }
+
+               if ( $partialBlocks ) {
+                       // Mutations to the $row object are not persisted. The restrictions will
+                       // need be stored in a separate store.
+                       $this->restrictions = BlockRestriction::loadByBlockId( $partialBlocks );
                }
 
                $lb->execute();
index dcebb60..ea805fb 100644 (file)
@@ -98,11 +98,7 @@ abstract class UploadBase {
                        self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
                        self::FILENAME_TOO_LONG => 'filename-toolong',
                ];
-               if ( isset( $code_to_status[$error] ) ) {
-                       return $code_to_status[$error];
-               }
-
-               return 'unknown-error';
+               return $code_to_status[$error] ?? 'unknown-error';
        }
 
        /**
index 5e5ca1b..43be06e 100644 (file)
@@ -1817,11 +1817,7 @@ class User implements IDBAccessObject, UserIdentity {
         */
        public static function getDefaultOption( $opt ) {
                $defOpts = self::getDefaultOptions();
-               if ( isset( $defOpts[$opt] ) ) {
-                       return $defOpts[$opt];
-               } else {
-                       return null;
-               }
+               return $defOpts[$opt] ?? null;
        }
 
        /**
@@ -2297,21 +2293,22 @@ class User implements IDBAccessObject, UserIdentity {
         * Check if user is blocked from editing a particular article
         *
         * @param Title $title Title to check
-        * @param bool $bFromSlave Whether to check the replica DB instead of the master
+        * @param bool $fromSlave Whether to check the replica DB instead of the master
         * @return bool
         */
-       public function isBlockedFrom( $title, $bFromSlave = false ) {
-               global $wgBlockAllowsUTEdit;
+       public function isBlockedFrom( $title, $fromSlave = false ) {
+               $blocked = $this->isHidden();
 
-               $blocked = $this->isBlocked( $bFromSlave );
-               $allowUsertalk = ( $wgBlockAllowsUTEdit ? $this->mAllowUsertalk : false );
-               // If a user's name is suppressed, they cannot make edits anywhere
-               if ( !$this->mHideName && $allowUsertalk && $title->getText() === $this->getName()
-                       && $title->getNamespace() == NS_USER_TALK ) {
-                       $blocked = false;
-                       wfDebug( __METHOD__ . ": self-talk page, ignoring any blocks\n" );
+               if ( !$blocked ) {
+                       $block = $this->getBlock( $fromSlave );
+                       if ( $block ) {
+                               $blocked = $block->preventsEdit( $title );
+                       }
                }
 
+               // only for the purpose of the hook. We really don't need this here.
+               $allowUsertalk = $this->mAllowUsertalk;
+
                Hooks::run( 'UserIsBlockedFrom', [ $this, $title, &$blocked, &$allowUsertalk ] );
 
                return $blocked;
@@ -2418,7 +2415,7 @@ class User implements IDBAccessObject, UserIdentity {
         */
        public function isHidden() {
                if ( $this->mHideName !== null ) {
-                       return $this->mHideName;
+                       return (bool)$this->mHideName;
                }
                $this->getBlockedStatus();
                if ( !$this->mHideName ) {
@@ -2428,7 +2425,7 @@ class User implements IDBAccessObject, UserIdentity {
                        $this->mHideName = $authUser && $authUser->isHidden();
                        Hooks::run( 'UserIsHidden', [ $this, &$this->mHideName ] );
                }
-               return $this->mHideName;
+               return (bool)$this->mHideName;
        }
 
        /**
@@ -3701,7 +3698,7 @@ class User implements IDBAccessObject, UserIdentity {
 
                        if ( $count === null ) {
                                // it has not been initialized. do so.
-                               $count = $this->initEditCount();
+                               $count = $this->initEditCountInternal();
                        }
                        $this->mEditCount = $count;
                }
@@ -4518,6 +4515,16 @@ class User implements IDBAccessObject, UserIdentity {
                return $this->mBlock && $this->mBlock->prevents( 'sendemail' );
        }
 
+       /**
+        * Get whether the user is blocked from using Special:Upload
+        *
+        * @return bool
+        */
+       public function isBlockedFromUpload() {
+               $this->getBlockedStatus();
+               return $this->mBlock && $this->mBlock->prevents( 'upload' );
+       }
+
        /**
         * Get whether the user is allowed to create an account.
         * @return bool
@@ -5316,73 +5323,36 @@ class User implements IDBAccessObject, UserIdentity {
        }
 
        /**
-        * Deferred version of incEditCountImmediate()
-        *
-        * This function, rather than incEditCountImmediate(), should be used for
-        * most cases as it avoids potential deadlocks caused by concurrent editing.
+        * Schedule a deferred update to update the user's edit count
         */
        public function incEditCount() {
-               wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle(
-                       function () {
-                               $this->incEditCountImmediate();
-                       },
-                       __METHOD__
+               if ( $this->isAnon() ) {
+                       return; // sanity
+               }
+
+               DeferredUpdates::addUpdate(
+                       new UserEditCountUpdate( $this, 1 ),
+                       DeferredUpdates::POSTSEND
                );
        }
 
        /**
-        * Increment the user's edit-count field.
-        * Will have no effect for anonymous users.
-        * @since 1.26
+        * This method should not be called outside User/UserEditCountUpdate
+        *
+        * @param int $count
         */
-       public function incEditCountImmediate() {
-               if ( $this->isAnon() ) {
-                       return;
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-               // No rows will be "affected" if user_editcount is NULL
-               $dbw->update(
-                       'user',
-                       [ 'user_editcount=user_editcount+1' ],
-                       [ 'user_id' => $this->getId(), 'user_editcount IS NOT NULL' ],
-                       __METHOD__
-               );
-               // Lazy initialization check...
-               if ( $dbw->affectedRows() == 0 ) {
-                       // Now here's a goddamn hack...
-                       $dbr = wfGetDB( DB_REPLICA );
-                       if ( $dbr !== $dbw ) {
-                               // If we actually have a replica DB server, the count is
-                               // at least one behind because the current transaction
-                               // has not been committed and replicated.
-                               $this->mEditCount = $this->initEditCount( 1 );
-                       } else {
-                               // But if DB_REPLICA is selecting the master, then the
-                               // count we just read includes the revision that was
-                               // just added in the working transaction.
-                               $this->mEditCount = $this->initEditCount();
-                       }
-               } else {
-                       if ( $this->mEditCount === null ) {
-                               $this->getEditCount();
-                               $dbr = wfGetDB( DB_REPLICA );
-                               $this->mEditCount += ( $dbr !== $dbw ) ? 1 : 0;
-                       } else {
-                               $this->mEditCount++;
-                       }
-               }
-               // Edit count in user cache too
-               $this->invalidateCache();
+       public function setEditCountInternal( $count ) {
+               $this->mEditCount = $count;
        }
 
        /**
         * Initialize user_editcount from data out of the revision table
         *
-        * @param int $add Edits to add to the count from the revision table
+        * This method should not be called outside User/UserEditCountUpdate
+        *
         * @return int Number of edits
         */
-       protected function initEditCount( $add = 0 ) {
+       public function initEditCountInternal() {
                // Pull from a replica DB to be less cruel to servers
                // Accuracy isn't the point anyway here
                $dbr = wfGetDB( DB_REPLICA );
@@ -5395,13 +5365,15 @@ class User implements IDBAccessObject, UserIdentity {
                        [],
                        $actorWhere['joins']
                );
-               $count = $count + $add;
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->update(
                        'user',
                        [ 'user_editcount' => $count ],
-                       [ 'user_id' => $this->getId() ],
+                       [
+                               'user_id' => $this->getId(),
+                               'user_editcount IS NULL OR user_editcount < ' . (int)$count
+                       ],
                        __METHOD__
                );
 
index 0fc45f7..ec8bf5c 100644 (file)
@@ -32,6 +32,7 @@ class MWCryptRand {
         * @return CryptRand
         */
        protected static function singleton() {
+               wfDeprecated( __METHOD__, '1.32' );
                return MediaWikiServices::getInstance()->getCryptRand();
        }
 
@@ -45,6 +46,7 @@ class MWCryptRand {
         * @return bool Always true
         */
        public static function wasStrong() {
+               wfDeprecated( __METHOD__, '1.32' );
                return true;
        }
 
@@ -58,6 +60,7 @@ class MWCryptRand {
         * @return string Raw binary random data
         */
        public static function generate( $bytes ) {
+               wfDeprecated( __METHOD__, '1.32' );
                return random_bytes( floor( $bytes ) );
        }
 
index a20435e..19a3ce5 100644 (file)
@@ -104,11 +104,7 @@ class MWFileProps {
                # NOTE: $gis[2] contains a code for the image type. This is no longer used.
                $info['width'] = $gis[0];
                $info['height'] = $gis[1];
-               if ( isset( $gis['bits'] ) ) {
-                       $info['bits'] = $gis['bits'];
-               } else {
-                       $info['bits'] = 0;
-               }
+               $info['bits'] = $gis['bits'] ?? 0;
 
                return $info;
        }
diff --git a/includes/widget/TitlesMultiselectWidget.php b/includes/widget/TitlesMultiselectWidget.php
new file mode 100644 (file)
index 0000000..95304b0
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+namespace MediaWiki\Widget;
+
+use OOUI\MultilineTextInputWidget;
+
+/**
+ * Widget to select multiple titles.
+ *
+ * @copyright 2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license MIT
+ */
+class TitlesMultiselectWidget extends \OOUI\Widget {
+
+       protected $titlesArray = [];
+       protected $inputName = null;
+       protected $inputPlaceholder = null;
+
+       /**
+        * @param array $config Configuration options
+        *   - array $config['titles'] Array of titles to use as preset data
+        *   - array $config['placeholder'] Placeholder message for input
+        *   - array $config['name'] Name attribute (used in forms)
+        */
+       public function __construct( array $config = [] ) {
+               parent::__construct( $config );
+
+               // Properties
+               if ( isset( $config['default'] ) ) {
+                       $this->titlesArray = $config['default'];
+               }
+               if ( isset( $config['name'] ) ) {
+                       $this->inputName = $config['name'];
+               }
+               if ( isset( $config['placeholder'] ) ) {
+                       $this->inputPlaceholder = $config['placeholder'];
+               }
+
+               $textarea = new MultilineTextInputWidget( [
+                       'name' => $this->inputName,
+                       'value' => implode( "\n", $this->titlesArray ),
+                       'rows' => 10,
+               ] );
+               $this->appendContent( $textarea );
+               $this->addClasses( [ 'mw-widgets-titlesMultiselectWidget' ] );
+       }
+
+       protected function getJavaScriptClassName() {
+               return 'mw.widgets.TitlesMultiselectWidget';
+       }
+
+       public function getConfig( &$config ) {
+               if ( $this->titlesArray !== null ) {
+                       $config['selected'] = $this->titlesArray;
+               }
+               if ( $this->inputName !== null ) {
+                       $config['name'] = $this->inputName;
+               }
+               if ( $this->inputPlaceholder !== null ) {
+                       $config['placeholder'] = $this->inputPlaceholder;
+               }
+
+               $config['$overlay'] = true;
+               return parent::getConfig( $config );
+       }
+
+}
index 79380de..853601e 100644 (file)
@@ -128,11 +128,8 @@ class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
                $interwiki = $this->iwLookup->fetch( $iwPrefix );
                $parsed = wfParseUrl( wfExpandUrl( $interwiki ? $interwiki->getURL() : '/' ) );
 
-               if ( isset( $this->customCaptions[$iwPrefix] ) ) {
-                       $caption = $this->customCaptions[$iwPrefix];
-               } else {
-                       $caption = $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->escaped();
-               }
+               $caption = $this->customCaptions[$iwPrefix] ??
+                       $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->escaped();
 
                $searchLink = Html::rawElement( 'em', null,
                        Html::rawElement( 'a', [ 'href' => $href, 'target' => '_blank' ], $caption )
index dc61519..999d648 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 /**
- * Parser for rules of language conversion , parse rules in -{ }- tag.
+ * Parser for rules of language conversion, parse rules in -{ }- tag.
  * @ingroup Language
  * @author fdcn <fdcn64@gmail.com>, PhiLiP <philip.npc@gmail.com>
  */
@@ -29,13 +29,13 @@ class ConverterRule {
        public $mConverter; // LanguageConverter object
        public $mRuleDisplay = '';
        public $mRuleTitle = false;
-       public $mRules = '';// string : the text of the rules
+       public $mRules = ''; // string : the text of the rules
        public $mRulesAction = 'none';
        public $mFlags = [];
        public $mVariantFlags = [];
        public $mConvTable = [];
-       public $mBidtable = [];// array of the translation in each variant
-       public $mUnidtable = [];// array of the translation in each variant
+       public $mBidtable = []; // array of the translation in each variant
+       public $mUnidtable = []; // array of the translation in each variant
 
        /**
         * @param string $text The text between -{ and }-
index e75ea1a..dad9c6c 100644 (file)
@@ -814,22 +814,6 @@ class Language {
                return self::$dataCache->getItem( $this->mCode, 'datePreferenceMigrationMap' );
        }
 
-       /**
-        * @param string $image
-        * @return array|null
-        */
-       function getImageFile( $image ) {
-               return self::$dataCache->getSubitem( $this->mCode, 'imageFiles', $image );
-       }
-
-       /**
-        * @return array
-        * @since 1.24
-        */
-       public function getImageFiles() {
-               return self::$dataCache->getItem( $this->mCode, 'imageFiles' );
-       }
-
        /**
         * @return array
         */
@@ -4263,14 +4247,17 @@ class Language {
        }
 
        /**
-        * Check if the language has the specific variant
+        * Strict check if the language has the specific variant.
+        *
+        * Compare to LanguageConverter::validateVariant() which does a more
+        * lenient check and attempts to coerce the given code to a valid one.
         *
         * @since 1.19
         * @param string $variant
         * @return bool
         */
        public function hasVariant( $variant ) {
-               return (bool)$this->mConverter->validateVariant( $variant );
+               return $variant && ( $variant === $this->mConverter->validateVariant( $variant ) );
        }
 
        /**
index ea26c64..21902af 100644 (file)
@@ -212,9 +212,13 @@ class LanguageConverter {
        }
 
        /**
-        * Validate the variant
+        * Validate the variant and return an appropriate strict internal
+        * variant code if one exists.  Compare to Language::hasVariant()
+        * which does a strict test.
+        *
         * @param string|null $variant The variant to validate
-        * @return mixed Returns the variant if it is valid, null otherwise
+        * @return mixed Returns an equivalent valid variant code if possible,
+        *   null otherwise
         */
        public function validateVariant( $variant = null ) {
                if ( $variant === null ) {
index df835bd..01f42e1 100644 (file)
        "tog-hideminor": "Peusom neuandam bacut bak neuubah barô",
        "tog-hidepatrolled": "Peusom neuandam teurunda bak neuubah barô",
        "tog-newpageshidepatrolled": "Peusom laman teurunda nibak dapeuta ôn barô",
-       "tog-hidecategorization": "Peusom kawan mieng",
+       "tog-hidecategorization": "Peusom kawan laman",
        "tog-extendwatchlist": "Peuhah dapeuta keunalön keu peuleumah ban dum neuubah, kön nyang barô mantöng",
        "tog-usenewrc": "Peusaho neuandam bak neuleumah neuubah barô ngön dapeuta keunalön meunurôt ôn",
        "tog-numberheadings": "Bôh numbôi nan keudroë",
-       "tog-showtoolbar": "Peuleumah bar alat peusaneut",
        "tog-editondblclick": "Peusaneut laman ngön duwa gö teugön",
        "tog-editsectiononrightclick": "Peujeuët peusaneut bideueng ngön teugön blah uneun bak nan bideueng",
        "tog-watchcreations": "Tamah laman nyang lôn peugöt u dapeuta keunalön",
        "and": "&#32;ngön",
        "faq": "Teunanyöng Umom",
        "actions": "Buët",
-       "namespaces": "Ruweuëng nan",
+       "namespaces": "Ruweueng nan",
        "variants": "Ragam",
        "navigation-heading": "Keumudoe",
        "errorpagetitle": "Seunalah",
        "newpage": "Laman barô",
        "talkpagelinktext": "marit",
        "specialpage": "Laman kusuih",
-       "personaltools": "Peukakaih droë",
+       "personaltools": "Peukakaih droe",
        "talk": "Marit",
        "views": "Leumah",
        "toolbox": "Alat",
        "viewcount": "Laman nyoë ka geusaweuë {{PLURAL:$1|sigo|$sigo}}.<br />",
        "protectedpage": "Laman teupeulindông",
        "jumpto": "Grôp u:",
-       "jumptonavigation": "keumudoë",
+       "jumptonavigation": "keumudoe",
        "jumptosearch": "mita",
        "view-pool-error": "Meu'ah, server teungöh sibôk jinoe\nLe that ureueng nyang meuh'eut jak eu laman nyoe\nNeuprèh si'at yôh goh neubaci lom\n\n$1",
        "generic-pool-error": "Meu'ah, server teungöh peunoh jinoë.\nRamè that ureuëng ngui nyang eu laman nyoë.\nNeuprèh sijamong sigoh neuci lom.",
        "policy-url": "Project:Neuatô",
        "portal": "Meusapat",
        "portal-url": "Project:Meusapat",
-       "privacy": "Jaga rahsia",
-       "privacypage": "Project:Jaga rahsia",
+       "privacy": "Keubijakan rahsia",
+       "privacypage": "Project:Keubijakan rahsia",
        "badaccess": "Salah khut/hak tamöng",
        "badaccess-group0": "Droeneuh hana geupeuidin keu neupeulaku buët nyang neulakèë",
        "badaccess-groups": "Buët nyang neulakèë geupeubatah keu ureuëng ngui lam {{PLURAL:$2|kawan|salah saboh nibak kawan}}: $1.",
        "versionrequired": "Peureulèë MediaWiki vèrsi $1",
        "versionrequiredtext": "MediaWiki versi $1 geupeureulèë keu neungui laman nyoë. Neu'eu [[Special:Version|on versi]]",
        "ok": "Ka göt",
-       "retrievedfrom": "Geurumpok nibak \"$1\"",
+       "retrievedfrom": "Geurumpök nibak \"$1\"",
        "youhavenewmessages": "Droëneuh na $1 ($2).",
        "youhavenewmessagesfromusers": "Droeneuh na $1 nibak {{PLURAL:$3|ureueng nguy la'en|$3 ureueng nguy}} ($2).",
        "youhavenewmessagesmanyusers": "Droeneuh na $1 nibak ureueng nguy la'en ($2)",
        "newmessageslinkplural": "{{PLURAL:$1|saboh peusan barô|999=peusan barô}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|neuubah|999=neuubah}} seuneulheuëh",
        "youhavenewmessagesmulti": "Droëneuh na padum boh peusan barô bak $1",
-       "editsection": "Peusaneut",
+       "editsection": "peusaneut",
        "editold": "peusaneut",
        "viewsourceold": "Eu nè",
        "editlink": "peusaneut",
        "exception-nologin-text": "Droëneuh suwah [[Special:Userlogin|neutamöng]] mangat jeuët neupeuhah laman nyoë",
        "virus-unknownscanner": "Antivirus hana geuturi:",
        "logouttext": "'''Droeneuh ka neutubiet log.'''\n\nBeuneuteupue meunyoe na padum-padum laman nyang deuh lagèe na neutamöng log, sampoe ka lheuh neupeugléh ''cache''.",
-       "cannotlogoutnow-title": "H`an jeuet teubiet log jinoe",
+       "cannotlogoutnow-title": "H'an jeuet teubiet jinoe",
        "welcomeuser": "Seulamat trôk teuka, $1 !",
-       "welcomecreation-msg": "Nan droëneuh ka geupeugöt. \nBèk tuwo neuatô [[Special:Preferences|geunalak {{SITENAME}}]] droëneuh.",
+       "welcomecreation-msg": "Akun-neuh ka geupeugöt. \nDroeneuh jeuet neugantoe {{SITENAME}} [[Special:Preferences|peuatô]] meunyö neumeuh'eut.",
        "yourname": "Ureuëng ngui:",
        "userlogin-yourname": "Ureuëng ngui",
        "userlogin-yourname-ph": "Peutamöng nan ureuëng ngui droëneuh",
        "createacct-yourpasswordagain-ph": "Pasoë lom lageuëm rahsia",
        "userlogin-remembermypassword": "Pubiyeuë lôn tamöng",
        "userlogin-signwithsecure": "Ngui koneksi aman",
-       "cannotlogin-title": "H`an jeuet tamong log",
+       "cannotlogin-title": "H'an jeuet tamöng",
+       "cannotloginnow-title": "H'an jeuet tamöng jinoe",
+       "cannotcreateaccount-title": "H'an jeuet peugöt akun",
        "yourdomainname": "Domain droeneuh:",
        "password-change-forbidden": "Droëneuh h‘an jeuët neuubah lageuëm rahsia bak wiki nyoë.",
-       "externaldberror": "Na seunalah bak peusahèh basis data luwa atawa droëneuh hana geubri idin keu neupeubarô akun luwa droëneuh",
+       "externaldberror": "Na seunalah bak peusahèh basis data luwa atawa droëneuh hana geubri idin keu neupubarô akun luwa droëneuh",
        "login": "Tamöng",
-       "nav-login-createaccount": "Tamöng / dapeuta",
+       "nav-login-createaccount": "Tamöng / peugöt akun",
        "logout": "Teubiët",
        "userlogout": "Teubiët",
-       "notloggedin": "Hana tamöng lom",
-       "userlogin-noaccount": "Goh lom neudapeuta?",
+       "notloggedin": "Goh lom neutamöng",
+       "userlogin-noaccount": "Goh lom na akun?",
        "userlogin-joinproject": "Neugabông ngön {{SITENAME}}",
        "createaccount": "Peudapeuta nan barô",
        "userlogin-resetpassword-link": "Tuwö lageuëm rahsia?",
        "userlogin-helplink2": "Beunantu tamöng log",
        "userlogin-loggedin": "Droëneuh ka neutamöng seubagoë $1. Neungui blangko di yup keu neutamöng seubagoë ureuëng ngui la’én",
-       "userlogin-createanother": "Peudapeuta nan barô",
+       "userlogin-createanother": "Peugöt akun laén",
        "createacct-emailrequired": "Alamat surat-e",
        "createacct-emailoptional": "Alamat surat-e (hana wajéb)",
        "createacct-email-ph": "Neupasoë alamat surat-e droëneuh",
        "createacct-realname": "Nan aseuli (hana wajéb)",
        "createacct-reason": "Alasan:",
        "createacct-reason-ph": "Pakön droëneuh neupeugöt nan ureuëng ngui la’én",
-       "createacct-submit": "Peudapeuta nan barô",
+       "createacct-submit": "Peugöt akun Droeneuh",
        "createacct-another-submit": "Peugöt nan ureuëng ngui la’én",
+       "createacct-continue-submit": "Lanjut pumeugöt akun",
        "createacct-benefit-heading": "{{SITENAME}} geupeugöt lé ureuëng lagèë droëneuh.",
        "createacct-benefit-body1": "{{PLURAL:$1|peusaneut}}",
        "createacct-benefit-body2": "{{PLURAL:$1|$1 halaman}}",
        "badretype": "Lageuëm rahsia nyang neupasoë salah.",
        "userexists": "Nan ureuëng ngui nyang neupasoë ka na soë ngui.\nNeupiléh nan nyang la'én.",
        "loginerror": "Salah bak tamöng",
-       "createacct-error": "Peudapeuta nan barô hana meuhasé",
-       "createaccounterror": "H‘an jeuët peudapeuta nan: $1",
+       "createacct-error": "Pumeugöt akun hana meuhasé",
+       "createaccounterror": "H'an jeuet peugöt akun: $1",
        "nocookiesnew": "Nan ureueng ngui nyoe ka meupeugöt, tapi goh meutamöng.\n{{SITENAME}} jingui ''cookies'' keu peutamöng ureueng ngui.\n''Cookies'' droeneuh hana meupeuudép.\nNeupeuudép ''cookies'' dilèe, lheuh nyan neutamöng ngön nan ureueng ngui ngön lageuem rahsia droeneuh.",
        "noname": "Nan ureuëng ngui nyang Droënueh peutamöng hana sah.",
        "loginsuccesstitle": "Meuhasé tamöng log",
        "loginsuccess": "'''Droëneuh  jinoë ka neutamöng di {{SITENAME}} sibagoë \"$1\".'''",
-       "nosuchuser": "Hana ureuëng ngui ngön nan \"$1\".\nHaraih rayek ngön haraih ubeut na peungarôh.\nTulông neuparéksa keulayi ijaan-neuh, atawa [[Special:CreateAccount|neudapeuta barô]].",
+       "nosuchuser": "Hana ureuëng ngui ngön nan \"$1\".\nHaraih rayek ngön haraih ubeut na peungarôh.\nNeuparéksa ijaan-neuh, atawa [[Special:CreateAccount|neupeugöt akun]].",
        "nosuchusershort": "Hana ureuëng ngui ngön nan \"$1\".\nPréksa keulayi neu’ija Droëneuh.",
        "nouserspecified": "Neupasoë nan Droëneuh.",
        "login-userblocked": "Ureuëng ngui nyoë ka teublokir, hana idin/hanjeut tamöng.",
        "noemail": "Hana alamat surat-e nyang teucatat keu ureuëng ngui \"$1\".",
        "noemailcreate": "Droeneuh suwah neuseudia alamt surat-e nyang jeut ngui.",
        "passwordsent": "Lageuëm barô ka geupeu'et u surat-e nyang geupeudapeuta keu \"$1\". Neutamöng teuma lheuëh neuteurimöng surat-e nyan.",
-       "eauthentsent": "Saboh surat-e keu peunyö ka geukirém u alamat surat-e Droëneuh. Droëneuh beuneuseutöt préntah lam surat nyan keu neupeunyö meunyö alamat nyan nakeuh beutôi atra Droëneuh. {{SITENAME}} h‘an geupeuudép surat Droëneuh meunyö langkah nyoë hana neupeubuet lom.",
+       "eauthentsent": "Saboh surat-e keu peusahèh ka geupeuét u alamat surat-e neuh. Sigohlom surat-e laén geupeuét u akun, Droëneuh beu neuseutöt préntah lam surat nyan, keu neupeusahèh meunyö akun nyan keubit atra Droeneuh.",
        "cannotchangeemail": "Alamat surat-e han jeut geugantoe bak wiki nyoe.",
        "emaildisabled": "Situs nyoe han jeut geukirém surat-e.",
-       "accountcreated": "Ureuëng ngui ka teupeugöt",
-       "accountcreatedtext": "Ureuëng ngui keu [[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|talk]]) ka teupeugöt.",
+       "accountcreated": "Akun ka geupeugöt",
+       "accountcreatedtext": "Akun ureuëng ngui keu [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|marit]]) ka geupeugöt.",
        "createaccount-title": "Peugöt ureuëng ngui keu {{SITENAME}}",
        "login-throttled": "Droeneuh ka lé that neuujoe tamöng.\nNeuprèh $1 sigohlom neuujoe lom.",
        "login-abort-generic": "Log tamöng droëneuh han meuhasé- Ngon ka geupeubateuë.",
        "user-mail-no-body": "Droëneuh ka neucuba kirém e-surat soh ngon that paneuk",
        "changepassword": "Gantoe lageuem rahsia",
        "resetpass_announce": "Keu neutamöng log, droëneuh suwah neupeugöt lageuëm rahsia barô",
-       "resetpass_header": "Gantoë lageuëm rahsia nan ureuëng ngui",
+       "resetpass_header": "Gantoë lageuëm rahsia akun",
        "oldpassword": "Lageuëm rahsia awai:",
        "newpassword": "Lageuëm rahsia barô:",
        "retypenew": "Pasoë lom lageuëm barô:",
        "blockedtitle": "Ureueng ngui geutheun",
        "blockedtext": "<strong>Nan ureueng ngui atawa alamat IP Droeneuh ka geutheun.</strong>\n\nTeuneuheuen geupeugöt lé $1. \nAlasan nyang geubri nakeuh <em>$2</em>.\n\n* Phôn mula geutheun: $8\n* Maté tanggai teuneuheun: $6\n* Ureueng nyang geutheun: $7\n\nDroeneuh jeuet neutanyöng bak $1 atawa [[{{MediaWiki:Grouppage-sysop}}|ureueng urôih]] nyang la’én bhaih teuneuheun nyoe.\nDroeneuh h`an jeuet neungui alat \"{{int:emailuser}}\" keucuali meunyo alamat surat-e nyang sah na neupasoe bak [[Special:Preferences|Neuatô akun]] ngön Droeneuh hana geutheun keu neungui atra nyan.\nAlamat IP Droeneuh jinoe nakeuh $3, ngön ID teuneuheun nakeuh $5.\nNeutulông pasoe ban dum keutrangan di ateueh lam tiep teunanyöng nyang neupeugöt.",
        "autoblockedtext": "'''Nan ureuëng nguy atawa alamat IP Droëneuh  ka geutheun.'''\n\nGeutheun lé $1. Dalèh jih nakeuh ''$2''.\n\n* Geutheun yôh: $8\n* Neutheun maté tanggay bak: $6\n* Nyang geutheun: $7\n\nDroëneuh   jeuët neutanyong bak $1 atawa [[{{MediaWiki:Grouppage-sysop}}|nyang urôh nyang la’én]] keu peugah haba bhah nyoë.\n\nDroëneuh   h’an jeuët neunguy alat 'Kirém surat-e ureuëng nguy nyoë' keucuali ka neupasoë alamat surat-e nyang sah di [[Special:Preferences|Geunalak]] Droëneuh ngön Droëneuh ka geutheun keu nguy nyan.\n\nAlamat IP Droëneuh nakeuh $3, ngön ID neutheun nakeuh $5. Tulông peuseureuta salah saboh atawa ban duwa beurita nyoë bak tiëp teunanyöng nyang neupeugöt.",
-       "blockednoreason": "hana dalèh nyang geubri",
+       "blockednoreason": "hana alasan nyang geubri",
        "whitelistedittext": "Droeneuh suwah $1 keu neuandam ôn.",
        "nosuchsectiontitle": "Bideueng hana geutumèe",
        "loginreqtitle": "Droeneuh payah neutamöng log.",
        "template-protected": "(geulindông)",
        "template-semiprotected": "(siteungoh-lindông)",
        "hiddencategories": "Laman nyoë nakeuh anggèëta nibak {{PLURAL:$1|1 kawan teusom |$1 kawan teusom}}:",
-       "nocreatetext": "{{SITENAME}} ka jitham bak pumeugöt laman barô. \nDroëneuh jeuët neuriwang ngön neupeusaneut laman nyang ka na, atawa [[Special:UserLogin|neutamong log atawa neupeugöt akun]].",
+       "nocreatetext": "{{SITENAME}} ka jitham bak pumeugöt laman barô. \nDroëneuh jeuët neuriwang ngön neupeusaneut laman nyang ka na, atawa [[Special:UserLogin|neutamöng atawa neudapeuta]].",
        "nocreate-loggedin": "Droeneuh hana khut keu neupeugöt laman-laman barô.",
        "sectioneditnotsupported-title": "Peusaneut bideueng hana geudukông",
        "sectioneditnotsupported-text": "Peusaneut bideueng hana geudukông bak laman nyoe.",
        "preferences": "Galak",
        "mypreferences": "Atô",
        "prefs-edits": "Jumeulah neuandam:",
+       "prefsnologintext2": "Neutamöng mangat jeuet neugantoe peuatô",
        "prefs-skin": "Kulét",
        "skin-preview": "Eu dilèe",
        "datedefault": "Hana geunalak",
        "prefs-personal": "Profil ureueng ngui",
        "prefs-rc": "Neuubah barô",
        "prefs-watchlist": "Dapeuta keunalön",
-       "prefs-watchlist-days": "Jumeulah uroe nyang meupeudeuh bak dapeuta keunalön:",
-       "prefs-watchlist-days-max": "{{PLURAL:$1|uroë}}",
+       "prefs-watchlist-days": "Jumeulah uroe nyang geupeuleumah lam dapeuta keunalön:",
+       "prefs-watchlist-days-max": "Paléng le {{PLURAL:$1|uroë}}",
        "prefs-misc": "La'én-la'én",
        "prefs-resetpass": "Gantoe lageuem rahsia",
        "prefs-changeemail": "Gantoe atawa böh alamat surat-e",
        "userrights-editusergroup": "Ubah kawan ureueng ngui",
        "saveusergroups": "Ubah kawan ureueng ngui",
        "userrights-groupsmember": "Anggèeta nibak:",
-       "userrights-reason": "Dalèh:",
+       "userrights-reason": "Alasan:",
        "userrights-no-interwiki": "Droeneuh hana izin keu neuubah khut ureueng ngui bak wiki la'én.",
        "userrights-changeable-col": "Kawan nyang jeut neugantoe",
        "userrights-unchangeable-col": "Kawan nyang han jeut neugantoe",
+       "userrights-expiry-options": "siuroe:1 day,sigo jumeu'at:1 week,sibuleuen:1 month,3 buleuen:3 months,6 buleuen:6 months,sithôn:1 year",
        "group": "Kawan:",
        "group-user": "Ureueng-ureueng ngui",
        "group-autoconfirmed": "Ureueng ngui nyang meu-konfirmasi otomatis",
        "right-createtalk": "Peugöt ôn marit",
        "right-createaccount": "Peugöt nan ureueng ngui barô",
        "right-minoredit": "Peutanda seubagoe peusaneut ubeut",
-       "right-move": "Pinah laman",
+       "right-move": "Pupinah laman",
        "right-move-subpages": "Pinah laman ngön ban dum aneuk laman",
        "right-move-rootuserpages": "Pinah laman ureueng ngui",
        "right-movefile": "Pinah beureukaih",
        "right-delete": "Sampôh laman",
        "right-bigdelete": "Sampôh laman ngön ban dum riwayatjih",
        "right-browsearchive": "Mita laman nyang geusampôh",
+       "grant-createeditmovepage": "Peugöt, peusaneut, ngön pupinah laman",
        "newuserlogpage": "Ureuëng ngui barô",
        "rightslog": "Log neuubah hak peuhah",
        "action-read": "beuët laman nyoe",
        "rcfilters-date-popup-title": "Watèe nyang neumita",
        "rcfilters-days-title": "Uroe seuneulheueh",
        "rcfilters-hours-title": "Jeum seuneulheueh",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|uroe}}",
        "rcfilters-quickfilters": "Seunaréng teukeubah",
        "rcfilters-savedqueries-defaultlabel": "Seunaréng teukeubah",
        "rcfilters-show-new-changes": "Peuleumah neuubah barô",
        "rcfilters-filter-pageedits-label": "Peusaneut laman",
        "rcfilters-filter-newpages-label": "Peugöt laman",
        "rcfilters-filter-logactions-label": "Buet teucètèt",
-       "rcfilters-liveupdates-button": "Neuubah langsông",
+       "rcfilters-liveupdates-button": "Ban meuubah",
        "rcnotefrom": "Di yup nyoe nakeuh {{PLURAL:$5|neuubah}} yôh <strong>$3, $4</strong> (trôk 'an <strong>$1</strong> geupeuleumah).",
        "rclistfrom": "Peuleumah neuubah barô yôh $3 $2 kön",
        "rcshowhideminor": "$1 peusaneut bacut",
        "filepage-nofile": "Hana beureukaih ngön nan nyoe",
        "uploadnewversion-linktext": "Peulöt seunalén nyang leubèh barô nibak beureukah nyoë.",
        "upload-disallowed-here": "Droëneuh h'an jeuët neutimpa beureukaih nyoë",
+       "filerevert-comment": "Alasan:",
+       "filedelete-comment": "Alasan:",
+       "filedelete-otherreason": "Alasan laén/teunamah:",
        "mimesearch": "Mita MIME",
        "listredirects": "Dapeuta peuninah",
        "unusedtemplates": "Templat nyang hana geungui",
        "deadendpages": "Laman buntu",
        "protectedpages": "Laman nyang geulindông",
        "protectedpages-noredirect": "Peusom peuninah",
+       "protectedpages-reason": "Alasan",
        "listusers": "Dapeuta ureuëng ngui",
        "usercreated": "{{GENDER:$3|Geupeugot}} bak $1 poh $2",
        "newpages": "Laman barô",
        "watchlist-options": "Peuniléh dapeuta kalön",
        "watching": "Kalön...",
        "unwatching": "Hana kalön...",
+       "enotif_reset": "Bôh tanda ban dum laman kalheuh meusaweue",
        "deletepage": "Sampôh laman",
        "historywarning": "'''Peuneugah:''' Laman nyang keumeung neusampôh na riwayat ngön kureuëng leubèh $1 {{PLURAL:$1|geunantoë}}:",
        "confirmdeletetext": "Droëneuh neuk neusampôh laman atawa beureukaih nyoë keu sabé. Meunan cit ban mandum riwayatjih nibak basis data. Neupeupaseuti meunyo Droëneuh cit keubiët meung neusampôh, neutupeuë ban mandum akébatjih, ngön peuë nyang neupeulaku nyoë nakeuh meunurôt [[{{MediaWiki:Policy-url}}|kebijakan{{SITENAME}}]].",
        "actionfailed": "Hana meuhasé",
        "deletedtext": "\"$1\" ka geusampôh. Eu $2 keu log paléng barô bak laman nyang ka geusampôh.",
        "dellogpage": "Log seunampôh",
-       "deletecomment": "Choë:",
-       "deleteotherreason": "Nyang la’én/choë la’én:",
-       "deletereasonotherlist": "Choë la’én",
+       "deletecomment": "Alasan:",
+       "deleteotherreason": "Nyang laén/alasan laén:",
+       "deletereasonotherlist": "Alasan laén",
        "rollbacklink": "pulang",
        "rollbacklinkcount": "peuriwang $1 {{PLURAL:$1|hase peusaneut}}",
+       "changecontentmodel-reason-label": "Alasan:",
        "changecontentmodel-submit": "Gantoe",
        "protectlogpage": "Log lindông",
        "protectedarticle": "peulindông \"[[$1]]\"",
        "modifiedarticleprotection": "Ubah tingkat lindông \"[[$1]]\"",
        "prot_1movedto2": "peupinah [[$1]] u [[$2]]",
-       "protectcomment": "Choë:",
+       "protectcomment": "Alasan:",
        "protectexpiry": "Maté tanggay:",
        "protect_expiry_invalid": "Watèë maté tanggay hana sah.",
        "protect_expiry_old": "Watèë maté tanggay nakeuh bak masa u likôt.",
        "protect-expiry-indefinite": "sabé",
        "protect-cascade": "Peulindông ban mandum ôn nyang rôh lam ôn nyoë (lindông meuturôt).",
        "protect-cantedit": "Droëneuh h‘an jeuët neu’ubah tingkat lindông ôn nyoë kareuna Droëneuh hana hak keu neupeulaku nyan.",
+       "protect-otherreason": "Alasan laén/teunamah:",
        "protect-expiry-options": "1 jeum:1 hour,1 uroë:1 day,1 minggu:1 week,2 minggu:2 weeks,1 buleuën:1 month,3 buleuën:3 months,6 buleuën:6 months,1 thôn:1 year,sabé:infinite",
        "restriction-type": "Lindông:",
        "restriction-level": "Tingkat:",
        "undeletebtn": "Peuriwang!",
        "undeletelink": "eu/peuriwang",
        "undeleteviewlink": "eu",
+       "undeletecomment": "Alasan:",
        "undelete-search-submit": "Mita",
        "namespace": "Ruweuëng nan:",
        "invert": "Peubalék peuniléh",
        "whatlinkshere-hideimages": "$1 peunawôt beureukaih",
        "whatlinkshere-filters": "Saréng",
        "blockip": "Theun ureuëng ngui",
+       "ipbreason": "Alasan:",
        "ipboptions": "2 jeum:2 hours,1 uroë:1 day,3 uroë:3 days,1 minggu:1 week,2 minggu:2 weeks,1 buleuën:1 month,3 buleuën:3 months,6 buleuën:6 months,1 thôn:1 year,sabé:infinite",
        "ipbhidename": "Peusom nan ureueng ngui nibak hasé peusaneut ngön dapeuta",
        "ipblocklist": "Ureuëng ngui teutheun",
+       "blocklist-reason": "Alasan",
        "ipblocklist-submit": "Mita",
        "infiniteblock": "hana bataih",
        "blocklink": "theun",
        "contribslink": "beuneuri",
        "blocklogpage": "Log peutheun",
        "blocklogentry": "theun [[$1]] ngön watèë maté tanggay $2 $3",
+       "reblock-logentry": "geuubah peuatô teuneutham keu [[$1]] ngön watèe abéh $2 $3",
        "unblocklogentry": "peugadöh theun \"$1\"",
        "block-log-flags-nocreate": "pumeugöt akun geupumaté",
        "proxyblocker": "Ngön theun proxy",
+       "move-page-legend": "Pupinah laman",
        "movepagetext": "Formulir di yup nyoë geunguy keu jak ubah nan saboh ôn ngön jak peupinah ban dum data riwayat u nan barô. Nan nyang trép euntreuk jeuët keu ôn peupinah u nan nyang barô. Hubông u nan trép hana meu’ubah. Neupeupaseuti keu neupréksa peuninah ôn nyang reulöh atawa meuganda lheuëh neupinah. Droëneuh nyang mat tanggông jaweuëb keu neupeupaseuti meunyo hubông laju teusambông u ôn nyang patôt.\n\nBeu neuingat that meunyo ôn '''h’an''' jan geupeupinah meunyo ka na ôn nyang geunguy nan barô, keucuali meunyo ôn nyan soh atawa nakeuh ôn peuninah ngön hana riwayat andam. Nyoë areutijih Droëneuh jeuët neu’ubah nan ôn keulayi lagèë söt meunyo Droëneuh neupeugöt seunalah, ngön Droëneuh h‘an jeuët neutimpa ôn nyang ka na.\n'''INGAT'''\nNyoë jeuët geupeuakébat neu’ubah nyang h’an neuduga ngön kreuëh ngön bacah keu ôn nyang meuceuhu. Neupeupaseuti Droëneuh meuphôm akébat nibak buët nyoë sigohlom neulanjut.",
        "movepagetalktext": "Ôn peugah haba nyang na hubôngan euntreuk teupinah keudroë '''keucuali meunyo:'''\n\n*Saboh ôn peugah haba nyang hana soh ka na di yup nan barô, atawa\n*Droëneuh hana neubôh tanda cunténg bak kutak di yup nyoë\n\nLam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugabông ôn keudroë.",
+       "movenotallowed": "Droeneuh hana idin keu neupinah laman",
        "newtitle": "Nan barô:",
        "move-watch": "Kalön laman nyoë",
-       "movepagebtn": "Peupinah laman",
+       "movepagebtn": "Pupinah laman",
        "pagemovedsub": "Peupinah meuhasé",
        "movepage-moved": "'''\"$1\" ka geupeupinah u \"$2\".'''",
        "articleexists": "Ôn ngön nan nyan ka na atawa nan nyang neupiléh hana sah. Neupiléh nan la’én.",
        "movelogpage": "Log pinah",
        "movereason": "Choë:",
        "revertmove": "peuriwang",
+       "immobile-source-namespace": "H'an jeuet pupinah laman lam ruweueng nan \"$1\".",
+       "immobile-target-namespace": "H'an jeuet pupinah laman lam ruweueng nan \"$1\".",
        "export": "Èkspor laman",
        "allmessages": "Peusan sistem",
        "allmessagesname": "Nan",
        "pageinfo-watchers": "Jumeulah ureueng kalön laman",
        "pageinfo-redirects-name": "Jumeulah peuninah u laman nyoe",
        "pageinfo-subpages-name": "Jeumeulah aneuk laman nibak laman nyoe",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|peuninah}}; $3 {{PLURAL:$3|kön-peuninah}})",
        "pageinfo-firstuser": "Ureueng peugöt laman",
        "pageinfo-firsttime": "Uroe buleuen pumeugot laman",
        "pageinfo-lastuser": "Ureueng peusaneut seuneulheueh",
        "pageinfo-edits": "Jumeulah hasé peusaneut ban dum",
        "pageinfo-authors": "Jumeulah ban dum ureueng teumuléh nyang mubida",
        "pageinfo-recent-edits": "Jumeulah peusaneut ban-ban nyoe (lam $1 nyoe)",
+       "pageinfo-magic-words": "{{PLURAL:$1|Narit}} ajaéb ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Kawan}} teusom ($1)",
        "pageinfo-toolboxlink": "Keutrangan laman",
        "pageinfo-contentpage-yes": "Nyo",
        "patrol-log-page": "Log patroli",
        "previousdiff": "← Bida awai",
        "nextdiff": "Geunantoë lheuëh nyan →",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|laman}}",
        "file-info-size": "$1 × $2 piksel, rayek beureukaih: $3, MIME jeunèh: $4",
        "file-info-size-pages": "$1 × $2 piksel, seunipat beureukaih: $3, jeunèh MIME: $4, $5 {{PLURAL:$5|laman}}",
        "file-nohires": "Hana resolusi nyang leubèh manyang.",
        "tags-active-yes": "Nyo",
        "tags-active-no": "H`an",
        "tags-hitcount": "$1 {{PLURAL:$1|neuubah}}",
+       "tags-create-reason": "Alasan:",
+       "tags-delete-reason": "Alasan:",
+       "tags-activate-reason": "Alasan:",
+       "tags-deactivate-reason": "Alasan:",
+       "tags-edit-reason": "Alasan:",
        "logentry-delete-delete": "$1 {{GENDER:$2|geusampôh}} laman $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|geupeuriwang}} laman $3 ($4)",
        "revdelete-content-hid": "asoe geusom",
        "logentry-move-move": "$1 {{GENDER:$2|geupinah}} laman $3 u $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|geupinah}} laman $3 u $4 hana geubôh peuninah",
        "duration-years": "{{PLURAL:$1|thôn}}",
        "duration-decades": "{{PLURAL:$1|dekade}}",
        "duration-centuries": "{{PLURAL:$1|abad}}",
-       "duration-millennia": "{{PLURAL:$1|milenium}}"
+       "duration-millennia": "{{PLURAL:$1|milenium}}",
+       "pagelang-reason": "Alasan"
 }
index 44f8a03..1540601 100644 (file)
@@ -23,7 +23,6 @@
        "tog-extendwatchlist": "КӀэлъыплъэ тхылъыр зэхэщ зэхъокӀ пстэур плъэгъунэу, бэмышӀхэм ямызакъоу",
        "tog-usenewrc": "БэмышI зэхъокIхэм ыкIи лъыплъэ купым щыщ зэхъокIхэр куп-купэу гъэзаф",
        "tog-numberheadings": "Аутоматэу цӀэшъхьаӀхэм номер ятын",
-       "tog-showtoolbar": "Къэгъэлъагъу еIэзэн Ӏэмэ-псымэхэр",
        "tog-editondblclick": "ТIо-теIункIэмкIэ нэкIубгъомэ яIаз",
        "tog-editsectiononrightclick": "Жъабгъу тIо-теIункIэмкIэ уеIэзэшъунэу къэшI",
        "tog-watchcreations": "СшIыгъэ нэкIубгъохэр ыкIи ислъхьэгъэ файлэхэр си лъыплъэ купым хэгъахъу",
index 2c68200..b5c162c 100644 (file)
@@ -15,7 +15,6 @@
                ]
        },
        "tog-usenewrc": ")جمّع التعديلات حسب الصفحة في أحدث التغييرات وقائمة المراقبة (يتطلب جافاسكربت",
-       "tog-showtoolbar": "أظهر شريط التحرير (يتطلب جافاسكربت)",
        "tog-editondblclick": "عدل الصفحات عند الضغط المزدوج (جافاسكربت)",
        "tog-editsectiononrightclick": "فعل تعديل الأقسام بواسطة كبسة الفأرة اليمين على عناوين الأقسام (جافاسكريبت)",
        "tog-fancysig": "عامل التوقيع كنص ويكي (بدون وصلة أوتوماتيكية)",
index ab0aa58..519d682 100644 (file)
@@ -38,7 +38,6 @@
        "tog-extendwatchlist": "Brei dophoulys uit om alle wysigings te wys, nie slegs die nuutste nie",
        "tog-usenewrc": "Groepeer wysigings per bladsy in onlangse wysigings en dophoulys",
        "tog-numberheadings": "Nommer opskrifte outomaties",
-       "tog-showtoolbar": "Wys redigeringsnutsbalk",
        "tog-editondblclick": "Dubbelklik om te redigeer",
        "tog-editsectiononrightclick": "Wysig afdeling met 'n regskliek op die afdeling se titel",
        "tog-watchcreations": "Voeg bladsye wat ek skep en lêers wat ek oplaai by my dophoulys",
index b00e768..d758d5b 100644 (file)
@@ -15,7 +15,6 @@
        "tog-extendwatchlist": "micuwat miazihay a piazihan-tu-sulit paazih yamalyilu capi demiad zumaay a sacahamin sumad",
        "tog-usenewrc": "kilul capi demiad misumad atu miazihay a piazihan-tu-sulit a kasabelih  kakuniza paazih ku masumaday",
        "tog-numberheadings": "satangahan lunuk pabanggu",
-       "tog-showtoolbar": "paazih mikawaway-kalumyiti sakaluk tusil",
        "tog-editondblclick": "sapecec sakatusa hawsa mikawaway-kalumyiti kasabelih",
        "tog-editsectiononrightclick": "miwawah hwasu kawanan-penec sapecec tusil satangahan mikawaway-kalumyiti",
        "tog-watchcreations": "amipatizeng kasabelih nu maku atu patapabaw a tangan pacunus miazihay a piazihan-tu-sulit",
index 24a6f97..6d111fc 100644 (file)
@@ -19,7 +19,6 @@
        "tog-extendwatchlist": "Zgjâno listën e mbikëqyrjeve që me i pa tâna ndryshimet, jo veç ato mâ të fresktat",
        "tog-usenewrc": "Përdor ndryshimet e freskëta me vegla të përparueme (lyp JavaScript)",
        "tog-numberheadings": "Numëro automatikisht mbititujt",
-       "tog-showtoolbar": "Trego butonat për redaktim (JavaScript)",
        "tog-editondblclick": "Redakto faqet me klikim të dyfishtë (JavaScript)",
        "tog-editsectiononrightclick": "Lejo redaktimin e seksioneve tue klikue me të djathtë mbi titull (JavaScript)",
        "tog-watchcreations": "Shtoji në listë mbikëqyrëse faqet që i krijoj vetë",
index 0612ee9..09f0d0c 100644 (file)
@@ -23,7 +23,6 @@
        "tog-extendwatchlist": "የሚደረጉ ለውጦችን ለማሳየት መቆጣጠሪያ-ዝርዝርን ዘርጋ",
        "tog-usenewrc": "የተሻሻሉ የቅርብ ጊዜ ለውጦች ተጠቀም (JavaScript ያስፈልጋል)",
        "tog-numberheadings": "አርዕስቶችን በራስገዝ ቁጥር ስጥ",
-       "tog-showtoolbar": "«አርም» ትዕዛዝ-መስጫ ይታይ (JavaScript)",
        "tog-editondblclick": "ሁለቴ መጫን ገጹን ማረም ያስችል (JavaScript ያስፈልጋል)",
        "tog-editsectiononrightclick": "የክፍል አርዕስት ላይ በቀኝ በመጫን ክፍል ማረምን አስችል (JavaScript)",
        "tog-watchcreations": "እኔ የምፈጥራቸውን ገጾችና የምልካቸውን ፋይሎች ወደምከታተላቸው ገጾች ዝርዝር ውስጥ ጨምር",
index e52509e..ff8bf7b 100644 (file)
@@ -27,7 +27,6 @@
        "tog-extendwatchlist": "Expandir a lista de seguimiento t'amostrar totz os cambeos, no nomás os más recients.",
        "tog-usenewrc": "Zaguers cambeos con presentación amillorada (cal JavaScript)",
        "tog-numberheadings": "Numerar automaticament os encabezaus",
-       "tog-showtoolbar": "Amostrar a barra d'edición",
        "tog-editondblclick": "Editar pachinas fendo-ie doble click",
        "tog-editsectiononrightclick": "Activar a edición de seccions punchando con o botón dreito d'o ratet en os títols de seccions",
        "tog-watchcreations": "Cosirar as pachinas que creye",
index f0fe020..a716930 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "Sprǣdan behealdungtæl tō īwenne ealla andwendinga, nā synderlīce þā nīwostan",
        "tog-usenewrc": "Settan andwendunga on hēapas on trametum on nīwra andwendunga getæle and behealdungtæle",
        "tog-numberheadings": "Settan rīm on forecwidas selflīce",
-       "tog-showtoolbar": "Īwan þā adihtunge tōlmearce",
        "tog-editondblclick": "Adihtan trametas mid twifealdum mȳs swenge",
        "tog-editsectiononrightclick": "Þafian dǣla adihtunge þurh swīðran healfe mȳs swengas on dǣla titulum",
        "tog-watchcreations": "Ēacnian mīn behealdungtæl mid trametum þā ic scieppe and ymelum þā ic hlade on nett.",
index 5578f49..9154182 100644 (file)
@@ -17,7 +17,6 @@
        "tog-extendwatchlist": "ध्यान सूची मॆं सब्भे बदलाव दर्शाबॊ, सिर्फ हाले के नै",
        "tog-usenewrc": "हाल मं॑ होलऽ परिवर्तनऽ आरू ध्यानसूची मं॑ परिवर्तनऽ क॑ पृष्ठ अनुसार समूहऽ मं॑ बाँटऽ",
        "tog-numberheadings": "शीर्षक स्वयं-क्रमांकित करॊ",
-       "tog-showtoolbar": "सम्पादन उपकरण पट्टी दिखाबऽ",
        "tog-editondblclick": "दू-बार क्लीक करी क॑ पन्ना संपादित करऽ (जावास्क्रीप्ट)",
        "tog-editsectiononrightclick": "अनुभाग शीर्षक पर दायाँ क्लिक करला पर अनुभाग सम्पादित करऽ",
        "tog-watchcreations": "हमरऽ तैयार करलऽ पन्ना आरू हमरऽ अपलोड करलऽ फाइल सब क॑ हमरऽ ध्यानसूची मं॑ जोड़ऽ",
index 346135c..3a4810f 100644 (file)
@@ -87,7 +87,6 @@
        "tog-extendwatchlist": "وسع قائمة المراقبة لتعرض كل التغييرات، وليس أحدثها فقط",
        "tog-usenewrc": "طي التغييرات حسب الصفحة في أحدث التغييرات وقائمة المراقبة",
        "tog-numberheadings": "ترقيم العناوين تلقائيا",
-       "tog-showtoolbar": "إظهار شريط التحرير",
        "tog-editondblclick": "تعديل الصفحات بالنقر المزدوج",
        "tog-editsectiononrightclick": "تفعيل تعديل الأقسام بالنقر باليمين على عناوين الأقسام",
        "tog-watchcreations": "أضف الصفحات التي أنشئها والملفات التي أرفعها إلى قائمة مراقبتي.",
        "subject-preview": "معاينة الموضوع:",
        "previewerrortext": "حدث خطأ أثناء محاولة معاينة تغييراتك.",
        "blockedtitle": "المستخدم ممنوع",
+       "blocked-email-user": "<strong>م منع اسم المستخدم الخاص بك من إرسال البريد الإلكتروني، لا يزال بإمكانك تحرير صفحات أخرى على هذا الويكي،</strong> يمكنك عرض تفاصيل المنع بالكامل في [[Special:MyContributions|مساهمات الحساب]].\n\nتم المنع بواسطة  $1.\n\nالسبب المعطى هو <em>$2</em>.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n* معرف المنع #$5",
+       "blockedtext-partial": "<strong>تم منع اسم المستخدم أو عنوان الآيبي الخاص بك من إجراء تغييرات على هذه الصفحة، لا يزال بإمكانك تعديل صفحات أخرى على هذا الويكي،</strong> يمكنك عرض تفاصيل المنع بالكامل في [[Special:MyContributions|مساهمات الحساب]].\n\nتم المنع بواسطة  $1.\n\nالسبب المعطى هو <em>$2</em>.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n* معرف المنع #$5",
        "blockedtext": "'''اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه.'''\n\nقام بالمنع $1.\nسبب المنع هو: ''$2''.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك الاتصال ب$1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] للنقاش حول المنع.\nلا يمكنك استخدام خاصية \"{{int:emailuser}}\" إلا إذا كنت قد وضعت عنوان بريدي صحيح في [[Special:Preferences|تفضيلات حسابك]] ولم يتم منعك من استخدامها.\nعنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
        "autoblockedtext": "مُنِع عنوان آيبيك تلقائيا لأن مستخدما آخرا منعه $1 استخدمه.\nالسبب المعطى هو التالي:\n\n:<em>$2</em>\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك أن تتصل ب $1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] الآخرين لمناقشة المنع.\n\nلاحظ أنه لا يمكنك استخدام خاصية \"إرسال رسالة لهذا المستخدم\" إلا لو كان لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]] ولم يتم منعك من استخدامه.\n\nعنوان آيبيك الحالي $3، ورقم المنع #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
        "systemblockedtext": "اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه تلقائيا بواسطة ميدياويكي.\nالسبب المعطى هو:\n\n:<em>$2</em>\n\n* بداية المنع: $8\n* نهاية المنع: $6\n* المقصود بالمنع: $7\n\nعنوان الأيبي الحالي الخاص بك هو $3.\nمن فضلك ضمن كل التفاصيل بالأعلى في أي استعلام تقوم به.",
        "mergehistory-go": "عرض التعديلات القابلة للدمج",
        "mergehistory-submit": "دمج المراجعات",
        "mergehistory-empty": "لا مراجعات يمكن دمجها.",
-       "mergehistory-done": "$3 {{PLURAL:$3|مراجعة}} من $1{{PLURAL:$3|كان|اين}} تم دمجها بنجاح في [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|مراجعة|مراجعات}} من $1 {{PLURAL:$3|تم}} دمجها في [[:$2]].",
        "mergehistory-fail": "غير قادر على عمل دمج التاريخ، من فضلك أعد التحقق من محددات الصفحة والزمن.",
        "mergehistory-fail-bad-timestamp": "الختم الزمني غير صالح.",
        "mergehistory-fail-invalid-source": "الصفحة المصدر غير صالحة.",
        "ipb-disableusertalk": "امنع هذا المستخدم من تعديل صفحة نقاشه ما دام ممنوعاً",
        "ipb-change-block": "أعد منع المستخدم بهذه الإعدادات",
        "ipb-confirm": "أكّد المنع",
+       "ipb-sitewide": "الموقع بأكمله",
+       "ipb-partial": "جزئي",
+       "ipb-type-label": "النوع",
+       "ipb-pages-label": "الصفحات",
        "badipaddress": "عنوان أيبي غير صحيح",
        "blockipsuccesssub": "تم المنع بنجاح",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] تم {{GENDER:$1|منعه|منعها}}.<br />\nطالع [[Special:BlockList|قائمة منع الآيبي]] لمراجعة حالات المنع.",
        "createaccountblock": "إنشاء الحسابات ممنوع.",
        "emailblock": "البريد الإلكتروني ممنوع",
        "blocklist-nousertalk": "لا يمكنه تعديل صفحة نقاشه الخاصة",
+       "blocklist-editing": "التحرير",
+       "blocklist-editing-sitewide": "التحرير (على مستوى الموقع)",
        "ipblocklist-empty": "قائمة المنع فارغة.",
        "ipblocklist-no-results": "عنوان الأيبي أو اسم المستخدم المطلوب غير ممنوع.",
        "blocklink": "امنع",
        "logentry-block-block": "{{GENDER:$2|منع|منعت}} $1 {{GENDER:$4|$3}} لفترة زمنية مدتها $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|رفع منع}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": " {{GENDER:$2|غير|غيرت}} $1 إعدادات المنع ل{{GENDER:$4|$3}} بتاريخ انتهاء $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|منع|منعت}} {{GENDER:$4|$3}} من تحرير {{PLURAL:$8|صفحة|الصفحات}} $7 مع وقت انتهاء يبلغ $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|غير|غيرت}} إعدادات منع {{GENDER:$4|$3}} التي تمنع التعديلات على {{PLURAL:$8|صفحة|الصفحات}} $7 بوقت انتهاء يبلغ $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|منع|منعت}} {{GENDER:$4|$3}} من إجراءات عدم التعديل بوقت انتهاء يبلغ $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|غير|غيرت}} إعدادات منع {{GENDER:$4|$3}} لإجراءات عدم التعديل بوقت انتهاء يبلغ $5 $6",
        "logentry-suppress-block": "{{GENDER:$2|منع|منعت}} $1 {{GENDER:$4|$3}} لفترة زمنية مدتها $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|غير|غيرت}} إعدادات المنع ل{{GENDER:$4|$3}} بتاريخ انتهاء $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|استورد}} $3 بواسطة رفع ملف",
        "mw-widgets-titleinput-description-redirect": "تحويل إلى $1",
        "mw-widgets-categoryselector-add-category-placeholder": "أضف تصنيفا...",
        "mw-widgets-usersmultiselect-placeholder": "أضف المزيد...",
+       "mw-widgets-titlesmultiselect-placeholder": "أضف المزيد...",
        "date-range-from": "من تاريخ:",
        "date-range-to": "حتى تاريخ:",
        "sessionmanager-tie": "لا يمكن جمع أنواع استيثاق متعددة: $1.",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "لا يمكن أن تتطابق كلمة المرور مع كلمات المرور المدرجة على القائمة السوداء تحديدا",
        "passwordpolicies-policy-maximalpasswordlength": "يجب أن يكون طول كلمة المرور أقل من $1 {{PLURAL:$1|حرف|أحرف}}",
        "passwordpolicies-policy-passwordcannotbepopular": "لا يمكن أن تكون كلمة المرور {{PLURAL:$1|كلمة المرور الشائعة|في قائمة كلمات المرور الشائعة الـ$1}}",
-       "easydeflate-invaliddeflate": "المحتوى المقدم لا يتم تفريغه بشكل صحيح"
+       "easydeflate-invaliddeflate": "المحتوى المقدم لا يتم تفريغه بشكل صحيح",
+       "unprotected-js": "لأسباب تتعلق بالأمان; لا يمكن تحميل جافا سكريبت من الصفحات غير المحمية; الرجاء إنشاء جافا سكريبت فقط في نطاق ميدياويكي: أو كصفحة فرعية للمستخدم"
 }
index 98c4d62..b4686a1 100644 (file)
@@ -12,7 +12,6 @@
                ]
        },
        "tog-underline": "Miñcewirilpe lasun",
-       "tog-showtoolbar": "Pengelün kümeelkünun ñi chemkün",
        "tog-editondblclick": "Wirin pakina epu klik mew",
        "underline-always": "Rumel",
        "underline-never": "Turpu",
index 3aa0599..ce33e94 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "دلّي الليستة تاع التتباع باش تورّي كامل التبديلات، ماشي برك غير التوالا",
        "tog-usenewrc": "جمّع الـتبدالات بل صفحة فل تبدالات الـجديدة و الـليستة تاع الـعسّة",
        "tog-numberheadings": "رقّم العلاون تاع القسيمات",
-       "tog-showtoolbar": "بيّن البارّة تاع دوزان‘ الكتبة",
        "tog-editondblclick": "آكتيفي التبدال تاع الباجات بل زوج ضركات تاع الفارة",
        "tog-editsectiononrightclick": "آكتيفي التبدال تاع السكسيوّات بل ضريك بل ليمنة على العلاوين نتاعهم",
        "tog-watchcreations": "زيد الـصفحات اللي نخلقها و الـفيشيّات فل قايمة تاع التتباع تاعي",
index 135dca5..061591e 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "Kebber l-lista dyal s-suivi baċ bano ṫ-ṫeġyiraṫ kamlin, maċi ġir l-leĥĥrin.",
        "tog-usenewrc": "Sṫeĝmel ṫ-ṫeġyiraṫ l-leĥĥrin l-mezyanin (kayḫṫaj JavaScript)",
        "tog-numberheadings": "Nemra otomaṫikiya dyal l-ĝanawin",
-       "tog-showtoolbar": "Werri l-barra dyal ṫ-ṫeĝdilaṫ (kayḫṫaj JavaScript)",
        "tog-editondblclick": "Baċ ṫṣayeb ṣ-ṣefḫa ĥaṣek ṫbrek 2 merraṫ (kayḫṫaj JavaScript)",
        "tog-editsectiononrightclick": "Baċ ṫbeddel l-ĝonwan dyal ċi seksyon brek ĝlih be l-imniya (kayḫṫaj JavaScript)",
        "tog-watchcreations": "zid sfahi li nchatha f qaaimat lmoraqaba",
index 2435640..b386762 100644 (file)
@@ -23,7 +23,6 @@
        "tog-extendwatchlist": "وسع ليستة المراقبه علشان تبين كل التعديلات, مش بس اجدد تعديلات",
        "tog-usenewrc": "جمع  التغييرات  حسب الصفحه ف اجدد التغييرات و لستة الصفح اللى باراقبها",
        "tog-numberheadings": "رقم العناوين اوتوماتيك",
-       "tog-showtoolbar": "بين شريط التعديل",
        "tog-editondblclick": "عدل الصفح لما تدوس مرتين",
        "tog-editsectiononrightclick": "اسمح بـ تعديل الاجزاء لما تعمل كليك يمين بـالماوس على عناوين الاجزاء",
        "tog-watchcreations": "زوّد الصفح اللى ابتديتها على ليستة الصفح اللى باراقبها.",
index fead6f8..0e5c031 100644 (file)
@@ -34,7 +34,6 @@
        "tog-extendwatchlist": "কেৱল সাম্প্ৰতিকেই নহয, লক্ষ্য-তালিকাৰ সকলো সাল-সলনি বহলাই দেখুৱাওক",
        "tog-usenewrc": "পৃষ্ঠাৰ পৰিৱৰ্তনসমূহ শেহতীয়া সালসলনি আৰু লক্ষ্যতালিকাত ভাগ কৰক",
        "tog-numberheadings": "শীৰ্ষকত স্বয়ংক্ৰিয়ভাৱে ক্ৰমিক নং দিয়ক",
-       "tog-showtoolbar": "সম্পাদনা দণ্ডিকা দেখুৱাওক",
        "tog-editondblclick": "দুবাৰ ক্লিক কৰি পৃষ্ঠা সম্পাদনা কৰিব পাৰি",
        "tog-editsectiononrightclick": "অনুচ্ছেদৰ শিৰোনামাত ৰাইট্‌ ক্লিক টিপি সম্পাদনা কৰাটো সক্ৰিয় কৰক",
        "tog-watchcreations": "মই সৃষ্টি সকলো পৃষ্ঠা মোৰ লক্ষ্য-তালিকাত যোগ কৰক",
index b3783e9..53a0227 100644 (file)
@@ -10,7 +10,6 @@
        "tog-newpageshidepatrolled": "M518x560S15a16490x548S2880f453x527S20e00476x538S1821d488x535S30a00482x483 M518x558S15a37484x534S1f550490x541S20e00470x545S26502452x544S30a00482x483 M518x610S14402482x556S1440a475x532S22b04497x580S30a00482x483 S38700463x496 M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M537x524S10e50516x494S26a10463x476S26a00510x476S10e58469x494 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
        "tog-extendwatchlist": "M518x534S14702496x489S1470a483x479S22704501x506S22700484x467S22a04501x519 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509 M521x531S10012491x516S15a18479x503S26620486x469 M538x518S15a21515x483S15a07463x482S15a01466x483S2a20c493x490 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 S38700463x496 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M518x521S10000483x491S2ef00500x479 M521x524S1f740501x509S1f748479x498S20e00503x494S22a00502x476 M536x534S35610482x483S10601513x506S21600525x501",
        "tog-usenewrc": "L536x534S35610482x483S10601513x506S21600525x501S30a30488x489 L518x589S10609492x553S10621481x569S21100494x540S2df20473x525S30a00482x483 S38700463x496 R526x572S10e50511x542S26500510x524S10e58475x542S26510477x524S30a00482x483 R518x610S14402482x556S1440a475x532S22b04497x580S30a00482x483 S38700463x496 M514x533S19a20486x468S27106495x493 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 M521x508S1f748479x493S1f740501x493",
-       "tog-showtoolbar": "M521x531S10012491x516S15a18479x503S26620486x469 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x521S15a18482x494S1c501493x480S20600496x506 M512x531S1ec27488x470S22b04491x501",
        "tog-editondblclick": "M516x523S1c520485x495S26a00489x478 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
        "tog-editsectiononrightclick": "M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 M524x525S15a3a477x493S15a41478x476S2d60a501x505S21100506x488 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M521x508S1f748479x493S1f740501x493 M512x518S12420489x488S22104500x482 M524x525S15a3a477x493S15a41478x476S2d60a501x505S21100506x488 M525x528S11010508x501S11018476x501S2df1e475x473S2df06505x473",
        "tog-watchcreations": "M529x562S15a37499x531S1f550505x538S20e00485x542S26a02468x535S30a00482x483 M536x561S10043506x528S20500495x550S30a00482x483 M531x566S20302492x532S2030a488x549S21100508x551S26900515x529S26910467x548S30a00482x483 S38700463x496 M520x576S14c19480x549S15a01497x550S20710483x530S30a00482x483 M536x561S10043506x528S20500495x550S30a00482x483 M539x579S10e27506x534S10e09480x534S22a07495x565S22a17469x564S21b00531x528S21b00504x528S30a00482x483 S38700463x496 M527x524S18548473x482S18540497x486S2880f507x504S22104500x476 M514x514S15a01491x487S20500487x503 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
index 660ea80..bd1ba3a 100644 (file)
@@ -26,7 +26,6 @@
        "tog-extendwatchlist": "Espander la llista de siguimientu p'amosar tolos cambeos, non solo los más recientes",
        "tog-usenewrc": "Agrupar los cambeos por páxina nos cambeos recientes y na llista de siguimientu",
        "tog-numberheadings": "Autonumberar los encabezaos",
-       "tog-showtoolbar": "Amosar la barra de ferramientes d'edición",
        "tog-editondblclick": "Editar páxines con doble clic",
        "tog-editsectiononrightclick": "Activar la edición de seiciones calcando col botón drechu nos títulos de seición",
        "tog-watchcreations": "Amestar les páxines que cree y los ficheros que xuba a la mio llista de siguimientu",
index f12e3ce..4a131e8 100644 (file)
@@ -19,7 +19,6 @@
        "tog-extendwatchlist": "Ekoci kaskina kata nokok nohwe nosinesinihan ka kweskisinihikateki ka masinateki aka tepirak nohwe kata nokok aka weckat ka ki otci otamirotakaniwiki.",
        "tog-usenewrc": "Tatwa paskickwemakan mamowicta ka ki meckotcitakaniwoki  aka weckat kaki otci kweskisinihikateki acit nta nosinesinihikanik.",
        "tog-numberheadings": " Nicike kata masinihikepirik akitasowina  e icinikateki tipanisinihikanica",
-       "tog-showtoolbar": "Motena ka maskotikw kata nokoki irapitcitcikana masinihikakan e nisawitakaniwok",
        "tog-editondblclick": "Nicowaw mamakona kata kweskisinahaman paskickwemakana",
        "tog-watchcreations": "Ita acotcita nosinesinihikanik paskickwemikana ocki ka ocitaian acit nohwe ka natcipitaman natisinihikaniwoca.",
        "tog-watchdefault": "Acotcicta paskickemikana nosinesinihikanik acit natisinihikaniwoca ka ki kweskisinahaman",
index f51958c..f6de868 100644 (file)
@@ -18,7 +18,6 @@
        "tog-extendwatchlist": "Divatcera va suzdasiki ta nedira va kot rorewan betaks",
        "tog-usenewrc": "Noeltaf betakseem tulogijayan (kucilas va Javascript)",
        "tog-numberheadings": "Mivaskafa vergumveltotukara",
-       "tog-showtoolbar": "Nedira va tidexekak ke betararude",
        "tog-editondblclick": "Ta bubetara tolon vulegal (JavaScript tir adraf)",
        "tog-editsectiononrightclick": "Betara va gabot talton vulegason<br /> va gabotvergumvelt",
        "tog-watchcreations": "Kosuzdasikira va jinon betayan bueem",
index dde8033..8b995ff 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "खाली हालिए कय नाहीं, बल्कि कुल बदलाव कय देखावे कय लिए ध्यानसूची कय विस्तारित करा जाय",
        "tog-usenewrc": "नँवा बदलाव में अउर ध्यानसूची बदलाव कय पन्ना अनुसार समूह में बाँटा जाय",
        "tog-numberheadings": "शीर्षक स्व-क्रमांकित करा जाय",
-       "tog-showtoolbar": "सम्पादन औज़ारपट्टी देखावो",
        "tog-editondblclick": "दुई क्लिक से पन्ना संपादित करा जाय",
        "tog-editsectiononrightclick": "अनुभाग शीर्षक पे दायाँ क्लिक कई कय अनुभाग सम्पादित कीन जाय",
        "tog-watchcreations": "हमार बनावा पन्ना अव हमार अपलोड करल फाइल कय हमरे ध्यानसूची में जोडो",
index 65c9f89..1002158 100644 (file)
@@ -42,7 +42,6 @@
        "tog-extendwatchlist": "Yalnız son dəyişiklikləri yox, bütün dəyişiklikləri göstərmək üçün izləmə siyahısını genişlət",
        "tog-usenewrc": "Son dəyişikliklərdəki və izləmə siyahısındakı dəyişiklikləri qruplaşdır",
        "tog-numberheadings": "Başlıqları avtomatik nömrələ",
-       "tog-showtoolbar": "Redaktə zamanı üstdəki alətlər qutusunu göstər",
        "tog-editondblclick": "Səhifələri iki kliklə redaktə et",
        "tog-editsectiononrightclick": "Bölmə başlığı üzərində siçanın sağ düyməsini klikləməklə bölmələri redaktə et",
        "tog-watchcreations": "Yaratdığım səhifələri və yüklədiyim faylları izlədiyim səhifələrə əlavə et",
index 2ceaf98..d297eee 100644 (file)
@@ -34,7 +34,6 @@
        "tog-extendwatchlist": "ایزله‌دیک‌لری تکجه یئنی‌لر اۆچون دئییل، بۆتون دییشیک‌لیک‌لری گؤسترمک اۆچون گئنیشلندیر.",
        "tog-usenewrc": "دَییشیک‌لیک‌لری سوْن دَییشیک‌لیک‌لر صفحه‌سینده ایزله‌دیک‌لر صفحه‌سینده قروپ‌لا (جاوااسکریپت گرک‌دیر)",
        "tog-numberheadings": "باشلیق‌لاری اوْتوماتیک نۆمره‌له",
-       "tog-showtoolbar": "دَییشدیرمه آراج-چۇبوغونو گؤستر",
        "tog-editondblclick": "صفحه‌‌لری ایکی کیلیک‌ده دَییشدیر",
        "tog-editsectiononrightclick": "بؤلوم‌لرین دَییشدیرمه‌سینی، باشلیق‌لارین اۆستونده ساغ‌کلیک ائتمک‌‌له ایجازه وئر",
        "tog-watchcreations": "ياراتدیغیم صفحه‌‌لری و يۆکله‌دیگیم فايل‌لاری، ایزله‌دیک‌لریمه آرتیر",
index 79b9215..42702c3 100644 (file)
@@ -29,7 +29,8 @@
                        "Ilmira",
                        "Irus",
                        "Khanmarat",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Amire80"
                ]
        },
        "tog-underline": "Һылтанмалар аҫтына һыҙыу:",
@@ -40,7 +41,6 @@
        "tog-extendwatchlist": "Барлыҡ үҙгәртеүҙәрҙе үҙ эсенә алған, киңәйтелгән күҙәтеү исемлеге",
        "tog-usenewrc": "Һуңғы төҙәтеүҙәр һәм күҙәтеү теҙмәһендәге биттәр буйлап төркөм-үҙгәрештәр",
        "tog-numberheadings": "Атамаларҙы автоматик номерлау",
-       "tog-showtoolbar": "Мөхәррирләү мәлендә ҡоралдар панелен күрһәтергә (JavaScript кәрәк)",
        "tog-editondblclick": "Биттәрҙе ике сиртеп мөхәррирлә",
        "tog-editsectiononrightclick": "Бүлектәрҙе мөхәррирләүҙе тоҡандырыу өсөн, бүлек атамаһын билдәләгәс, төрткөнөң уң яғына баҫырға кәрәк",
        "tog-watchcreations": "Мин төҙөгән биттәрҙе һәм күсергән файлдарҙы күҙәтеү исемлегенә өҫтәргә",
        "category_header": "«$1» категорияһындағы биттәр",
        "subcategories": "Эске категориялар",
        "category-media-header": "«$1» категорияһындағы файлдар",
-       "category-empty": "\"Был категория әлегә буш.\"",
+       "category-empty": "<em>Был категория әлегә буш.</em>",
        "hidden-categories": "{{PLURAL:$1|Йәшерен категория|Йәшерен категориялар}}",
        "hidden-category-category": "Йәшерен категориялар",
        "category-subcat-count": "{{PLURAL:$2|Был категорияла тик киләһе эске категория ғына бар.|Барлығы $2 категориянан, был категорияла киләһе {{PLURAL:$1|эске категория|$1 эске категория}} күрһәтелә.}}",
index f2a684d..c1bb56b 100644 (file)
@@ -31,7 +31,6 @@
        "tog-extendwatchlist": "Daweiterde Beówochtungslisten",
        "tog-usenewrc": "Endarunga vo \"Lezde Endarunga\" und vo \"Mei Beobochtd\" noch Seitn gruppian",
        "tog-numberheadings": "Ywerschriften autómaatisch nummerrirn",
-       "tog-showtoolbar": "Zoag de Edit Toolbar (JavaScript nedig)",
        "tog-editondblclick": "Seiten mid am Dóppedrucker beorweiden",
        "tog-editsectiononrightclick": "Oahzelne Obschnitt mid am Rechtsdrucker beorweiten",
        "tog-watchcreations": "Voh mir söwer eihgstöde Seiten autómaatisch beówochten",
index e0e4805..1b5ad82 100644 (file)
@@ -23,7 +23,6 @@
        "tog-extendwatchlist": "لیست چارگ مزن کن دان کل تغییرات پیش داریت نه که فقط نوکینءَ",
        "tog-usenewrc": "گروپء تغییران تاکء واسته مان نوکین تغییران ءُ چاروک لیست",
        "tog-numberheadings": "اتوماتیک شماره کتن عناوین",
-       "tog-showtoolbar": "اصلاح کنوکین میلگ ابزارء پیش بدار",
        "tog-editondblclick": "ویبتاکانء مان دو کلیک ٹگل بدئ",
        "tog-editsectiononrightclick": "فعال کتن زرتگین بهرء اصلاح کتن گون کلیک زرتگین عنوانانء سرا",
        "tog-watchcreations": "منی اڈ کتگین پیج و اپلود کتگین فایلانء چارگ لیستء توکا هوار کن",
index 0821ad5..cec0171 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Palakbanga an bantay-listahan (watchlist) na maipahiling an gabos na pinagbago, bako sana an pinakahurihang binago",
        "tog-usenewrc": "Pangrupong mga kaliwatan sa kada pahina kan mga dae pa sana nahaloy na mga kaliwatan asin bantay-listahan",
        "tog-numberheadings": "Tolos-bilang na mga pamayohán",
-       "tog-showtoolbar": "Ipahiling an barang-gamit nin pagliwat",
        "tog-editondblclick": "Liwaton an mga pahina sa pagdoble nin klik",
        "tog-editsectiononrightclick": "Paganaha an seksyon nin pagliliwat sa pag-klik kan mga titulo nin seksyon",
        "tog-watchcreations": "Idagdag an mga pahina na ako an nagmukna asin an mga sagunson na ako an nagkarga sa sakong bantay-listahan",
index 29bdcb1..79f8afe 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "Пашырыць сьпіс назіраньня, каб ён паказваў усе зьмены, а ня толькі апошнія",
        "tog-usenewrc": "Групаваць зьмены па старонках у апошніх зьменах і сьпісе назіраньня",
        "tog-numberheadings": "Аўтаматычная нумарацыя загалоўкаў",
-       "tog-showtoolbar": "Паказваць панэль інструмэнтаў рэдагаваньня",
        "tog-editondblclick": "Рэдагаваць старонкі па падвойным націсканьні",
        "tog-editsectiononrightclick": "Рэдагаваць сэкцыі па націсканьні правай кнопкі мышы на загалоўку",
        "tog-watchcreations": "Дадаваць у мой сьпіс назіраньня створаныя мной старонкі і загружаныя файлы",
        "subject-preview": "Папярэдні прагляд загалоўку:",
        "previewerrortext": "Адбылася памылка пры спробе папярэдняга прагляду вашых зьменаў.",
        "blockedtitle": "Удзельнік заблякаваны",
+       "blocked-email-user": "<strong>Вашаму рахунку было забаронена дасылаць лісты электроннай поштай. Вы ўсё яшчэ можаце рэдагаваць іншыя старонкі ў гэтай вікі.</strong> Вы можаце пабачыць падрабязнасьці блякаваньня на старонцы [[Special:MyContributions|ўнёску рахунку]].\n\nБлякавананьне зробленае $1.\n\nПададзеная прычына — <em>$2</em>.\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Мэта блякаваньня: $7\n* Ідэнтыфікатар блякаваньня #$5",
+       "blockedtext-partial": "<strong>Вашаму рахунку ці IP-адрасу было забаронена зьмяняць гэтую старонку. Вы ўсё яшчэ можаце рэдагаваць іншыя старонкі ў гэтай вікі.</strong> Вы можаце паглядзець падрабязнасьці блякаваньня на старонцы [[Special:MyContributions|ўнёску рахунку]].\n\nБлякаваньне зробленае $1.\n\nПададзеная прычына — <em>$2</em>.\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Мэта блякаваньня: $7\n* Ідэнтыфікатар блякаваньня #$5",
        "blockedtext": "<strong>Ваш рахунак удзельніка ці IP-адрас быў заблякаваны.</strong>\n\nБлякаваньне выканаў $1.\nПрычына гэтага: <em>$2</em>.\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Быў заблякаваны: $7\n\nВы можаце скантактавацца з $1 ці адным зь іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб абмеркаваць блякаваньне. Заўважце, што вы ня зможаце ўжыць магчымасьць «{{int:emailuser}}», пакуль не пазначыце сапраўдны адрас электроннай пошты ў вашых [[Special:Preferences|наладах]], і калі гэта вам не было забаронена.\nВаш IP-адрас — $3, ідэнтыфікатар блякаваньня — #$5.\nКалі ласка, улучайце ўсю вышэйпададзеную інфармацыю ва ўсе запыты, што вы будзеце рабіць.",
        "autoblockedtext": "Ваш IP-адрас быў аўтаматычна заблякаваны, таму што ён ужываўся іншым удзельнікам, які быў заблякаваны $1.\nПрычына гэтага:\n\n:<em>$2</em>\n\n* Блякаваньне пачалося: $8\n* Блякаваньне скончыцца: $6\n* Быў заблякаваны: $7\n\nВы можаце скантактавацца з $1 ці з адным зь іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб абмеркаваць блякаваньне.\n\nЗаўважце, што вы ня зможаце ўжываць магчымасьць «{{int:emailuser}}», пакуль ня будзе пазначаны дзейны адрас электроннай пошты ў вашых [[Special:Preferences|наладах удзельніка]], і калі гэта вам не было забаронена.\n\nВаш цяперашні IP-адрас — $3, ідэнтыфікатар блякаваньня — #$5.\nКалі ласка, улучайце ўсю вышэйпададзеную інфармацыю ва ўсе запыты, што вы будзеце рабіць.",
        "systemblockedtext": "Вашае імя ўдзельніка ці IP-адрас былі аўтаматычна заблякаваныя MediaWiki.\nЗ наступнай прычыны:\n\n:<em>$2</em>\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Мэта блякаваньня: $7\n\nВаш цяперашні IP-адрас — $3.\nКалі ласка, уключайце ўсе пададзеныя вышэй дэталі ва ўсе запыты, што вы робіце.",
        "ipb-disableusertalk": "Забараніць удзельніку рэдагаваньне ўласнай старонкі гутарак падчас блякаваньня",
        "ipb-change-block": "Зьмяніць парамэтры блякаваньня",
        "ipb-confirm": "Пацьвердзіць блякаваньне",
+       "ipb-sitewide": "На ўсім сайце",
+       "ipb-partial": "Частковая",
+       "ipb-type-label": "Тып",
+       "ipb-pages-label": "Старонкі",
        "badipaddress": "Некарэктны IP-адрас",
        "blockipsuccesssub": "Блякаваньне пасьпяховае",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] {{GENDER:$1|быў заблякаваны|была заблякаваная}}.<br />\nГлядзіце [[Special:BlockList|сьпіс блякаваньняў]] дзеля іх перагляду.",
        "createaccountblock": "стварэньне рахунку заблякаванае",
        "emailblock": "дасылка лістоў забароненая",
        "blocklist-nousertalk": "ня можа рэдагаваць уласную старонку гутарак",
+       "blocklist-editing": "рэдагаваньне",
+       "blocklist-editing-sitewide": "рэдагаваньне (ва ўсім праекце)",
        "ipblocklist-empty": "Сьпіс блякаваньняў пусты.",
        "ipblocklist-no-results": "Паданы IP-адрас альбо імя ўдзельніка не заблякаваныя.",
        "blocklink": "заблякаваць",
        "tooltip-preferences-save": "Захаваць налады",
        "tooltip-summary": "Увядзіце кароткае апісаньне",
        "interlanguage-link-title": "$1 — $2",
+       "interlanguage-link-title-nonlang": "$1 — $2",
        "common.json": "/* Кожны разьмешчаны тут JSON будзе загружацца для ўсіх удзельнікаў пры загрузцы кожнай старонкі. */",
        "anonymous": "{{PLURAL:$1|1=Ананімны ўдзельнік ці ўдзельніца|Ананімныя ўдзельнікі і ўдзельніцы}} {{GRAMMAR:родны|{{SITENAME}}}}",
        "siteuser": "Удзельнік/удзельніца {{GRAMMAR:родны|{{SITENAME}}}} $1",
        "logentry-block-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} на тэрмін $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|разблякаваў|разблякавала}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} тэрмін блякаваньня {{GENDER:$4|$3}} на пэрыяд $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} ад рэдагаваньня {{PLURAL:$8||старонак}} $7 з часам сканчэньня $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} на тэрмін $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} тэрмін блякаваньня {{GENDER:$4|$3}} на пэрыяд $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|імпартаваў|імпартавала}} $3 праз загрузку файлу",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Пароль ня можа супадаць з паролямі з чорнага сьпісу",
        "passwordpolicies-policy-maximalpasswordlength": "Пароль мусіць быць даўжынёй менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Пароль ня можа {{PLURAL:$1|супадаць з самым папулярным паролем|быць зь сьпісу $1 папулярных пароляў}}",
-       "easydeflate-invaliddeflate": "Пададзены зьмест ня сьціснуты адпаведным чынам"
+       "easydeflate-invaliddeflate": "Пададзены зьмест ня сьціснуты адпаведным чынам",
+       "unprotected-js": "З прычынаў бясьпекі JavaScript ня можа быць загружаны зь неабароненых сайтаў. Калі ласка, стварайце javascript выключна ў прасторы назваў MediaWiki: ці як падстаронку ўдзельніка"
 }
index 0204039..b4f3b48 100644 (file)
@@ -46,7 +46,6 @@
        "tog-extendwatchlist": "Паказваць усе змяненні, а не толькі апошнія",
        "tog-usenewrc": "Групаваць змены па старонках у апошніх зменах і спісе назірання",
        "tog-numberheadings": "Аўта-нумараваць падзагалоўкі",
-       "tog-showtoolbar": "Паказваць панэль інструментаў рэдактара",
        "tog-editondblclick": "Праўка старонак па двайным пстрыку",
        "tog-editsectiononrightclick": "Правіць падраздзелы па правым пстрыку на загалоўку",
        "tog-watchcreations": "Дадаваць створаныя мной старонкі і файлы ў мой спіс назірання",
index 2cbd4aa..cad8d1a 100644 (file)
@@ -54,7 +54,6 @@
        "tog-extendwatchlist": "Разширяване на списъка за наблюдение, така че да показва всички промени, не само последните",
        "tog-usenewrc": "Групиране по страници на промените на Последни промени и в списъка за наблюдение",
        "tog-numberheadings": "Автоматично номериране на заглавията",
-       "tog-showtoolbar": "Показване на лентата с инструменти за редактиране",
        "tog-editondblclick": "Редактиране на страниците чрез двойно щракване",
        "tog-editsectiononrightclick": "Възможност за редактиране на раздел при щракване с десния бутон върху заглавието му",
        "tog-watchcreations": "Добавяне на създадените от мен страници и качените от мен файлове към списъка ми за наблюдение",
index 4d9537c..d8c1548 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "پراخ کورتین واچلیستی لڑلیست په موچین تغیراتان،نه فقط آخرینان",
        "tog-usenewrc": "گروپ بندی تغیراتانئ بی اساسئ تاکدیمانئ اخیر ئین تغیران و واچلیستئ لڑ لیستا",
        "tog-numberheadings": "ئنوانانئ اتوماتیکین شماره گذاری",
-       "tog-showtoolbar": "نشان داتین ایڈیٹی نوارئ",
        "tog-editondblclick": "تاکدیمانی ایڈیٹ کورتین گو دو کلیک ئا",
        "tog-editsectiononrightclick": "پئال کورتین بخشانی ایڈیٹی گو راست کلیکا بی ئنوانی سرا",
        "tog-watchcreations": "تاکدیمان که من جوڑ ئه کنین یا فایلان که بُرز ( ڈ\tانلوڈ\t) ئه کنین بی نئ واچلیست ئا اضافه بیئنت",
index c03b9a9..8ca47ef 100644 (file)
@@ -18,7 +18,6 @@
        "tog-extendwatchlist": "खाली हाले के बदलाव ना बालुक, सगरी बदलाव के देखावे खातिर धियानसूची के बिस्तारित करीं",
        "tog-usenewrc": "तुरंत भइल बदलाव में आ धियानसूची में भइल बदलाव सभ के पन्ना अनुसार झुंड में बांटी",
        "tog-numberheadings": "हेडिंग के ऑटो-नंबरिंग",
-       "tog-showtoolbar": "संपादन औजारपट्टी के देखावल जाव",
        "tog-editondblclick": "दुइ क्लिक पर पन्ना सभ के संपादन करीं",
        "tog-editsectiononrightclick": "हेडिंग पर दायाँ क्लिक कइ के खंड के संपादन संभव करीं",
        "tog-watchcreations": "हमार बनावल पन्ना आ हमार अपलोड कइल फाइल सभ के हमरी धियानसूची में जोड़ल जाव",
index d677a0b..81ce363 100644 (file)
@@ -18,7 +18,6 @@
        "tog-extendwatchlist": "Singkaiakan daptar itihan hagan manampaiakan samunyaan paubahan, kada nang hanyar haja.",
        "tog-usenewrc": "Purukakan panampaian paubahan pahanyarnya tingkat tinggi (parlu ada JavaScript)",
        "tog-numberheadings": "Bari numur judul utumatis",
-       "tog-showtoolbar": "Tampaiakan bilah-pakakas babak (parlu ada JavaScript)",
        "tog-editondblclick": "Babak tutungkaran wan klik ganda (parlu ada JavaScript)",
        "tog-editsectiononrightclick": "Kawa'akan mambabak sub-hagian lawan mang-klik kanan pada judul hagian (parlu ada JavaScript)",
        "tog-watchcreations": "Tambahi tungkaran nang ulun ulah ka daptar itihan",
index 66849a1..3ee7556 100644 (file)
@@ -49,7 +49,6 @@
        "tog-extendwatchlist": "শুধু সাম্প্রতিক পরিবর্তনই নয়, সকল পরিবর্তন দেখতে নজর তালিকা সম্প্রসারণ করা হোক",
        "tog-usenewrc": "সাম্প্রতিক পরিবর্তনসমূহ এবং নজরতালিকা পাতায় পরিবর্তনগুলি একত্রে প্রদর্শন করা হোক",
        "tog-numberheadings": "শিরোনামগুলিকে স্বয়ংক্রিয়ভাবে ক্রমিক নম্বর দেয়া হোক",
-       "tog-showtoolbar": "সম্পাদনা সরঞ্জামদণ্ড দেখানো হোক",
        "tog-editondblclick": "দুইবার ক্লিক করে পাতা সম্পাদনা করা হোক",
        "tog-editsectiononrightclick": "পরিচ্ছেদের শিরোনামে ডান ক্লিক করার মাধ্যমে পরিচ্ছেদ সম্পাদনা করার সুবিধাটি সক্রিয় করা হোক",
        "tog-watchcreations": "আমার তৈরি করা পাতাগুলি এবং আপলোড করা ফাইলগুলি আমার নজরতালিকায় যোগ করা হোক",
        "badarticleerror": "এই পাতায় এই কাজটি করা সম্ভব নয়।",
        "cannotdelete": "\"$1\" পাতা বা ফাইলটি মোছা সম্ভব হয়নি।\nসম্ভবত অন্য কেউ আগেই এটিকে মুছে ফেলেছেন।",
        "cannotdelete-title": "\"$1\" পাতাটি মুছে ফেলা যাচ্ছে না",
+       "delete-scheduled": "\"$1\" পাতাটি মুছে ফেলার জন্য তালিকাভুক্ত হয়েছে।\nদয়া করে ধৈর্য ধরুন।",
        "delete-hook-aborted": "হুকের কারণে পাতা মোছার কাজটি পরিত্যক্ত হয়েছে।\nকোন ব্যাখ্যা দেয়া হয়নি।",
        "no-null-revision": "\"$1\" পাতার জন্য ফাঁকা সংস্করণ তৈরী করা যায়নি",
        "badtitle": "ভুল শিরোনাম",
        "stub-threshold-disabled": "নিস্ক্রিয়",
        "recentchangesdays": "সাম্প্রতিক পরিবর্তন পাতায় প্রদর্শিত দিনের সংখ্যা:",
        "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিনের}}",
-       "recentchangescount": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà§\87 à¦ªà§\8dরদরà§\8dশিত à¦¸à¦®à§\8dপাদনার à¦ªà§\82রà§\8dবনিরà§\8dধারিত সংখ্যা:",
+       "recentchangescount": "পà§\82রà§\8dবনিরà§\8dধারিতভাবà§\87, à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà§\87, à¦ªà¦¾à¦¤à¦¾à¦° à¦\87তিহাসà§\87, à¦\93 à¦²à¦\97à§\87 à¦ªà§\8dরদরà§\8dশনà§\87র à¦\9cনà§\8dয à¦¸à¦®à§\8dপাদনার সংখ্যা:",
        "prefs-help-recentchangescount": "সর্বোচ্চ সংখ্যা: ১০০০",
        "prefs-help-watchlist-token2": "এটি আপনার নজরতালিকার ওয়েব ফিডের গোপন চাবি।\nকেউ যদি এটি জানতে পারেন, তাহলে তিনি আপনার নজরতালিকা পড়তে সক্ষম হবেন, তাই এটি প্রকাশ করবেন না।\n[[Special:ResetTokens|আপনার এটি পুনঃনির্ধারণ করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
        "prefs-help-tokenmanagement": "আপনি আপনার অ্যাকাউন্টের জন্য গোপন চাবি দেখতে এবং পুনরায় নির্ধারন করতে পারবেন যা দিয়ে আপনার নজরতালিকার ওয়েব ফিডে প্রবেশাধিকার পাওয়া যাবে। যে কেউ যিনি এই চাবিটি জানেন তিনি আপনার নজর তালিকাটি পড়তে সক্ষম হবেন, তাই এটি অন্যদের সাথে ভাগ করবেন না।",
        "rcfilters-activefilters": "সক্রিয় ছাঁকনিসমূহ",
        "rcfilters-activefilters-hide": "লুকান",
        "rcfilters-activefilters-show": "দেখান",
+       "rcfilters-activefilters-hide-tooltip": "সক্রিয় ছাঁকনির এলাকা লুকান",
+       "rcfilters-activefilters-show-tooltip": "সক্রিয় ছাঁকনির এলাকা দেখান",
        "rcfilters-advancedfilters": "উন্নত ছাঁকনি",
        "rcfilters-limit-title": "যেসব ফলাফল দেখাবে",
        "rcfilters-limit-and-date-label": "$1টি {{PLURAL:$1|পরিবর্তন}}, $2",
        "imagelinks": "ফাইলের ব্যবহার",
        "linkstoimage": "নিম্নলিখিত {{PLURAL:$1|পাতাটি|$1টি পাতা}} এই ফাইল ব্যবহার করে:",
        "linkstoimage-more": "এই ফাইলের সাথে $1টির বেশি {{PLURAL:$1|পাতার লিংক}} রয়েছে।\nনিচের তালিকায় ফাইলের সাথে যুক্ত {{PLURAL:$1|প্রথম পাতাটির লিংক|প্রথম $1টি পাতার লিংক}} দেখানো হচ্চে।\nএছাড়া একটি [[Special:WhatLinksHere/$2|পূর্ণাঙ্গ তালিকাও]] রয়েছে।",
-       "nolinkstoimage": "এই ফাইলে সংযোগ করে এমন কোন পাতা নেই।",
+       "nolinkstoimage": "এই ফাইল ব্যবহার করে এমন কোন পাতা নেই।",
        "morelinkstoimage": "এই ফাইলের [[Special:WhatLinksHere/$1|আরও লিঙ্ক]] দেখাও।",
        "linkstoimage-redirect": "$1 (ফাইল পুনঃর্নিদেশ) $2",
        "duplicatesoffile": "নিচের {{PLURAL:$1|ফাইলটি|$1 ফাইলগুলো}} এই ফাইলের প্রতিলিপি ([[Special:FileDuplicateSearch/$2|বিস্তারিত দেখুন]]):",
        "prefixindex": "উপসর্গ সহ সমস্ত পাতা",
        "prefixindex-namespace": "উপসর্গ সহ সকল পাতা ($1 নামস্থান)",
        "prefixindex-submit": "দেখাও",
-       "prefixindex-strip": "তালিà¦\95া à¦¥à§\87à¦\95ে উপসর্গ লুকান",
+       "prefixindex-strip": "ফলাফলে উপসর্গ লুকান",
        "shortpages": "সংক্ষিপ্ত পাতাসমূহ",
        "longpages": "দীর্ঘ পাতাসমূহ",
        "deadendpages": "যেসব পাতা থেকে কোনো সংযোগ নেই",
        "pageinfo-category-files": "ফাইলের সংখ্যা",
        "pageinfo-user-id": "ব্যবহারকারী আইডি",
        "pageinfo-file-hash": "হ্যাশ মান",
+       "pageinfo-view-protect-log": "এই পাতার জন্য সুরক্ষা লগ দেখুন।",
        "markaspatrolleddiff": "পরীক্ষিত হিসেবে চিহ্নিত করুন",
        "markaspatrolledtext": "এই পাতাটি পরীক্ষিত হিসেবে চিহ্নিত করুন",
        "markaspatrolledtext-file": "এই ফাইলের সংস্করণ পরীক্ষিত হিসেবে চিহ্নিত করুন",
        "previousdiff": "← পুরনো সম্পাদনা",
        "nextdiff": "নতুনতর সম্পাদনা →",
        "mediawarning": "'''সতর্কীকরণ''': এই ফাইলের ধরনে ক্ষতিকর কোড থাকতে পারে। এটি চালালে আপনার সিস্টেমে ক্ষতি হতে পারে।",
-       "imagemaxsize": "à¦\9bবির à¦\86à¦\95ারà§\87র à¦¸à¦°à§\8dবà§\8bà¦\9aà§\8dà¦\9a à¦¸à§\80মা:<br />''(à¦\9bবির à¦¬à¦¿à¦¬à¦°à¦£ à¦ªà¦¾à¦¤à¦¾à¦° à¦\9cনà§\8dয)''",
+       "imagemaxsize": "à¦\9bবির à¦¬à¦¿à¦¬à¦°à¦£à§\87র à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦\9bবির à¦\86à¦\95ারà§\87র à¦¸à¦°à§\8dবà§\8bà¦\9aà§\8dà¦\9a à¦¸à§\80মা:",
        "thumbsize": "থাম্বনেইল আকার:",
        "widthheightpage": "$1 × $2, $3টি {{PLURAL:$1|পাতা}}",
        "file-info": "ফাইলের আকার: $1, MIME ধরন: $2",
        "confirm-unwatch-top": "এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলতে ইচ্ছুক?",
        "confirm-rollback-button": "ঠিক আছে",
        "confirm-rollback-top": "এই পাতায় করা সম্পাদনাগুলি প্রত্যাবর্তন করবেন?",
+       "confirm-mcrrestore-title": "সংশোধনটি পুনরুদ্ধার করুন",
        "mcrundofailed": "পূর্বাবস্থায় ফেরা ব্যর্থ হয়েছে",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← পূর্ববর্তী পাতা",
        "redirect-file": "ফাইলের নাম",
        "redirect-logid": "লগ আইডি",
        "redirect-not-exists": "মান পাওয়া যায়নি",
+       "redirect-not-numeric": "মান সাংখ্যিক নয়",
        "fileduplicatesearch": "সদৃশ ফাইলের জন্য অনুসন্ধান",
        "fileduplicatesearch-summary": "হ্যাশ ভ্যালুর ওর ভিত্তি করে একই ছবিগুলো খুঁজুন।",
        "fileduplicatesearch-filename": "ফাইলনাম:",
        "unlinkaccounts-success": "অ্যাকাউন্টের সংযোগ বিচ্ছিন্ন করা হয়েছে।",
        "authenticationdatachange-ignored": "প্রমাণীকরণ উপাত্তের পরিবর্তন পরিচালনা করা হয়নি। হয়তো কোন প্রদানকারী কনফিগার করা হয়নি?",
        "userjsispublic": "অনুগ্রহ করে লক্ষ্য করুন: জাভাস্ক্রিপ্টের উপপাতাগুলিতে গোপনীয় তথ্য থাকা উচিত নয় যেহেতু অন্যান্য ব্যবহারকারীও এগুলি দেখতে পান।",
+       "userjsonispublic": "অনুগ্রহ করে লক্ষ্য করুন: JSON উপপাতাগুলিতে গোপনীয় তথ্য থাকা উচিত নয় যেহেতু অন্যান্য ব্যবহারকারীও এগুলি দেখতে পান।",
        "usercssispublic": "অনুগ্রহ করে লক্ষ্য করুন: সিএসএসের উপপাতাগুলিতে গোপনীয় তথ্য থাকা উচিত নয় যেহেতু অন্যান্য ব্যবহারকারীও এগুলি দেখতে পান।",
        "restrictionsfield-badip": "আইপি ঠিকানা অথবা পরিসীমা অবৈধ: $1",
        "restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
        "passwordpolicies-policy-minimalpasswordlength": "পাসওয়ার্ড অবশ্যই {{PLURAL:$1|১ অক্ষরের|$1 অক্ষরের}} হতে হবে",
        "passwordpolicies-policy-passwordcannotmatchusername": "পাসওয়ার্ড ব্যবহারকারী নামের মত একই হতে পারে না",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "পাসওয়ার্ড বিশেষত কালো তালিকাভুক্ত পাসওয়ার্ডের সাথে মিলতে পারবে না",
-       "passwordpolicies-policy-maximalpasswordlength": "পাসওয়ার্ড $1 {{PLURAL:$1|অক্ষরের}} চেয়ে কম দীর্ঘ হতে হবে"
+       "passwordpolicies-policy-maximalpasswordlength": "পাসওয়ার্ড $1 {{PLURAL:$1|অক্ষরের}} চেয়ে কম দীর্ঘ হতে হবে",
+       "unprotected-js": "নিরাপত্তার কারণে জাভাস্ক্রিপ্ট অনিরাপদ পৃষ্ঠা থেকে লোড করা যাবে না। শুধুমাত্র মিডিয়াউইকি: নামস্থান বা ব্যবহারকারী উপপাতায় জাভাস্ক্রিপ্ট তৈরি করুন"
 }
index 46cc757..88c0642 100644 (file)
@@ -19,7 +19,6 @@
        "tog-extendwatchlist": "ལྟ་ཞིབ་ཐོ་རྒྱ་སྐྱེད་ཏེ་ཉེ་ལམ་ཙམ་མིན་པར་བཟོ་བཅོས་ཡོངས་རྫོགས་སྟོན་ཅིག",
        "tog-usenewrc": "ཉེ་བའི་བཟོ་བཅོས་དང་དགས་འདེམས་ཤོག་ངོས་ཀྱི་བཅོས་འགྱུར་རྐྱེན་པས་སྡེ་ཚན་བཅོས་འགྱུར་ཕྱིན་འདུག།",
        "tog-numberheadings": "རང་སྒྲིག་ཨང་རྟགས་འགོ་བརྗོད།",
-       "tog-showtoolbar": "རྩོམ་སྒྲིག་ལག་ཆ་སྟོན། (JavaScript ཡི་བརྡ་ཆད་དགོས།)",
        "tog-editondblclick": "ཤོག་ངོས་རྩོམ་སྒྲིག་བྱེད་པར་ལན་གཉིས་རྡེབ།",
        "tog-editsectiononrightclick": "དུམ་འཚམས་ཀྱི་འགོ་འརྗོད་ལ་འཐེབ་གཞོང་གཡས་པ་གནོན་ཏེ་དུམ་འཚམས་བཟོ་འཅོས་བྱེད་རོགས།",
        "tog-watchcreations": "ངས་གསར་བཟོ་བྱས་པའི་ཤོག་ངོས་དང་ཡིག་ཆ་ཡར་འཇུག་བྱས་པ་རྣམས་ངའི་དགའ་འདེམས་ཐོ་ལ་སྣོན་རོགས།",
index da44540..6297e78 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "হুদ্দা হাদি এহান পতাসি অতা নাবে, হাব্বি পতানি দেহাদেনার কা আহিরফঙে থসি তালিকাহান সালকরানি অক।",
        "tog-usenewrc": "হাব্বিত্ত ঙালসে পতানিহানি ব্যবহার কর (জাভাস্ক্রিপ্ট)",
        "tog-numberheadings": "নিজেলত্ত পাজালার চিঙনাঙ",
-       "tog-showtoolbar": "পতানির আতিয়ার দেহাদে (জাভাস্ক্রিপ্ট)",
        "tog-editondblclick": "দ্বিমাউ যাতিয়া পতাহান পতিক (জাভাস্ক্রিপ্ট)",
        "tog-editsectiononrightclick": "পরিচ্ছদ পতানির য়্যাথাঙহান বাতেদের গোথামগ <br /> পরিচ্ছদর চিঙনাঙর গজে যাতিলে দে (জাভাস্ক্রিপ্ট)",
        "tog-watchcreations": "যে পতাহানি মি ইকরিসু অতা মর তালাবির তালিকাত থ",
index 8e9e882..3a8c295 100644 (file)
@@ -17,7 +17,6 @@
        "tog-extendwatchlist": "گپ کردن نوم گه آ مو سی دیئن همه آلشتا نه فقط هونو که بیشتر ز همه انجوم ابون.",
        "tog-usenewrc": "جٱرغاٛ کاری آلشتا ڤا آلشتکاری بٱلگاٛیلسۊن و سئیل بٱرگسۊن",
        "tog-numberheadings": "شوماراٛ ڤٱندن خودٱنجوم سی سربٱلگاٛیل",
-       "tog-showtoolbar": "دیاری کردن تۊلبار ڤیرایشت",
        "tog-editondblclick": "ڤیرایشت بٱلگاٛیل ڤا دو کئرٱت پۊرنیڌن",
        "tog-editsectiononrightclick": "ڤیرایشت ڤابیڌن ڤا راست پۊرنیڌن ری بٱرجا داسۊن هر جاگٱ",
        "tog-watchcreations": "اٛزاف کردن او بٱلگاٛیلی کاٛ خوم راست کردوماٛ و او جانیایلی کاٛ خوم لاهامسۊناٛ مئن سئیل بٱرگ خوم",
index 48526f5..8bb11c2 100644 (file)
@@ -31,7 +31,6 @@
        "tog-extendwatchlist": "Astenn ar roll evezhiañ a-benn diskouez an holl gemmoù ha neket ar re ziwezhañ hepken.",
        "tog-usenewrc": "Diskouez ar c'hemmoù nevez en ur feson kempennoc'h",
        "tog-numberheadings": "Niverenniñ emgefre an titloù",
-       "tog-showtoolbar": "Diskouez ar varrenn ostilhoù aozañ",
        "tog-editondblclick": "Daouglikañ evit kemmañ pajennoù",
        "tog-editsectiononrightclick": "Kemmañ ur rann dre glikañ a-zehou war titl ar rann",
        "tog-watchcreations": "Ouzhpennañ ar pajennoù krouet ganin da'm roll evezhiañ",
index b574d89..f33972c 100644 (file)
@@ -40,7 +40,6 @@
        "tog-extendwatchlist": "Proširi spisak praćenja za pogled svih izmjena, ne samo nedavnih",
        "tog-usenewrc": "Grupiraj izmjene po stranicama sa nedavnih izmjena i praćenih članaka",
        "tog-numberheadings": "Automatski numeriši podnaslove",
-       "tog-showtoolbar": "Prikaži traku s alatkama za uređivanje",
        "tog-editondblclick": "Uredi stranice dvostrukim klikom",
        "tog-editsectiononrightclick": "Uključi uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka",
        "tog-watchcreations": "Dodaj stranice i datoteke koje napravim na moj spisak praćenih članaka",
index 6800d66..3a7befe 100644 (file)
@@ -13,7 +13,6 @@
        "tog-extendwatchlist": "Kombangkon daftar pamataan tuna patidaon sude parubaan, inda umna tarbaru",
        "tog-usenewrc": "Kalompokkon editan i tampilan parubaan tarbaru dot daftar pamataan mardasorkon alaman",
        "tog-numberheadings": "Len nomor judul sacara otomatis",
-       "tog-showtoolbar": "Tampilkon bilah alat pangeditan",
        "tog-editondblclick": "Pature alaman dohot klik ganda",
        "tog-editsectiononrightclick": "Fungsion pangeditan bagian dohot mangklik siamun i judul bagian",
        "tog-watchcreations": "Tambaon alaman na ubaen dot berkas na uunggah tu daftar pamataan",
index ae2a6cb..586f07f 100644 (file)
@@ -72,7 +72,6 @@
        "tog-extendwatchlist": "Desplega la llista de seguiment per a mostrar tots els canvis afectats, no només els més recents",
        "tog-usenewrc": "Agrupa els canvis per pàgina en canvis recents i llista de seguiment",
        "tog-numberheadings": "Enumera automàticament els encapçalaments",
-       "tog-showtoolbar": "Mostra la barra d'eines d'edició (cal JavaScript)",
        "tog-editondblclick": "Edita les pàgines amb un doble clic (cal JavaScript)",
        "tog-editsectiononrightclick": "Habilita l'edició per seccions en clicar amb el botó dret sobre els títols de les seccions (cal JavaScript)",
        "tog-watchcreations": "Afegeix les pàgines que vagi creant i fitxers que carregui a la llista de seguiment",
index 96db33f..b0189b9 100644 (file)
@@ -26,7 +26,6 @@
        "tog-extendwatchlist": "敆擴展監視單單臺中顯示所有其更改,伓啻最近其更改",
        "tog-usenewrc": "按頁顯示最近修改共監視列表臺中其群組改變",
        "tog-numberheadings": "標題自動編號",
-       "tog-showtoolbar": "顯示編輯家私條",
        "tog-editondblclick": "雙擊就修改頁面",
        "tog-editsectiononrightclick": "啟用右擊標題編輯段落",
        "tog-watchcreations": "加添我開其頁面共我上傳其文件遘我其監視單",
index c6142e4..75120c8 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "Шорбина тӀехьажарна могӀам, ша беригге а, хийцамаш чубогӀуш, тӀехьаббина боцурш а",
        "tog-usenewrc": "Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)",
        "tog-numberheadings": "Ша шех хlитто терахь корташна",
-       "tog-showtoolbar": "Гайта лакхара гӀирсийн панель тадарш дечу хенахь",
        "tog-editondblclick": "Нисъе агӀонаш шозза тӀетаӀийча (JavaScript)",
        "tog-editsectiononrightclick": "Нисде дакъа шозза бакъехьар дахка тӀетаӀийча оцу кортан (JavaScript)",
        "tog-watchcreations": "ТӀетоха ас кхоьллина агӀонаш тергаме могӀам чу",
index c38812e..5bfbf4a 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "Padak-a ang gibantayan aron mapakita ang tanang kausaban, dili lang ang labing bag-o",
        "tog-usenewrc": "Gamita ang na-enhance nga mga bag-ong giusab (JavaScript kinahanglan)",
        "tog-numberheadings": "Awtomatiko ang pagnumero sa mga heading",
-       "tog-showtoolbar": "Ipakita ang toolbar sa pag-edit (JavaScript)",
        "tog-editondblclick": "I-edit ang panid inig dobol-klik (JavaScript)",
        "tog-editsectiononrightclick": "Mahimo ang pag-usab sa seksyon pinaagi sa pag-right click sa titulo sa seksyon (JavaScript kinahanglan)",
        "tog-watchcreations": "Bantayi ang akong gisugdang mga panid",
index 5d4e5b7..fbea87b 100644 (file)
@@ -32,7 +32,6 @@
        "tog-extendwatchlist": "لیستی چاودێری درێژبکەرەوە بۆ نیشان دانی ھەموو گۆڕانکارییەکان، نەک تەنھا دوایینەکان.",
        "tog-usenewrc": "گۆڕانکارییەکان لە دوایین گۆڕانکارییەکان و پێرستی چاودێریدا بەپێی پەڕە پۆلێن بکە",
        "tog-numberheadings": "ژمارەکردنی خۆگەڕی سەردێڕەکان",
-       "tog-showtoolbar": "تووڵامرازی دەستکاری نیشان بدە",
        "tog-editondblclick": "دەستکاریی پەڕە بە دووکرتە",
        "tog-editsectiononrightclick": "دەستکاریی بەشەکان بە کرتەی ڕاست لەسەر سەردێڕی بەشەکان",
        "tog-watchcreations": "ئەو پەڕانەی من دروستم کردوون و ئەو پەڕگانە من بارم کردوون زیاد بکە بە لیستی چاودێڕییەکەم",
        "protectedtitlesempty": "ھیچ سەرناوێک بەم سنوورانەوە ئێستا نەپارێزراوە.",
        "listusers": "پێرستی بەکارھێنەران",
        "listusers-editsonly": "تەنیا ئەو بەکارھێنەرانە نیشان بدە کە دەستکارییان کردووە",
+       "listusers-temporarygroupsonly": "تەنیا ئەو بەکارھێنەرانە نیشان بدە کە بە شێوەیەکی کاتی مافیان ھەیە",
        "listusers-creationsort": "ڕیزکردن بە پێی ڕێکەوتی دروستکردن",
        "listusers-desc": "ڕیزکردنی بەرەوە ژێر",
        "usereditcount": "$1 {{PLURAL:$1|دەستکاری|دەستکاری}}",
index b8c7d88..86d642c 100644 (file)
@@ -41,7 +41,7 @@
        "august": "aostu",
        "september": "settembre",
        "october": "ottobre",
-       "november": "nuvembre",
+       "november": "nuvembri",
        "december": "dicembre",
        "january-gen": "ghjennaghju",
        "february-gen": "ferraghju",
        "istemplate": "inclusione",
        "whatlinkshere-prev": "{{PLURAL:$1|precidente|precidenti $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|seguente|seguenti $1}}",
-       "whatlinkshere-links": "$1 ligami",
-       "whatlinkshere-hidetrans": "inclusione",
+       "whatlinkshere-links": " ligami",
+       "whatlinkshere-hidetrans": "$1 inclusione",
        "whatlinkshere-hidelinks": "$1 ligami",
        "ipaddressorusername": "Adrizzu IP o nome di cuntributore",
        "ipbreason": "Mutivu:",
index 316a13d..efe0557 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "Palapadon ang lista sang mga ginabantayan para makita ang tanan nga nagla-in, indi lang man ang pinakabag-o",
        "tog-usenewrc": "Gamiton ang ginpatahum nga mga bag-ong ilis {kinanglan ang Javascript}",
        "tog-numberheadings": "Insigida nga pag-isip sang numero sa mga titulo",
-       "tog-showtoolbar": "Ipakita ang toolbar sang pag-ilis (kinahanglan ang JavaScript)",
        "tog-editondblclick": "Liwaton ang mga pahina sa duwa ka pindot {kinahanglan ang Javascript}",
        "tog-editsectiononrightclick": "Pasugtan ang pag-ilis sang mga bahin pama-agi sa tu-o nga pagpindot sa mga titulo sang pahina {kinanglan ang JavaScript}",
        "tog-watchcreations": "Idugang sa akon balantayan ang mga pahina nga gin-ubra ko.",
index 2241458..6216acd 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "Козетюв джедвелини, тек сонъки дегиль, бутюн денъиштирмелерни корьмек ичюн кенишлет",
        "tog-usenewrc": "Сонъки денъиштирмелер саифесиндеки ве козетюв джедвелиндеки денъиштирмелерни группаландырув (JavaScript керек)",
        "tog-numberheadings": "Серлеваларны автоматик номераландыр",
-       "tog-showtoolbar": "Саифени денъиштирген вакъытта ярдымджы дёгмелерни косьтер. (JavaScript)",
        "tog-editondblclick": "Саифени чифт басып денъиштирмеге башла (JavaScript)",
        "tog-editsectiononrightclick": "Болюк серлевасына онъ баскъанда денъиштирюв пенджересини ач. (JavaScript)",
        "tog-watchcreations": "Яраткъан саифелеримни ве юклеген файлларымны козетюв джедвелиме кирсет",
index 02405da..7435577 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "Közetüv cedvelini, tek soñki degil, bütün deñiştirmelerni körmek içün kenişlet",
        "tog-usenewrc": "Soñki deñiştirmeler saifesindeki ve közetüv cedvelindeki deñiştirmelerni gruppalandıruv (JavaScript kerek)",
        "tog-numberheadings": "Serlevalarnı avtomatik nomeralandır",
-       "tog-showtoolbar": "Saifeni deñiştirgen vaqıtta yardımcı dögmelerni köster. (JavaScript)",
        "tog-editondblclick": "Saifeni çift basıp deñiştirmege başla (JavaScript)",
        "tog-editsectiononrightclick": "Bölük serlevasına oñ basqanda deñiştirüv penceresini aç. (JavaScript)",
        "tog-watchcreations": "Yaratqan saifelerimni ve yüklegen fayllarımnı közetüv cedvelime kirset",
index 3c5fdfa..130c37a 100644 (file)
@@ -52,7 +52,6 @@
        "tog-extendwatchlist": "Na seznamu sledovaných stránek zobrazovat všechny změny, ne jen tu poslední",
        "tog-usenewrc": "V posledních změnách a sledovaných stránkách seskupovat změny podle stránek",
        "tog-numberheadings": "Automaticky číslovat nadpisy",
-       "tog-showtoolbar": "Zobrazit panel nástrojů",
        "tog-editondblclick": "Editovat stránky dvojklikem",
        "tog-editsectiononrightclick": "Umožnit editaci části stránky kliknutím pravým tlačítkem na nadpisy sekcí",
        "tog-watchcreations": "Přidávat mnou založené stránky a načtené soubory ke sledovaným",
index a5b0b20..ab129e1 100644 (file)
@@ -24,7 +24,6 @@
        "tog-extendwatchlist": "Rozwinië lëstã ùzérónëch artiklów bë wëskrzënic wszëtczé zmianë, ni le blós slédné",
        "tog-usenewrc": "Grëpùjë zjinaczi wedle starnów na lëscé slédnych zjinaków ë ùzérónych",
        "tog-numberheadings": "Aùtomatné numerowanié nôgłówków",
-       "tog-showtoolbar": "Wëskrzëni listwã nôrzãdzów edicëji",
        "tog-editondblclick": "Editëjë starnë przez dëbeltné klëkniãcé",
        "tog-editsectiononrightclick": "Włączë edicjã sekcji bez klëkniãcé prawą knąpą mëszë na titlu sekcje",
        "tog-watchcreations": "Dodôwôj do mòji lëstë ùzérónëch artiklów starnë, chtërné ùsôdzã, i lopczi, chtërné wladëjã",
index 9af37c1..122d457 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "Пĕтĕм улшăнусене кăтартакан анлă сăнав списокĕ",
        "tog-usenewrc": "Юлашки улшăнусен лайăхлатнă списокĕ (JavaScript)",
        "tog-numberheadings": "Заголовоксене хăй тĕллĕн номерлесе пымалла.",
-       "tog-showtoolbar": "Тӳрлетнĕ чухне çӳлти хатĕрсен хăмине кăтартмалла (JavaScript)",
        "tog-editondblclick": "Иккĕ пуссан статьяна тӳрлетмелле (JavaScript)",
        "tog-editsectiononrightclick": "Шăшин сылтăм пускăчне пуссан статья пайне тӳрлетмелле (JavaScript)",
        "tog-watchcreations": "Эпĕ тунă страницăсене сăнав списокне кĕртмелле",
index 66a0816..314619a 100644 (file)
@@ -32,7 +32,6 @@
        "tog-extendwatchlist": "Ehangu'r rhestr wylio i ddangos pob golygiad yn hytrach na'r diweddaraf yn unig",
        "tog-usenewrc": "Grwpio'r newidiadau bob yn ddalen yn y 'newidiadau diweddar' a'r 'rhestr wylio'",
        "tog-numberheadings": "Rhifo penawdau'n awtomatig",
-       "tog-showtoolbar": "Dangos y bar offer golygu",
        "tog-editondblclick": "Golygu tudalennau wrth glicio ddwywaith",
        "tog-editsectiononrightclick": "Galluogi golygu adran drwy dde-glicio ar bennawd yr adran",
        "tog-watchcreations": "Ychwanegu tudalennau at fy rhestr wylio wrth i mi eu creu a ffeiliau wrth i mi eu huwchlwytho.",
index 85b7efd..3add3bb 100644 (file)
@@ -81,7 +81,6 @@
        "tog-extendwatchlist": "Udvid overvågningslisten til at vise alle ændringer og ikke kun den nyeste",
        "tog-usenewrc": "Gruppér ændringer efter side i listen over seneste ændringer og i overvågningslisten",
        "tog-numberheadings": "Automatisk nummerering af overskrifter",
-       "tog-showtoolbar": "Vis værktøjslinje til redigering",
        "tog-editondblclick": "Redigér sider med dobbeltklik",
        "tog-editsectiononrightclick": "Redigér afsnit ved at højreklikke på deres titler",
        "tog-watchcreations": "Føj sider jeg opretter og filer jeg lægger op, til min overvågningsliste",
        "ipb-disableusertalk": "Forhindr denne bruger i at redigere sin egen brugerdiskussion under blokeringen",
        "ipb-change-block": "Forny brugerens blokering med disse indstillinger",
        "ipb-confirm": "Bekræft blokering",
+       "ipb-partial": "Delvist",
+       "ipb-type-label": "Type",
+       "ipb-pages-label": "Sider",
        "badipaddress": "IP-adressen/brugernavnet er udformet forkert eller eksistere ikke.",
        "blockipsuccesssub": "Blokeringen er gennemført.",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] er blevet blokeret.<br />\nSe [[Special:BlockList|blokeringslisten]] for alle blokeringer.",
        "createaccountblock": "oprettelse af konto deaktiveret",
        "emailblock": "e-mail blokeret",
        "blocklist-nousertalk": "kan ikke redigere egen diskussionsside",
+       "blocklist-editing": "redigering",
        "ipblocklist-empty": "Blokeringslisten er tom.",
        "ipblocklist-no-results": "Den angivene IP-addresse eller brugernavn er ikke blokeret.",
        "blocklink": "blokér",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Tilføj en kategori...",
        "mw-widgets-usersmultiselect-placeholder": "Tilføj flere ...",
+       "mw-widgets-titlesmultiselect-placeholder": "Tilføj flere ...",
        "date-range-from": "Fra dato:",
        "date-range-to": "Til dato:",
        "sessionmanager-tie": "Kan ikke kombinere flere forespørgselgodkendelsetyper: $1.",
index 9773a6a..e122a07 100644 (file)
@@ -35,7 +35,6 @@
        "tog-extendwatchlist": "In der Beobachtungsliste alle Änderungen anzeigen, nicht nur die aktuellsten",
        "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
        "tog-numberheadings": "Überschriften automatisch nummerieren",
-       "tog-showtoolbar": "Bearbeiten-Werkzeugleiste aktivieren",
        "tog-editondblclick": "Seiten mit Doppelklick bearbeiten",
        "tog-editsectiononrightclick": "Einzelne Abschnitte per Rechtsklick bearbeiten",
        "tog-enotifrevealaddr": "Ihre E-Mail-Adresse in Benachrichtigungs-E-Mails anzeigen",
index ed33c4b..5b21347 100644 (file)
        "tog-extendwatchlist": "Alle Änderungen in der Beobachtungsliste anzeigen, nicht nur die aktuellsten",
        "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
        "tog-numberheadings": "Überschriften automatisch nummerieren",
-       "tog-showtoolbar": "Bearbeiten-Werkzeugleiste anzeigen",
        "tog-editondblclick": "Seiten mit Doppelklick bearbeiten",
        "tog-editsectiononrightclick": "Einzelne Abschnitte per Rechtsklick auf die Überschrift bearbeiten",
        "tog-watchcreations": "Selbst erstellte Seiten und hochgeladene Dateien automatisch beobachten",
        "subject-preview": "Vorschau der Zusammenfassungszeile:",
        "previewerrortext": "Beim Versuch, eine Vorschau deiner Änderungen anzuzeigen, ist ein Fehler aufgetreten.",
        "blockedtitle": "Benutzer ist gesperrt",
+       "blocked-email-user": "<strong>Dein Benutzerkonto wurde für das Versenden von E-Mails gesperrt. Du kannst noch andere Seiten in diesem Wiki bearbeiten.</strong> Du kannst die vollständigen Einzelheiten in deinen [[Special:MyContributions|Benutzerbeiträgen]] einsehen.\n\nDie Sperre wurde von $1 durchgeführt.\n\nDie angegebene Begründung lautet: <em>$2</em>.\n\n* Beginn der Sperre: $8\n* Ablauf der Sperre: $6\n* Sperre betrifft: $7\n* Sperrkennung: #$5",
+       "blockedtext-partial": "<strong>Dein Benutzerkonto oder deine IP-Adresse wurde für das Durchführen von Änderungen an dieser Seite gesperrt. Du kannst noch andere Seiten in diesem Wiki bearbeiten.</strong> Du kannst die vollständigen Einzelheiten in deinen [[Special:MyContributions|Benutzerbeiträgen]] einsehen.\n\nDie Sperre wurde von $1 durchgeführt.\n\nDie angegebene Begründung lautet: <em>$2</em>.\n\n* Beginn der Sperre: $8\n* Ablauf der Sperre: $6\n* Sperre betrifft: $7\n* Sperrkennung: #$5",
        "blockedtext": "'''Dein Benutzername oder deine IP-Adresse wurde gesperrt.'''\n\nDie Sperrung wurde vom Administrator $1 durchgeführt.\nAls Grund wurde ''$2'' angegeben.\n\n* Beginn der Sperre: $8\n* Ende der Sperre: $6\n* Sperre betrifft: $7\n\nDu kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.\nDu kannst die „{{int:emailuser}}“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.\nDeine aktuelle IP-Adresse ist $3 und die Sperrkennung lautet $5.\nBitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
        "autoblockedtext": "Deine IP-Adresse wurde automatisch gesperrt, da sie von einem anderen Benutzer genutzt wurde, der von $1 gesperrt wurde.\nAls Grund wurde angegeben:\n\n:''$2''\n\n* Beginn der Sperre: $8\n* Ende der Sperre: $6\n* Sperre betrifft: $7\n\nDu kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.\n\nDu kannst die „{{int:emailuser}}“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.\n\nDeine aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.\nBitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
        "systemblockedtext": "Dein Benutzername oder deine IP-Adresse wurde von MediaWiki automatisch gesperrt.\nDer angegebene Grund ist:\n\n:<em>$2</em>\n\n* Beginn der Sperre: $8\n* Ablauf der Sperre: $6\n* Sperre betrifft: $7\n\nDeine aktuelle IP-Adresse ist $3.\nBitte gib alle oben stehenden Details in jeder Anfrage an.",
        "ipb-disableusertalk": "Diesen Benutzer daran hindern, seine eigene Diskussionsseite zu bearbeiten, solange er gesperrt ist",
        "ipb-change-block": "Sperre mit diesen Sperrparametern erneuern",
        "ipb-confirm": "Sperrung bestätigen",
+       "ipb-sitewide": "Auf der gesamten Website",
+       "ipb-partial": "Teilweise",
+       "ipb-type-label": "Typ",
+       "ipb-pages-label": "Seiten",
        "badipaddress": "Die IP-Adresse hat ein falsches Format.",
        "blockipsuccesssub": "Die Sperrung war erfolgreich.",
        "blockipsuccesstext": "Der Benutzer / die IP-Adresse [[Special:Contributions/$1|$1]] wurde gesperrt.<br />\nZur Aufhebung der Sperre siehe die [[Special:BlockList|Liste aller aktiven Sperren]].",
        "createaccountblock": "Erstellung von Benutzerkonten gesperrt",
        "emailblock": "E-Mail-Versand gesperrt",
        "blocklist-nousertalk": "darf eigene Diskussionsseite nicht bearbeiten",
+       "blocklist-editing": "Bearbeiten",
+       "blocklist-editing-sitewide": "Bearbeiten (gesamte Website)",
        "ipblocklist-empty": "Die Liste enthält keine Einträge.",
        "ipblocklist-no-results": "Die gesuchte IP-Adresse/der Benutzername ist nicht gesperrt.",
        "blocklink": "Sperren",
        "logentry-block-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} für eine Dauer von $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|hob}} die Sperre von {{GENDER:$4|$3}} auf",
        "logentry-block-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} für das Bearbeiten {{PLURAL:$8||der Seiten}} $7 mit einer Ablaufzeit von $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} zum Verhindern von Bearbeitungen auf {{PLURAL:$8||den Seiten}} $7 mit einer Ablaufzeit von $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} für Nicht-Bearbeitungsaktionen mit einer Ablaufzeit von $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} für Nicht-Bearbeitungsaktionen mit einer Ablaufzeit von $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importierte}} $3 durch das Hochladen einer Datei",
        "duration-seconds": "$1 {{PLURAL:$1|Sekunde|Sekunden}}",
        "duration-minutes": "$1 {{PLURAL:$1|Minute|Minuten}}",
        "duration-hours": "$1 {{PLURAL:$1|Stunde|Stunden}}",
-       "duration-days": "$1 {{PLURAL:$1|Tag|Tage}}",
+       "duration-days": "$1 {{PLURAL:$1|Tag|Tagen}}",
        "duration-weeks": "$1 {{PLURAL:$1|Woche|Wochen}}",
        "duration-years": "$1 {{PLURAL:$1|Jahr|Jahre}}",
        "duration-decades": "$1 {{PLURAL:$1|Jahrzehnt|Jahrzehnte}}",
        "mw-widgets-titleinput-description-redirect": "Weiterleitung nach $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Eine Kategorie hinzufügen …",
        "mw-widgets-usersmultiselect-placeholder": "Weitere hinzufügen …",
+       "mw-widgets-titlesmultiselect-placeholder": "Weitere hinzufügen …",
        "date-range-from": "Von Datum:",
        "date-range-to": "Bis Datum:",
        "sessionmanager-tie": "Mehrere Anfrageauthentifikationstypen konnten nicht kombiniert werden: $1.",
index b886c37..72d07fb 100644 (file)
@@ -42,7 +42,6 @@
        "tog-extendwatchlist": "Lista seyrkerdışi hera bıke ke vurnayışi pêro basê, tenya tewr peyêni nê",
        "tog-usenewrc": "Vurnayışê ke pela vurnayışanê peyênan û lista seyrkerdışi derê inan grube ke.",
        "tog-numberheadings": "Sernuşteyan be xo numre cı şane",
-       "tog-showtoolbar": "Toolbar virnayisi bivin (JavaScript lazımo)",
        "tog-editondblclick": "Per virnayisi di dilet klik bike (JavaScript lazımo)",
        "tog-editsectiononrightclick": "Qısıman be tıknayışê serrêze ra ebe gocega raşte bıvurne (JavaScript lazımo)",
        "tog-watchcreations": "Pelê ke mı afernayê u dosyeyê ke mı bar kerdê lista mına seyrkerdışi ke",
index e0137af..7f02bb6 100644 (file)
@@ -31,7 +31,6 @@
        "tog-extendwatchlist": "Wobglědowańku wócyniś, aby wšě změny pokazał, nic jano nejnowše",
        "tog-usenewrc": "Kupkowe změny pó boku w aktualnych změnach a wobglědowanjach",
        "tog-numberheadings": "Nadpisma awtomatiski numerěrowaś",
-       "tog-showtoolbar": "Wobźěłowańsku rědku pokazaś",
        "tog-editondblclick": "Boki z dwójnym kliknjenim wobźěłaś",
        "tog-editsectiononrightclick": "Wobźěłowanje wótrězkow pśez kliknjenje z pšaweju tastu myški zmóžniś",
        "tog-watchcreations": "Boki, kótarež napórajom a dataje, kótarež nagrawam, wobglědowaś",
index 1f8403a..8181f93 100644 (file)
@@ -14,7 +14,6 @@
        "tog-extendwatchlist": "Pointongo koinsanai listamangan do popokito koinsanai pinongundolihon, okon ko iri kawawagu nopo",
        "tog-usenewrc": "Tinimungan nopingalanan maya bobolikon ii wagu kaalanai om lispintangan",
        "tog-numberheadings": "oporian-mongonumbur it tuluhon",
-       "tog-showtoolbar": "Pokitono kakamotbar mongidit",
        "tog-editondblclick": "Idito bolikon momoguno induaan todos",
        "tog-editsectiononrightclick": "Pabanaro sikson mongidit momoguno todos golibang id sikson tuluon",
        "tog-watchcreations": "Ruhangai bolikon di winonsoiku om nogi pail pinosuangku id lisintanganku",
index b502538..ecfa68d 100644 (file)
@@ -19,7 +19,6 @@
        "tog-extendwatchlist": "निगरानी सूचीलाई सबै परिवर्तन धेकुन्या गरी बढुन्या , ऐईलका बाहेक",
        "tog-usenewrc": "पानाका अहिलका  परिवर्तन र अवलोकन सूचीका आधारमी सामूहिक परिवर्तनहरू",
        "tog-numberheadings": "शीर्षकहरूलाई स्वत:अङ्कित गर",
-       "tog-showtoolbar": "सम्पादन औजारबट्टा धेकौन्या",
        "tog-editondblclick": "दोहोरो क्लिकमा पाना सम्पादन गर्ने",
        "tog-editsectiononrightclick": "शीर्षकमा दाहिने क्लिकद्वारा खण्ड सम्पादन सक्षम पारन्या",
        "tog-watchcreations": "मेरा ध्यान सूचीमा मुइले सृजना गरयाका पाना र अपलोड जोड्न्या",
index f3a81cc..f4216fb 100644 (file)
@@ -19,7 +19,6 @@
        "tog-extendwatchlist": "Fà vèder tót' al mudéfichi fât a i tgnû sòt ôc, mìa sōl l'ûltma.",
        "tog-usenewrc": "Unés al mudéfichi per pàgina int al j ûltmi mudéfichi e in quî tgnû sòt' ôc.",
        "tog-numberheadings": "Cûnta automâtica di tétol ed sesiòun.",
-       "tog-showtoolbar": "Fà vèder la bâra di strumèint ed mudéfica.",
        "tog-editondblclick": "Mudéfica 'l pàgini cun un cléch dòpi.",
        "tog-editsectiononrightclick": "Mudéfica dal sesiòun per mèz dal cléch a dréta insém al tétol.",
        "tog-watchcreations": "Zûnta al pàgini fâti e i file carghê int i tgnû 'd ôc specêl.",
index ca46c54..44fc58e 100644 (file)
@@ -67,7 +67,6 @@
        "tog-extendwatchlist": "Επέκταση της λίστας παρακολούθησης ώστε να δείχνει όλες τις αλλαγές, όχι μόνο τις πιο πρόσφατες",
        "tog-usenewrc": "Ομαδοποίηση αλλαγών ανά σελίδα στις πρόσφατες αλλαγές και στη λίστα παρακολούθησης",
        "tog-numberheadings": "Αυτόματη αρίθμηση επικεφαλίδων",
-       "tog-showtoolbar": "Εμφάνιση μπάρας εργαλείων επεξεργασίας",
        "tog-editondblclick": "Επεξεργασία σελίδων με διπλό κλικ",
        "tog-editsectiononrightclick": "Ενεργοποίηση επεξεργασίας ενοτήτων με δεξί κλικ στους τίτλους των ενοτήτων",
        "tog-watchcreations": "Προσθήκη σελίδων που δημιουργώ και αρχείων που ανεβάζω στη λίστα παρακολούθησής μου",
        "ipb-disableusertalk": "Αποτρέψτε αυτό το χρήστη από την επεξεργασία της δική του σελίδας συζήτησης, ενώ είναι αποκλεισμένος",
        "ipb-change-block": "Επαναφραγή του χρήστη με αυτές τις ρυθμίσεις",
        "ipb-confirm": "Επιβεβαίωση φραγής",
+       "ipb-partial": "Μερική",
+       "ipb-type-label": "Τύπος",
+       "ipb-pages-label": "Σελίδες",
        "badipaddress": "Άκυρη διεύθυνση IP.",
        "blockipsuccesssub": "Η φραγή ολοκληρώθηκε επιτυχώς.",
        "blockipsuccesstext": "{{GENDER:$1|Ο|Η}} [[Special:Contributions/$1|$1]] έχει υποστεί φραγή.<br />\nΔείτε τον [[Special:BlockList|κατάλογο φραγών]] για να εποπτεύσετε τις φραγές.",
        "mw-widgets-titleinput-description-redirect": "ανακατεύθυνση στο $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Προσθήκη κατηγορίας...",
        "mw-widgets-usersmultiselect-placeholder": "Προσθήκη περισσότερων...",
+       "mw-widgets-titlesmultiselect-placeholder": "Προσθήκη περισσότερων...",
        "date-range-from": "Από ημερομηνία:",
        "date-range-to": "Έως ημερομηνία:",
        "sessionprovider-generic": "$1 συνεδρίες",
index f002731..f03f82b 100644 (file)
@@ -46,7 +46,6 @@
        "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent",
        "tog-usenewrc": "Group changes by page in recent changes and watchlist",
        "tog-numberheadings": "Auto-number headings",
-       "tog-showtoolbar": "Show edit toolbar",
        "tog-editondblclick": "Edit pages on double click",
        "tog-editsectiononrightclick": "Enable section editing by right clicking on section titles",
        "tog-watchcreations": "Add pages I create and files I upload to my watchlist",
index e35af5a..91f259e 100644 (file)
@@ -11,7 +11,6 @@
        "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent",
        "tog-usenewrc": "Group changes by page in recent changes and watchlist",
        "tog-numberheadings": "Auto-number headings",
-       "tog-showtoolbar": "Show edit toolbar",
        "tog-editondblclick": "Edit pages on double click",
        "tog-editsectiononrightclick": "Enable section editing by right clicking on section titles",
        "tog-watchcreations": "Add pages I create and files I upload to my watchlist",
        "subject-preview": "Preview of subject:",
        "previewerrortext": "An error occurred while attempting to preview your changes.",
        "blockedtitle": "User is blocked",
+       "blocked-email-user": "<strong>Your username has been blocked from sending email. You can still edit other pages on this wiki.</strong> You can view the full block details at [[Special:MyContributions|account contributions]].\n\nThe block was made by $1.\n\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n* Block ID #$5",
+       "blockedtext-partial": "<strong>Your username or IP address has been blocked from making changes to this page. You can still edit other pages on this wiki.</strong> You can view the full block details at [[Special:MyContributions|account contributions]].\n\nThe block was made by $1.\n\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n* Block ID #$5",
        "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"{{int:emailuser}}\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
        "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"{{int:emailuser}}\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
        "systemblockedtext": "Your username or IP address has been automatically blocked by MediaWiki.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYour current IP address is $3.\nPlease include all above details in any queries you make.",
        "ipb-disableusertalk": "Prevent this user from editing their own talk page while blocked",
        "ipb-change-block": "Re-block the user with these settings",
        "ipb-confirm": "Confirm block",
+       "ipb-sitewide": "Sitewide",
+       "ipb-partial": "Partial",
+       "ipb-type-label": "Type",
+       "ipb-pages-label": "Pages",
        "badipaddress": "Invalid IP address",
        "blockipsuccesssub": "Block succeeded",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] has been blocked.<br />\nSee the [[Special:BlockList|block list]] to review blocks.",
        "createaccountblock": "account creation disabled",
        "emailblock": "email disabled",
        "blocklist-nousertalk": "cannot edit own talk page",
+       "blocklist-editing": "editing",
+       "blocklist-editing-sitewide": "editing (sitewide)",
        "ipblocklist-empty": "The block list is empty.",
        "ipblocklist-no-results": "The requested IP address or username is not blocked.",
        "blocklink": "block",
        "logentry-block-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiration time of $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|unblocked}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiration time of $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} from editing {{PLURAL:$8||the pages}} $7 with an expiration time of $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} preventing edits on {{PLURAL:$8||the pages}} $7 with an expiration time of $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} from non-editing actions with an expiration time of $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} for non-editing actions with an expiration time of $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiration time of $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiration time of $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|imported}} $3 by file upload",
        "mw-widgets-titleinput-description-redirect": "redirect to $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Add a category...",
        "mw-widgets-usersmultiselect-placeholder": "Add more...",
+       "mw-widgets-titlesmultiselect-placeholder": "Add more...",
        "date-range-from": "From date:",
        "date-range-to": "To date:",
        "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
index fd9d966..aac234e 100644 (file)
@@ -51,7 +51,8 @@
                        "Gamliel Fishkin",
                        "Kastanoto",
                        "Rafaneta",
-                       "NMaia"
+                       "NMaia",
+                       "Joao Xavier"
                ]
        },
        "tog-underline": "Substrekado de ligiloj:",
@@ -62,7 +63,6 @@
        "tog-extendwatchlist": "Etendi la atentaron por montri ĉiujn ŝanĝojn, ne nur la plej lastajn",
        "tog-usenewrc": "Grupigi ŝanĝojn laŭ paĝo en \"Lastaj ŝanĝoj\" kaj \"Atentaro\" (bezonas Ĝavaskripton)",
        "tog-numberheadings": "Aŭtomate numeri sekciojn",
-       "tog-showtoolbar": "Montri redakto-breton",
        "tog-editondblclick": "Redakti paĝojn per duobla alklako",
        "tog-editsectiononrightclick": "Ŝalti sekcian redaktadon per dekstra musklako de sekciaj titoloj (per Ĝavaskripto)",
        "tog-watchcreations": "Aldoni miajn kreatajn paĝojn kaj miajn alŝutaĵojn al mia atentaro",
        "savechanges": "Konservi ŝanĝojn",
        "publishpage": "Eldoni paĝon",
        "publishchanges": "Publikigi ŝanĝojn",
+       "publishchanges-start": "Publikigi ŝanĝojn…",
        "preview": "Antaŭrigardo",
        "showpreview": "Antaŭrigardo",
        "showdiff": "Montri ŝanĝojn",
index 8e490ef..52d48e7 100644 (file)
@@ -14,7 +14,6 @@
        "tog-hideminor": "Ocultar ediciones menores de los cambios recientes",
        "tog-hidepatrolled": "Ocultar ediciones patrulladas de los cambios recientes",
        "tog-newpageshidepatrolled": "Ocultar páginas patrulladas de la lista de páginas nuevas",
-       "tog-showtoolbar": "Mostrar barra de edición",
        "tog-oldsig": "Su firma actual:",
        "tog-ccmeonemails": "Enviarme una copia de los correos electrónicos que yo envíe a otros usuarios",
        "sunday": "domingo",
index f5eb00d..087dfbb 100644 (file)
        "tog-extendwatchlist": "Mostrar todos los cambios en la lista de seguimiento, no solo los más recientes",
        "tog-usenewrc": "Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento",
        "tog-numberheadings": "Numerar automáticamente los encabezados",
-       "tog-showtoolbar": "Mostrar la barra de edición",
        "tog-editondblclick": "Editar páginas al hacer doble clic",
        "tog-editsectiononrightclick": "Permitir las modificaciones de sección al hacer clic derecho en sus títulos",
        "tog-watchcreations": "Añadir a mi lista de seguimiento las páginas que cree y los archivos que suba",
        "pageinfo-category-files": "Número de archivos",
        "pageinfo-user-id": "Identificador de usuario",
        "pageinfo-file-hash": "Resumen criptográfico",
+       "pageinfo-view-protect-log": "Ver el registro de protecciones de esta página.",
        "markaspatrolleddiff": "Marcar como verificada",
        "markaspatrolledtext": "Marcar esta página como verificada",
        "markaspatrolledtext-file": "Marcar esta versión de archivo como verificada",
        "limitreport-ppgeneratednodes": "N.º de nodos generados por el preprocesador",
        "limitreport-postexpandincludesize": "Tamaño de inclusión posexpansión",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
-       "limitreport-templateargumentsize": "Argumento del tamaño de la plantilla",
+       "limitreport-templateargumentsize": "Tamaño de los parámetros de plantilla",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Profundidad máxima de expansión",
-       "limitreport-expensivefunctioncount": "Cuenta de la función expansiva del analizador",
+       "limitreport-expensivefunctioncount": "Contador de funciones costosas del analizador",
        "limitreport-unstrip-depth": "Profundidad de recursión de función «unstrip»",
-       "limitreport-unstrip-size": "Unstrip tamaño post-expandido",
+       "limitreport-unstrip-size": "Tamaño tras la expansión de «unstrip»",
        "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "expandtemplates": "Expandir plantillas",
        "expand_templates_intro": "Esta página especial toma un texto wiki y expande todas sus plantillas recursivamente.\nTambién expande las funciones sintácticas como <code><nowiki>{{</nowiki>#language:…}}</code>, y variables como\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. De hecho, expande casi cualquier cosa que esté entre llaves dobles.",
index c2439de..553cdfe 100644 (file)
@@ -42,7 +42,6 @@
        "tog-extendwatchlist": "Laienda jälgimisloendit, et näha kõiki muudatusi, mitte vaid kõige värskemaid",
        "tog-usenewrc": "Rühmita viimased muudatused ja muudatuste jälgimisloend lehekülje järgi",
        "tog-numberheadings": "Pealkirjade automaatnummerdus",
-       "tog-showtoolbar": "Näita redigeerimise tööriistariba",
        "tog-editondblclick": "Redigeeri lehekülgi topeltklõpsu peale",
        "tog-editsectiononrightclick": "Alusta alaosa redigeerimist paremklõpsuga alaosa pealkirjal",
        "tog-watchcreations": "Lisa jälgimisloendisse minu alustatud leheküljed ja minu üles laaditud failid",
index cfd0594..bec3183 100644 (file)
@@ -33,7 +33,8 @@
                        "MarcoAurelio",
                        "Iñaki LL",
                        "Amaia",
-                       "Matěj Suchánek"
+                       "Matěj Suchánek",
+                       "CiaPan"
                ]
        },
        "tog-underline": "Azpimarratu loturak:",
@@ -44,7 +45,6 @@
        "tog-extendwatchlist": "Jarraipen-zerrenda zabaldu aldaketa guztiak ikusteko, ez bakarrik azken aldaketak",
        "tog-usenewrc": "Azken aldaketetan eta jarraipen-zerrendan aldaketak orrialdearen arabera taldekatu",
        "tog-numberheadings": "Zenbakitu automatikoki atalburuak",
-       "tog-showtoolbar": "Aldaketen tresna-barra erakutsi",
        "tog-editondblclick": "Klik bikoitzaren bitartez orrialdeak aldatu",
        "tog-editsectiononrightclick": "Atalen izenburuetan eskuin klik eginez aldatzea gaitu",
        "tog-watchcreations": "Sortzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" lankidea ez dago erregistatuta. Mesedez, konprobatu orri hau editatu/sortu nahi duzun.",
        "userpage-userdoesnotexist-view": "\"$1\" erabiltzaile-kontua ez dago erregistraturik.",
        "blocked-notice-logextract": "Erabiltzaile hau blokeatuta dago une honetan.\nAzken blokeoaren erregistroa ageri da behean, erreferentzia gisa:",
-       "clearyourcache": "<strong>Oharra:</strong> Gorde ondoren, zure nabigatzailearen katxea ekidin beharko duzu aldaketak ikusteko.\n* <strong>Firefox / Safari:</strong> <em>Shift</em> tekla sakatu birkargatzeko momentuan, edo <em>Ctrl-Shift-R</em> edo <em>Crtl-F5</em>  sakatu (<em>⌘-R</em> Mac batean)\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R </em>  sakatu (<em>⌘-Shift-R</em> Mac batean)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> tekla sakatu birkargatzeko momentuan, edo <em>Ctrl-F5</em> sakatu\n* <strong>Opera</strong> erabiltzaileek <em>Tresnak → Hobespenak</em> atalera joan eta katxea garbitzeko aukera hautatu",
+       "clearyourcache": "<strong>Oharra:</strong> Gorde ondoren, zure nabigatzailearen katxea ekidin beharko duzu aldaketak ikusteko.\n* <strong>Firefox / Safari:</strong> <em>Shift</em> tekla sakatu birkargatzeko momentuan, edo <em>Ctrl-Shift-R</em> edo <em>Ctrl-F5</em>  sakatu (<em>⌘-R</em> Mac batean)\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R </em>  sakatu (<em>⌘-Shift-R</em> Mac batean)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> tekla sakatu birkargatzeko momentuan, edo <em>Ctrl-F5</em> sakatu\n* <strong>Opera</strong> erabiltzaileek <em>Tresnak → Hobespenak</em> atalera joan eta katxea garbitzeko aukera hautatu",
        "usercssyoucanpreview": "'''Laguntza:''' Zure CSS berria gorde aurretik probatzeko \"{{int:showpreview}}\" botoia erabili.",
        "userjsonyoucanpreview": "<strong>Aholkua:</strong> Gorde aurretik, erabili \"{{int:showpreview}}\" botoia zure JSON berria probatzeko.",
        "userjsyoucanpreview": "'''Laguntza:''' Zure JS berria gorde aurretik probatzeko \"{{int:showpreview}}\" botoia erabili.",
index e4f4c7b..885f9ea 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "Aumental la lista de seguimientu pa muestral tolos chambus apricabris, nu solu los úrtimus",
        "tog-usenewrc": "Resartal úrtimus chambus (es mestel JavaScript)",
        "tog-numberheadings": "Autu-numeral entítulus",
-       "tog-showtoolbar": "Muestral la barra d'eición (JavaScript)",
        "tog-editondblclick": "Eital páhinas haziendu dobri click (JavaScript)",
        "tog-editsectiononrightclick": "Premitil eital secionis pulsandu el botón de la derecha<br /> enus entítulus de secionis (JavaScript)",
        "tog-watchcreations": "Vehilal las páhinas que yo crei",
index 200f178..afaea4b 100644 (file)
@@ -79,7 +79,6 @@
        "tog-extendwatchlist": "گسترش فهرست پیگیری‌ها برای نمایش همهٔ تغییرات، نه فقط جدیدترین‌ها",
        "tog-usenewrc": "در تغییرات اخیر و فهرست پیگیری‌ها تغییرات بر پایهٔ صفحه‌ گروه‌بندی شود",
        "tog-numberheadings": "شماره‌گذاری خودکار عنوان‌ها",
-       "tog-showtoolbar": "نوار ابزار ویرایش نمایش داده شود",
        "tog-editondblclick": "ویرایش صفحات با دو کلیک",
        "tog-editsectiononrightclick": "فعال کردن ویرایش بخش‌ها با کلیک راست روی عنوان بخش‌ها",
        "tog-watchcreations": "صفحه‌هایی که می‌سازم و پرونده‌هایی که بارگذاری می‌کنم به فهرست پیگیری‌های من افزوده شود",
        "ipb-disableusertalk": "جلوگیری از ویرایشی صفحهً بحث توسط خود کاربر در زمانی که بسته است",
        "ipb-change-block": "بستن دوبارهٔ کاربر با این تنظیم‌ها",
        "ipb-confirm": "تأیید بستن",
+       "ipb-type-label": "نوع",
+       "ipb-pages-label": "صفحات",
        "badipaddress": "نشانی آی‌پی نامجاز",
        "blockipsuccesssub": "بستن با موفقیت انجام شد",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] بسته شد.<br />\nبرای بررسی بسته‌شده‌ها [[Special:BlockList|فهرست بسته‌شده‌ها]] را ببینید.",
        "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
        "mw-widgets-categoryselector-add-category-placeholder": "در حال افزودن رده ...",
        "mw-widgets-usersmultiselect-placeholder": "افزودن بیشتر...",
+       "mw-widgets-titlesmultiselect-placeholder": "افزودن بیشتر...",
        "date-range-from": "از تاریخ:",
        "date-range-to": "تا تاریخ:",
        "sessionmanager-tie": "نمی‌توان چندین نوع درخواست هویت‌سنجی را ترکیب کرد: $1.",
index 2c09e0b..3db8b2c 100644 (file)
@@ -70,7 +70,6 @@
        "tog-extendwatchlist": "Laajenna tarkkailulista näyttämään kaikki tehdyt muutokset, eikä vain viimeisimmät",
        "tog-usenewrc": "Ryhmittele muutokset sivun mukaan tuoreiden muutosten listalla ja tarkkailulistalla",
        "tog-numberheadings": "Numeroi otsikot automaattisesti",
-       "tog-showtoolbar": "Näytä työkalupalkki",
        "tog-editondblclick": "Muokkaa sivuja kaksoisnapsautuksella",
        "tog-editsectiononrightclick": "Muokkaa osioita napsauttamalla osion otsikkoa hiiren oikealla painikkeella",
        "tog-watchcreations": "Lisää luomani sivut ja tallentamani tiedostot tarkkailulistalleni",
index af388a4..3f930c7 100644 (file)
@@ -24,7 +24,6 @@
        "tog-extendwatchlist": "Víðka eftirlitslistan fyri at vísa allar broytingar, ikki bara tær seinastu",
        "tog-usenewrc": "Bólka broytingar eftir síðu í seinastu broytingum og eftirlitslita",
        "tog-numberheadings": "Sjálvvirkandi talmerking av yvirskriftum",
-       "tog-showtoolbar": "Vís rættingar-tóllinju",
        "tog-editondblclick": "Rætta síður við at tvíklikkja",
        "tog-editsectiononrightclick": "Rætta reglubrot við at høgraklikkja á reglubrotsyvirskrift",
        "tog-watchcreations": "Legg síður, sum eg stovni og fílur sum eg leggi út, afturat mínum eftirlitslista",
index 672d973..f2ef1ef 100644 (file)
        "tog-extendwatchlist": "Étendre la liste de suivi pour afficher toutes les modifications et pas uniquement les plus récentes",
        "tog-usenewrc": "Grouper les changements par page dans les modifications récentes et la liste de suivi",
        "tog-numberheadings": "Numéroter automatiquement les titres de section",
-       "tog-showtoolbar": "Afficher la barre d’outils d’édition",
        "tog-editondblclick": "Modifier les pages avec un double-clic",
        "tog-editsectiononrightclick": "Activer la modification des sections par un clic droit sur les titres de section",
        "tog-watchcreations": "Ajouter à ma liste de suivi les pages que je crée et les fichiers que j’importe",
        "subject-preview": "Aperçu du sujet :",
        "previewerrortext": "Une erreur s’est produite lors de la tentative de prévisualisation de vos modifications.",
        "blockedtitle": "L’utilisateur est bloqué.",
+       "blocked-email-user": "<strong>Votre nom d’utilisateur a été bloqué pour l’envoi de courriels. Vous pouvez toujours modifier d’autres pages sur ce wiki.</strong> Vous pouvez voir tous les détails du blocage sur [[Special:MyContributions|contributions du compte]].\n\nCe blocage a été fait par $1.\n\nLe motif fourni est <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Cible souhaitée du blocage : $7\n* ID du blocage #$5",
+       "blockedtext-partial": "<strong>Votre nom d’utilisateur ou votre adresse IP a été bloqué pour effectuer des modifications sur cette page. Vous pouvez toujours modifier d’autres pages sur ce wiki.</strong> Vous pouvez voir tous les détails sur ce blocage sur [[Special:MyContributions|contributions du compte]].\n\nLe blocage a été effectué par $1.\n\nLe motif fourni est <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Cible souhaitée du blocage : $7\n* ID du blocage #$5",
        "blockedtext": "<strong>Votre compte utilisateur ou votre adresse IP a été bloqué.</strong>\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{int:emailuser}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité ne vous a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
        "autoblockedtext": "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.\nLa raison invoquée est :\n\n: <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7\n\nVous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.\n\nNotez que vous ne pourrez utiliser la fonctionnalité « {{int:emailuser}} » que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que cette fonctionnalité ne vous a pas été désactivée.\n\nVotre adresse IP actuelle est $3, et le numéro de blocage est $5.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
        "systemblockedtext": "Votre nom d'utilisateur ou votre adresse IP ont été bloqués automatiquement par MediaWiki.\nLa raison donnée est la suivante:\n\n: <em>$2</em>.\n\n* Le début du blocage: $8\n* Expiration du délai de blocage: $6\n* Elément concerné: $7\n\nVotre adresse IP actuelle est $3.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
        "ipb-disableusertalk": "Empêcher l'utilisateur de modifier sa page de discussion pendant le blocage",
        "ipb-change-block": "Bloquer à nouveau l'utilisateur avec ces paramètres",
        "ipb-confirm": "Confirmer le blocage",
+       "ipb-sitewide": "À tout le site",
+       "ipb-partial": "Partiel",
+       "ipb-type-label": "Type",
+       "ipb-pages-label": "Pages",
        "badipaddress": "Adresse IP incorrecte",
        "blockipsuccesssub": "Blocage réussi",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e}}.<br />\nConsultez la [[Special:BlockList|liste des blocages]] pour voir les utilisateurs bloqués.",
        "createaccountblock": "création de compte bloquée",
        "emailblock": "courriel bloqué",
        "blocklist-nousertalk": "ne peut pas modifier sa propre page de discussion",
+       "blocklist-editing": "modification",
+       "blocklist-editing-sitewide": "modification (tout le site)",
        "ipblocklist-empty": "La liste des adresses IP bloquées est actuellement vide.",
        "ipblocklist-no-results": "L'adresse IP ou l'utilisateur demandé n'est pas bloqué.",
        "blocklink": "bloquer",
        "logentry-block-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} avec la durée $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|a débloqué}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} avec une durée de $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} pour modifier {{PLURAL:$8|la page|les pages}} $7 avec une date d’expiration à $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres du blocage pour {{GENDER:$4|$3}} empêchant les modifications sur {{PLURAL:$8|la page|les pages}} $7 avec une date d’expiration au $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} pour les actions autres que la modification avec une date d’expiration au $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres du blocage de {{GENDER:$4|$3}} pour les actions autres que la modification avec une date d’expiration au $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} avec une durée de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} avec une durée de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|a importé}} $3 par téléversement de fichier",
        "mw-widgets-titleinput-description-redirect": "redirection vers $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Ajouter une catégorie...",
        "mw-widgets-usersmultiselect-placeholder": "Ajouter plus ...",
+       "mw-widgets-titlesmultiselect-placeholder": "Ajouter davantage…",
        "date-range-from": "À partir du :",
        "date-range-to": "Jusqu’au :",
        "sessionmanager-tie": "Impossible de combiner des types multiples de demandes d’authentification : $1.",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Les mots de passe ne peuvent pas être identiques à ceux qui sont dans la liste noire.",
        "passwordpolicies-policy-maximalpasswordlength": "Les mots de passe doivent avoir moins de $1 caractère{{PLURAL:$1||s}} de long",
        "passwordpolicies-policy-passwordcannotbepopular": "Le mot de passe ne peut pas être {{PLURAL:$1|le mot de passe populaire|dans la liste des $1 mots de passe populaires}}",
-       "easydeflate-invaliddeflate": "Le contenu fourni n'est pas correctement développé"
+       "easydeflate-invaliddeflate": "Le contenu fourni n'est pas correctement développé",
+       "unprotected-js": "Pour des raisons de sécurité, JavaScript ne peut pas être chargé depuis des pages non protégées. Veuillez ne créer du javascript que dans l’espace de noms MediaWiki: ou comme sous-page utilisateur"
 }
index c0de588..9c338a3 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Agrandir la liste des pages guettées pour montrer tous les changements",
        "tog-usenewrc": "User les derniers changements improuvés (JavaScript)",
        "tog-numberheadings": "Mettre les numéros sus les en-têtes",
-       "tog-showtoolbar": "Montrer la barre d'outils des changements (nécessite JavaScript)",
        "tog-editondblclick": "Faire un clic-double pour changer la page (nécessite JavaScript)",
        "tog-editsectiononrightclick": "Changer une section en faisant un clic droit sus son nom (JavaScript)",
        "tog-watchcreations": "Additionner les pages que je crée à ma liste des pages guettées",
index 86001dc..914bea9 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Èpatar la lista de gouârda por montrar tôs los changements et pas mas que los ples novéls",
        "tog-usenewrc": "Rassemblar los changements per pâge dedens los dèrriérs changements et la lista de gouârda",
        "tog-numberheadings": "Numerotar ôtomaticament los titros de sèccion",
-       "tog-showtoolbar": "Montrar la bârra d’outils de changement",
        "tog-editondblclick": "Changiér de pâges avouéc un doblo-cllic",
        "tog-editsectiononrightclick": "Activar lo changement de sèccions per un cllic drêt dessus lors titros",
        "tog-watchcreations": "Apondre a ma lista de gouârda les pâges que fé et pués los fichiérs que tèlèchârjo",
index 649b6f5..b655f35 100644 (file)
@@ -25,7 +25,6 @@
        "tog-extendwatchlist": "Ütjwidjet list faan sidjen, diar dü uun't uug behual wel",
        "tog-usenewrc": "Ütjwidjet uunwisin faan a ''Leetst feranrangen'' an bi a sidjen, diar dü ''Uun't uug behual'' wel",
        "tog-numberheadings": "Auerskraften automaatisk numeriare",
-       "tog-showtoolbar": "Werktjüch tu bewerkin wise",
        "tog-editondblclick": "Sidjen mä dobelklik bewerke",
        "tog-editsectiononrightclick": "Enkelt kirwer mä rochtsklik bewerke",
        "tog-watchcreations": "Salew maaget sidjen an huuchlooset datein leewen uun't uug behual",
index d4cc49e..dd51ddc 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "Slargje la liste des controladis specialis, no dome aes ultimis",
        "tog-usenewrc": "Ragrupe lis modifichis par pagjine intes ultimis modifichis e inati oservâts speciai",
        "tog-numberheadings": "Numerazion automatiche dai titui",
-       "tog-showtoolbar": "Mostre sbare dai imprescj pe modifiche (JavaScript)",
        "tog-editondblclick": "Cambie lis pagjinis fracant dôs voltis",
        "tog-editsectiononrightclick": "Modifiche une sezion fracant cul tast diestri<br /> sui titui des sezions",
        "tog-watchcreations": "Zonte  lis pagjinis creadis e i file cjariats aes oservadis specials",
index c7025f7..6e06565 100644 (file)
@@ -30,7 +30,6 @@
        "tog-extendwatchlist": "Wreidzje folchlist út om alle wizigings sjen te litten, net allinnich de lêste wizigings",
        "tog-usenewrc": "Utwreide ferzje fan 'Koartlyn feroare' brûke (JavaScript fereaske)",
        "tog-numberheadings": "Koppen fansels nûmerje",
-       "tog-showtoolbar": "Brûk arkbalke by bewurkjen",
        "tog-editondblclick": "Dûbelklik jout bewurkingsside (freget JavaScript)",
        "tog-editsectiononrightclick": "Rjochtsklik op sekjsetitels jout seksjebewurking (freget JavaScript)",
        "tog-watchcreations": "Set siden dy't jo begjinne yn jo folchlist",
index e37a2ca..5535f19 100644 (file)
@@ -32,7 +32,6 @@
        "tog-extendwatchlist": "Leathnaigh an liosta faire chun gach athrú cuí a thaispeáint",
        "tog-usenewrc": "Athruithe a ghrúpáil de réir leathanaigh sna hathruithe le déanaí agus sa liosta faire",
        "tog-numberheadings": "Uimhrigh ceannteidil go huathoibríoch",
-       "tog-showtoolbar": "Taispeáin an barra uirlisí eagarthóireachta",
        "tog-editondblclick": "Déchliceáil chun leathanaigh a chur in eagar",
        "tog-editsectiononrightclick": "Cumasaigh mír-eagarthóireacht le deaschliceáil ar cheannteidil",
        "tog-watchcreations": "Cuir ar mo liosta faire leathanaigh a chruthaím",
index 46e6617..3e53476 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "İlerlemiş bakmaa listası",
        "tog-usenewrc": "İlerlemiş bitki diişmäkler listası (JavaScript uymêêr)",
        "tog-numberheadings": "Başlıklara avtomatik nomer yaz",
-       "tog-showtoolbar": "Diişmäk yapar känä yardımcı tuşları göster. (JavaScript)",
        "tog-editondblclick": "Sayfayı çift tuşlayarak diiştirmää başla (JavaScript)",
        "tog-editsectiononrightclick": "Bölüm başlıına saa tuşla basarak bölümü düzmää izin ver.(JavaScript)",
        "tog-watchcreations": "Yarattıım sayfaları bakmaa listama ekle",
index d59ed57..0c54f4b 100644 (file)
@@ -29,7 +29,6 @@
        "tog-extendwatchlist": "增加监视清单来显示全部改动,不净系最晏𠮶",
        "tog-usenewrc": "用强化版最晏𠮶改动(需要JavaScript)",
        "tog-numberheadings": "标题自动编号",
-       "tog-showtoolbar": "显示编辑工具栏(JavaScript)",
        "tog-editondblclick": "按两下改吖(JavaScript)",
        "tog-editsectiononrightclick": "可以按右键来编写只把子段落(JavaScript)",
        "tog-watchcreations": "拿偶开嘞𠮶页面加到偶𠮶监视列表",
index f8dcab3..ecac1c6 100644 (file)
@@ -23,7 +23,6 @@
        "tog-extendwatchlist": "增加監視清單來顯示全部改動,不淨係最晏嗰",
        "tog-usenewrc": "用強化版最晏嗰改動(需要JavaScript)",
        "tog-numberheadings": "標題自動編號",
-       "tog-showtoolbar": "顯示編輯工具欄(JavaScript)",
        "tog-editondblclick": "捺兩下來改下(JavaScript)",
        "tog-editsectiononrightclick": "可以按右鍵來編寫隻把子段落(JavaScript)",
        "tog-watchcreations": "搦我開嗰頁面加到我嗰監視列表",
index 76a9b41..aa48de5 100644 (file)
@@ -13,7 +13,6 @@
        "tog-extendwatchlist": "Étann lis di swivi pou afiché tout modifikasyon-yan é pa inikman pli résan-yan",
        "tog-usenewrc": "Groupé chanjman-yan pa paj annan modifikasyon résan-yan é lis di swivi-a",
        "tog-numberheadings": "Niméroté otomatikman tit di sèksyon",
-       "tog-showtoolbar": "Afiché bar di zouti di édisyon",
        "tog-editondblclick": "Modifyé paj-ya ké roun doub-klik",
        "tog-editsectiononrightclick": "Agtivé modifikasyon-an dé sègsyon pa roun klik drèt asou tit-ya di sègsyon",
        "tog-watchcreations": "Ajouté à mo lis di swivi paj-ya ki mo kréyé é fiché-ya ki mo ka enpòrté",
        "collapsible-collapse": "Roupliyé",
        "collapsible-expand": "Dévlopé",
        "confirmable-confirm": "Ès zòt sir{{GENDER:$1||}} ?",
-       "confirmable-yes": "Wi",
+       "confirmable-yes": "Enren",
        "confirmable-no": "Awa",
        "thisisdeleted": "Ès zòt ka déziré afiché oben rèstoré $1 ?",
        "viewdeleted": "Wè $1 ?",
        "badarticleerror": "Sa agsyon pa pouvé fika éfègtchwé asou sa paj.",
        "cannotdelete": "Enposib di siprimen paj-a oben fiché-a « $1 ».\nSiprésyon-an pitèt ja té éfègtchwé pa rounòt moun.",
        "cannotdelete-title": "Enposib di siprimen paj-a « $1 »",
+       "delete-scheduled": "Paj-a « $1 » sa progranmen pou fika siprimen.\nSouplé, pasyanté.",
        "delete-hook-aborted": "Siprésyon annilé pa roun ègstansyon.\nPyès lèsplikasyon té fourni.",
        "no-null-revision": "Enposib di kréyé roun nouvèl révizyon vid pou paj-a « $1 »",
        "badtitle": "Movè tit",
        "customcssprotected": "Zòt pa gen pèrmisyon-an di modifyé sa féy di èstil CSS, pas li ka kontni paranmèt pésonnèl-ya di rounòt itilizatò.",
        "customjsonprotected": "Zòt pa gen drwè di modifyé sa paj JSON pas li ka kontni paranmèt pésonnèl-ya di rounòt itilizatò.",
        "customjsprotected": "Zòt pa gen pèrmisyon-an di modifyé sa paj di JavaScript, pas li ka kontni paranmèt pésonnèl-ya di rounòt itilizatò.",
+       "sitecssprotected": "Zòt pa gen drwè di modifyé sa paj CSS pas sa pouvé afègté tout vizitò-ya.",
+       "sitejsonprotected": "Zòt pa gen drwé di modifyé sa paj JSON pas sa pouvé afègté tout vizitò-ya.",
+       "sitejsprotected": "Zòt pa gen drwè di modifyé sa paj JavaScript pas sa pouvé afègté tout vizitò-ya.",
        "mycustomcssprotected": "Zòt pa gen drwè di modifyé sa paj CSS.",
        "mycustomjsonprotected": "Zòt pa gen drwè di modifyé sa paj JSON.",
        "mycustomjsprotected": "Zòt pa gen drwè di modifyé sa paj JavaScript.",
        "login-migrated-generic": "Zòt kont té migré, é zòt non d'itilizatò pa ka ègzisté òkò asou sa wiki.",
        "loginlanguagelabel": "Lanng : $1",
        "suspicious-userlogout": "Zòt doumann di konnègsyon té roufizé pas i sanblé ki li té voyé pa roun navigatò défègtché oben dipi kach-a di roun sèrvis mandatèr.",
-       "createacct-another-realname-tip": "Véritab non sa òpsyonèl.\nSi zòt désidé di fourni li, i ké fika itilizé pou krédité lotò di so travay.",
+       "createacct-another-realname-tip": "Véritab non-an sa òpsyonnèl.\nSi zòt désidé di fourni li, i ké fika itilizé pou krédité lotò-a di so travay-ya.",
        "pt-login": "Konnègté so kò",
        "pt-login-button": "Konnègté so kò",
        "pt-login-continue-button": "Kontinwé konnègsyon-an",
        "botpasswords-restriction-failed": "Rèstrigsyon-yan di modipas di robo ka anpéché sa konnègsyon.",
        "botpasswords-invalid-name": "Non-an d'itilizatò spésifyé pa ka kontni di séparatò di mo di pas di robo (« $1 »).",
        "botpasswords-not-exist": "{{GENDER:$1|Itilizatò|Itilizatris}}-a « $1 » pa gen di mo di pas di robo nonmen « $2 ».",
+       "botpasswords-needs-reset": "Modipas-a di robo di non « $2 » di itilizatò-a « $1 » divèt fika réynisyalizé.",
        "resetpass_forbidden": "Mo di pas pa pouvé fika chanjé.",
        "resetpass_forbidden-reason": "Mo di pas pa pouvé fika modifyé : $1",
        "resetpass-no-info": "Zòt divèt fika konnègté pou agsédé dirèkman à sa paj.",
        "editing": "Modifikasyon di $1",
        "creating": "Kréyasyon di $1",
        "editingsection": "Modifikasyon di $1 (sèksyon)",
+       "yourtext": "Zòt tègs",
+       "yourdiff": "Diférans",
        "templatesused": "{{PLURAL:$1|Modèl itilizé}} pa sa paj :",
        "templatesusedpreview": "{{PLURAL:$1|Modèl itilizé}} annan sa prévizwalizasyon :",
        "template-protected": "(protéjé)",
        "permissionserrorstext-withaction": "Zòt pa pouvé $2, pou {{PLURAL:$1|rézon swivant}} :",
        "recreate-moveddeleted-warn": "<strong>Panga : zòt ka roukréyé roun paj ki té présédanman siprimen.</strong>\n\nAsouré-zòt ki i sa pèrtinan di pourswiv modifikasyon-yan asou sa paj.\nJournal-ya dé siprésyon é dé déplasman pou sa paj sa fourni isi pou lenfòrmasyon :",
        "moveddeleted-notice": "Sa paj té siprimen. \nJournal-ya dé siprésyon, dé protègsyon é dé déplasman pou paj-a sa afiché anba pou référans.",
+       "edit-conflict": "Trafalga di modifikasyon.",
+       "postedit-confirmation-created": "Paj-a té fika kréyé.",
+       "invalid-content-data": "Data di kontni pa valid",
        "content-model-wikitext": "wikitèks",
+       "content-model-text": "tègs groso",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Lòbjè vid",
+       "content-json-empty-array": "Tablo vid",
        "undo-failure": "Sa modifikasyon pa pouvé fika défè : sa-a té ké rantré an konfli ké modifikasyon entèrmédjèr-ya.",
        "viewpagelogs": "Wè opérasyon-yan asou sa paj",
+       "nohistory": "I pa ka ègzisté di listorik dé modifikasyon pou sa paj.",
+       "currentrev": "Vèrsyon atchwèl",
        "currentrev-asof": "Vèrsyon atchwèl daté di $1",
        "revisionasof": "Vèrsyon di $1",
        "revision-info": "Révizyon daté di $1 pa {{GENDER:$6|$2}}$7",
        "nextrevision": "Vèrsyon swivant →",
        "currentrevisionlink": "Wè vèrsyon atchwèl-a",
        "cur": "atch",
+       "next": "swivan",
        "last": "dif",
+       "page_first": "pronmyé",
+       "page_last": "dannyé",
        "histlegend": "Sélègsyon di diff : koché bouton radjo-ya dé vèrsyon ki à konparé é apiyé asou rantré oben asou bouton-an ki anba.<br />\nLéjann : <strong>({{int:cur}})</strong> = diférans ké dannyé vèrsyon-an, <strong>({{int:last}})</strong> = diférans ké vèrsyon présédan-an, <strong>{{int:minoreditletter}}</strong> = modifikasyon minò.",
        "history-fieldset-title": "Sasé dé révizyon",
        "histfirst": "Pli ansyenn",
        "histlast": "Pli résan-yan",
+       "historyempty": "(vid)",
        "history-feed-title": "Listorik dé vèrsyon",
        "history-feed-description": "Listorik dé vèrsyon pou sa paj asou wiki-a",
        "history-feed-item-nocomment": "$1 à $2",
        "rev-delundel": "afiché/maské",
+       "rev-showdeleted": "afiché",
+       "revdelete-show-file-submit": "Enren",
+       "revdelete-hide-comment": "Rézimen di modifikasyon",
+       "revdelete-log": "Motif",
+       "pagehist": "Listorik di paj-a",
+       "revdelete-reasonotherlist": "Ròt rézon",
        "mergelog": "Journal dé fizyon",
        "history-title": "$1 : Listorik dé vèrsyon",
        "difference-title": "$1 : Diférans ant vèrsyon",
        "searchprofile-articles-tooltip": "Sasé annan $1",
        "searchprofile-images-tooltip": "Sasé dé fiché miltimédja",
        "searchprofile-everything-tooltip": "Sasé annan tout sit-a (osi annan paj di diskisyon-yan)",
-       "searchprofile-advanced-tooltip": "Sasé annan lèspas di non pèrsonalizé",
+       "searchprofile-advanced-tooltip": "Sasé annan lèspas di non-yan ki pésonnalizé",
        "search-result-size": "$1 ({{PLURAL:$2|1 mo|$2}})",
        "search-result-category-size": "$1 manm{{PLURAL:$1|}} ($2 soukatégori{{PLURAL:$2|}}, $3 fiché{{PLURAL:$3|}})",
        "search-redirect": "(Roudirègsyon dipi $1)",
        "speciallogtitlelabel": "Sib (tit oben {{ns:user}}:non di itilizatò) :",
        "log": "Journal d’opérasyon",
        "all-logs-page": "Tout journal piblik",
-       "alllogstext": "Lafichaj konbinen di tout journal-ya ki disponnib asou {{SITENAME}}.\nZòt pouvé pèrsonalizé lafichaj an sélègsyonnan tip di journal-a, non di itilizatò-a oben paj-a ki konsèrnen (sa Dé dannyé sa sansib Ã  lakas).",
+       "alllogstext": "Lafichaj konbinen di tout journal-ya ki disponnib asou {{SITENAME}}.\nZòt pouvé pésonnalizé lafichaj-a an sélègsyonnan tip di journal-a, non di itilizatò-a oben paj-a ki konsèrnen (sa Dé dannyé sa sansib Ã  lakas-a).",
        "logempty": "Pyès lopérasyon ki ka korèsponn annan journal-ya.",
        "allpages": "Tout paj-ya",
        "allarticles": "Tout paj-ya",
        "pageinfo-templates": "{{PLURAL:$1|Modèl enkli}} ($1)",
        "pageinfo-toolboxlink": "Lenfòrmasyon asou paj-a",
        "pageinfo-contentpage": "Konté kou paj di kontni",
-       "pageinfo-contentpage-yes": "Wi",
+       "pageinfo-contentpage-yes": "Enren",
        "patrol-log-page": "Journal dé roulèktir",
        "previousdiff": "← Modifikasyon présédant",
        "nextdiff": "Modifikasyon swivant →",
        "specialpages": "Paj èspésyal",
        "tag-filter": "Filtré [[Special:Tags|baliz]] :",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Baliz}}]] : $2)",
-       "tags-active-yes": "Wi",
+       "tags-active-yes": "Enren",
        "tags-active-no": "Awa",
        "tags-hitcount": "$1 modifikasyon{{PLURAL:$1|}}",
        "logentry-delete-delete": "$1 siprimen paj-a $3",
index 9bdd762..c4e700b 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "Leudaich an clàr-faire gus an seall e gach mùthadh 's chan ann an fheadhainn as ùire a-mhàin",
        "tog-usenewrc": "Buidhnich na h-atharraichean a-rèir duilleige sna mùthaidhean ùra agus air a' chlàr-fhaire",
        "tog-numberheadings": "Cuir àireamhan ri ceann-sgrìobhaidhean leis fhèin",
-       "tog-showtoolbar": "Seall am bàr-inneal deasachaidh",
        "tog-editondblclick": "Tòisich air deasachadh duilleige le briogadh dùbailte",
        "tog-editsectiononrightclick": "Cuir an comas deasachadh earrainn le briogadh deas air tiotal na h-earrainn",
        "tog-watchcreations": "Cuir duilleagan a chruthaicheas mi air a' chlàr-fhaire agam",
index d041829..f0ecb01 100644 (file)
@@ -39,7 +39,6 @@
        "tog-extendwatchlist": "Expandir a lista de vixilancia para amosar todos os cambios e non só os máis recentes",
        "tog-usenewrc": "Agrupar as modificacións por páxina nos cambios recentes e na lista de vixilancia",
        "tog-numberheadings": "Numerar automaticamente as cabeceiras",
-       "tog-showtoolbar": "Amosar a barra de ferramentas de edición",
        "tog-editondblclick": "Facer dobre clic para editar as páxinas",
        "tog-editsectiononrightclick": "Permitir a edición de seccións premendo co botón dereito nos títulos das seccións",
        "tog-watchcreations": "Engadir as páxinas que cree e os ficheiros que cargue á miña lista de vixilancia",
index f40ff1e..46c062d 100644 (file)
@@ -17,7 +17,6 @@
        },
        "tog-hideminor": "हालींच बदल केल्ल्यांतले बारीक संपादन लिपय",
        "tog-numberheadings": "माथाळे स्वंय क्रमांकित कर",
-       "tog-showtoolbar": "संपादन उपकरणाची पट्टी दाखय",
        "tog-editondblclick": "दोट्टी क्लिकाचेर पानां संपादीत कर",
        "tog-watchdefault": "हांवें संपादीत केल्लीं पानां आनी फायल म्हजे सादुरवळेरीक जोड",
        "tog-previewontop": "संपादन पेटीच्या मुखार प्रीव्यु दाखय",
index 1ff682d..36ee01e 100644 (file)
@@ -10,7 +10,6 @@
        "tog-underline": "Zoddnienche adhorekhan",
        "tog-hideminor": "Halinch bodol kel'leantle dhakte bodol lipoi",
        "tog-numberheadings": "Mathalle sway kromankit kor",
-       "tog-showtoolbar": "Bodolache hathiar-potti dakhoi",
        "tog-editondblclick": "Dotti klickacher pananche sonskoron kor",
        "tog-watchdefault": "Hanv bodolta tim panam moji sadurvollerint zod",
        "tog-previewontop": "Sonskoron petie mukhar zolok dakhoi",
index 0acbe20..4cf3bd2 100644 (file)
@@ -19,7 +19,6 @@
        "tog-extendwatchlist": "Bu'ade daputari he'awasiyalo mopobilohu nga'amila u loboli'a, diila bo ubohu",
        "tog-usenewrc": "Tayade u biloli'o to bibilohu halaman lobohuwa wawu daputari he awasiyalo",
        "tog-numberheadings": "Otomatis modulade nomoro",
-       "tog-showtoolbar": "Popobilohe pilakasi pomoli'o",
        "tog-editondblclick": "Boli'a halaman lo klik po'oluwo",
        "tog-editsectiononrightclick": "Popohunawa momoli'a tayadu wolo motepu olowala to judul lo tayadu",
        "tog-watchcreations": "Duhengi halaman pilohutu'u wawu berkas diletohu ode daputari he awasiyalo",
index 4b224c2..5c6bd75 100644 (file)
@@ -30,7 +30,6 @@
        "tog-extendwatchlist": "Ἐφοροδιαλογὴν ἐκτείνειν ἵνα φανῶσιν ἅπασαι αἱ ἀλλαγαὶ, οὐχὶ μόνον αἱ ἁρμόδιαι",
        "tog-usenewrc": "Χρῆσθαι προσκεκοσμημέναις προσφάτοις ἀλλαγαῖς (ἀπαιτεῖται JavaScript)",
        "tog-numberheadings": "Ἐξαριθμεῖν ἐπικεφαλίδας αὐτομάτως",
-       "tog-showtoolbar": "Δεικνύναι τὴν τῶν ἐργαλείων μεταγραφῆς μετώπην",
        "tog-editondblclick": "Ἐπὶ δέλτων δὶς θλίψας, μετάγραψον αὐτάς",
        "tog-editsectiononrightclick": "Καθιστάναι δυνατὸν τὸ μεταγράφειν τμήματα διὰ τοῦ ἐπὶ τῶν ἐπιγραφῶν τῶν τμημάτων θλίβειν δεξιῶς",
        "tog-watchcreations": "Προστιθέναι τὰς δέλτους ἃς ποιῶ τοῖς ἐφορωμένοις μου",
index 0e4d71f..9417a00 100644 (file)
@@ -34,7 +34,6 @@
        "tog-extendwatchlist": "Beobachtungslischte erwytere go alli Änderige aazeige, nit numme di letschte",
        "tog-usenewrc": "Änderigen uf „Letschte Änderige“ un dr Beobachtigslischt no Syte gruppiere",
        "tog-numberheadings": "Überschrifte outomatisch numeriere",
-       "tog-showtoolbar": "Wärchzyyglyscht zum Bearbeite aazeige",
        "tog-editondblclick": "Syte ändere mit Doppelklick",
        "tog-editsectiononrightclick": "Einzelni Absätz ändere mit Rächtsclick uf d Iberschrifte",
        "tog-watchcreations": "Sälber gmachti Sytene un uffegladeni Dateie automatisch  beobachte",
index a955d65..355b4f8 100644 (file)
@@ -42,7 +42,6 @@
        "tog-extendwatchlist": "ધ્યાનસૂચિને વિસ્તૃત કરો જેથી,ફક્ત તાજેતરનાજ નહીં, બધા આનુષાંગિક ફેરફારો જોઇ શકાય",
        "tog-usenewrc": "તાજા ફેરફારોમાં અને ધ્યાનસૂચિમાં ફેરફારોને પાનાં અનુસાર જૂથમાં ગોઠવો",
        "tog-numberheadings": "મથાળાંઓને આપો-આપ ક્રમ (ઑટો નંબર) આપો",
-       "tog-showtoolbar": "ફેરફાર માટેની ટૂલબાર બતાવો",
        "tog-editondblclick": "બે વખત ક્લિક કરી પાનાંઓમાં ફેરફાર કરો",
        "tog-editsectiononrightclick": "વિભાગના મથાળાં ને રાઇટ ક્લિક દ્વારા ફેરફાર કરવાની રીત અપનાવો.",
        "tog-watchcreations": "મેં બનાવેલાં પાનાં અને અપલોડ કરેલી ફાઇલો મારી ધ્યાનસૂચિમાં ઉમેરો",
index f88debf..b394d56 100644 (file)
@@ -16,7 +16,6 @@
        "tog-newpageshidepatrolled": "Follee duillagyn er nyn scrutaghey 'sy rolley duillagyn noa",
        "tog-extendwatchlist": "Lheeadee y rolley arrey dys taishbyney dagh caghlaa bentyn da",
        "tog-numberheadings": "Cur earrooyn gyn smooinaght er kione-linnaghyn",
-       "tog-showtoolbar": "Taishbyn barr greieyn (ta feme ec er JavaScript)",
        "tog-editondblclick": "Reagh duillagyn lesh crig dooblit (ta feme ec er JavaScript)",
        "tog-watchcreations": "Cur duillagyn ta crooit aym rish my rolley arrey",
        "tog-watchdefault": "Cur duillagyn ta reaghit aym rish my rolley arrey",
index beaa6c4..4650230 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "A faɗaɗa jerin kan ido ya nuna duka gyare-gyare, ba na baya-bayan nan kawai ba",
        "tog-usenewrc": "A yi amfani da kyautattun gyare-gyare na baya-bayan nan (ana buƙatar Javascript)",
        "tog-numberheadings": "A lambace kanun matani kai tsaye",
-       "tog-showtoolbar": "A nuna sandar kayan aiki ta gyarawa (ana buƙatar JavaScript)",
        "tog-editondblclick": "A gyara shafuna da dabar-kiliki (ana buƙatar JavaScript)",
        "tog-editsectiononrightclick": "A lamunta gyara shashe da kilikin dama a kan kanun shashe (ana buƙatar JavaScript)",
        "tog-watchcreations": "A daɗa shafunan da na ƙirƙira a cikin jerina na kan ido",
index 012bb35..57b01f4 100644 (file)
@@ -26,7 +26,6 @@
        "tog-extendwatchlist": "Chán-khôi kâm-sṳ lie̍t-péu lòi hién-sṳ só-yû kiên-kói, m̀  tân-chhiang he chui-khiûn ke",
        "tog-usenewrc": "Chhai chui-khiûn kiên-kói lâu kâm-sṳ lie̍t-péu tú cháng-ha̍p thùng yit-ya̍p ke siû-kói",
        "tog-numberheadings": "Phiêu-thì chhṳ-thung phiên-ho",
-       "tog-showtoolbar": "Chán-sṳ phiên-siá kûng-khí-làn",
        "tog-editondblclick": "Sûng-khim phiên-siá ya̍p-mien",
        "tog-editsectiononrightclick": "Yún-hí yu-khim phiêu-thì phiên-siá thon-lo̍k",
        "tog-watchcreations": "Kâ ngài kien-li̍p ke ya̍p-mien lâu sông-chhòn ke tóng-on kâ-ngi̍p ngài-ke kâm-sṳ lie̍t-péu",
index 990dcb0..901a417 100644 (file)
@@ -17,7 +17,6 @@
        "tog-extendwatchlist": "E hoʻākea i ka papakiaʻi no ka hōʻike ʻana i nā loli apau, ʻaʻole nā mea hanawale wale nō",
        "tog-usenewrc": "Nā loli hui mao ka ʻaoʻao ma loko o ka loli hou a me ka papakiaʻi",
        "tog-numberheadings": "E hikahelu i nā poʻo",
-       "tog-showtoolbar": "E hōʻike i ka pahu hāmeʻa hoʻololi",
        "tog-editondblclick": "E ho‘ololi i nā ‘ao‘ao me ke kōmi pālua",
        "tog-editsectiononrightclick": "E hoʻokuʻu i ka hoʻololi mahele mao ka paʻina ʻākau ma nā poʻoinoa māhele",
        "tog-watchcreations": "E ho‘ohui i nā ‘ao‘ao aʻu i hana ai a me nā waihona aʻu i hoʻouka ai i ka‘u papakiaʻi",
index 3035eb1..33d0857 100644 (file)
@@ -48,7 +48,6 @@
        "tog-extendwatchlist": "הרחבת רשימת המעקב כך שתציג את כל השינויים, לא רק את השינויים האחרונים בכל דף",
        "tog-usenewrc": "קיבוץ השינויים לפי דפים בדף השינויים האחרונים וברשימת המעקב",
        "tog-numberheadings": "מספור כותרות אוטומטי",
-       "tog-showtoolbar": "הצגת סרגל העריכה",
        "tog-editondblclick": "עריכת דפים בלחיצה כפולה",
        "tog-editsectiononrightclick": "עריכת פסקאות באמצעות לחיצה ימנית על כותרות הפסקאות",
        "tog-watchcreations": "הוספת דפים שאני {{GENDER:|יוצר|יוצרת}} וקבצים שאני מעלה לרשימת המעקב שלי",
        "subject-preview": "תצוגה מקדימה של הנושא:",
        "previewerrortext": "אירעה שגיאה בעת הניסיון להציג תצוגה מקדימה של השינויים שלך.",
        "blockedtitle": "המשתמש חסום",
+       "blocked-email-user": "<strong>שם המשתמש שלך נחסם משליחת דואר אלקטרוני. עם זאת, באפשרותך לערוך דפים אחרים באתר זה.</strong> באפשרותך לצפות בפרטי החסימה המלאים ב[[Special:MyContributions|תרומות המשתמש]].\n\nהחסימה בוצעה על־ידי $1.\n\nהסיבה שניתנה לכך היא <em>$2</em>.\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n* מספר חסימה #$5",
+       "blockedtext-partial": "<strong>שם המשתמש או כתובת ה־IP שלך נחסמו מביצוע שינויים לדף זה. עם זאת, באפשרותך לערוך דפים אחרים באתר זה.</strong> באפשרותך לצפות בפרטי החסימה המלאים ב[[Special:MyContributions|תרומות המשתמש]].\n\nהחסימה בוצעה על־ידי $1.\n\nהסיבה שניתנה לכך היא <em>$2</em>.\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n* מספר חסימה #$5",
        "blockedtext": "<strong>שם המשתמש או כתובת ה־IP שלך נחסמו.</strong>\n\nהחסימה בוצעה על־ידי $1.\nהסיבה שניתנה לכך היא <em>$2</em>.\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותך ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון בחסימה.\nכמו־כן, באפשרותך להשתמש בתכונת \"{{int:emailuser}}\", אלא אם לא ציינת כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלך]] או אם נחסמת משליחת דוא\"ל.\nכתובת ה־IP הנוכחית שלך היא $3, ומספר החסימה שלך הוא #$5.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
        "autoblockedtext": "כתובת ה־IP שלך נחסמה באופן אוטומטי כיוון שמשתמש אחר, שנחסם על־ידי $1, השתמש בה.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותך ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון בחסימה.\n\nכמו־כן, באפשרותך להשתמש בתכונת \"{{int:emailuser}}\", אלא אם לא ציינת כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלך]] או אם נחסמת משליחת דוא\"ל.\n\nכתובת ה־IP הנוכחית שלך היא $3, ומספר החסימה שלך הוא #$5.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
        "systemblockedtext": "שם המשתמש או כתובת ה־IP שלך נחסמו באופן אוטומטי על־ידי תוכנת מדיה־ויקי.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nכתובת ה־IP הנוכחית שלך היא $3.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
        "ipb-disableusertalk": "ביטול האפשרות של המשתמש לערוך את דף השיחה של עצמו בעת החסימה",
        "ipb-change-block": "חסימת המשתמש מחדש עם הגדרות אלה",
        "ipb-confirm": "אישור החסימה",
+       "ipb-sitewide": "כל האתר",
+       "ipb-partial": "חלקית",
+       "ipb-type-label": "סוג",
+       "ipb-pages-label": "דפים",
        "badipaddress": "כתובת IP שגויה",
        "blockipsuccesssub": "החסימה הושלמה בהצלחה",
        "blockipsuccesstext": "{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.<br />\nניתן לעיין ב[[Special:BlockList|רשימת החסומים]] כדי לצפות בחסימות.",
        "createaccountblock": "יצירת חשבונות נחסמה",
        "emailblock": "שליחת דוא\"ל נחסמה",
        "blocklist-nousertalk": "עריכת דף השיחה האישי נחסמה",
+       "blocklist-editing": "עריכה",
+       "blocklist-editing-sitewide": "עריכה (כל האתר)",
        "ipblocklist-empty": "רשימת המשתמשים החסומים ריקה.",
        "ipblocklist-no-results": "שם המשתמש או כתובת ה־IP המבוקשים אינם חסומים.",
        "blocklink": "חסימה",
        "logentry-block-block": "$1 {{GENDER:$2|חסם|חסמה}} את {{GENDER:$4|$3}} למשך $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|שחרר|שחררה}} את החסימה של {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|שינה|שינתה}} את הגדרות החסימה של {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|חסם|חסמה}} את {{GENDER:$4|$3}} מעריכת {{PLURAL:$8||הדפים}} $7 למשך $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|שינה|שינתה}} את הגדרות החסימה של {{GENDER:$4|$3}} כך שימנעו עריכה של {{PLURAL:$8||הדפים}} $7 למשך $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|חסם|חסמה}} את {{GENDER:$4|$3}} מפעולות שאינן עריכה למשך $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|שינה|שינתה}} את הגדרות החסימה של {{GENDER:$4|$3}} עבור פעולות שאינן עריכה למשך $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|חסם|חסמה}} את {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|שינה|שינתה}} את הגדרות החסימה של {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|ייבא|ייבאה}} את הדף $3 באמצעות העלאת קובץ",
        "mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}",
        "mw-widgets-categoryselector-add-category-placeholder": "הוספת קטגוריה...",
        "mw-widgets-usersmultiselect-placeholder": "הוספת עוד...",
+       "mw-widgets-titlesmultiselect-placeholder": "הוספת עוד...",
        "date-range-from": "מתאריך:",
        "date-range-to": "עד תאריך:",
        "sessionmanager-tie": "לא ניתן לצרף מספר סוגי אימות זהות: $1.",
index a2b79d2..cfef42e 100644 (file)
                        "Shypoetess",
                        "Innocentbunny",
                        "TryKid",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Tavleen"
                ]
        },
-       "tog-underline": "à¤\95ड़à¥\80 à¤°à¥\87à¤\96ाà¤\82à¤\95न:",
-       "tog-hideminor": "हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤²à¤\98à¥\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\9bिपाà¤\8fà¤\81",
-       "tog-hidepatrolled": "हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤ªà¤°à¥\80à¤\95à¥\8dषित à¤¬à¤¦à¤²à¤¾à¤µ à¤\9bिपाà¤\8fà¤\81",
+       "tog-underline": "लिà¤\82à¤\95 à¤°à¥\87à¤\96ाà¤\82à¤\95ित:",
+       "tog-hideminor": "हाल à¤\95à¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¸à¥\87 à¤®à¤¾à¤®à¥\82लà¥\80 à¤¸à¤\82पादन à¤\9bà¥\81पाà¤\8fà¤\82",
+       "tog-hidepatrolled": "हाल à¤\95à¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¸à¥\87 à¤\97शà¥\8dत à¤¸à¤\82पादन à¤\9bà¥\81पाà¤\8fà¤\82",
        "tog-newpageshidepatrolled": "नये पृष्ठ की सूची में परीक्षित पृष्ठों को छिपाएँ",
        "tog-hidecategorization": "पृष्ठों का श्रेणीकरण छिपाएं",
        "tog-extendwatchlist": "केवल हालिया ही नहीं, बल्कि सभी परिवर्तनों को दिखाने के लिए ध्यानसूची को विस्तृत करें",
        "tog-usenewrc": "हाल में हुए परिवर्तनों और ध्यानसूची में परिवर्तनों को पृष्ठ अनुसार समूहों में बाँटें",
        "tog-numberheadings": "स्व-क्रमांकित शीर्षक",
-       "tog-showtoolbar": "सम्पादन उपकरण पट्टी दिखाएँ",
        "tog-editondblclick": "डबल क्लिक पर पृष्ठ संपादित करें",
        "tog-editsectiononrightclick": "अनुभाग शीर्षक पर दायाँ क्लिक करने पर अनुभाग सम्पादित करें",
        "tog-watchcreations": "मेरे द्वारा निर्मित पृष्ठों और मेरी अपलोड की फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "prefs-watchlist-edits": "ध्यानसूची में दिखाने हेतु अधिकतम बदलाव:",
        "prefs-watchlist-edits-max": "अधिकतम संख्या: एक हज़ार",
        "prefs-watchlist-token": "ध्यानसूची टोकन",
+       "prefs-watchlist-managetokens": "टोकन प्रबंधित करें",
        "prefs-misc": "अन्य",
        "prefs-resetpass": "कूटशब्द बदलें",
        "prefs-changeemail": "ई-मेल पता परिवर्तित करें",
index 9a1d234..f6e1432 100644 (file)
@@ -30,7 +30,6 @@
        "tog-extendwatchlist": "Dhyaan suchi ke khol ke sab badlao ke dekhao, khaali nawaa waala nai",
        "tog-usenewrc": "Dher jan se badla gais panna, haali ke badlao aur dhyan suchi me",
        "tog-numberheadings": "Sab heading ke apne se number karo",
-       "tog-showtoolbar": "Badle waala toolbar ke dekhao",
        "tog-editondblclick": "Dugnaa click pe panna ke badlo",
        "tog-editsectiononrightclick": "Bhaag ke title pe right click kare pe bhaag ke badle ke laabu karo",
        "tog-watchcreations": "Hamaar banawa waala panna aur upload karaa gais file ke hamaar dhyaan suchi me jorro",
index ade51d1..fb09e25 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "Palaparon ang watchlist para makita ang tanan nga mga na-islan, indi lang man sa pinaka bag-o",
        "tog-usenewrc": "Grupohon ang mga pagbag-o kada panid sa bag-o lang gid na ilisan kag sa ginabantayan (nagakilanlan sang JavaScript)",
        "tog-numberheadings": "Auto-numero heading",
-       "tog-showtoolbar": "Ipakita ang edit toolbar (nagakilanlan JavaScript)",
        "tog-editondblclick": "Islan ang pahina kung i-doble klik mo (nagakilanlan JavaScript)",
        "tog-editsectiononrightclick": "Sugtan ang pag-ilis sang seksyon paagi sa pagtum-ok sang natoo sa mouse sa titulo sang seksyon (nagakinahanglan sang JavaScript)",
        "tog-watchcreations": "Magdugang sang mga panid nga akon buhaton kag mga hilera nga akon igapasaka sa akon mga ginabantayan",
index b74ff7f..9c57822 100644 (file)
@@ -51,7 +51,6 @@
        "tog-extendwatchlist": "Proširi popis praćenih stranica tako da prikaže sve promjene, ne samo najnovije",
        "tog-usenewrc": "Grupne promjene po stranici u popisu nedavnih izmjena i popisu praćenih stranica (zahtijeva JavaScript)",
        "tog-numberheadings": "Automatski označi naslove brojevima",
-       "tog-showtoolbar": "Prikaži traku s alatima za uređivanje (zahtijeva JavaScript)",
        "tog-editondblclick": "Dvoklik otvara uređivanje stranice (JavaScript)",
        "tog-editsectiononrightclick": "Pritiskom na desnu tipku miša otvori uređivanje pojedinih odlomaka (JavaScript)",
        "tog-watchcreations": "Dodaj stranice koje sam stvorio na moj popis praćenja",
        "sig_tip": "Vaš potpis s datumom",
        "hr_tip": "Vodoravna crta (koristiti rijetko)",
        "summary": "Sažetak:",
-       "subject": "Tema:",
+       "subject": "Predmet:",
        "minoredit": "Ovo je manja promjena",
        "watchthis": "Prati ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
        "version-license-not-found": "Za ovaj dodatak nema detaljnih informacija o licenciji.",
        "version-credits-title": "Zasluge za $1",
        "version-credits-not-found": "Za ovo proširenje nisu pronađene informacije o zaslugama.",
-       "version-poweredby-credits": "Ovaj wiki pogoni '''[https://www.mediawiki.org/ MediaWiki]''', autorska prava © 2001-$1 $2.",
+       "version-poweredby-credits": "Ovaj wiki pokreće '''[https://www.mediawiki.org/ MediaWiki]''', autorska prava © 2001-$1 $2.",
        "version-poweredby-others": "ostali",
        "version-poweredby-translators": "prevoditelji s projekta translatewiki.net",
        "version-credits-summary": "Željeli bismo zahvaliti sljedećim suradnicima na njihovom doprinosu [[Special:Version|MediaWikiju]].",
index 4bfe193..13e5c8b 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "Beobachtungslist erweitre, um statt nuer der letzte Ännrung alle Ännrunge oonzuzeiche.",
        "tog-usenewrc": "Ännrunge uff \"Letzte Ännrunge\" und Beobachtungslist noh Seit gruppiere",
        "tog-numberheadings": "Üwerschrifte automatisch nummeriere",
-       "tog-showtoolbar": "Beoorbeite-Werrekzeichleiste oonzeiche",
        "tog-editondblclick": "Seite mit Doppelklick beoorbeite",
        "tog-editsectiononrightclick": "Einzelne Abschnitte per Rechtsklick beoorbeite",
        "tog-watchcreations": "Sellebst erstellt Seite und hochgeloodne Dateie automatisch beobachte",
index 443217d..1664cbd 100644 (file)
@@ -27,7 +27,6 @@
        "tog-extendwatchlist": "Lisćinu wobkedźbowankow wočinić, zo by wšě změny widźał, nic jenož najnowše",
        "tog-usenewrc": "Změny po stronje w aktualnych změnach a wobkedźbowankach zeskupjeć",
        "tog-numberheadings": "Nadpisma awtomatisce čisłować",
-       "tog-showtoolbar": "Wobdźěłowansku lajstu pokazać",
        "tog-editondblclick": "Strony z dwójnym kliknjenjom wobdźěłować",
        "tog-editsectiononrightclick": "Wobdźěłowanje wotrězkow přez kliknjenje z prawej tastu na nadpisma wotrězkow zmóžnić",
        "tog-watchcreations": "Strony, kotrež wutworjam a dataje, kotrež nahrawam, swojim wobkedźbowankam přidać",
index 6c537a7..01d3006 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "Etann lis swivi pou ou kapab wè tout chanjman yo, pa sèlman sa ki fèk fèt yo",
        "tog-usenewrc": "Sanble modifikasyon pou chak paj nan chanjman resan ak paj an vèy",
        "tog-numberheadings": "Nimewote otomatikman tit yo",
-       "tog-showtoolbar": "Montre zouti chanjman yo",
        "tog-editondblclick": "Klike de fwa pou chanje yon paj",
        "tog-editsectiononrightclick": "Pemèt chanje yon seksyon lè ou klike a dwat sou tit seksyon an",
        "tog-watchcreations": "Ajoute paj mwen kreye yo nan lis swivi mwen.",
index bed8b65..bbbdb4d 100644 (file)
@@ -15,7 +15,6 @@
        "tog-extendwatchlist": "A figyelőlistán az összes változtatás látszódjon, ne csak az utolsó",
        "tog-usenewrc": "Szerkesztések csoportosítása oldal szerint a friss változtatásokban és a figyelőlistán",
        "tog-numberheadings": "Fejezetcímek automatikus számozása",
-       "tog-showtoolbar": "Szerkesztőeszközsor megjelenítése",
        "tog-editondblclick": "A lapok szerkesztése dupla kattintásra",
        "tog-editsectiononrightclick": "Szakaszok szerkesztése a szakaszcímre való jobb kattintással",
        "tog-watchcreations": "Az Ön által létrehozott lapok és feltöltött fájlok felvétele a figyelőlistára",
index c45f660..5f3e8a1 100644 (file)
@@ -62,7 +62,6 @@
        "tog-extendwatchlist": "A figyelőlistán az összes változtatás látszódjon, ne csak az utolsó",
        "tog-usenewrc": "Szerkesztések csoportosítása oldal szerint a friss változtatásokban és a figyelőlistán",
        "tog-numberheadings": "Fejezetcímek automatikus számozása",
-       "tog-showtoolbar": "Szerkesztőeszközsor megjelenítése",
        "tog-editondblclick": "A lapok szerkesztése dupla kattintásra",
        "tog-editsectiononrightclick": "Szakaszok szerkesztése a szakaszcímre való jobb kattintással",
        "tog-watchcreations": "Az általam létrehozott lapok és feltöltött fájlok felvétele a figyelőlistámra",
index 811820a..b23e460 100644 (file)
@@ -44,7 +44,6 @@
        "tog-extendwatchlist": "Ընդարձակել հսկացանկը՝ ցույց տալով բոլոր փոփոխությունները, այլ ոչ միայն վերջինները",
        "tog-usenewrc": "Խմբավորել փոփոխությունները վերջին փոփոխություններում և հսկացանկում (պահանջում է JavaScript)",
        "tog-numberheadings": "Ինքնաթվագրել վերնագրերը",
-       "tog-showtoolbar": "Ցույց տալ խմբագրումների գործիքների վահանակը",
        "tog-editondblclick": "Խմբագրել էջերը կրկնակի սեղմամբ",
        "tog-editsectiononrightclick": "Խմբագրել բաժինները վերնագրի աջ սեղմամբ",
        "tog-watchcreations": "Ավելացնել իմ ստեղծած էջերը և բեռնած նիշքերը իմ հսկացանկում",
index 04c3105..c551529 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "Displicar le observatorio pro monstrar tote le modificationes, non solmente les plus recente",
        "tog-usenewrc": "Gruppar modificationes per pagina in modificationes recente e observatorio",
        "tog-numberheadings": "Numerar titulos automaticamente",
-       "tog-showtoolbar": "Monstrar instrumentario de modification",
        "tog-editondblclick": "Modificar paginas con duple clic",
        "tog-editsectiononrightclick": "Permitter modification de sectiones con clic-a-dextra sur titulos de section",
        "tog-watchcreations": "Adder le paginas que io crea e le files que io incarga a mi observatorio",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Le contrasigno non pote corresponder a contrasignos in le lista nigre",
        "passwordpolicies-policy-maximalpasswordlength": "Le contrasigno debe continer minus de $1 {{PLURAL:$1|character|characteres}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Le contrasigno non pote esser {{PLURAL:$1|le contrasigno le plus popular|in le lista de $1 contrasignos popular}}",
-       "easydeflate-invaliddeflate": "Le contento fornite non es correctemente comprimite"
+       "easydeflate-invaliddeflate": "Le contento fornite non es correctemente comprimite",
+       "unprotected-js": "Pro motivos de securitate, non es possibile cargar codice JavaScript de paginas non protegite. Crea JavaScript solmente in le spatio de nomines \"MediaWiki:\" o como un subpagina de usator."
 }
index e91a308..4e0be27 100644 (file)
@@ -72,7 +72,6 @@
        "tog-extendwatchlist": "Kembangkan daftar pantauan untuk menunjukkan semua perubahan, tidak hanya yang terbaru",
        "tog-usenewrc": "Kelompokkan suntingan di tampilan perubahan terbaru dan daftar pantauan berdasarkan halaman",
        "tog-numberheadings": "Beri nomor judul secara otomatis",
-       "tog-showtoolbar": "Tampilkan bilah alat penyuntingan",
        "tog-editondblclick": "Sunting halaman dengan klik ganda",
        "tog-editsectiononrightclick": "Fungsikan penyuntingan bagian dengan mengeklik kanan pada judul bagian",
        "tog-watchcreations": "Tambahkan halaman yang saya buat dan berkas yang saya unggah ke daftar pantauan",
index 6f6d173..3cb5476 100644 (file)
@@ -27,7 +27,6 @@
        "tog-extendwatchlist": "Expander li liste de vigilantie a omni changes, ne solmen li max nov",
        "tog-usenewrc": "Ordinar changes in «Recent changes» e li liste de vigila secun págines",
        "tog-numberheadings": "Auto-numerar rublicas",
-       "tog-showtoolbar": "Monstrar barre de redactional utensiles",
        "tog-editondblclick": "Redacter págines per duplic clacca",
        "tog-editsectiononrightclick": "Redacter singul sectiones per dextri clacca",
        "tog-watchcreations": "Automaticmen viligar págines e files, queles yo ha creat.",
index e154b98..8f98fc8 100644 (file)
@@ -13,7 +13,6 @@
        "tog-extendwatchlist": "Gbasa ndetu ihe ánà elé ka ó zi gbanwere nke níle, o bughi nani nke isi nso",
        "tog-usenewrc": "Ji ihe gbanwere nso níguélé élu (ö chọrọ JavaScript)",
        "tog-numberheadings": "Onuogụgụ-otu anyi mere ya maka ishi edemede",
-       "tog-showtoolbar": "Zi igbe orü (Í gí nwere JavaScript)",
        "tog-editondblclick": "Rüwá na élu ihü mgbe I kpạtạrạ (ö chọrọ JavaScript)",
        "tog-editsectiononrightclick": "Kpa na áká nri Í gbanyé orürü nkeji na ishi nkeji (ö chọrọ JavaScript)",
        "tog-watchcreations": "Tinyé ihüm na eké na ndetu ihem ne lé",
index 5c75650..649b125 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, saan laeng a ti kabiitan",
        "tog-usenewrc": "Dagiti grupo a panagbaliw babaen ti panid ti kaudian a balbaliw ken listaan ti bambantayan",
        "tog-numberheadings": "Automatiko a pabilangan dagiti paulo",
-       "tog-showtoolbar": "Ipakita ti baras ti ramit ti panagurnos",
        "tog-editondblclick": "Urnosen dagiti panid iti mamindua a panagpindut",
        "tog-editsectiononrightclick": "Pakabaelan ti panagurnos iti seksion babaen ti panagpindut iti kanawan kadagiti titulo ti paset",
        "tog-watchcreations": "Agnayon kadagiti panid a pinartuatko ken papeles nga inkargak iti listaan ti bambantayak",
index e54666d..a79eebd 100644 (file)
@@ -24,7 +24,6 @@
        "tog-extendwatchlist": "Хьашеръе зéма хьаязъяьр шедола хувцамаш юкъелоацаш, тIехьара даь хувцамаш хинна ца Iеш.",
        "tog-usenewrc": "Хувцамех тоабаш е керда нийсдарашка а зéма хьаязъяьра чу а",
        "tog-numberheadings": "Ши-шегIа номераш увттае кепакертошта",
-       "tog-showtoolbar": "Кечала панель хьахьокха хувцам беча хана",
        "tog-editondblclick": "Тоае оагӀонаш шозза тӀатоӀайича (JavaScript)",
        "tog-editsectiononrightclick": "Тоаде оагIон дáкъа цун кепакертá дахкилга аьттехьара тоIаерг тӀатоӀайича (JavaScript)",
        "tog-watchcreations": "Зем беш йолча оагIонашта а файлашта а тIатоха аз хьаяь оагIонаши чуяьха хинна файлаши",
index dc70102..cb8e621 100644 (file)
@@ -27,7 +27,6 @@
        "tog-extendwatchlist": "Expansez surveyo-listo por montrar omna chanji, vice nur la maxim recenta",
        "tog-usenewrc": "Grupigar la modifiki por pagino en recenta chanji e \"watchlist\"",
        "tog-numberheadings": "Autonumerez tituli",
-       "tog-showtoolbar": "Montrez redaktilo (JavaScript bezonesas)",
        "tog-editondblclick": "Redaktez pagini kande on klikus dufoye (JavaScript bezonesas)",
        "tog-editsectiononrightclick": "Kapabligez redakto di secioni per dextre-klikar tituli di secioni",
        "tog-watchcreations": "Adjuntez la pagini qui me kreos a mea surveyaji",
        "previewnote": "<strong>Atencez ke ico esas nur prevido.</strong> Ol ne registragesis ankore!",
        "continue-editing": "Irez a la redakto-areo",
        "session_fail_preview": "'''Pardonez! Ni ne povis traktar vua redakto pro perdo di sesiono donaji.'''\nVoluntez probar itere.\nSe ol ankore nefuncionas, probez [[Special:UserLogout|ekirar]] e pose enirar.",
+       "session_fail_preview_html": "Pardonez! Ni ne povis recevar vua redakto pro perdajo di dati.\n\n<em>Pro ke la wiki {{SITENAME}} permisas uzar bruta HTML, la previdado celesas por preventar ataki uzante JavaScript.</em>\n\n<strong>Se la probo di redakto esas legitima, voluntez itere sendar ol.</strong>\nSe duros ne funcionar, facez [[Special:UserLogout|logout]] ed itere facez login. Videz se vua retonavigilo (browser) permisas uzar 'cookies' de ica retosituo.",
        "editing": "Vu redaktas $1",
        "creating": "Vu kreas $1",
        "editingsection": "Vu redaktas $1 (seciono)",
        "rcfilters-filter-watchlist-watched-label": "En mea surveyo-listo",
        "rcfilters-filter-watchlist-watched-description": "Modifikuri en pagini de vua surveyo-listo.",
        "rcfilters-filter-watchlist-watchednew-label": "Nova modifikuri en la surveyo-listo",
+       "rcfilters-filter-watchlistactivity-unseen-description": "Modifikuri en la pagini quin vu ne vizitis pos ke la modifikuri facesis.",
        "rcfilters-filtergroup-changetype": "Tipo di modifikuro",
        "rcfilters-filter-pageedits-label": "Redakti di pagini",
        "rcfilters-filter-pageedits-description": "Redakturi en la kontenajo dil Wiki, diskuti, deskriptado di kategorii...",
        "rcfilters-view-namespaces-tooltip": "Filtrar rezulti segun nomo",
        "rcfilters-liveupdates-button": "Quika aktualigi",
        "rcfilters-watchlist-markseen-button": "Indikar \"vidita\" en omna modifikuri",
+       "rcfilters-watchlist-edit-watchlist-button": "Modifikez vua listo pri pagini vigilata",
+       "rcfilters-watchlist-showupdated": "La chanji en pagini quin vu ne vizitis pos eventir modifikuri indikesas per <strong>dika literi</strong>, kun solida marki.",
        "rcnotefrom": "Infre {{PLURAL:$5|esas la chanjo|esas la chanji}} de <strong>$3, $4</strong> (montrata til <strong>$1</strong>).",
        "rclistfrom": "Montrar nova chanji startante de $3 $2",
        "rcshowhideminor": "$1 mikra redakturi",
        "upload-form-label-infoform-date": "Dato",
        "upload-form-label-own-work-message-generic-local": "Me konfirmas ke me sendas l'arkivo segun la kondicioni e politiki pri autoroyuri de {{SITENAME}}",
        "upload-form-label-not-own-work-message-generic-foreign": "Se vu ne povas sendar ica arkivo segun la politiki dil depozeyo por partigita arkivi, voluntez klozar ica dialogo-fenestro e probar altra metodo.",
+       "backend-fail-maxsize": "Ne povis skribar l'arkivo \"$1\" nam ol esas plu granda kam {{PLURAL:$2|1 bicoko* (byte)|$2 bicoki* (bytes)}}.",
        "uploadstash-bad-path": "La voyo ne existas.",
        "uploadstash-bad-path-invalid": "La voyo esas nevalida.",
        "uploadstash-bad-path-unknown-type": "Tipo \"$1\" nekonocita.",
        "protectedtitles": "Protektita tituli",
        "listusers": "Uzerolisto",
        "listusers-editsonly": "Montrez nur uzeri qui facis redakti",
+       "listusers-temporarygroupsonly": "Montrez nur l'uzeri en tempala uzero-grupi",
        "listusers-creationsort": "Ordinar segun la dato di kreado",
        "listusers-desc": "Ordinar segun decensanta ordeno",
        "usereditcount": "$1 {{PLURAL:$1|redakto|redakti}}",
        "linksearch-ok": "Serchez",
        "listusersfrom": "Montrez uzeri komencante de:",
        "listusers-submit": "Montrez",
+       "listusers-noresult": "Nula uzero trovita.",
        "listusers-blocked": "(blokusita)",
        "activeusers": "Listo pri aktiva uzeri",
        "activeusers-intro": "Yen listo pri uzeri qui laboris en la Wiki dum la lasta $1 {{PLURAL:$1|dio|dii}}.",
        "tooltip-ca-nstab-category": "Videz la pagino dil kategorio",
        "tooltip-minoredit": "Markizar ica redaktajo kom mikra",
        "tooltip-save": "Registrigez chanji",
+       "tooltip-publish": "Publikigar vua modifikuri",
        "tooltip-preview": "Previdar vua chanji. Voluntez uzor ico ante registragar!",
        "tooltip-diff": "Montrez la chanji a la texto quin vu facis",
        "tooltip-compareselectedversions": "Vidar la diferaji inter la du selektita versioni di ca pagino.",
        "logentry-delete-delete": "$1 {{GENDER:$2|efacis}} la pagino $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|efacis}} la ridirektilo $3, riskribante ol",
        "logentry-delete-restore": "$1 {{GENDER:$2|restauris}} la pagino $3 ($4)",
+       "restore-count-revisions": "{{PLURAL:$1|1 revizuro|$1 revizuri}}",
        "logentry-delete-revision": "$1 {{GENDER:$2|modifikis}} videbleso di {{PLURAL:$5|la revizo|$5 revizi}} di la pagino $3: $4",
        "revdelete-content-hid": "celita kontenajo",
        "logentry-block-block": "$1 {{GENDER:$2|blokusis}} {{GENDER:$4|$3}} dum $5 $6",
        "limitreport-ppvisitednodes": "Quanto di nodi vizitita dal preprocesoro",
        "limitreport-ppgeneratednodes": "Quanto di nodi kreita dal preprocesoro",
        "limitreport-postexpandincludesize": "Grandeso dil inkluzo pos expanso",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bicoko*|bicoki*}}",
        "limitreport-expansiondepth": "Maxima profundeso di expanso",
        "limitreport-expensivefunctioncount": "Kontado di funcioni kustoza di analizo sintaxala",
        "expand_templates_output": "Rezulto",
        "expand_templates_ok": "O.K.",
        "expand_templates_preview": "Previdar",
        "pagelang-language": "Linguo",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bicoko*|$1 bicoki*}} ($2; $3%)",
        "special-characters-group-latin": "Latina",
        "special-characters-group-latinextended": "Latina extensita",
        "special-characters-group-symbols": "Simboli",
index 69bb504..4faf576 100644 (file)
@@ -38,7 +38,6 @@
        "tog-extendwatchlist": "Sýna allar breytingar á vaktlistanum, ekki einungis þær nýjustu",
        "tog-usenewrc": "Flokka breytingar eftir síðu í nýlegum breytingum og vaktlista",
        "tog-numberheadings": "Númera fyrirsagnir sjálfkrafa",
-       "tog-showtoolbar": "Sýna breytingaverkfærastiku",
        "tog-editondblclick": "Breyta síðum þegar tvísmellt er",
        "tog-editsectiononrightclick": "Virkja hlutabreytingu með því að hægrismella á hlutafyrirsagnir",
        "tog-watchcreations": "Bæta á vaktlistann minn síðum sem ég bý til og skrám sem ég hleð inn",
index be08d90..5c1204b 100644 (file)
        "tog-extendwatchlist": "Mostra tutte le modifiche agli osservati speciali, non solo l'ultima",
        "tog-usenewrc": "Raggruppa le modifiche per pagina nelle ultime modifiche e negli osservati speciali",
        "tog-numberheadings": "Numerazione automatica dei titoli di sezione",
-       "tog-showtoolbar": "Mostra la barra degli strumenti di modifica",
        "tog-editondblclick": "Modifica delle pagine tramite doppio clic",
        "tog-editsectiononrightclick": "Modifica delle sezioni tramite clic destro sul titolo",
        "tog-watchcreations": "Aggiungi le pagine che creo e i file che carico agli osservati speciali",
        "ipb-disableusertalk": "Impedisci a questo utente di modificare la propria pagina di discussioni mentre è bloccato",
        "ipb-change-block": "Ri-blocca l'utente con queste impostazioni",
        "ipb-confirm": "Conferma il blocco",
+       "ipb-partial": "Parziale",
+       "ipb-type-label": "Tipo",
+       "ipb-pages-label": "Pagine",
        "badipaddress": "Indirizzo IP non valido.",
        "blockipsuccesssub": "Blocco eseguito",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] è stato bloccato.<br />\nConsultare la [[Special:BlockList|lista dei blocchi]] per vedere i blocchi attivi.",
        "duration-centuries": "$1 {{PLURAL:$1|secolo|secoli}}",
        "duration-millennia": "$1 {{PLURAL:$1|millennio|millenni}}",
        "rotate-comment": "Immagine ruotata di $1 {{PLURAL:$1|grado|gradi}} in senso orario",
-       "limitreport-title": "Dati profilo del parser:",
+       "limitreport-title": "Dati di profilazione del parser:",
        "limitreport-cputime": "Tempo di utilizzo CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|secondo|secondi}}",
        "limitreport-walltime": "Tempo di utilizzo reale",
        "mw-widgets-titleinput-description-redirect": "reindirizzamento a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Aggiungi una categoria...",
        "mw-widgets-usersmultiselect-placeholder": "Aggiungi altri...",
+       "mw-widgets-titlesmultiselect-placeholder": "Aggiungi altri...",
        "date-range-from": "Dalla data:",
        "date-range-to": "Alla data:",
        "sessionmanager-tie": "Non è possibile combinare più tipi di richieste di autenticazione: $1.",
        "passwordpolicies-policy-passwordcannotmatchusername": "La password non può essere uguale al nome utente",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "La password non può corrispondere a password specificate nell'elenco delle password proibite",
        "passwordpolicies-policy-maximalpasswordlength": "La password deve essere lunga meno di $1 {{PLURAL:$1|carattere|caratteri}}",
-       "passwordpolicies-policy-passwordcannotbepopular": "La password non può essere {{PLURAL:$1|la password più popolare|nell'elenco delle $1 password più popolari}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "La password non può essere {{PLURAL:$1|la password più popolare|nell'elenco delle $1 password più popolari}}",
+       "unprotected-js": "Per motivi di sicurezza, non è possibile caricare JavaScript da pagine non protette. Crea javascript solo nel namespace MediaWiki o come sottopagina Utente"
 }
index c2ec297..7641b96 100644 (file)
        "tog-extendwatchlist": "ウォッチリストを拡張して最新の変更以外もすべて表示",
        "tog-usenewrc": "最近の更新とウォッチリストで、複数の変更をページごとにまとめる",
        "tog-numberheadings": "見出しに番号を自動的に振る",
-       "tog-showtoolbar": "編集用のツールバーを表示",
        "tog-editondblclick": "ダブルクリックでページを編集",
        "tog-editsectiononrightclick": "節見出しの右クリックで節を編集できるようにする",
        "tog-watchcreations": "自分が作成したページやアップロードしたファイルをウォッチリストに追加",
        "prefixindex": "先頭が同じ全ページ",
        "prefixindex-namespace": "先頭が同じ全ページ ($1名前空間)",
        "prefixindex-submit": "表示",
-       "prefixindex-strip": "一覧で接頭辞を省略",
+       "prefixindex-strip": "結果一覧から接頭辞を省略",
        "shortpages": "短いページ",
        "longpages": "長いページ",
        "deadendpages": "行き止まりページ",
index ffc35a1..33e24a0 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "Expan wachlis fi shuo aal chienj, no jos di muos riisant",
        "tog-usenewrc": "Yuuz enans riisant chienj (rikwaya JavaScript)",
        "tog-numberheadings": "Aato-nomba edndem",
-       "tog-showtoolbar": "Shuo edit tuulbaar (rikwaya JavaScript)",
        "tog-editondblclick": "Edit piej pahn dobl klik (rikwaya JavaScript)",
        "tog-editsectiononrightclick": "Eniebl sekshan editin bai rait klikin pahn sekshan taikl (rikwaya JavaScript)",
        "tog-watchcreations": "Ad piej mi kriet tu mi wachlis",
index 44bd00f..30310e2 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "Utwiid öwewågnengslisten te å wis åll øndrenge å ett kons di nysti",
        "tog-usenewrc": "Gruppiir øndrenge pro siid i listen öwe siensti øndrenge å i öwewågnengslisten",
        "tog-numberheadings": "Automatisk nummeriireng å öweskrifte",
-       "tog-showtoolbar": "Wis wærktyeslinje te redigiireng",
        "tog-editondblclick": "Redigiir side mä doppeltklikk",
        "tog-editsectiononrightclick": "Redigiir åsnit we å højaklikk på dæes title",
        "tog-watchcreations": "Tilfye side, æ oprette, å fili, æ lägge op, te min öwewågnengslist",
index 7d1686f..ced9bc5 100644 (file)
@@ -29,7 +29,6 @@
        "tog-extendwatchlist": "Ambakaké pawawangan nedya nuduhaké kabèh owahan, ora mung kang paling anyar",
        "tog-usenewrc": "Golongaké owah-owahan miturut kaca ing owah-owahan anyar lan pawawangan",
        "tog-numberheadings": "Wènèhi angkaning sesirah kanthi otomatis",
-       "tog-showtoolbar": "Tuduhaké wilah piranti sarana besut",
        "tog-editondblclick": "Besut kaca sarana ngeklik pindho",
        "tog-editsectiononrightclick": "Idinaké mbesut pérangan sarana klik tengen ing sesirahing pérangan",
        "tog-watchcreations": "Wuwuh kaca gawéanku lan barkas unggahanku menyang pawawanganku",
index 1dc9504..bab6507 100644 (file)
@@ -40,7 +40,6 @@
        "tog-extendwatchlist": "გავრცობილი კონტროლის სია ყველა დაკავშირებული ცვლილების ჩვენების ჩათვლით",
        "tog-usenewrc": "ბოლო ცვლილებების და კონტროლის სიის ცვლილებების დაჯგუფება",
        "tog-numberheadings": "ავტომატურად დანომრე ქვესათაურები",
-       "tog-showtoolbar": "რედაქტირების პანელის ჩვენება",
        "tog-editondblclick": "გვერდების რედაქტირება ორმაგი დაწკაპუნებით",
        "tog-editsectiononrightclick": "სექციის რედაქტირების ნებართვა სათაურებზე მარჯვენა ღილაკზე დაჭერით",
        "tog-watchcreations": "დაამატე ჩემი კონტროლის სიას ჩემს მიერ შექმნილი გვერდები და ატვირთული ფაილები",
index c836f82..34a7ffc 100644 (file)
@@ -18,7 +18,6 @@
        "tog-extendwatchlist": "Baqlaw dizimin barlıq o'zgerislerdi ko'rsetetug'ın qılıp ken'eyt (tek aqırg'ıların emes)",
        "tog-usenewrc": "Jaqındag'ı o'zgerisler ha'm baqlaw dizimindegi o'zgerislerdi birlestiriw",
        "tog-numberheadings": "Atamalardı avtomat nomerle",
-       "tog-showtoolbar": "O'zgertiw a'sbapların ko'rset",
        "tog-editondblclick": "Betlerdi eki ma'rte basıp o'zgertiw",
        "tog-editsectiononrightclick": "Bo'lim atamasın on' jaqqa basıp o'zgertiwdi qos",
        "tog-watchcreations": "Men jaratqan betlerdi ha'm ju'klegen fayllardı baqlaw dizimime qos",
index 631949d..02ff34b 100644 (file)
@@ -31,7 +31,6 @@
        "tog-extendwatchlist": "Ssemɣer umuɣ n uɛessi iwakken ad muqleɣ akk n wayen zemreɣ ad beddleɣ",
        "tog-usenewrc": "Ssegrew ibeddlen s usebtar deg ibeddilen imaynuten d umuɣ n uḍfar",
        "tog-numberheadings": "Izwal ɣur-sen imḍanen mebla ma serseɣ-iten",
-       "tog-showtoolbar": "Ssken tafeggagt n ifecka n ubeddel",
        "tog-editondblclick": "Beddel isebtar mi wekkiɣ snat n tikwal",
        "tog-editsectiononrightclick": "Ssermed abeddel n tigezmi s ukliki ayeffus ɣef izwal",
        "tog-watchcreations": "Rnu isebtar i xelqeɣ deg wumuɣ n uɛessi inu",
index 27e530f..048d018 100644 (file)
@@ -17,7 +17,6 @@
        "tog-extendwatchlist": "ЩӀэлъыплъыгъуэм и тхылъышхуэ, яужырэй къуэдейхэм нэмыщӀу зэхъуэкӀыгъуэ псори хэту",
        "tog-usenewrc": "Гъэтэрэзыгъуэ щӀэхэм я тхылъ нэхъыфӀыр къэгъэсэбэпын (JavaScript хуэныкъуэ)",
        "tog-numberheadings": "Псалъащхьэхэм автоматику номер ятын",
-       "tog-showtoolbar": "Гъэтэрэзыным идежь ищхьэ пэнелыр гъэлъэгъуэн (JavaScript)",
        "tog-editondblclick": "ТӀуанэ текъузэгъуэкӀэ напэкӀуэцӀхэр гъэтэрэзын (requires JavaScript)",
        "tog-editsectiononrightclick": "Псалъашъхьэм, дзыгъуэм и ижырабгъу текъузэгъуэмкӀэ секциэхэр гъэтэрэзын (JavaScript)",
        "tog-watchcreations": "Сэ сщIа напэкIуэцIхэр сызыкIэлъыплъ тхылъым хэлъхьэн",
index 24c157a..585d25c 100644 (file)
@@ -18,7 +18,6 @@
        "tog-extendwatchlist": "زیرِنظرفہرستو پھیلاؤ  کورے تاکہ ھیارا تھمامو ترمیمات غیچھی گیانی، نہ کہ صرفی تازہ ترین",
        "tog-usenewrc": "حالیہ تبدیلیان اوچے زیر نظر فہرستہ تبدیلیان بلحاظ صفحہ گروہ بندی کورے",
        "tog-numberheadings": "سرخیانتے تان لمبار دیت",
-       "tog-showtoolbar": "ترمیم کوریکو اوزاران پشاوے",
        "tog-editondblclick": "جو کلکہ صفحاتن ترمیم کورے",
        "tog-editsectiononrightclick": "سطری عنواناتا فروسکی کلکو ذریعا سطری ترمیم کاریو فعال ساؤزاوے",
        "tog-watchcreations": "مہ مرتب کاردو صفحاتن مہ  زیرِنظرفہرستہ شامل کورے",
index 9b798f0..7dff56c 100644 (file)
@@ -19,7 +19,6 @@
        "tog-extendwatchlist": "Lista şêrkerdene hira bıke ke vurnayişi pêro basê, teyna tewr peyêni nê",
        "tog-usenewrc": "Vurnayisê ke pela vurnayisunê peyênun u lista şêrkerdişi derê inu grube ke.",
        "tog-numberheadings": "Sernustu be ho numra cı sane",
-       "tog-showtoolbar": "Gozagunê hacetunê vurnayişi bıasne (JavaScript lazımo)",
        "tog-editondblclick": "Pê dı rey teqnayene pele sero bıguriye (JavaScript lazımo)",
        "tog-editsectiononrightclick": "Qısımu be teqnayena serrêze ra ebe gozaga raste bıvurne (JavaScript lazımo)",
        "tog-watchcreations": "Pelê ke mı afernê u dosyê ke mı bar kerdê lista mına şêrkerdişi ke",
index fde7ecf..f0ebb5c 100644 (file)
@@ -86,6 +86,7 @@
        "noindex-category": "ဝီႋဖၠုံးသံင့်လေဝ်လိက်ဖၠုံးခၞါလ်ုအ်ှ လိက်မေံၜၠါ်လ်ုဖး",
        "broken-file-category": "ခါၯာၯံင် ဖိုင်ႋလင့်အှ်သယ်လ်ုဖး လိက်မေံၜၠါ်",
        "about": "အ်ုကျံင်",
+       "article": "ပ်ုယုံ့ခေါဟ်တင်လိက်မေံၜၠာ်",
        "newwindow": "(ဝင်းဒိုးသင့်လ်ုၮါင်းဝယ် မ်ုပုဂ်ထုင်း)",
        "cancel": "မာလှ်ေအေး",
        "moredotdotdot": "ၰိုဲမေံၜၠာ်...",
        "jumpto": "မ်ုၯယ့်ထါင်ယိုဝ်",
        "jumptonavigation": "ပ်ုယုံ့",
        "jumptosearch": "အင်းၯူ့",
+       "pool-errorunknown": "လ်ုသီးယာ့ ဆ်ုမးၜး",
+       "poolcounter-usage-error": "ဆ်ုသုံႋဆာႋအ်ုမး: $1",
        "aboutsite": "အ်ုကျံင် {{SITENAME}}",
        "aboutpage": "Project:အ်ုၯံင်အ်ုကျံင်",
        "copyrightpage": "{{ns:project}}: ပ္တုံဆာပၞံင့်",
        "showtoc": "ဍုဂ်ၮဲ",
        "hidetoc": "အ်ှသူး",
        "collapsible-collapse": "မ်ုပေဝ်ႋက္ဍာ",
+       "collapsible-expand": "လဝ်လဲာ",
        "confirmable-confirm": "{{GENDER:$1|ၮ်ု}} ထီ့ဆာႋဝး?",
        "confirmable-yes": "မွာဲ",
        "confirmable-no": "လ်ုမာၜး",
        "nosuchspecialpage": "ဗေ့ယိုဝ်သိုဝ် လိက်မေံၜၠါ်ခေါဟ် လ်ုအှ်ၜး",
        "nospecialpagetext": "<strong>ၮ်ုယိုဝ် လ်ုထီ့ဆာ့ၜး လိက်မေံခေါဟ်လ်ုၮါင်းအိုဝ် အင်းကိင်ဖှ်ေထဆေဝ်ႋလှ်။</strong>\n\nထီ့ဆာ့ လိက်မေံခေါဟ် စ်ုရင့်သယ် [[Special:SpecialPages|{{int:specialpages}}]] ခဝ့် ၮ်ုဍးၮေဝ်လှ်။",
        "error": "ဆ်ုမး",
+       "databaseerror-error": "အ်ုမး: $1",
        "badtitle": "လိက်မေံဆ်ုနာႋ",
        "badtitletext": "အင်းကိင်ႋလင်ထ လိက်မေံၜၠါ် ခေါဟ်တင်ၮ်ှ လ်ုဖံင်ပၞံင့် (လ်ု) လ်ုအှ်မိင်ၜး (လ်ု) ၰာၰံင်ဘာႋသာ့လ်ုဖး(inter-language or inter-wiki title)အိုဝ် ထိုဝ်ၜုဂ်လင့်မးဝေ့လှ်။",
        "viewsource": "မ်ုယောဝ်ႋအ်ုဝီခၞာ",
        "whatlinkshere-hideimages": "ဖိုင်ႋဆ်ုထိုဝ်ၜုဂ်လ်ုဖး $1 ၮါင်း",
        "whatlinkshere-filters": "ဆၟိုဝ်သယ်လ်ုဖး",
        "ipboptions": "၂ နာႋဍီ:2 hours,၁ မူႋသင့်:1 day,၃ မူႋသင့်:3 days,၁ နိုဲ့:1 week,၂ နိုဲ့:2 weeks,လာ ၁ ၜိင်း:1 month,လာ ၃ ၜိင်း:3 months,လာ ၆ ၜိင်း:6 months,၁ ၮိင်း:1 year,လ်ုထုက်ၜးတ:infinite",
+       "ipb-partial": "ပါဍီယာႋ",
+       "ipb-type-label": "အ်ုမိင်အ်ုကုဂ်",
+       "ipb-pages-label": "လိက်မေံၜၠာ်လ်ုဖး",
        "infiniteblock": "အ်ုထုက်လ်ုအ်ှ",
+       "blocklist-editing": "ဆ်ုအင်းတါင်",
        "blocklink": "ဍုဂ်အ်ှပွါ်",
        "contribslink": "မာၜိုဝ်မာဆိုင်",
        "blocklogpage": "ဆ်ုဍာ်အှ်ၯင်း  လိက်မါၮါင်း",
        "logentry-upload-overwrite": "$3 ၮှ်ခဝ့် ဗားရှင်းအ်ုသင့်အိုဝ် $1 {{GENDER:$2|upload ပ္တုံထုင်းထဆေဝ်ႋ}}",
        "searchsuggest-search": "{{SITENAME}}ဝဲါ မ်ုအင်းၰူ့",
        "duration-days": "$1 {{PLURAL:$1|မူႋသင့်|မူႋသင့်လ်ုဖး}}",
+       "mw-widgets-titlesmultiselect-placeholder": "ဆူ့ဍုဂ် ဆ်ုအှ်ထါင်...",
        "randomrootpage": "လ်ုၜးမိင် အ်ုခံင့် လိက်မေံၜၠါ်"
 }
index 3967e27..edb61af 100644 (file)
@@ -12,7 +12,6 @@
        "tog-extendwatchlist": "باقىلاۋ ٴتىزىمدى ۇلعايت (بارلىق جارامدى وزگەرىستەردى كورسەت)",
        "tog-usenewrc": "كەڭەيتىلگەن جۋىقتاعى وزگەرىستەر (JavaScript)",
        "tog-numberheadings": "باس جولداردى وزدىكتىك نومىرلە",
-       "tog-showtoolbar": "وڭدەۋ قۋرالدار جولاعىن كورسەت (JavaScript)",
        "tog-editondblclick": "قوس نۇقىمداپ وڭدەۋ (JavaScript)",
        "tog-editsectiononrightclick": "ٴبولىم تاقىرىبىن وڭ نۇقۋمەن وڭدەۋىن قوس (JavaScript)",
        "tog-watchcreations": "مەن باستاعان بەتتەردى باقىلاۋ تىزىمىمە ۇستە",
index 93f7982..036a9d3 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "Бақылау тізімді ұлғайтып барлық өзгерістерді көрсету, ең соңғыларды ғана емес",
        "tog-usenewrc": "Жуықтағы өзгерістер және бақылау тізімінде беті бойынша өзгерістерді топтау",
        "tog-numberheadings": "Мазмұн тақырыптарын автоматты нөмірлеу",
-       "tog-showtoolbar": "Өңдеу құралдарын үстелін көрсету",
        "tog-editondblclick": "Қос шерту арқылы бетті өңдеу",
        "tog-editsectiononrightclick": "Бөлім тақырыбын оң нұқумен бөлім өңдеуін қосу",
        "tog-watchcreations": "Мен бастаған беттерді және мен жүктеген файлдарды бақылау тізіміне қосу",
index eac51e1..824ae67 100644 (file)
@@ -14,7 +14,6 @@
        "tog-extendwatchlist": "Baqılaw tizimdi ulğaýt (barlıq jaramdı özgeristerdi körset)",
        "tog-usenewrc": "Keñeýtilgen jwıqtağı özgerister (JavaScript)",
        "tog-numberheadings": "Bas joldardı özdiktik nomirle",
-       "tog-showtoolbar": "Öñdew qwraldar jolağın körset (JavaScript)",
        "tog-editondblclick": "Qos nuqımdap öñdew (JavaScript)",
        "tog-editsectiononrightclick": "Bölim taqırıbın oñ nuqwmen öñdewin qos (JavaScript)",
        "tog-watchcreations": "Men bastağan betterdi baqılaw tizimime üste",
index e130589..017c661 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "ពន្លាត​បញ្ជីតាមដាន​ដើម្បី​បង្ហាញ​គ្រប់​បន្លាស់ប្ដូរទាំងអស់ មិន​មែន​ត្រឹមតែ​បន្លាស់ប្ដូរថ្មី​ៗ​នោះ​ទេ",
        "tog-usenewrc": "បន្លាស់ប្ដូរជាក្រុមតាមទំព័រក្នុងបន្លាស់ប្តូរថ្មីៗនិងបញ្ជីតាមដាន",
        "tog-numberheadings": "ដាក់លេខ​ចំណងជើងរង​ដោយស្វ័យប្រវត្តិ",
-       "tog-showtoolbar": "បង្ហាញ​របារឧបករណ៍កែប្រែ",
        "tog-editondblclick": "កែប្រែទំព័រដោយចុចពីរដង​ជាប់គ្នា",
        "tog-editsectiononrightclick": "អនុញ្ញាត​អោយកែប្រែ​​ផ្នែកណាមួយ ដោយ​ចុចកណ្តុរស្ដាំ​លើ​ចំណងជើង​របស់វា",
        "tog-watchcreations": "បន្ថែម​ទំព័រ​ទាំងឡាយដែលខ្ញុំបង្កើត​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ",
index e751f0c..398584c 100644 (file)
@@ -44,7 +44,6 @@
        "tog-extendwatchlist": "ಕೇವಲ ಇತ್ತೀಚೆಗಿನ ಬದಲಾವಣೆಗಳಲ್ಲದೆ, ಎಲ್ಲಾ ಬದಲಾವಣೆಗಳನ್ನು ತೋರುವಂತೆ ಪಟ್ಟಿಯನ್ನು ವಿಸ್ತರಿಸಿ",
        "tog-usenewrc": "ಹೆಚ್ಚು ವರ್ಧಿಸಲಾದ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳು ಪುಟ ಬಳಸು",
        "tog-numberheadings": "ತಲೆಬರಹಗಳಿಗೆ ಅಂಕಿಗಳನ್ನು ತೋರಿಸು",
-       "tog-showtoolbar": "ಸಂಪಾದನೆಯ ಉಪಕರಣಗಳ ಪಟ್ಟಿಯನ್ನು ತೋರು",
        "tog-editondblclick": "ಎರಡು ಬಾರಿ ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ಪುಟವು ಸಂಪಾದಿಸುವಂತಾಗಲಿ",
        "tog-editsectiononrightclick": "ಪುಟದ ವಿಭಾಗಗಳನ್ನು ಅವುಗಳ ಶೀರ್ಷಿಕೆಯನ್ನು ಎರಡು ಬಾರಿ ಕ್ಲಿಕ್ ಮಾಡಿ ಸಂಪಾದನೆ ಮಾಡುವಂತೆ ಇರಲಿ",
        "tog-watchcreations": "ನಾನು ಪ್ರಾರಂಭಿಸುವ ಲೇಖನಗಳನ್ನು ಮತ್ತು ಕಡತಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು",
index fbbe1db..601b284 100644 (file)
@@ -82,7 +82,6 @@
        "tog-extendwatchlist": "주시문서 목록에서 가장 최근의 편집만이 아닌 모든 편집을 보기",
        "tog-usenewrc": "최근 바뀜과 주시문서 목록의 문서별 그룹 바뀜",
        "tog-numberheadings": "자동으로 머리글 번호 매기기",
-       "tog-showtoolbar": "편집 도구 모음 보이기",
        "tog-editondblclick": "더블 클릭으로 문서 편집하기",
        "tog-editsectiononrightclick": "문단 제목을 오른쪽 클릭해서 문단 편집하기 활성화",
        "tog-watchcreations": "내가 만든 문서와 내가 올린 파일을 주시문서 목록에 추가",
        "subject-preview": "주제 미리 보기:",
        "previewerrortext": "변경사항을 미리보기하는 도중 오류가 발생했습니다.",
        "blockedtitle": "사용자가 차단됨",
+       "blocked-email-user": "<strong>사용자 이름은 이메일 보내기에서 차단되었습니다. 그러나 이 위키에서 다른 문서를 편집할 수 있습니다.</strong> [[Special:MyContributions|계정 기여]]에서 자세한 전체 차단 정보를 볼 수 있습니다.\n\n차단은 $1님에 의해 이루어졌습니다.\n\n지정된 이유는 <em>$2</em>입니다.\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n* 차단 ID #$5",
        "blockedtext": "'''사용자 계정 또는 IP 주소가 차단되었습니다.'''\n\n차단한 사람은 $1입니다.\n차단한 이유는 다음과 같습니다: <em>$2</em>.\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 '이메일 보내기' 기능을 사용할 수 있습니다. 또 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n현재 당신의 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "autoblockedtext": "당신의 IP 주소는 $1님이 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.\n차단된 이유는 다음과 같습니다:\n\n:<em>$2</em>\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n\n[[Special:Preferences|사용자 환경 설정]]에 올바른 이메일 주소가 있어야만 \"이메일 보내기\" 기능을 사용할 수 있습니다. 또한 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n\n현재 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "systemblockedtext": "당신의 사용자 이름 또는 IP 주소가 자동으로 미디어위키에 의해 차단되었습니다.\n이유는 다음과 같습니다:\n\n:<em>$2</em>\n\n* 차단 시작: $8\n* 차단 만료: $6\n* 차단 대상: $7\n\n당신의 현재 IP 주소는 $3입니다.\n문의에 대해 상기의 상세 설명을 모두 포함해 주십시오.",
        "logdelete-text": "삭제된 로그 내용은 로그에 나타나지만, 내용 중 일부는 일반인이 접근할 수 없게 됩니다.",
        "revdelete-text-others": "다른 관리자는 여전히 숨겨진 내용에 접근할 수 있고 추가 제한이 설정되어 있지 않으면, 다시 되살릴 수 있습니다.",
        "revdelete-confirm": "이 작업의 수행 결과를 알고 있으며, 이 작업이 [[{{MediaWiki:Policy-url}}|정책]]에 의거하는지 확인해주세요.",
-       "revdelete-suppress-text": "숨기기는 <strong>다음 경우에만</strong> 사용되어야 합니다:\n* 잠재적인 비방 정보\n* 부적절한 개인 정보\n*: 집 주소, 전화번호, 주민등록번호 등",
+       "revdelete-suppress-text": "감추기는 <strong>다음 경우에만</strong> 사용되어야 합니다:\n* 잠재적인 비방 정보\n* 부적절한 개인 정보\n*: 집 주소, 전화번호, 주민등록번호 등",
        "revdelete-legend": "보이기 제한을 설정",
        "revdelete-hide-text": "판 문자열",
        "revdelete-hide-image": "파일을 숨기기",
        "revdelete-radio-same": "(바꾸지 않음)",
        "revdelete-radio-set": "숨겨짐",
        "revdelete-radio-unset": "보임",
-       "revdelete-suppress": "문서 내용을 관리자에게도 보이지 않게 숨기기",
+       "revdelete-suppress": "문서 내용을 관리자에게도 보이지 않게 감추기",
        "revdelete-unsuppress": "복구된 판에 대한 제한을 해제",
        "revdelete-log": "이유:",
        "revdelete-submit": "선택한 {{PLURAL:$1|판}}에 적용",
        "ipb-disableusertalk": "차단된 동안 자신의 사용자 토론 문서를 편집하지 못하도록 막기",
        "ipb-change-block": "이 설정으로 이 사용자를 다시 차단합니다",
        "ipb-confirm": "차단 확인",
+       "ipb-sitewide": "사이트 전체",
+       "ipb-partial": "부분",
+       "ipb-type-label": "유형",
+       "ipb-pages-label": "문서",
        "badipaddress": "잘못된 IP 주소",
        "blockipsuccesssub": "차단 완료",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]]님이 차단되었습니다.<br />\n차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.",
        "createaccountblock": "계정 만들기 금지됨",
        "emailblock": "이메일 차단됨",
        "blocklist-nousertalk": "자신의 토론 문서 편집 불가",
+       "blocklist-editing": "편집 중",
+       "blocklist-editing-sitewide": "편집 중 (사이트 전체)",
        "ipblocklist-empty": "차단 목록이 비어 있습니다.",
        "ipblocklist-no-results": "요청한 IP 주소나 사용자는 차단되지 않았습니다.",
        "blocklink": "차단",
        "mw-widgets-titleinput-description-redirect": "$1 문서로 넘겨주기",
        "mw-widgets-categoryselector-add-category-placeholder": "분류 추가...",
        "mw-widgets-usersmultiselect-placeholder": "더 추가하기...",
+       "mw-widgets-titlesmultiselect-placeholder": "더 추가하기...",
        "date-range-from": "시작 날짜:",
        "date-range-to": "끝 날짜:",
        "sessionmanager-tie": "여러 요청 인증 유형 결합할 수 없습니다: $1.",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "비밀번호는 블랙리스트에 있는 비밀번호와 일치할 수 없습니다",
        "passwordpolicies-policy-maximalpasswordlength": "비밀번호는 적어도 $1 {{PLURAL:$1|자}} 미만이어야 합니다",
        "passwordpolicies-policy-passwordcannotbepopular": "비밀번호는 {{PLURAL:$1|저명한 비밀번호가 될|$1개의 저명한 비밀번호에 속할}} 수 없습니다",
-       "easydeflate-invaliddeflate": "주어진 컨텐츠가 적절히 압축되지 않았습니다"
+       "easydeflate-invaliddeflate": "주어진 컨텐츠가 적절히 압축되지 않았습니다",
+       "unprotected-js": "보안 상의 이유로 자바스크립트는 보호되지 않은 문서로부터 불러올 수 없습니다. 미디어위키: 이름공간이나 사용자의 하위 문서에서만 자바스크립트를 만들어 주십시오."
 }
index 89e4ac1..9e6c932 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Кёзде тургъан тизмени, къуру ахыр тюл, бютеу тюрлениулени кёрюр ючюн кенгерт",
        "tog-usenewrc": "Ахыр тюрлениуледе эм кёздеги тизмеде бетлени тюрлениулерин къауумлашдыр",
        "tog-numberheadings": "Башлыкъланы (бёлюмлени атлары) автомат номерленсинле",
-       "tog-showtoolbar": "Тюрлендириу адыр панелни кёргюз",
        "tog-editondblclick": "Эки басыу бла бетлени тюрлендир",
        "tog-editsectiononrightclick": "Бёлюмлени бёлюм башлыкъгъа басханлай тюрлендир",
        "tog-watchcreations": "Мен къурагъан (башлагъан) бетлени эм мен джюклеген файлланы кёзюмде тургъан тизмеме къош",
index bfd7adb..3609d87 100644 (file)
@@ -23,7 +23,6 @@
        "tog-extendwatchlist": "Verjrößer de Oppaßleß för jede Aat vun müjjeliche Ännderonge ze zeije, nit alleijns  de neuste.",
        "tog-usenewrc": "De Änderonge en de „{{int:Recentchanges}}“ un en de Oppaßleß en Jroppe zesammevaße.",
        "tog-numberheadings": "Dun de Üvverschrefte automatisch nummereere",
-       "tog-showtoolbar": "De Wärkzüchleß zom Ändere aanzeije",
        "tog-editondblclick": "Sigge met Dubbel-Klicke ändere",
        "tog-editsectiononrightclick": "Afschnedde met Räächs-Klecke op de Üvverschrefte ändere",
        "tog-watchcreations": "Donn Sigge beim neu Aanlääje automattesch för ming Oppaßlėß vörschlonn",
index d9353bc..c112217 100644 (file)
@@ -33,7 +33,6 @@
        "tog-extendwatchlist": "Lîsteya şopandinê berfireh bike ji bo dîtina hemû guherandinan, ne tenê yên nû",
        "tog-usenewrc": "Weşandina zêdetir (JavaScript pêwîst e)",
        "tog-numberheadings": "Sernavan otomatîk bihejmêre",
-       "tog-showtoolbar": "Çoyê sererastkirinê nîşan bide",
        "tog-editondblclick": "Rûpelan bi du klîkan biguherîne",
        "tog-editsectiononrightclick": "Beşekê bi rast-klîkekê biguherîne",
        "tog-watchcreations": "Rûpelên min çêkirin û dosyeyên min barkirin, têxe nav lîsteya min a şopandinê",
index 89b7548..947f7a3 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "Efani an rol wolya dhe dhiskwedhes keniver chanj, a-dar an moyha a-dhiwedhes hepken",
        "tog-usenewrc": "Bagasa chanjyow herwydh an folen yn chanjyow a-dhiwedhes hag y'n rol wolya (res yw JavaScript)",
        "tog-numberheadings": "Awto-nivera pennlinennow",
-       "tog-showtoolbar": "Diskwedhes an toulvar chanjya (res yw JavaScript)",
        "tog-editondblclick": "Chanjya folennow ow tobyl-glyckya (res yw JavaScript)",
        "tog-editsectiononrightclick": "Galosegi chanjya trehow dre dhyhow-glyckya war ditlys an trehow (res yw JavaScript)",
        "tog-watchcreations": "Keworra folennow gwruthys genev ha restrennow ughkergys genev dhe'm rol golyas",
index bd7ae38..d979b6a 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "Бүт өзгөртүүлөрдү камтыган кеңири көзөмөл тизмеси, эң соңкуларды гана эмес",
        "tog-usenewrc": "Өзгөртүүлөрдү соңку өзгөрүүлөргө жана көзөмөл тизмеме топтоо (JavaScript талап кылынат)",
        "tog-numberheadings": "Башжазууларды автоматтык түрдө номердөө",
-       "tog-showtoolbar": "Оңдоо учурунда аспаптар тактасын көрсөтүү (JavaScript талап кылынат)",
        "tog-editondblclick": "Эки басып баракты оңдоо (JavaScript талап кылынат)",
        "tog-editsectiononrightclick": "Бөлүмдүн башжазуусун чычкандын оң баскычы менен басканда оңдоп-түзөө бөлүгүн ачуу (JavaScript талап кылынат)",
        "tog-watchcreations": "Көзөмөл тизмеме мен жараткан барактарды жана мен жүктөгөн файлдарды кошуу",
index f93a72a..02d834b 100644 (file)
@@ -40,7 +40,6 @@
        "tog-extendwatchlist": "In indice paginarum observandarum non solum recentissimas, verum omnes mutationes ostendere",
        "tog-usenewrc": "Indices per paginas redigere",
        "tog-numberheadings": "Subtituli numeris adornandi",
-       "tog-showtoolbar": "Trabem editoriam affigere",
        "tog-editondblclick": "Duplici ictu liceat paginam recensere",
        "tog-editsectiononrightclick": "Titulis a dextra tactis liceat paginarum partes recensere",
        "tog-watchcreations": "Paginas, quas creavero, et fasciculos, quos imposuero, observare",
index c1d7b45..1fffe53 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Anchar mi lista de akavidamiento afín de àmostrar todos los trocamientos, no sólo los muevos",
        "tog-usenewrc": "Agrupar kambios por pajinas en kambios resiente y lista",
        "tog-numberheadings": "Numerotar otomatika mente los títolos de los kapítolos",
-       "tog-showtoolbar": "Amostrar el chibuk de aparatos",
        "tog-editondblclick": "Trocar las hojas con doble klik",
        "tog-editsectiononrightclick": "Pueder trocar los kapítůlos, en pizando el botón derecho del ratón encima el títůlo",
        "tog-watchcreations": "Anyadir lad pajinas ke kree i archivos ke karge a mi lista",
index d765524..25e729c 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "Iwwerwaachungslëscht op all Ännerungen ausbreeden, net nëmmen op déi rezentst",
        "tog-usenewrc": "Rezent Ännerungen an Iwwerwaachungslëscht pro Säit weisen",
        "tog-numberheadings": "Iwwerschrëften automatesch numeréieren",
-       "tog-showtoolbar": "Ännerungstoolbar weisen",
        "tog-editondblclick": "Säite mat Duebelklick änneren",
        "tog-editsectiononrightclick": "Eenzel Abschnitter mat Rietsklick änneren",
        "tog-watchcreations": "Säiten déi ech uleeën a Fichieren déi ech eroplueden op meng Iwwerwaachungslëscht dobäisetzen",
        "ipb-disableusertalk": "Dëse Benotzer dorun hënnere fir seng eegen Diskussiounssäit z'ännere sou laang wéi e gespaart ass",
        "ipb-change-block": "De Benotzer mat dese Parameteren nees spären",
        "ipb-confirm": "Spär confirméieren",
+       "ipb-partial": "Partiell",
+       "ipb-type-label": "Typ",
+       "ipb-pages-label": "Säiten",
        "badipaddress": "D'IP-Adress huet dat falscht Format.",
        "blockipsuccesssub": "Gouf gespaart",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] gouf gespaart. <br />\n\nKuckt d'[[Special:BlockList|Spär-Lëscht]] fir all Spären nozekucken.",
        "createaccountblock": "Opmaache vu Benotzerkonte gespaart",
        "emailblock": "E-Maile schécke gespaart",
        "blocklist-nousertalk": "däerf seng eegen Diskussiounssäit net ännereen",
+       "blocklist-editing": "änneren",
        "ipblocklist-empty": "D'Spärlëscht ass eidel.",
        "ipblocklist-no-results": "Déi gesichten IP-Adress respektiv de gesichte Benotzer ass net gespaart.",
        "blocklink": "spären",
        "mw-widgets-titleinput-description-redirect": "viruleeden op $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Eng Kategorie dobäisetzen...",
        "mw-widgets-usersmultiselect-placeholder": "Méi dobäisetzen...",
+       "mw-widgets-titlesmultiselect-placeholder": "Méi derbäisetzen...",
        "date-range-from": "Vum (Datum):",
        "date-range-to": "Bis den (Datum):",
        "sessionprovider-generic": "$1-Sessiounen",
index e57ba4a..ead8345 100644 (file)
@@ -27,7 +27,6 @@
        "tog-extendwatchlist": "ЧӀехи сиягь килигунин, кутазвай вири дегишунар, амма са эхирбур туш",
        "tog-usenewrc": "Мукьвара хьайи масакӀавилерин ччина ва вилив хуьнин сиягьда дуьзар хъувунар кӀеретӀриз ччара авун. (JavaScript герекзава)",
        "tog-numberheadings": "Кьилин цӀарариз автоматдаказ номерар эцигун",
-       "tog-showtoolbar": "Дуьзар хъувунин алатрин кьвати къалура (JavaScript)",
        "tog-editondblclick": "Ччинар кьве тӀампӀуналди дуьзар хъувун (JavaScript герекзава)",
        "tog-editsectiononrightclick": "Пайдин кьилинцӀардиз эрчӀи патан тӀампӀ авуна пайдин дуьзар хъувуниз мумкинвал гун (JavaScript герекзава)",
        "tog-watchcreations": "За туькӀуьрнавай ччинар зи гуьзетунин сиягьдиз алава авун",
index f279596..4c7a700 100644 (file)
@@ -24,7 +24,6 @@
        "tog-extendwatchlist": "Aumenta la lista monitorida per mostra tota cambias, no sola la plu resentes",
        "tog-usenewrc": "Grupi cambias par paje en cambias resente e lista monitorida",
        "tog-numberheadings": "Numeri automata titulos",
-       "tog-showtoolbar": "Mostra la utiles de edita",
        "tog-editondblclick": "Edita pajes par clica duple",
        "tog-editsectiononrightclick": "Edita un parte par clica destra un titulo de parte",
        "tog-watchcreations": "Ajunta a mea lista monitorida la pajes cual me crea e la fixes cual me carga",
index fe1221f..3acc272 100644 (file)
@@ -14,7 +14,6 @@
        "tog-extendwatchlist": "Olukalala lw'empapula zengoberera lulabike mu bujjuvu, nga ebikyuse byonna mwebiri so ssi ebisinga obugya byokka",
        "tog-usenewrc": "Olukalala olw'ebikyuse lweyambise obusobozi obw'enyongeza (kyetaagisa 'JavaScript')",
        "tog-numberheadings": "Emitwe gy'emiko ku mpapula gibengako ennamba",
-       "tog-showtoolbar": "Amapeesa g'ebiyamba mu kuwandika galabikenga (kino kyetaagisa JavaScript)",
        "tog-editondblclick": "Okunyiga eppeesa emirundi ebiri kubikkulenga w'okyusiza olupapula  (kyetaagisa 'JavaScript')",
        "tog-editsectiononrightclick": "Okunyiga ku omutwe gw'omuko ku lupapula n'eppeesa erya ddyo kubikkulenga w'ogukyusiza (kyetaagisa 'JavaScript')",
        "tog-watchcreations": "Empapula zenkolawo ziteekebwenga ku lukalala lw'ezo zengoberera",
index f7db609..ffc87a0 100644 (file)
@@ -29,7 +29,6 @@
        "tog-extendwatchlist": "Oetgebreide volglies gebroeke óm alle verangeringe te zeen en neet allein de lèste",
        "tog-usenewrc": "Tuun verangeringe per pagina in recènte verangeringe en volglies",
        "tog-numberheadings": "Köpkes autematis nómmere",
-       "tog-showtoolbar": "Laot bewirkingwerkbalk zeen",
        "tog-editondblclick": "Bewirk pagina's bie 'ne dobbelklik",
        "tog-editsectiononrightclick": "Secties bewirke mit 'ne rechtermoesklik op sectietitels",
        "tog-watchcreations": "Volg autematis pagina's die ich aanmaak en bestenj die ich upload",
        "imagetypemismatch": "De nuje bestandjsextensie is neet gliek aan 't bestandjstype.",
        "imageinvalidfilename": "De nuje bestandsnaam is ongeldig",
        "fix-double-redirects": "Alle doorverwiezinge biewerke die verwieze nao de originele paginanaam",
-       "move-leave-redirect": "'n Doorverwiezing achterlaote",
+       "move-leave-redirect": "Laot 'ne redirek staon",
        "protectedpagemovewarning": "'''Waorsjoewing: Dees pazjena is besjermp zoedat ze allein doer gebroekers mit administratorrechte kint weure verplaats.'''\nDe lèste logbookregel steit hierónger:",
        "semiprotectedpagemovewarning": "<strong>Let op:</strong> Dees pazjena is beveilig en kin allein door geregistreerde gebroekers verplaats waere.\nDe lèste logbookregel steit hiejónger:",
        "move-over-sharedrepo": "[[:$1]] besteit al in 'ne gedeildje mediadatabank.\nE bestandj hiehaer verplaatse euversjrief 't gedeildj bestandj.",
index 8356723..6a59927 100644 (file)
@@ -27,7 +27,6 @@
        "tog-extendwatchlist": "mostra tùtte e modìfiche di òservæ speciâli, no solo l'ùrtima",
        "tog-usenewrc": "Amùggia pe pàgina e modìfiche inte ùrtime modìfiche e sotta òservaçión",
        "tog-numberheadings": "Numeraçión aotomàtica di tìtoli de seçión",
-       "tog-showtoolbar": "Mostra a bâra di strumenti de modìfica",
        "tog-editondblclick": "Modìfica de pàgine tràmite dóggio clic",
        "tog-editsectiononrightclick": "Permetti de modificâ e seçioìn co-o clic drîto in sciô tìtolo",
        "tog-watchcreations": "Azonzi e pàgine che mi crêo e i files che càrego a-i öservæ speciâli",
index 2e98cb9..9c35093 100644 (file)
@@ -23,7 +23,6 @@
        "tog-extendwatchlist": " کؤل رزگ-فئرست الؤن(آلشت)کریال-تغیرات نیشان دۀ،نۀ هر تنیا دؤمائنۀل",
        "tog-usenewrc": "تنیا آڵؤن(آلشتی)کریال تازۀ ؤ لیست پئگیریۀل رزگ بنی-گروه بندی کۀ",
        "tog-numberheadings": "شؤمارۀ  نئ خودکار سروڵگۀل-عناوین",
-       "tog-showtoolbar": "دیار دائن ابزار دسکاری",
        "tog-editondblclick": "دەسکاری وەڵگەل وە دۆگل کلیک کردن",
        "tog-editsectiononrightclick": "دسکاری کردن راسال-بخشۀل ئۀ کلیک راست کردن ئۀرؤی سرولگۀل باج کار",
        "tog-watchcreations": "وڵگۀلئ گه مَسازم ؤ پرؤندۀلئ گه مۀنم اضافۀ که فئرست سئرکردنۀل",
index d66f127..7c6dcf9 100644 (file)
@@ -31,7 +31,6 @@
        "tog-extendwatchlist": "Slarga la funziun \"tegn sot ögg\" in manera che la fà vidè tüt i mudifegh, minga dumà l'ültema",
        "tog-usenewrc": "Reönés le mudifiche per pàgina endèle ölteme mudìfiche 'ndèi oservàcc speciài",
        "tog-numberheadings": "Auto-nümerazion di paragraf",
-       "tog-showtoolbar": "Fà ved la barra dei arnés de modifica",
        "tog-editondblclick": "Redatá i pagin cun al dópi clich",
        "tog-editsectiononrightclick": "Abilitá mudifica di seziún cun al clic dester sül tìtul",
        "tog-watchcreations": "Giunta i paginn e i archivi ch'hoo creaa mì a la lista di paginn che tegni sot ögg",
index 14c9294..8011325 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "ຂະຫຍາຍລາຍການຕິດຕາມໃຫ້ສະແດງການປ່ຽນແປງທັງໝົດ, ບໍ່ແມ່ນພຽງການປ່ຽນແປງລ້າສຸດ",
        "tog-usenewrc": "ຈັດກຸ່ມການປ່ຽນແປງແບ່ງຕາມໜ້າຢູ່ໃນລາຍການປ່ຽນແປງລ້າສຸດແລະລາຍການຕິດຕາມ",
        "tog-numberheadings": "ກຳນົດເລກຫົວເລື່ອງອັດຕະໂນມັດ",
-       "tog-showtoolbar": "ສະແດງແຖບເຄື່ອງມືແກ້ໄຂ",
        "tog-editondblclick": "ແກ້ໄຂໜ້າເມື່ອກົດສອງເທື່ອ",
        "tog-editsectiononrightclick": "ເປີດໃຊ້ງານການແກ້ໄຂສ່ວນໂດຍກົດເມົາສ໌ດ້ານຂວາຢູ່ເທິງຊື່ເລື່ອງຂອງສ່ວນນັ້ນ",
        "tog-watchcreations": "ເພີ່ມໜ້າທີ່ຂ້ອຍສ້າງແລະໄຟລ໌ທີ່ຂ້ອຍອັບໂຫຼດເຂົ້າໃນລາຍການຕິດຕາມ",
index 82d0b26..06226ab 100644 (file)
@@ -11,7 +11,6 @@
        "tog-underline": "Tumana ling'ko:",
        "tog-usenewrc": "Inenset petuho nca (JavaScript)",
        "tog-numberheadings": "Auto-palo mukunguna",
-       "tog-showtoolbar": "Kamukile hloli ye ng'i toolbar (bulukezi JavaScript)",
        "tog-editondblclick": "Hloli ye ng'i petulo di 'klik' dubo (JavaScript)",
        "tog-watchcreations": "Pusize petulo a hloli di zwa mukoloko di kentezi",
        "tog-watchdefault": "Pusize petulo a hloli ye ng'i di zwa mukoloko di kentezi",
index ab62a89..085d254 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "سئیل بأرگە نە سی نئشوٙ دأئن تأموٙم آلئشتیا ڤا کو نە فأقأط سی بیشتئر تازە باڤیا.",
        "tog-usenewrc": "دأسە بأنی آلئشتیا ڤا بألگە د آلئشتیا تازە و سئیل بأرگ",
        "tog-numberheadings": "سأربألگە خود شمارئشت کو",
-       "tog-showtoolbar": "نأڤار أڤزار ڤیرایئشت نە نئشو بیە",
        "tog-editondblclick": "بألگە یا نە ڤا د نۊ پوٙرنیئن ڤیرایئشت بأکیت",
        "tog-editsectiononrightclick": "بأرجا ڤیرایئشت نە ڤا راس پوٙرنییئن د بأرجا داسوٙنیا کونئشتگأر کو",
        "tog-watchcreations": "بألگە یایی کئ مئ رأڤأندیاری کئمە و جانیایی کئ مئ سوڤار کئمە ئضاف کو د سئیل بأرگە مئ",
index d133436..5d38a3b 100644 (file)
@@ -51,7 +51,6 @@
        "tog-extendwatchlist": "Išplėsti stebimųjų sąrašą, kad rodytų visus tinkamus keitimus, ne tik pačius naujausius",
        "tog-usenewrc": "Grupuoti pakeitimas pagal puslapį paskutinių keitimų ir stebėjimo sąrašuose",
        "tog-numberheadings": "Automatiškai numeruoti skyrelius",
-       "tog-showtoolbar": "Rodyti redagavimo įrankių juosta",
        "tog-editondblclick": "Puslapių redagavimas dvigubu spustelėjimu",
        "tog-editsectiononrightclick": "Įjungti skyrelių redagavimą paspaudus skyrelio pavadinimą dešiniuoju pelės klavišu (JavaScript)",
        "tog-watchcreations": "Pridėti mano sukuriamus puslapius į stebimųjų sąrašą",
index d7c7e26..b641dc0 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "A thar chauh ni lo, tihdanglamna zawng zawng tilang tùrin ralvèn kapparh rawh",
        "tog-usenewrc": "Tihdanglam tharte leh ralvente a phêk azir zëlin tlar rawh (JavaScript a ngai)",
        "tog-numberheadings": "A thupuite amahin nambar inpêktir rawh",
-       "tog-showtoolbar": "Siamṭhatna hmanraw-liang tilang rawh (JavaScript a ngai)",
        "tog-editondblclick": "Hmehphìrin phêk siamṭha rawh (JavaScript a ngai)",
        "tog-editsectiononrightclick": "Hlawm thupui ding-hmeh hmangin hlawm siamţhat theihna awmtir rawh (JavaScript a ngai)",
        "tog-watchcreations": "Ka phêk siamte leh ka taksa hlankaite ka ralvèn zing-ah telh rawh",
index d55e07a..4acf87d 100644 (file)
@@ -15,7 +15,6 @@
        "tog-extendwatchlist": "گپ کردن بلگه یل  پیگیری یل سی نشو دائن تموم تغییره یل ، نه فقط هونو که جدید وابون",
        "tog-usenewrc": "تغییره یل جمی توسط بلگه مئنه تغییره یل نو و نوم بلگه پیگیری",
        "tog-numberheadings": "شماره وندن خودکار سی سرخط یل",
-       "tog-showtoolbar": "نشو دائن تولبار ویرایش",
        "tog-editondblclick": "ویرایس بلگه یل با دو کلیژ",
        "tog-editsectiononrightclick": "فعال کردن ویرایس قسمتل با یه کلیژ ری نوم او قسمت",
        "tog-watchcreations": "وندن بلگه یلی ک مو ساختمه و فایلل ک مو بار کردمه مئنه نوم بلگه پیگیری",
index 670d9c1..95a22b3 100644 (file)
@@ -39,7 +39,6 @@
        "tog-extendwatchlist": "Izvērst uzraugāmo lapu sarakstu, lai parādītu visas veiktās izmaiņas (ne tikai pašas svaigākās)",
        "tog-usenewrc": "Grupēt izmaiņas pēc lapas pēdējās izmaiņās un uzraugāmo lapu sarakstā",
        "tog-numberheadings": "Automātiski numurēt virsrakstus",
-       "tog-showtoolbar": "Rādīt labošanas rīkjoslu",
        "tog-editondblclick": "Atvērt lapu labošanai ar dubultklikšķi",
        "tog-editsectiononrightclick": "Atvērt sadaļas labošanas lapu, uzklikšķinot ar labo peles pogu uz sadaļas virsraksta (izmanto ''JavaScript'')",
        "tog-watchcreations": "Pievienot manis radītās lapas un manis augšuplādētos failus uzraugāmo lapu sarakstam",
        "rcfilters-filter-humans-label": "Cilvēki (ne boti)",
        "rcfilters-filter-humans-description": "Cilvēku veikti labojumi.",
        "rcfilters-filtergroup-reviewstatus": "Pārskatīšanas statuss",
-       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nepatrulēti",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nepārbaudīti",
+       "rcfilters-filter-reviewstatus-manual-label": "Manuāli pārbaudīti",
+       "rcfilters-filter-reviewstatus-auto-label": "Automātiski pārbaudīti",
        "rcfilters-filtergroup-significance": "Nozīmīgums",
        "rcfilters-filter-minor-label": "Maznozīmīgi labojumi",
        "rcfilters-filter-minor-description": "Labojumi, kas atzīmēti kā maznozīmīgi.",
        "ipbwatchuser": "Uzraudzīt šī lietotāja lapu un lietotāja diskusijas lapu",
        "ipb-change-block": "Pārbloķēt ar šiem uzstādījumiem",
        "ipb-confirm": "Apstiprināt bloķēšanu",
+       "ipb-pages-label": "Lapas",
        "badipaddress": "Nederīga IP adrese",
        "blockipsuccesssub": "Nobloķēts veiksmīgi",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] tika nobloķēts.<br />\nVisus blokus var apskatīties [[Special:BlockList|IP bloku sarakstā]].",
        "mw-widgets-titleinput-description-new-page": "lapa vēl nepastāv",
        "mw-widgets-categoryselector-add-category-placeholder": "Pievienot kategoriju...",
        "mw-widgets-usersmultiselect-placeholder": "Pievienot vēl...",
+       "mw-widgets-titlesmultiselect-placeholder": "Pievienot vēl...",
        "date-range-from": "No datuma:",
        "date-range-to": "Līdz datumam:",
        "sessionprovider-generic": "$1 sesijas",
index 43496d7..f27c5de 100644 (file)
@@ -35,7 +35,6 @@
        "tog-extendwatchlist": "展列見變",
        "tog-usenewrc": "監修以類",
        "tog-numberheadings": "生章數",
-       "tog-showtoolbar": "多寶列見",
        "tog-editondblclick": "雙擊以纂",
        "tog-editsectiononrightclick": "右擊標以纂段",
        "tog-watchcreations": "哨己撰",
index a693c65..96883a5 100644 (file)
@@ -35,7 +35,6 @@
        "tog-extendwatchlist": "सन्निकट परिवर्तन नै,अखन ध्यानसूचीमे रहल सभ परिवर्तन देखाबी",
        "tog-usenewrc": "नीक सन्निकट परिवर्तन प्रयोग करी (जावास्क्रिप्ट चाही)",
        "tog-numberheadings": "शीर्षक स्वयं-क्रमाङ्कित करी",
-       "tog-showtoolbar": "सम्पादन ओजारपेटी देखाबी",
        "tog-editondblclick": "दू बेर क्लीक कए पन्ना सम्पादित करी",
        "tog-editsectiononrightclick": "अनुभाग शीर्षक पर दाहिन क्लिक करै पर अनुभाग सम्पादित करी",
        "tog-watchcreations": "हमर बनाओल पृष्ठ हमर साकांक्ष सूचीमे राखी",
@@ -53,7 +52,7 @@
        "tog-shownumberswatching": "ध्यान राखैबला प्रयोगकर्ताक सङ्ख्या",
        "tog-oldsig": "अखुनका दस्खत:",
        "tog-fancysig": "दस्खतक विकिटेक्सटक समान मानी (स्वचालित श्रृङ्खला हीन)",
-       "tog-uselivepreview": "पूर्वावलोकनक उपयोग करी",
+       "tog-uselivepreview": "पूर्वावलोकनक उपयोग करी",
        "tog-forceeditsummary": "यदि सम्पादन सारांश नै देल गेल होए तहन हमरा सूचित करी",
        "tog-watchlisthideown": "हमर साकांक्ष सूचीसँ हमर सम्पादन नुकाबी",
        "tog-watchlisthidebots": "हमर साकांक्ष सूचीसँ स्वचालित सम्पादन हटाबी",
        "july-gen": "जुलाई",
        "august-gen": "अगस्त",
        "september-gen": "सितम्बर",
-       "october-gen": "अकटुबर",
+       "october-gen": "à¤\85à¤\95à¥\8dà¤\9fà¥\81बर",
        "november-gen": "नवम्बर",
        "december-gen": "दिसम्बर",
        "jan": "जन.",
        "category-file-count-limited": "ई श्रेणीमे निम्नलिखित {{PLURAL:$1|फाइल अछि।|फाइलसभ अछि।}}",
        "listingcontinuesabbrev": "शेष आगाँ।",
        "index-category": "सूचीबद्ध पृष्ठ",
-       "noindex-category": "à¤\95à¥\8dरम à¤¨à¥\88 à¤\95à¥\87ल पृष्ठ",
+       "noindex-category": "à¤\85सà¥\82à¤\9aà¥\80बदà¥\8dध पृष्ठ",
        "broken-file-category": "पन्नासभ जाहिमे फाइल लिङ्कसभ टूटल हुअए",
        "about": "क विषयमे",
        "article": "सामग्री लेख",
        "searcharticle": "जाए",
        "history": "पृष्ठ इतिहास",
        "history_short": "इतिहास",
+       "history_small": "इतिहास",
        "updatedmarker": "हमर अन्तिम आगमनसँ पहिने अद्यतन केल",
        "printableversion": "प्रिन्ट करबा योग्य",
        "permalink": "स्थायी लिङ्क",
        "views": "दर्शाव",
        "toolbox": "उपकरण",
        "tool-link-userrights": "{{GENDER:$1|सदस्य}} समूह परिवर्तन करी",
+       "tool-link-userrights-readonly": "{{GENDER:$1|प्रयोक्ता}} समूह देखी",
        "tool-link-emailuser": "ई {{GENDER:$1|प्रयोक्ता}}के इमेल भेजी",
        "imagepage": "फाइल पृष्ठ देखी",
        "mediawikipage": "सन्देश पन्ना देखी",
        "redirectedfrom": "($1सँ पुनर्निर्देशित)",
        "redirectpagesub": "पृष्ठ पुनर्निर्देशित करी",
        "redirectto": "कऽ अनुप्रेषित:",
-       "lastmodifiedat": "ई पृष्ठक नवीनतम परिवर्तन $1 के $2 बजे भेल छल।",
+       "lastmodifiedat": "ई पृष्ठक नवीनतम परिवर्तन $1 के $2 बजे भेल छल।",
        "viewcount": "ई पृष्ठ {{PLURAL:$1|एक|$1}} बेर देखल गेल छल।",
        "protectedpage": "सुरक्षित पृष्ठ",
        "jumpto": "एतय जाए:",
        "versionrequired": "मिडियाविकिक संस्करण $1 चाही",
        "versionrequiredtext": "ई पृष्ठ प्रयोग करैक लेल मिडियाविकिक $1 अवतरण जरुरी अछि।\nदेखी [[Special:Version|अवतरण पृष्ठ]]।",
        "ok": "ठीक अछि",
+       "pagetitle": "$1 - {{SITENAME}}",
        "pagetitle-view-mainpage": "{{अन्तर्जाल}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "प्राप्ति स्थल \"$1\"",
        "ns-specialprotected": "विशेष पन्ना सभक सम्पादित नै कएल जा सकैए।",
        "titleprotected": "ई शीर्षकक निर्माण प्रतिबन्धित अछि [[User:$1|$1]] द्वारा।\nएकर लेल निम्न कारण देल गएल अछि <em>$2</em>।",
        "filereadonlyerror": "\"$1\" फाइलके बदलैलेल अक्षम कियाक भण्डार \"$2\" ई समय 'मात्र पाठनक लेल' अछि।\n\nजे प्रबन्धक ई प्रबन्ध लगोनै अछि ओ निम्न विवरण प्रदान कएने अछि: \"$3\"।",
+       "invalidtitle": "अवैध शीर्षक",
        "invalidtitle-knownnamespace": "\"$2\" नामस्थान आर \"$3\" नाम बला गलत शीर्षक",
        "invalidtitle-unknownnamespace": "अज्ञात नामस्थान संख्या $1 आर नाम \"$2\" वाला गलत शीर्षक",
        "exception-nologin": "सम्प्रवेशित नै",
        "nosuchusershort": "\"$1\" नामक कोनो प्रयोक्ता नै अछि।\nअपन हिजए सुधारी।",
        "nouserspecified": "अहाँक एकटा प्रयोक्तानाम देबऽ पडत।",
        "login-userblocked": "ई प्रयोक्ता प्रतिबन्धित अछि। सम्प्रवेशक अधिकार नै अछि।",
-       "wrongpassword": "à¤\97लत à¤\95à¥\82à¤\9fशबà¥\8dद à¤¦à¥\87ल à¤\97à¥\87ल।\nफà¥\87रसà¤\81 प्रयास करी।",
+       "wrongpassword": "à¤\85हाà¤\81 à¤\9cà¥\87 à¤\95à¥\82à¤\9fशबà¥\8dद à¤¦à¥\87लà¥\8cà¤\82 à¤\93 à¤\97लत à¤\85à¤\9bि à¥¤\nà¤\95à¥\83पया à¤ªà¥\81न: प्रयास करी।",
        "wrongpasswordempty": "रिक्त कूटशब्द देल गेल।\nफेरसँ प्रयास करी।",
        "passwordtooshort": "कूटशब्द कमसँ कम {{PLURAL:$1|1 वर्ण|$1 वर्णक}} हुअए।",
        "passwordtoolong": "कुटशब्द {{PLURAL:$1|1 वर्ण|$1 वर्णसभ}}सँ बेसी नम्हर नै भ सकएत अछि।",
-       "passwordtoopopular": "à¤\86म à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤\85हाà¤\81 à¤¨à¥\88 à¤\9aà¥\81नि à¤¸à¤\95à¤\8fत à¤\85à¤\9bि। à¤\95à¥\83पया à¤\85नà¥\8bà¤\96ा à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड चुनी।",
+       "passwordtoopopular": "à¤\85हाà¤\81 à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤\95à¥\82à¤\9fशबà¥\8dदड à¤¨à¥\88 à¤\9aà¥\81नि à¤¸à¤\95à¥\88त à¤\9bà¥\80 à¥¤ à¤\95à¥\83पया à¤\95ठिन à¤\95à¥\82à¤\9fशबà¥\8dद चुनी।",
        "password-name-match": "अहाँक कूटशब्द अहाँक प्रयोक्तानामसँ भिन्न हेबाक चाही।",
        "password-login-forbidden": "ऐ प्रयोक्तानाम आ कूटशब्दक प्रयोग प्रतिबन्धित अछि।",
        "mailmypassword": "नूतन कूटशब्द ई-पत्रसँ पठाबी",
        "passwordremindertitle": "{{SITENAME}}क लेल नव अस्थायी कूटशब्द",
-       "passwordremindertext": "कियो (सम्भवतः अहाँ, अनिकेत $1 सँ) एकटा नव कूटशब्दक आग्रह {{SITENAME}} ($4) केनए अछि। एकटा अस्थायी कूटशब्द प्रयोक्ता \"$2\" लेल बनाओल गेल अछि आ \"$3\" रूपमे स्थापित कएल गेल अछि। जँ ई अहाँक इच्छा अछि तँ अहाँक सम्प्रवेश करए पडत आ एकटा नव कूटशब्दक चुनाव करए पडत। \nअहाँक अस्थायी कूटशब्द खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 दिन}} मे।",
+       "passwordremindertext": "कियो ($1 आइपी ठेगान सँ) {{SITENAME}} ($4) पर प्रयोगक लेल नव कूटशब्द आग्रह केनए अछि। प्रयोक्ता \"$2\" कऽ लेल एक अस्थायी कूटशब्द बनाए देल गेल अछि, आ ओ अखन \"$3\" छी । यदि ई अहाँक इच्छा छल, तँ आब अहाँक सम्प्रवेश करवाक लेल एक नव कूटशब्द चुनऽ पड़त ।\nअहाँक अस्थायी कूटशब्दक अवधि {{PLURAL:$5|एक दिन|$5 दिन}}मे समाप्त भऽ जाएत।\n\nयदि ई अनुरोध कियो आओर केनए छल, या अहाँक अपन पुरान कूटशब्द आब नै परिवर्तन करै लेल चाहैत छी कियाकी अहाँक अपन पुरान कूटशब्द मोन आबि गेल अछि, तँ अहाँ ई सन्देश अनदेखा करि सकैत छी, आ अपन पुरान कूटशब्दकें पहिने जका प्रयोग करि सकैत छी।",
        "noemail": "प्रयोक्ता \"$1\" लेल कोनो ई-पत्र सङ्केत दर्ज नै अछि।",
        "noemailcreate": "अहाँक एकटा मान्य ई-पत्र सङ्केत देबऽ पडत।",
        "passwordsent": "एकटा नव कूटशब्द \"$1\" लेल पञ्जजीकृत ई-पत्र सङ्केतपर पठाएल गेल अछि।\nजखन अहाँक ई भेटैए तँ फेरसँ सम्प्रवेश करी।",
        "botpasswords-existing": "वर्तमान बोट पासवर्ड",
        "botpasswords-createnew": "बोटक लेल नव पासवर्ड बनाबी",
        "botpasswords-editexisting": "बोटक वर्तमान पासवर्डके बदली",
+       "botpasswords-label-needsreset": "(कूटशब्द नवीकरण करवाक आवश्यकता अछि)",
        "botpasswords-label-appid": "बोट नाम:",
        "botpasswords-label-create": "बनाबी",
        "botpasswords-label-update": "अद्यतन",
        "search-interwiki-caption": "अन्य प्रकल्प",
        "search-interwiki-default": "$1 सँ परिणाम:",
        "search-interwiki-more": "(आर)",
+       "search-interwiki-more-results": "अधिक परिणाम",
        "search-relatedarticle": "सम्बन्धी",
        "searchrelated": "सम्बन्धी",
        "searchall": "सभटा",
        "search-external": "बाह्य खोज",
        "searchdisabled": "{{SITENAME}} खोज बन्द अछि।\nता अहाँ गूगलक माध्यमसँ ताकि सकै छी।\nमोन राखी जे तकर विवरणी {{SITENAME}} समिग्री समयातीत भऽ सकैए।",
        "search-error": "खोजवाके समय निम्न त्रुटि उत्पन्न भेल: $1",
+       "search-warning": "खोजवाक समय निम्न त्रुटि उत्पन्न भेल: $1",
        "preferences": "विकल्प",
        "mypreferences": "खासमखास",
        "prefs-edits": "सम्पादनक सङ्ख्या:",
        "prefs-editwatchlist-clear": "अपन साकांक्षसूची खालि करी",
        "prefs-watchlist-days": "साकांक्ष-सूचीमे एतेक दिन देखाएल:",
        "prefs-watchlist-days-max": "बेसीसँ बेसी $1 {{PLURAL:$1|दिन|दिन}}",
-       "prefs-watchlist-edits": "बढाà¤\8fल à¤¸à¤¾à¤\95ाà¤\82à¤\95à¥\8dष à¤¸à¥\82à¤\9aà¥\80मà¥\87 à¤\85धिà¤\95तम à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96ाà¤\8fब:",
+       "prefs-watchlist-edits": "साà¤\95ाà¤\82à¤\95à¥\8dष à¤¸à¥\82à¤\9aà¥\80मà¥\87 à¤¦à¥\87à¤\96बà¥\88à¤\95 à¤²à¥\87ल à¤\85धिà¤\95तम à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन:",
        "prefs-watchlist-edits-max": "बेसीसँ बेसी:१०००",
        "prefs-watchlist-token": "साकांक्ष-सूची खेप:",
+       "prefs-watchlist-managetokens": "टोकन प्रबन्धित करी",
        "prefs-misc": "आर",
        "prefs-resetpass": "कूटशब्द बदली",
        "prefs-changeemail": "इमेल पता परिवर्तित करी",
        "prefs-help-recentchangescount": "एहिमे सम्मिलित अछि आइ-काल्हिक परिवर्तन, पन्नाक इतिहास आ वृत्तलेख",
        "prefs-help-watchlist-token2": "इ अहाँके कंक्षाकसूचीके वेब फिडके गोपनीय चाभी छी ।\nइ जे कोइ लंग अछि उ अपन कंक्षाकसूची पैढ सकैत अछि, ऐ लेल इ क्यों गोटा स नै बाटब ।\n[[Special:ResetTokens|एकरा रीसेट करवाक लेल यै ठाम क्लिक करु]]।",
        "savedprefs": "अहाँक पसिन्न सुरक्षित कएल गेल",
-       "savedrights": "पà¥\8dरयà¥\8bà¤\95à¥\8dता {{GENDER:$1|$1}}à¤\95 à¤¸à¤¦à¤¸à¥\8dय अधिकार सङ्ग्रह कएल गेल।",
+       "savedrights": "पà¥\8dरयà¥\8bà¤\95à¥\8dता {{GENDER:$1|$1}}à¤\95 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता अधिकार सङ्ग्रह कएल गेल।",
        "timezonelegend": "समय क्षेत्र",
        "localtime": "स्थानीय समए:",
        "timezoneuseserverdefault": "पूर्वनिर्धारित वितरक प्रयुक्त करी ($1)",
        "timezoneregion-europe": "यूरोप",
        "timezoneregion-indian": "हिन्द महासागर",
        "timezoneregion-pacific": "प्रशान्त महासागर",
-       "allowemail": "आन प्रयोक्ताक ई-पत्र समर्थ करी",
+       "allowemail": "अन्य प्रयोक्ता सँ ई-पत्र सक्षम करी",
+       "email-allow-new-users-label": "एकदम नव उपयोगकर्तासभकें ई-पत्रक अनुमति दी",
        "prefs-searchoptions": "ताकी",
        "prefs-namespaces": "नामस्थानसभ",
        "default": "पूर्वनिर्धारित",
        "right-patrol": "अन्य सदस्यसभक सम्पादन परीक्षित चिन्हित करी",
        "right-autopatrol": "अपन सम्पादन स्वचालित रूपसँ परीक्षित चिन्हित करी",
        "right-patrolmarks": "हालक परिवर्तनमे संचालन चेन्ह देखू",
-       "right-unwatchedpages": "à¤\8fहन à¤ªà¥\83षà¥\8dठसभà¤\95 à¤¸à¥\82à¤\9aà¥\80 à¤¦à¥\87à¤\96à¥\80 à¤\9cà¥\87 à¤\95à¥\87à¤\95रà¥\8b à¤§à¥\8dयानसà¥\82à¤\9aà¥\80मà¥\87 à¤¨à¥\88 à¤\85à¤\9bि",
+       "right-unwatchedpages": "एहन पृष्ठसभक सूची देखी जे ककरो ध्यानसूचीमे नै अछि",
        "right-mergehistory": "पन्नाक इतिहास एकत्रित करी",
        "right-userrights": "सभटा प्रयोक्ता अधिकारकेँ सम्पादित करू",
        "right-userrights-interwiki": "दोसर विकीपर प्रयोक्ताक प्रयोक्ता अधिकारक सम्पादन करी",
        "recentchanges-legend-heading": "<strong>कुञ्जी:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नव पन्नसभक सूची]] सेहो देखी)",
        "recentchanges-submit": "देखाबी",
+       "rcfilters-legend-heading": "<strong>सङ्केतक सूची:</strong>",
        "rcnotefrom": "नीचाँमे '''$2''' सँ भेल परिवर्तन अछि ('''$1''' धरि देखाएल)।",
        "rclistfrom": "$3 $2 सँ शुरू भेल नव परिवर्तन देखी",
        "rcshowhideminor": "$1 अल्प सम्पादन",
        "listfiles_search_for": "ऐ दृश्य-श्रव्य नामले ताकू:",
        "listfiles-userdoesnotexist": "प्रयोक्ता खाता \"$1\" पंजीकृत नै अछि।",
        "imgfile": "सञ्चिका",
-       "listfiles": "सà¤\82चिका सूची",
+       "listfiles": "सà¤\9eà¥\8dचिका सूची",
        "listfiles_thumb": "लघुचित्र",
        "listfiles_date": "तिथि",
        "listfiles_name": "नाम",
        "download": "अवारोपन",
        "unwatchedpages": "बिन ध्यान देल पन्ना",
        "listredirects": "पुनर्निर्देशनसभक सूची",
-       "listduplicatedfiles": "डà¥\81पà¥\8dलिà¤\95à¥\87à¤\9f à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤«à¤¾à¤\87लसभ à¤\95à¥\87 सूची।",
+       "listduplicatedfiles": "नà¤\95à¥\8dà¤\95लà¤\95 à¤¸à¤\99à¥\8dà¤\97 à¤«à¤¾à¤\87लसभà¤\95 सूची।",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] राखैत अछि  [[$3|{{PLURAL:$2|एक प्रतिलिपि|$2 duplicates}}]] ।",
        "unusedtemplates": "बिना प्रयोगक नमूना सभ",
        "unusedtemplatestext": "ई पन्ना {{ns:template}} नामस्थानमे सभ पन्नाकेँ सूची बनबैए, जे दोसर पन्नापर शामिल नै अछि।\nमेटेबासँ पहिने दोसर नमूनाक लागिकेँ जाँचब मोन राखू।",
        "mostrevisions": "सभसँ बेसी संशोधनबला पन्ना",
        "prefixindex": "उपसर्गक संग सभटा पृष्ठ",
        "prefixindex-namespace": "उपसर्ग भएल सभ पृष्ठ ($1 नामस्थान)",
-       "prefixindex-strip": "सà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\89पसरà¥\8dà¤\97 à¤¨à¥\81à¤\95ाà¤\89",
+       "prefixindex-strip": "नतिà¤\9cामà¥\87 à¤\89पसरà¥\8dà¤\97 à¤¨à¥\81à¤\95ाबà¥\80",
        "shortpages": "छोट पृष्ठसभ",
        "longpages": "नमगर पन्ना सभ",
        "deadendpages": "एकदमसँ अन्त भऽ जाएबला पन्ना सभ",
        "logentry-contentmodel-change-revertlink": "पूर्ववत करी",
        "logentry-contentmodel-change-revert": "पूर्ववत करी",
        "protectlogpage": "सुरक्षा लौग",
-       "protectlogtext": "नीचाँ किछु पन्ना सुरक्षा परिवर्तनक सूची अछि।\nदेखू [[Special:ProtectedPages|protected pages list]] लगक कार्यरत पन्ना सुरक्षाकऽ सूची लेल।",
+       "protectlogtext": "नीचाँ किछ पन्ना सुरक्षा परिवर्तनक सूची अछि।\nवर्तमान सुरक्षित पृष्ठसभक सूचीक लेल [[Special:ProtectedPages|सुरक्षित पृष्ठसभक सूची]] देखी।",
        "protectedarticle": "रक्षित \"[[$1]]\" कएल गेल",
        "modifiedarticleprotection": "\"[[$1]]\" लेल बदलैत रक्षा स्तर",
        "unprotectedarticle": "अरक्षित केलौं \"[[$1]]\"",
        "blocklist": "प्रतिबन्धित प्रयोक्ता सभ",
        "ipblocklist": "प्रतिबन्धित प्रयोक्ता सभ",
        "ipblocklist-legend": "प्रतिबन्धित प्रयोक्ताकेँ ताकू",
-       "blocklist-userblocks": "खाता प्रतिबन्ध-सूची नुकाउ",
-       "blocklist-tempblocks": "अस्थायी प्रतिबन्ध-सूची नुकाउ",
+       "blocklist-userblocks": "खाता प्रतिबन्ध सूची नुकाबी",
+       "blocklist-tempblocks": "अस्थायी प्रतिबन्ध नुकाबी",
        "blocklist-addressblocks": "एकल अनिकेत प्रतिबन्ध नुकाउ",
        "blocklist-rangeblocks": "क्षेत्र प्रतिबन्ध नुकाउ",
        "blocklist-timestamp": "समएकाल",
        "exportall": "पन्ना सभकेँ निर्यात करू",
        "exportcuronly": "अखुनका संशोधन मात्र लिअ, पूरा इतिहास नै।",
        "exportnohistory": "----\n'''सूचना:''' परिणाम कुशलताकेँ देखैत पन्नाक सम्पूर्ण इतिहासक निर्यात अशक्त कएल गेल अछि।",
-       "exportlistauthors": "सभ à¤ªà¤¨à¥\8dनाà¤\95 à¤¸à¤®à¥\8dपà¥\82रà¥\8dण à¤¯à¥\8bà¤\97दानà¤\95रà¥\8dताà¤\95 à¤¸à¥\82à¤\9aà¥\80 à¤\9cà¥\8bड़à¥\82",
+       "exportlistauthors": "पà¥\8dरतà¥\8dयà¥\87à¤\95 à¤ªà¥\83षà¥\8dठà¤\95 à¤²à¥\87ल à¤¯à¥\8bà¤\97दानà¤\95रà¥\8dतासभà¤\95 à¤\8fà¤\95 à¤ªà¥\82रà¥\8dण à¤¸à¥\82à¤\9aà¥\80 à¤¶à¤¾à¤®à¤¿à¤² à¤\95रà¥\80",
        "export-submit": "निर्यात",
        "export-addcattext": "अहि श्रेणी केर पन्ना जोडू",
        "export-addcat": "जोडू",
        "watchlistedit-clear-legend": "साकांक्ष-सूची मेटाबी",
        "watchlistedit-clear-explain": "एही ठाम रहल सभ शिर्षक अहाँक साकांक्ष-सूची से मेटा जाएत",
        "watchlistedit-clear-titles": "शीर्षक",
-       "watchlistedit-clear-submit": "साà¤\95ाà¤\82à¤\95à¥\8dष-सà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\9fाà¤\89 (à¤\88 à¤¸à¥\8dथायà¥\80 à¤\9bि!)",
+       "watchlistedit-clear-submit": "साà¤\95ाà¤\82à¤\95à¥\8dष-सà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\9fाबà¥\80 (à¤\88 à¤¸à¥\8dथायà¥\80 à¤\9bà¥\80!)",
        "watchlistedit-clear-done": "अहाँक साकांक्ष-सूची मेटाओल गेल।",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 शीर्षक छल|$1शीर्षक सभ रहए}} हटाएल गेल:",
        "watchlistedit-too-many": "एतय दर्शावैक लेल अत्यधिक पृष्ठ अछि।",
        "tags-create-invalid-title-chars": "टैग नाम में एहन कैरेक्टर नै होना चाही जे पन्ना के शीर्षक में नै प्रयोग भऽ सकेत अछि।",
        "tags-create-already-exists": "फाइल $1 पहिने स अछि।",
        "tags-create-warnings-above": "निम्न लिखित {{PLURAL:$2|चेतना देखी गेल अछि}}  जखन टैग \"$1\" बनाबे प्रयास गेल छेल:",
-       "tags-create-warnings-below": "à¤\95à¥\80 à¤\86हाà¤\81 à¤\88 à¤\9fà¥\88à¤\97 à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤\9cारà¥\80 à¤°à¤¾à¤\96à¥\87ला à¤\9aाहà¥\88 à¤\9aिà¤\8f?",
+       "tags-create-warnings-below": "à¤\95ि à¤\85हाà¤\81 à¤\88 à¤\9fà¥\8dयाà¤\97à¤\95à¥\87à¤\82 à¤¸à¤®à¥\8dपादन à¤\9cारà¥\80 à¤°à¤\96à¥\88लà¥\87ल à¤\9aाहà¥\88त à¤\9bà¥\80?",
        "tags-delete-title": "ट्याग मेटाउ",
        "tags-delete-explanation-initial": "आहाँ टैग \"$1\" के डाटाबेस से हटाबै जा रहल चिए।",
        "tags-delete-reason": "कारण:",
index 2bb8ea7..ec27ef9 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Kembangna daftar pengawasan kanggo nidokna kabeh pangowahan, ora mung sing paling anyar thok",
        "tog-usenewrc": "Klompok owahan miturut kaca nang owahan anyar lan daptar pangawasan (mbutuhna JavaScript)",
        "tog-numberheadings": "Aweh nomer judul secara otomatis",
-       "tog-showtoolbar": "Tidhokna bilah alat penyuntingan",
        "tog-editondblclick": "Nyunting kaca nganggo klik ping loro",
        "tog-editsectiononrightclick": "Aktifna panyuntingan subbagian nganggo klik-tengen nang judul bagian",
        "tog-watchcreations": "Tambahna kaca gaweanne inyong lan berkas sing tek unggah nang daptar pangawasanne inyong",
index 8f4fd3c..a23b4a4 100644 (file)
@@ -18,7 +18,6 @@
        "tog-extendwatchlist": "Келептемс мельгеваномать сембе полафтоматнень няфтемга, аф аньцек мекольценнет",
        "tog-usenewrc": "Полгаяфтомс илякстоптоматнень лопань коряс мекольце полафнематнень эса ди мельгеваномаса (веши JavaScript)",
        "tog-numberheadings": "Сёрмадома коняксс лувомтяшксне эслек путовихть",
-       "tog-showtoolbar": "Кядьёнкс седяфксть няфтемс сёрмадомбачк (JavaScript)",
        "tog-editondblclick": "Кафксть люпштазь сувамс сёрматфть петнема (JavaScript)",
        "tog-editsectiononrightclick": "Петнемс пялькстне: люпштамс сёрмадомбяльксть лемонц лангс видешире пуняса (JavaScript)",
        "tog-watchcreations": "Сувафтомс лопатнень, конатнень тиине ди файлат, конатнень тонгине мельгеваномазон",
index 8d0cf62..f42a099 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "Hanitatra ny lisitra fanaraham-pejy mba haneho ny fanovana rehetra fa tsy ny vaovao indrindra fotsiny",
        "tog-usenewrc": "Hampivondrona ny fiovana araky ny pejy ao amin'ny fiovana farany ary ao amin'ny lisitry ny pejy arahana",
        "tog-numberheadings": "Asio laharany ny lohateny",
-       "tog-showtoolbar": "Haneho ny toolbar fanovana",
        "tog-editondblclick": "Hanova pejy amin'ny alalan'ny tsindrim-boalavo roa misesy",
        "tog-editsectiononrightclick": "Hampiasa ny fanovana fizarana amin'ny tsindry havanana eo amin'ny lohatenim-pizarana.",
        "tog-watchcreations": "Hanaraka ny pejy foronoko ary ny rakitra ampidiriko",
index 89b4dfd..5ae6f09 100644 (file)
@@ -23,7 +23,6 @@
        "tog-extendwatchlist": "Чыла вашталтышым, а пытартыш гына огылым ончыкташлан эскерыме лӱмерым кугемдаш",
        "tog-usenewrc": "У тӧрлатымаш саемдыме лӱмерым кучылташ (JavaScript кӱлеш)",
        "tog-numberheadings": "Вуймутым автоматик йӧн дене радамлаш",
-       "tog-showtoolbar": "Тӧрлатымаш ӱзгараҥам ончыкташ",
        "tog-watchcreations": "Мыйын ыштыме лаштык-влакым эскерыме лӱмерыш ешараш",
        "tog-watchdefault": "Мыйын тӧрлатыме лаштык-влакым эскерыме лӱмерыш ешараш",
        "tog-watchmoves": "Мыйын лӱмым вашталтыме лаштык-влакым эскерыме лӱмерыш ешараш",
index 642e01e..604e05a 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Kambangan daftar pantau untuak mancaliak kasado parubahan, indak nan baru se",
        "tog-usenewrc": "Gunoan tampilan parubahan tingkek lanjuik (paralu JavaScript)",
        "tog-numberheadings": "Agiah nomor judul sacaro otomatis",
-       "tog-showtoolbar": "Tunjuakan bilah panyuntiangan (paralu JavaScript)",
        "tog-editondblclick": "Suntiang laman jo klik duo kali (paralu JavaScript)",
        "tog-editsectiononrightclick": "Aktipan bagian panyuntiangan jo mangklik kanan pado judul bagian (paralu JavaScript)",
        "tog-watchcreations": "Tambahan laman nan den buek jo gambar nan den unggah ka daftar pantau",
index 1676128..549ae72 100644 (file)
@@ -34,7 +34,6 @@
        "tog-extendwatchlist": "Прошири го список на набљудувања за приказ на сите промени, не само скорешните",
        "tog-usenewrc": "Промени во групи по страници во списокот на скорешни промени",
        "tog-numberheadings": "Наброј ги заглавијата",
-       "tog-showtoolbar": "Прикажи алатник за уредување",
        "tog-editondblclick": "Уредување на страници при двоен стисок",
        "tog-editsectiononrightclick": "Уредување на заглавија со десно копче од глушецот на нивниот наслов",
        "tog-watchcreations": "Додавај ги страниците што ги создавам и податотеките што ги подигам во набљудуваните",
        "subject-preview": "Преглед на насловот:",
        "previewerrortext": "Се појави грешка при обидот да се прегледаат промените.",
        "blockedtitle": "Корисникот е блокиран",
+       "blocked-email-user": "<strong><strong>На вашето корисничко име му е забрането да праќа е-пошта. Можете сепак да уредувате други страници на ова вики.</strong> Сите поединости за забраната ќе ги најдете во [[Special:MyContributions|придонесите на сметката]].\n\nЗабраната ја дал $1.\n\nНаведената причина гласи <em>$2</em>.\n\n* Почеток на забраната: $8\n* Истек на забраната: $6\n* Предвиден забраненик: $7\n* Назнака на забраната #$5",
+       "blockedtext-partial": "<strong>На вашето корисничко или IP-адреса му е забрането да прави измени на страницава. Можете сепак да уредувате други страници на ова вики.</strong> Сите поединости за забраната ќе ги најдете во [[Special:MyContributions|придонесите на сметката]].\n\nЗабраната ја дал $1.\n\nНаведената причина гласи <em>$2</em>.\n\n* Почеток на забраната: $8\n* Истек на забраната: $6\n* Предвиден забраненик: $7\n* Назнака на забраната #$5",
        "blockedtext": "<strong>Вашето корисничко име или IP-адреса е блокирано.</strong>\n\nБлокирањето е направено од страна на $1.\nДаденото образложение е ''$2''.\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Корисникот што требало да биде блокиран: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со блокирањето.\nМожете да ја искористите можноста „{{int:emailuser}}“ ако е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и не ви е забрането да ја користите.\nВашата сегашна IP-адреса е $3, а назнака на блокирањето гласи #$5.\nВе молиме наведете ги сите подробности прикажани погоре, во вашата евентуална реакција.",
        "autoblockedtext": "Вашата IP-адреса е автоматски блокирана бидејќи била користена од страна на друг корисник, кој бил блокиран од $1.\nДаденото образложение е следново:\n\n:<em>$2</em>\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Со намера да се блокира: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со ова блокирање.\n\nИмајте предвид дека можеби нема да можете да ја искористите можноста „{{int:emailuser}}“ доколку не е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и ви е забрането користитење на истата.\n\nВашата IP-адреса е $3, a ID на блокирањеto е $5.\nВе молиме наведете ги овие подробности доколку реагирате на блокирањето.",
        "systemblockedtext": "Вашето корисничко име или IP-адреса е автоматски блокирано од МедијаВики.\nПонудена причина:\n\n:<em>$2</em>\n\n* Почеток на блокот: $8\n* Истек на блокот: $6\n* Блокот е наменет за: $7\n\nВашата тековна IP-адреса гласи $3.\nПрепишете ги сите горенаведени поединости доколку сакате да се распрашате кај надлежните во врска со блокот.",
        "ipb-disableusertalk": "Спречи го корисников да ја уредува неговата разговорна страница додека е блокиран",
        "ipb-change-block": "Преблокирај го корисникот со овие нагодувања",
        "ipb-confirm": "Потврди блок",
+       "ipb-sitewide": "Насекаде",
+       "ipb-partial": "Делумно",
+       "ipb-type-label": "Вид",
+       "ipb-pages-label": "Страници",
        "badipaddress": "Неважечка IP-адреса",
        "blockipsuccesssub": "Успешно блокирање",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] е блокирана.<br />\nБлоковите можете да ги прегледате на [[Special:BlockList|списокот на блокови]].",
        "createaccountblock": "создавањето на кориснички сметки е блокирано",
        "emailblock": "блокирана е-пошта",
        "blocklist-nousertalk": "без можност за уредување на својата разговорна страница",
+       "blocklist-editing": "уредување",
+       "blocklist-editing-sitewide": "уредување (на цело вики)",
        "ipblocklist-empty": "Списокот на блокирања е празен.",
        "ipblocklist-no-results": "Бараната IP-адреса или корисничка сметка не е блокирана.",
        "blocklink": "блокирај",
        "logentry-block-block": "$1 {{GENDER:$2|го блокираше}} корисникот {{GENDER:$4|$3}} со истек $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|го блокираше}} корисникот {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|го измени}} блокот на {{GENDER:$4|$3}} со истек $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|го блокираше}} {{GENDER:$4|$3}} од уредување на {{PLURAL:$8||страниците}} $7 со истек од $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|ги измени}} блоковските поставки за {{GENDER:$4|$3}} спречувајќи го уредувањето на {{PLURAL:$8||страниците}} $7 со истек од $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|го блокираше}} {{GENDER:$4|$3}} од неуредувачки дејства со истек од $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|ги измени}} блоковските поставки за {{GENDER:$4|$3}} за неуредувачки дејства со истек од $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|го блокираше}} {{GENDER:$4|$3}} со истек $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|го измени}} блокот на {{GENDER:$4|$3}} со истек $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|ја увезе}} $3 со податотечно подигање",
        "mw-widgets-titleinput-description-redirect": "пренасочување кон $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Додај категорија...",
        "mw-widgets-usersmultiselect-placeholder": "Додај уште...",
+       "mw-widgets-titlesmultiselect-placeholder": "Додај уште...",
        "date-range-from": "Од датумот:",
        "date-range-to": "До датумот:",
        "sessionmanager-tie": "Не можете истовремено да користите повеќе типови барања за заверка: $1.",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Лозинката не смее да биде од оние на црниот список",
        "passwordpolicies-policy-maximalpasswordlength": "Лозинката не треба да има повеќе од $1 {{PLURAL:$1|знак|знаци}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Лозинката не треба да биде {{PLURAL:$1|најзастапената|од списокот на $1 најзастапени лозинки}}",
-       "easydeflate-invaliddeflate": "Содржината не е соодветно прочистена"
+       "easydeflate-invaliddeflate": "Содржината не е соодветно прочистена",
+       "unprotected-js": "JavaScript не може да се вчита од незаштитени страници од безбедносни причини. Создавајте JavaScript само во именскиот простор МедијаВики: или како корисничка потстраница"
 }
index 6db8de9..d8bf99b 100644 (file)
@@ -42,7 +42,6 @@
        "tog-extendwatchlist": "ഏറ്റവും പുതിയവ മാത്രമല്ല, എല്ലാ മാറ്റങ്ങളും ദൃശ്യമാകുന്ന വിധത്തിൽ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക വികസിപ്പിക്കുക.",
        "tog-usenewrc": "സമീപകാല മാറ്റങ്ങൾ, ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക എന്നീ താളുകളിൽ മാറ്റങ്ങൾ ഗണംതിരിക്കുക",
        "tog-numberheadings": "ഉപവിഭാഗങ്ങൾക്ക് ക്രമസംഖ്യ കൊടുക്കുക",
-       "tog-showtoolbar": "തിരുത്തൽ റ്റൂൾബാർ  പ്രദർശിപ്പിക്കുക",
        "tog-editondblclick": "താളുകളിൽ ഇരട്ട ക്ലിക്ക് ചെയ്യുമ്പോൾ തിരുത്താനനുവദിക്കുക",
        "tog-editsectiononrightclick": "ഉപവിഭാഗങ്ങളുടെ തലക്കെട്ടിൽ റൈറ്റ് ക്ലിക്ക് ചെയ്യുന്നതു വഴി തിരുത്താനനുവദിക്കുക",
        "tog-watchcreations": "ഞാൻ സൃഷ്ടിക്കുന്ന താളുകളും ഞാൻ അപ്‌ലോഡ് ചെയ്യുന്ന പ്രമാണങ്ങളും ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക",
index 84528b9..8edce23 100644 (file)
@@ -26,7 +26,6 @@
        "tog-extendwatchlist": "Хянах жагсаалтаа сүүлийн л засваруудыг бус бүх засварыг харуулахаар томруулах",
        "tog-usenewrc": "Сүүлийн үед хуудсанд хийсэн Грүп өөрчлөлтүүд (ЖаваСкрипт хэрэглэгдэнэ)",
        "tog-numberheadings": "Гарчигуудыг автоматаар дэс дугаарлах",
-       "tog-showtoolbar": "Засварлах түүлбарыг үзүүлэх (ЖаваСкрипт)",
        "tog-editondblclick": "Хоёр удаа дараад хуудсыг засварлах (ЖаваСкрипт)",
        "tog-editsectiononrightclick": "Хэсгийн гарчиг дээр баруун товчлуураар дарж засварладаг болгох (ЖаваСкрипт)",
        "tog-watchcreations": "Миний үүсгэсэн хуудсуудыг хянах жагсаалтанд оруулах",
index df27073..74006cf 100644 (file)
@@ -12,7 +12,6 @@
        "tog-extendwatchlist": "ꯌꯦꯡꯅꯕꯥ ꯄꯥꯔꯦꯡꯗꯨ ꯄꯥꯛꯊꯣꯛꯍꯟꯂꯨ ꯑꯍꯣꯡꯕꯥ ꯂꯣꯏꯅꯥ ꯎꯅꯕꯥ, ꯍꯧꯖꯤꯛꯀꯤ ꯈꯋꯥꯏꯗꯒꯤ ꯑꯅꯛꯄ ꯑꯍꯣꯡꯕꯗꯨ ꯅꯠꯇꯕꯥ",
        "tog-usenewrc": "Group changes by page in recent changes and watchlist",
        "tog-numberheadings": "ꯃꯁꯥ ꯃꯇꯣꯝꯇꯥ-ꯃꯁꯤꯡ-ꯃꯀꯣꯛꯁꯤꯡ",
-       "tog-showtoolbar": "ꯁꯦꯝꯒꯠꯅꯕ ꯇꯨꯜꯕꯥꯔ ꯎꯨꯠꯂꯨ",
        "tog-editondblclick": "꯲ ꯔꯛ ꯅꯝꯃꯒꯥ ꯂꯥꯃꯥꯏꯗꯨ ꯁꯦꯝꯒꯠꯂꯨ",
        "tog-editsectiononrightclick": "section titles ꯗ ꯌꯦꯠꯅ ꯅꯝꯗꯨꯅꯥ ꯁꯦꯝꯒꯠꯂꯛꯅꯕꯒꯤ ꯃꯐꯝꯗꯨ ꯌꯥꯍꯟꯂꯨ",
        "tog-watchcreations": "ꯍꯥꯞꯆꯤꯟꯂꯨ ꯑꯩꯅꯥ ꯁꯦꯝꯂꯛꯄꯥ ꯂꯥꯃꯥꯏꯗꯨ ꯑꯃꯗꯤ ꯑꯩꯅꯥ ꯊꯥꯒꯠꯂꯛꯄꯥ ꯐꯥꯏꯜ ꯗꯨ ꯑꯩꯒꯤ ꯌꯦꯡꯅꯕꯥ ꯄꯔꯦꯡꯗꯥ",
        "subcategories": "ꯃꯆꯥꯈꯥꯏꯕꯥ ꯃꯆꯥ",
        "category-media-header": "$1 ꯗꯥ ꯂꯩꯕꯥ ꯃꯦꯗꯤꯌꯥꯒꯤ ꯃꯆꯥꯈꯥꯏꯕꯥ",
        "category-empty": "<em>This category currently contains no pages or media.</em>",
-       "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}",
+       "hidden-categories": "{{PLURAL:$1|ꯑꯔꯣꯠꯄ ꯃꯆꯥꯈꯥꯏꯕ|ꯑꯔꯣꯠꯄ ꯃꯆꯥꯈꯥꯏꯕꯁꯤꯡ}}",
        "hidden-category-category": "ꯑꯔꯣꯠꯄꯥ ꯃꯊꯪ ꯃꯅꯥꯎ ꯅꯥꯏꯕꯥ",
        "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
        "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.",
        "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.",
        "listingcontinuesabbrev": "ꯆꯠꯊꯕꯥ",
        "index-category": "Indexed ꯂꯥꯃꯥꯏꯁꯤꯡ",
-       "noindex-category": "Noindexed ê¯\82ꯥê¯\83ꯥê¯\8fê¯\81ꯤꯡ",
+       "noindex-category": "Noindexed ꯂꯃꯥꯏꯁꯤꯡ",
        "broken-file-category": " ꯀꯥꯏꯔꯕꯥ file links ꯒꯥ ꯂꯣꯏꯅꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯡ",
        "about": "ꯄꯣꯠꯇꯨꯗꯤ ꯃꯔꯝꯗꯥ",
        "article": "ꯂꯥꯃꯥꯏꯁꯤꯗꯥ ꯌꯥꯎꯕꯥ ꯄꯨꯝꯅꯃꯛ",
        "redirectedfrom": "($1 ꯗꯒꯤ ꯔꯤꯗꯥꯏꯔꯦꯛ)",
        "redirectpagesub": "ꯑꯃꯨꯛ ꯍꯟꯂꯛꯄꯥ ꯂꯃꯥꯏ",
        "redirectto": "Redirect to:",
-       "lastmodifiedat": "$2$1 ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯑꯔꯣꯏꯕꯥ ꯁꯦꯝꯒꯠꯈꯤꯕꯥ",
+       "lastmodifiedat": "$1 ꯗꯥ ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯑꯔꯣꯏꯕꯥ ꯁꯦꯝꯒꯠꯈꯤꯕꯥ, $2 ꯗꯥ",
        "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}?",
        "protectedpage": "ꯍꯥꯛꯊꯣꯛꯂꯕꯥ ꯂꯥꯃꯥꯏ",
        "jumpto": "ꯑꯗꯨꯗꯥ  ꯆꯣꯡꯈꯠꯄꯥ",
        "youhavenewmessages": "{{PLURAL:$3|ꯅꯪꯉꯣꯟꯗ ꯂꯩ}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).",
        "youhavenewmessagesmanyusers": "ꯅꯪ $1 ꯂꯩꯔꯦ $2 ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ ꯃꯌꯥꯝꯗꯒꯤ",
-       "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}",
+       "newmessageslinkplural": "{{PLURAL:$1|ꯑꯅꯧꯕ ꯄꯥꯎꯖꯦꯜ ꯱|꯹꯹꯹=ꯑꯅꯧꯕ ꯄꯥꯎꯖꯦꯜꯁꯤꯡ}}",
        "newmessagesdifflinkplural": "ꯑꯔꯣꯏꯕꯥ {{PLURAL:$1|ꯑꯍꯣꯡꯕ|꯹꯹꯹=ꯑꯍꯣꯡꯕꯁꯤꯡ}}",
        "youhavenewmessagesmulti": "$1 ꯅꯪꯒꯤ ꯑꯅꯧꯕꯥ ꯃꯦꯁꯦꯁ",
        "editsection": "ꯁꯦꯝꯒꯠꯄ",
        "changeemail-submit": "ꯏ-ꯃꯦꯜ ꯍꯣꯡꯕꯥ",
        "bold_sample": "ꯆꯥꯎꯅꯥ ꯏꯕꯥ",
        "bold_tip": "ꯆꯥꯎꯅꯥ ꯏꯕꯥ",
-       "italic_sample": "ê¯\8bꯥê¯\94ꯦꯡ ê¯\90ê¯\86ꯅꯥ ꯏꯕꯥ",
+       "italic_sample": "ê¯\8bꯥê¯\94ꯦꯡ ê¯\90ꯩꯅꯥ ꯏꯕꯥ",
        "italic_tip": "ꯋꯥꯔꯦꯡ ꯐꯩꯅꯥ ꯏꯕꯥ",
        "link_sample": "ꯃꯩꯃꯤꯡꯃꯤ ꯁꯝꯅꯐꯝ",
        "link_tip": "ꯃꯅꯨꯡꯒꯥ ꯁꯝꯅꯐꯝ",
        "savechanges-start": "ꯑꯍꯣꯡꯕꯁꯤꯡꯗꯨ ꯇꯨꯪꯁꯤꯟꯂꯨ",
        "publishpage-start": "ꯂꯥꯃꯥꯏ ꯐꯣꯡꯗꯣꯛ ꯎ",
        "publishchanges-start": "ꯑꯍꯣꯡꯕꯁꯤꯡꯗꯨ ꯐꯣꯡꯗꯣꯛ ꯎ",
-       "preview": "ê¯\83ꯥê¯\83ꯥꯡê¯\92ꯤ",
+       "preview": "ꯃꯃꯥꯡꯒꯤ",
        "showpreview": "ꯍꯥꯟꯅꯒꯤꯗꯨ ꯎꯨꯠꯂꯨ",
-       "showdiff": "ê¯\91ê¯\8dꯣꯡê¯\95ê¯\97ꯨ ê¯\8eꯨê¯\87ꯂꯨ",
+       "showdiff": "ê¯\91ê¯\8dꯣꯡê¯\95ê¯\97ꯨ ê¯\8eꯨꯠꯂꯨ",
        "blankarticle": "<strong>Warning:</strong> The page you are creating is blank.\nIf you click \"$1\" again, the page will be created without any content.",
        "anoneditwarning": "<strong>Warning:</strong> ꯅꯪ ꯃꯅꯨꯡ ꯆꯪꯗꯔꯤ꯬꯬ ꯫ Your IP address will be publicly visible if you make any edits. If you <strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
        "loginreqlink": "Chang Sinba",
        "continue-editing": "ꯁꯦꯝꯒꯠꯄꯒꯤ ꯃꯐꯝꯗꯨꯗꯥ ꯆꯠꯂꯨ",
        "editing": "$1 ꯁꯦꯝꯒꯠꯂꯤ",
        "creating": "ꯁꯥꯔꯤ $1",
-       "editingsection": "Editing $1 (section)",
+       "editingsection": "ꯏꯔꯤꯕ $1 (ꯁꯥꯔꯨꯛ)",
        "yourtext": "ꯅꯪꯒꯤ ꯇꯦꯀꯁ",
        "yourdiff": "ꯈꯦꯠꯅꯕꯥ ꯁꯤꯡ",
        "copyrightwarning": "Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).\nIf you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.\n<strong>Do not submit copyrighted work without permission!</strong>",
-       "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:",
+       "templatesused": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤꯗ ꯁꯤꯖꯤꯟꯅꯕ {{PLURAL:$1|ꯇꯦꯝꯄꯂꯦꯠ|ꯇꯦꯝꯄꯂꯦꯠꯁꯤꯡ}}:",
        "templatesusedpreview": "{{PLURAL:$1|ꯇꯦꯝꯄꯂꯦꯠ|ꯇꯦꯝꯄꯂꯦꯠꯁꯤꯡ}} ꯄꯔꯤꯕꯤꯌꯨ ꯗ ꯁꯤꯖꯤꯟꯅꯕ:",
-       "template-protected": "ꯉꯥꯛꯊꯣꯛꯂꯕꯥ",
+       "template-protected": "(ꯉꯥꯛꯊꯣꯛꯂꯕꯥ)",
        "template-semiprotected": "ꯇꯪꯈꯥꯏ ꯉꯥꯛꯊꯣꯛꯂꯕꯥ",
        "hiddencategories": "This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:",
        "permissionserrors": "ꯑꯌꯥꯕꯥꯗꯨ ꯁꯣꯏꯔꯦ",
        "revisionasof": " $1 ꯒꯤ ꯑꯃꯨꯛ ꯍꯟꯅ ꯌꯦꯡꯕ",
        "revision-info": " $1 ꯒꯤ ꯑꯃꯨꯛꯌꯦꯡꯕ {{GENDER:$6|$2}}$7 ꯅꯥ",
        "previousrevision": "← ꯑꯔꯤꯕꯥ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ",
-       "nextrevision": "ꯑꯅꯧꯕꯥ ꯑꯃꯨꯛꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ",
+       "nextrevision": "ꯑꯅꯧꯕꯥ ꯑꯃꯨꯛꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ →",
        "currentrevisionlink": "ꯈꯋꯥꯏꯗꯒꯤ ꯅꯧꯅꯥ ꯑꯃꯨꯛ ꯌꯦꯡꯕꯥ",
        "cur": "ꯍꯧ",
        "next": "ꯃꯊꯪ",
        "nextn": "ꯃꯥꯊꯪ{{PLURAL:$1|$1}}",
        "prevn-title": "ꯃꯃꯥꯡꯒꯤ $1 {{PLURAL:$1|result|results}}",
        "nextn-title": "ꯃꯊꯪ $1 {{PLURAL:$1|ꯐꯣꯜ|ꯐꯣꯜꯁꯤꯡ}}",
-       "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page",
+       "shown-title": "ꯎꯠꯂꯨ $1 {{PLURAL:$1|result|results}} ꯂꯃꯥꯏ ꯑꯃꯝ ꯑꯃꯝꯒꯤ ꯑꯣꯏꯅꯥ",
        "viewprevnext": "ꯎꯨꯇꯂꯨ ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>ꯃꯁꯤꯗ ꯂꯃꯥꯏ ꯑꯃꯥ ꯂꯩꯔꯦ ꯃꯃꯤꯡꯅꯥ \"[[:$1]]\" ꯁꯤꯒꯤ ꯋꯤꯀꯤꯁꯤꯗ </strong> {{PLURAL:$2|0=|ꯌꯦꯡꯉꯨ ꯁꯤꯖꯨ ꯑꯇꯩ ꯊꯤꯕꯒꯤ ꯐꯣꯜꯁꯤꯡꯗꯨ ꯫}}",
        "searchmenu-new": "<strong>ꯂꯃꯥꯏ ꯁꯥꯔꯣ \"[[:$1]]\" on this wiki!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
        "nmembers": "$1 {{PLURAL:$1|member|members}}",
        "prefixindex": "ꯋꯥꯇꯞ ꯀꯥ ꯂꯣꯏꯅꯕ ꯂꯥꯃꯥꯏꯁꯤꯡ ꯄꯨꯝꯅꯃꯛ",
        "listusers": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕ ꯁꯤꯡꯒꯤ ꯄꯥꯔꯦꯡ",
-       "newpages": "ê¯\91ê¯\85ꯧê¯\95ꯥ ê¯\82ꯥê¯\83ꯥê¯\8fê¯\81ꯤꯡ",
+       "newpages": "ꯑꯅꯧꯕꯥ ꯂꯃꯥꯏꯁꯤꯡ",
        "move": "ꯂꯦꯡꯍꯟꯕꯥ",
        "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
        "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
        "protect-default": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯁꯤꯡ ꯄꯨꯂꯞ ꯌꯥꯍꯟꯕ",
        "restriction-edit": "ꯁꯦꯝꯒꯠꯄꯥ",
        "restriction-move": "ꯂꯦꯡꯍꯟꯕꯥ",
-       "namespace": "ꯃꯥꯃꯤꯡꯒꯤ ꯃꯐꯝ",
+       "namespace": "ꯃꯥꯃꯤꯡꯒꯤ ꯃꯐꯝ:",
        "invert": "ꯈꯟꯂꯤꯕꯗꯨ ꯃꯀꯣꯛꯇꯒꯤ ꯂꯥꯛꯍꯟꯕ",
        "tooltip-invert": "Akhannaba maming gi manungda page tungi ahongba lotnaba oopu du yeng ngoo",
        "namespace_association": "Maming eefam ga marileinaba",
        "tooltip-pt-logout": "ꯊꯣꯛꯂꯛꯄꯥ",
        "tooltip-pt-createaccount": "ꯅꯪꯒꯤ ꯑꯣꯏꯕꯥ ꯱ ꯁꯦꯝꯕꯥ ꯑꯃꯥꯁꯨꯪ ꯃꯅꯨꯡ ꯆꯪꯁꯤꯟꯕꯥꯁꯤ ꯄꯨꯛꯅꯤꯡ ꯊꯧꯒꯠꯂꯤ, ꯇꯧꯕꯇꯕꯨ ꯃꯁꯤ ꯁꯪꯁꯣꯏ ꯁꯣꯏꯗꯅꯥ ꯆꯡꯕꯗꯤ ꯅꯠꯇꯦ",
        "tooltip-ca-talk": "ꯃꯅꯨꯡꯆꯟꯂꯤꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯒꯤ ꯃꯇꯥꯁꯗꯥ ꯈꯟꯅꯥ ꯅꯩꯅꯕꯥ",
-       "tooltip-ca-edit": "ê¯\83ê¯\81ꯤê¯\92ꯤ ê¯\82ꯥê¯\83ꯥê¯\8fê¯\81ꯤ ê¯\81ꯦê¯\9dê¯\92ꯠê¯\82ꯨ",
+       "tooltip-ca-edit": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯁꯦꯝꯒꯠꯂꯨ",
        "tooltip-ca-addsection": "ꯑꯅꯧꯕ ꯈꯥꯏꯗꯣꯛꯄꯗꯨ ꯍꯧꯔꯣ",
        "tooltip-ca-viewsource": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯉꯥꯛꯊꯣꯛꯂꯦ \nꯅꯪꯅꯥ ꯂꯃꯥꯏꯁꯤꯒꯤ ꯍꯧꯔꯛꯐꯝ ꯎꯒꯅꯤ",
-       "tooltip-ca-history": "ê¯\8dꯧê¯\88ê¯\94ê¯\95ꯥ ê¯\82ꯥê¯\83ꯥê¯\8f ê¯\91ê¯\83ꯨê¯\9b ê¯\8dê¯\9fê¯\85ꯥ ê¯\8cꯦꯡê¯\95ꯥ",
+       "tooltip-ca-history": "ꯍꯧꯈꯔꯕꯥ ꯂꯃꯥꯏ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ",
        "tooltip-ca-protect": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯉꯥꯛ ꯎ",
-       "tooltip-ca-delete": "ê¯\83ê¯\81ꯤê¯\92ꯤ ê¯\82ꯥê¯\83ꯥê¯\8fê¯\81ꯤ ê¯\80ê¯\9bê¯\8aꯠê¯\82ꯨ",
-       "tooltip-ca-move": "ê¯\83ê¯\81ꯤê¯\92ꯤ ê¯\82ꯥê¯\83ꯥê¯\8fê¯\81ꯤ ê¯\82ꯦꯡê¯\8dê¯\9fê¯\82ꯨ",
+       "tooltip-ca-delete": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯀꯛꯊꯠꯂꯨ",
+       "tooltip-ca-move": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯂꯦꯡꯍꯟꯂꯨ",
        "tooltip-ca-watch": "ꯅꯪꯒꯤ ꯌꯦꯡꯅꯕꯥ ꯄꯥꯔꯦꯡꯗꯨꯗꯥ ꯍꯥꯞꯆꯏꯟꯂꯨ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ",
        "tooltip-ca-unwatch": "ꯅꯪꯒꯤ ꯌꯦꯡꯅꯕ ꯄꯥꯔꯦꯡ ꯗꯒꯤ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯂꯧꯊꯣꯛ ꯎ",
        "tooltip-search": "ꯊꯤꯔꯣ",
        "tooltip-search-go": "ꯂꯩꯔꯥꯒꯗꯤ ꯆꯠꯂꯨ ꯃꯗꯨꯒꯤ ꯆꯞꯆꯕ ꯂꯃꯥꯏ ꯗꯨꯗ",
        "tooltip-search-fulltext": "ꯏꯔꯤꯕꯥ ꯃꯇꯦꯛꯁꯤꯒꯤ ꯂꯃꯥꯏ ꯁꯤ ꯊꯤꯔꯣ",
        "tooltip-p-logo": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯗꯨꯗꯥ ꯌꯧꯁꯤꯟꯂꯨ",
-       "tooltip-n-mainpage": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯗꯨꯗꯥ ꯌꯧꯁꯤꯟꯂꯨ",
+       "tooltip-n-mainpage": "ꯃꯔꯨꯑꯣꯏꯕ ꯂꯃꯥꯏꯗꯨꯗꯥ ꯌꯧꯁꯤꯟꯂꯨ",
        "tooltip-n-mainpage-description": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯗꯨꯗꯥ ꯌꯧꯁꯤꯟꯂꯨ",
        "tooltip-n-portal": "ꯊꯧꯑꯣꯡ ꯂꯥꯛꯄꯗꯨꯒꯤ ꯃꯔꯝꯗ꯬",
        "tooltip-n-currentevents": "ꯆꯠꯊꯔꯤꯕꯥ ꯊꯧꯔꯝꯁꯤꯒꯤ ꯃꯅꯨꯒꯤ ꯑꯣꯏꯕꯥ ꯋꯥꯔꯣꯟꯗꯨ ꯄꯨꯊꯣꯛ ꯎ",
        "tooltip-ca-nstab-user": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ ꯂꯥꯃꯥꯏꯁꯤ ꯌꯦꯡꯕꯥ",
        "tooltip-ca-nstab-special": "ꯃꯁꯤ ꯑꯈꯟꯅꯕꯥ ꯂꯃꯥꯏꯅꯤ, ꯁꯦꯝꯒꯠꯄꯥ ꯌꯥꯔꯣꯏ",
        "tooltip-ca-nstab-project": "ꯂꯃꯥꯏꯁꯤꯒꯤ ꯇꯧꯒꯗꯥ ꯊꯧꯔꯥꯡꯗꯨ ꯎꯨꯇꯂꯨ",
-       "tooltip-ca-nstab-image": "ê¯\90ꯥê¯\8fê¯\9c ê¯\82ꯥê¯\83ꯥê¯\8fê¯\97ꯨꯨꯨꯨꯨ ê¯\8eꯨꯠê¯\82ꯨ",
+       "tooltip-ca-nstab-image": "ꯐꯥꯏꯜ ꯂꯃꯥꯏꯗꯨꯨꯨꯨꯨ ꯎꯨꯠꯂꯨ",
        "tooltip-ca-nstab-mediawiki": "ꯊꯧꯁꯤꯜꯒꯤ ꯑꯣꯏꯕ ꯄꯥꯎꯖꯦꯜꯗꯨ ꯎꯨꯠꯂꯨ",
        "tooltip-ca-nstab-template": "ꯇꯦꯝꯄꯂꯦꯠ ꯇꯨ ꯎꯨꯠꯂꯨ",
        "tooltip-ca-nstab-category": "ꯃꯆꯥꯈꯥꯏꯕ ꯂꯃꯥꯏꯗꯨ ꯎꯨꯠꯂꯨ",
        "tooltip-save": "ꯅꯪꯒꯤ ꯑꯍꯣꯡꯕꯗꯨ ꯇꯨꯡꯁꯤꯟꯂꯨ",
-       "tooltip-preview": "ꯅꯪꯒꯤ ꯑꯍꯣꯡꯕꯗꯨ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯎꯠꯂꯨ. ꯆꯥꯟꯕꯤꯗꯨꯅꯥ ꯃꯁꯤ ꯍꯥꯟꯅꯥ ꯁꯤꯖꯤꯅꯧ ꯇꯪꯁꯤꯟꯗ꯭ꯔꯤꯉꯧꯗꯥ ꯫",
+       "tooltip-preview": "ê¯\85ꯪê¯\92ꯤ ê¯\91ê¯\8dꯣꯡê¯\95ê¯\97ꯨ ê¯\91ê¯\83ꯨê¯\9b ê¯\8dê¯\9fê¯\85ꯥ ê¯\8eꯠê¯\82ꯨ. ê¯\86ꯥê¯\9fê¯\95ꯤê¯\97ꯨê¯\85ꯥ ê¯\83ê¯\81ꯤ ê¯\8dꯥê¯\9fê¯\85ꯥ ê¯\81ꯤê¯\96ꯤê¯\85ꯧ ê¯\87ꯪꯨê¯\81ꯤê¯\9fê¯\97꯭ê¯\94ꯤê¯\89ꯧê¯\97ꯥ ê¯«",
        "tooltip-diff": "ꯅꯪꯅꯥ ꯏꯔꯤꯕꯥ ꯄꯥꯔꯦꯡꯗꯨꯗꯥ ꯑꯍꯣꯡꯕꯥ ꯎꯠꯂꯨ",
        "tooltip-compareselectedversions": "See the differences between the two selected revisions of this page",
        "tooltip-watch": "ꯍꯥꯞꯆꯤꯟꯂꯨ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯅꯪꯅ ꯌꯦꯡꯂꯤꯕ ꯄꯔꯦꯡ ꯗ",
        "pageinfo-header-edits": "ꯄꯨꯋꯥꯔꯤ ꯁꯦꯝꯒꯠꯄ",
        "pageinfo-header-restrictions": "ꯉꯥꯛꯊꯣꯛꯂꯕꯥ ꯂꯃꯥꯏ",
        "pageinfo-header-properties": "ꯂꯃꯥꯏꯁꯤ ꯒꯤ ꯑꯣꯏꯒꯗꯕꯁꯤꯡ",
-       "pageinfo-display-title": "ê¯\82ꯥê¯\83ꯥꯤê¯\92ꯤ ê¯\83ê¯\83ꯤꯡ ê¯\8cꯦꯡê¯\8dê¯\9fê¯\95",
+       "pageinfo-display-title": "ê¯\82ê¯\83ꯥê¯\8fê¯\92ꯤ ê¯\91ê¯\84ꯤê¯\95 ê¯\83ê¯\83ꯤꯡ ê¯\8eꯠê¯\8aꯣê¯\9bê¯\84",
        "pageinfo-default-sort": "ꯑꯇꯦꯟꯕ-꯱ꯍꯦꯛ-ꯇ ꯌꯥꯕ ‌‌‌‌‌",
-       "pageinfo-length": "ê¯\82ꯥê¯\83ꯥê¯\8fê¯\92ꯤ ê¯\91ê¯\81ꯥꯡê¯\95(ê¯\95ꯥê¯\8fê¯\87 ê¯\87)",
-       "pageinfo-article-id": "ê¯\82ꯥê¯\83ꯥê¯\8fê¯\92ꯤ ê¯\81ê¯\9bê¯\87ꯥê¯\9b",
-       "pageinfo-language": "ê¯\82ꯥê¯\83ꯥê¯\8fê¯\81ꯤê¯\97 ê¯\8fê¯\94ꯤê¯\95 ê¯\82ꯣê¯\9f",
+       "pageinfo-length": "ꯂꯃꯥꯏꯒꯤ ꯑꯁꯥꯡꯕ(ꯕꯥꯏꯇ ꯇ)",
+       "pageinfo-article-id": "ꯂꯃꯥꯏꯒꯤ ꯁꯛꯇꯥꯛ",
+       "pageinfo-language": "ꯂꯃꯥꯏꯁꯤꯗ ꯏꯔꯤꯕ ꯂꯣꯟ",
        "pageinfo-content-model": "ꯂꯥꯃꯥꯏꯁꯤꯗ ꯌꯥꯎꯔꯤꯕ ꯃꯑꯣꯡ ꯃꯇꯧ",
        "pageinfo-robot-policy": "ꯔꯣꯕꯣꯠꯁꯤꯡꯅꯥ ꯍꯥꯞꯆꯤꯟꯕ",
        "pageinfo-robot-index": "ꯌꯥꯍꯟꯕ",
        "exif-orientation-1": "ꯆꯥꯡ ꯅꯥꯏꯅꯥ",
        "namespacesall": "ꯄꯨꯂꯞ",
        "monthsall": "ꯄꯨꯂꯞ",
-       "imgmultipagenext": "ê¯\83ê¯\8aꯪ ê¯\82ꯥê¯\83ꯥê¯\8f",
+       "imgmultipagenext": "ê¯\83ê¯\8aꯪ ê¯\82ê¯\83ꯥê¯\8f â\86\92",
        "imgmultigo": "ꯆꯠꯂꯨ",
-       "imgmultigoto": "$1 ê¯\82ꯥê¯\83ꯥê¯\8f ê¯\97 ê¯\86ꯠê¯\82ꯨ",
+       "imgmultigoto": "$1 ꯂꯃꯥꯏ ꯗ ꯆꯠꯂꯨ",
        "watchlisttools-clear": "ꯌꯦꯡꯂꯤꯕ ꯄꯥꯔꯦꯡꯗꯨ ꯁꯦꯡꯗꯣꯛ ꯨꯎ",
        "watchlisttools-view": "ꯃꯁꯤꯒ ꯆꯥꯟꯅꯕ ꯑꯍꯣꯡꯕꯗꯨ ꯎꯨꯠꯂꯨ",
        "watchlisttools-edit": "ꯌꯦꯡꯂꯤꯕ ꯄꯥꯔꯦꯡꯗꯨ ꯁꯦꯝꯒꯌꯂꯨ ꯱ꯁꯨꯡ ꯎꯨꯠꯂꯨ",
        "redirect-value": "ꯃꯔꯨꯑꯣꯏꯅꯥ ꯂꯧꯅꯕ:",
        "redirect-user": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕ ꯁꯛꯇꯥꯛ",
        "redirect-page": "ꯂꯃꯥꯏꯒꯤ ꯁꯛꯇꯛ",
-       "redirect-revision": "ê¯\82ꯥê¯\83ꯥê¯\8f ê¯\91ê¯\83ꯨꯧꯍꯟꯅ ꯌꯦꯡꯕ",
+       "redirect-revision": "ê¯\82ê¯\83ꯥê¯\8f ê¯\91ê¯\83ꯨê¯\9bꯍꯟꯅ ꯌꯦꯡꯕ",
        "redirect-file": "ꯐꯥꯏꯜ ꯃꯃꯤꯡ",
        "specialpages": "ꯑꯈꯟꯅꯕ ꯂꯃꯥꯏꯁꯤꯡ",
        "tag-filter": "[[Special:Tags|ꯊꯦꯡꯕ]] ꯁꯦꯡꯇꯣꯛꯄ:",
index a48c9e1..5c6f336 100644 (file)
@@ -12,7 +12,6 @@
        "tog-newpageshidepatrolled": "ဗဒန် မုက်လိက်မဒဒှ်မဂေတ်ကၚ် နူ စရၚ် မုက်လိက် တၟိ",
        "tog-hidecategorization": "ပၞုက် အရာမဖျေဟ်ကဏ္ဍ ကုမုက်လိက်",
        "tog-extendwatchlist": "သၠဲ စရၚ်မမၚ်မဲ သ္ဂောံ ထ္ၜး အလုံ မုက်လိၚ်ဂမၠိုၚ်, ဆ မတုဲကၠုၚ်လၟုဟ် ဟွံသေၚ်",
-       "tog-showtoolbar": "ထ္ၜး တာန်ကြိယာမဒါန်",
        "tog-editondblclick": "ဒါန်မုက်လိက်ဂမၠိုၚ် ပွမပ္ဍဵုကေတ်ၜါလ္တန်",
        "tog-watchcreations": "စုတ်မုက်လိက် မအဲခၞံကၠောန်လဝ် ကေုာံ ဝှာၚ် မအဲပတိုန်လဝ် စရေၚ် စရၚ်မမၚ်မွဲအဲ.",
        "tog-watchdefault": "စုတ်မုက်လိက်ဂမၠိုၚ် ကေုာံ ဝှာၚ်ဂမၠိုၚ်မအဲပလေဝ်ဒါန်လဝ် စရေၚ်စရၚ်အဲမမၚ်မွဲ.",
index b561cb8..3c37899 100644 (file)
@@ -64,7 +64,6 @@
        "tog-extendwatchlist": "निरीक्षणसूचीत सगळे बदल दाखवा. फक्त अलीकडील नाही.",
        "tog-usenewrc": "अलीकडील बदल आणि पहाऱ्याची सूचीत मांडणी करा",
        "tog-numberheadings": "शीर्षके स्वयंक्रमांकित करा",
-       "tog-showtoolbar": "संपादन साधनपट्टी दाखवा",
        "tog-editondblclick": "दुबार-टिचकुन पान संपादित करा",
        "tog-editsectiononrightclick": "विभाग शीर्षकावर उजव्या क्लिकने टिचकुन संपादन करणे शक्य करा",
        "tog-watchcreations": "मी तयार केलेली पाने आणि चढविलेल्या संचिका माझ्या निरीक्षणसूचीत टाका",
index 8c25263..711c8fb 100644 (file)
@@ -38,7 +38,6 @@
        "tog-extendwatchlist": "Kembangkan senarai pantau untuk memaparkan semua perubahan, bukan hanya yang terkini",
        "tog-usenewrc": "Kumpulkan perubahan mengikut laman dalam perubahan terkini dan senarai pantau",
        "tog-numberheadings": "Nomborkan tajuk secara automatik",
-       "tog-showtoolbar": "Tunjukkan palang alat sunting",
        "tog-editondblclick": "Dwiklik untuk menyunting laman",
        "tog-editsectiononrightclick": "Bolehkan penyuntingan bahagian dengan mengklik kanan pada tajuk bahagian",
        "tog-watchcreations": "Tambahkan laman-laman yang saya cipta dan fail-fail yang saya muat naik ke dalam senarai pantau saya",
index 5ab6b4c..8f92a72 100644 (file)
@@ -24,7 +24,6 @@
        "tog-extendwatchlist": "Espandi l-lista ta' osservazzjoni biex turi t-tibdil kollu, u mhux biss dak riċenti",
        "tog-usenewrc": "Iġbor il-tibdil skont paġna fil-tibdil riċenti u lista' ta paġni osservati",
        "tog-numberheadings": "Numerazzjoni awtomatika tat-titli tas-sezzjonijiet",
-       "tog-showtoolbar": "Uri tal-għodda għall-modifikar il-paġni",
        "tog-editondblclick": "Immodifika l-paġni permezz ta' klikk doppju (bżonn tal-JavaScript)",
        "tog-editsectiononrightclick": "L-immodifikar ta' sezzjonijiet bi klikk lemini fuq it-titli tas-sezzjonijiet (bżonn tal-JavaScript)",
        "tog-watchcreations": "Żid il-paġni li noħloq u l-fajls li ntella' fil-lista ta' osservazzjoni tiegħi",
index 021ca92..2994c81 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "Lhistaige spandida de todas las altaraçones a las páiginas begiadas, nun solo de las redadeiras",
        "tog-usenewrc": "Agrupar altaraçones por páigina nas altaraçones recentes i páiginas begiadas",
        "tog-numberheadings": "Outo-numerar cabeçalhos",
-       "tog-showtoolbar": "Amostrar la barra d'eidiçon",
        "tog-editondblclick": "Eiditar páiginas quando houbir un clique duplo",
        "tog-editsectiononrightclick": "Posseblitar l'eidiçon de cachos por clique cul boton dreito ne l títalo de la seçon",
        "tog-watchcreations": "Ajuntar las páiginas que you criar a las mies páiginas begiadas",
index 1632376..f493937 100644 (file)
@@ -36,7 +36,6 @@
        "tog-extendwatchlist": "စောင့်ကြည့်စာရင်းတွင် ပြောင်းလဲမှုအားလုံးအား  ပြရန်။",
        "tog-usenewrc": "လတ်တလောပြောင်းလဲမှုများနှင့် စောင့်ကြည့်စာရင်းရှိ စာမျက်နှာ အုပ်စုလိုက် ပြောင်းလဲချက်များ",
        "tog-numberheadings": "ခေါင်းစဉ်များအား အလိုအလျောက် နံပါတ်စဉ်ရန်",
-       "tog-showtoolbar": "ပြင်ဆင် ကိရိယာဘားကို ပြရန်",
        "tog-editondblclick": "ကလစ်နှစ်ခါနှိပ်ပြီး စာမျက်နှာများအား ပြင်ဆင်ရန်",
        "tog-editsectiononrightclick": "အပိုင်းလိုက်ခေါင်းစဉ်များကို ညာကလစ်နှိပ်ခြင်းဖြင့် အပိုင်းလိုက် တည်းဖြတ်ခြင်းကို အသုံးပြုရန်",
        "tog-watchcreations": "ကျွန်ုပ်စတင်ရေးသားခဲ့သည့်စာမျက်နှာများနှင့် အပ်လုပ်တင်ခဲ့သည့် ဖိုင်များကို စောင့်​ကြည့်​စာ​ရင်း​ထဲ ပေါင်းထည့်ရန်",
index 20ebd82..0b6e56e 100644 (file)
@@ -25,7 +25,6 @@
        "tog-extendwatchlist": "Келейгавтомс сёрмадовкс мельга ваномань керьксэнть невтевест весе полавтнематне, аволь ансяк чиеньсетне.",
        "tog-usenewrc": "Пурнамс лиякстомтомат лопань коряс куронь-куронь чиень полавтнематнестэ-ванома лемрисьметнестэ",
        "tog-numberheadings": "Сёрмадовксконяксос кадык сынсь ловома валтнэ путовить",
-       "tog-showtoolbar": "Невтемс кедьёнкслазнэнть сёрмадома шкасто",
        "tog-editondblclick": "Кавксть лепштязь совамс сёрмадовксонь витнеме-петнеме",
        "tog-editsectiononrightclick": "Витнемс секциятнень-пелькстнэнь, лепштямс сёрмадовксонть лемензэ лангс чеерень витьёнсе повнесэ",
        "tog-watchcreations": "Совавтомс ванома лемрисьмезэнь монь теевть лопатнень ды сень, мезе ёвкстан",
index 7636827..2b07eb0 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "گت تر هکردن دمبال هکرده‌ئون فهرست تموم دگارسه‌ئون سر، و نا فقط آخرین  موردون",
        "tog-usenewrc": "استفاده از تازه دگاردسته‌ئون گت‌تر بَیی (نیازمند جاوااسکریپت)",
        "tog-numberheadings": "شماره بشتن خدکار عناوین",
-       "tog-showtoolbar": "دچی‌ین جعبه نوار ابزار ره سِراق هدائن",
        "tog-editondblclick": "دچی ین ولگون با دتا کلیک (نیازمند جاوااسکریپت)",
        "tog-editsectiononrightclick": "به کار دمبدائن دچی‌ین قسمت‌ئون با راست کیلیک<br />عناوین قسمت‌ئون ِرو (جاوااسکریپت)",
        "tog-watchcreations": "ایضافه بین صفحه‌ئونی که من دِرِس هاکردمه به پیگیری‌ئون ِرج.",
index f52fcb3..127f1a6 100644 (file)
@@ -21,7 +21,6 @@
        "tog-newpageshidepatrolled": "Mokintlàtis tlapîpialtlaìxtlapaltìn ìwikpa ìtlapòpòwaltekpànal in yâyankuik tlaìxtlapaltìn",
        "tog-extendwatchlist": "Mixmanaz in tlapopohualtecpantlachialli ica mottaz nochi in tlapatlaliztli, ahmo in zan ocachi yancuic.",
        "tog-usenewrc": "Molōloāzqueh in tlapatlaliztli in yancuīc tlapatlaliztli āmapan īhuān in tlachiyaliztli tlapōhualāmapan (monequi JavaScript)",
-       "tog-showtoolbar": "Motlaīxtlatīz in tlachihchīhualōni pāntli",
        "tog-editondblclick": "Tiquimpatlāz in zāzanilli intlā ōme tiquimpachoa",
        "tog-watchcreations": "Niquintlaliz in tlahcuilolamameh in oniquinchiuh ihuan in tlahcuilolpiyaliztin in oniquinquetz ipan notlachiyaliz",
        "tog-watchdefault": "Mahxiltiz tlahcuilolamatl ihuan tlahcuilolpiyalli in tlein niquinpatla ipan notlachiyaliz",
index 379fa5c..d80dcdf 100644 (file)
@@ -23,7 +23,6 @@
        "tog-extendwatchlist": "thián-khui kàm-sī-toaⁿ, khoàⁿ choân-pō͘  kái ê, m̄-nā choè-kīn niā.",
        "tog-usenewrc": "共文章最近有改的佮監視列表囥做伙",
        "tog-numberheadings": "Phiau-tê chū-tōng pian-hō",
-       "tog-showtoolbar": "Hián-sī pian-chi̍p ke-si-tiâu",
        "tog-editondblclick": "連揤兩个就通編輯",
        "tog-editsectiononrightclick": "Chiàⁿ ji̍h toāⁿ-lo̍h phiau-tê to̍h ē-tàng pian-chi̍p toāⁿ-lo̍h",
        "tog-watchcreations": "Kā goá khui ê ia̍h kah chiūⁿ-chái ê tóng-àn ka-ji̍p kàm-sī-toaⁿ lāi-té",
index 68cea82..227e8d9 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "Spanne ll'asservate speciale pe fà vedé tutte 'e cagnàmiente, nun solo a ll'ùrdemo",
        "tog-usenewrc": "Urdeme càgnamiente avanzate (JavaScript)",
        "tog-numberheadings": "Annúmmera automatecamente 'e títule",
-       "tog-showtoolbar": "Aspone 'a barra d''e stromiente 'e cagno",
        "tog-editondblclick": "Cagna 'e pàggene cliccanno ddoje vote",
        "tog-editsectiononrightclick": "Permette 'e cagnà 'e sezzione cliccanno p' 'o tasto dritto ncopp' 'e titule 'e sezzione",
        "tog-watchcreations": "Azzecca 'e ppaggene criate e li files carrecate ncopp'â l'elenco 'e cuntrollo",
index e1623d9..2d04f0d 100644 (file)
@@ -63,7 +63,6 @@
        "tog-extendwatchlist": "Utvid overvåkningslisten til å vise alle endringer, ikke bare de siste",
        "tog-usenewrc": "Grupper endringer etter side i siste endringer og overvåkingslisten",
        "tog-numberheadings": "Autonummerer overskrifter",
-       "tog-showtoolbar": "Vis verktøylinje",
        "tog-editondblclick": "Rediger sider ved å dobbeltklikke",
        "tog-editsectiononrightclick": "Rediger avsnitt ved å høyreklikke på avsnittsoverskrift",
        "tog-watchcreations": "Legg til sider jeg oppretter og filer jeg laster opp i min overvåkingsliste",
        "badarticleerror": "Handlingen kan ikke utføres på denne siden.",
        "cannotdelete": "Siden eller fila «$1» kunne ikke slettes.\nDen kan ha blitt slettet av noen andre.",
        "cannotdelete-title": "Kan ikke slette siden «$1»",
+       "delete-scheduled": "Siden «$1» står i kø for å bli slettet.\nHa tålmodighet.",
        "delete-hook-aborted": "Sletting avbrutt av en funksjon.\nDen ga ingen forklaring.",
        "no-null-revision": "Det ble ikke laget en null-endring av side \"$1\"",
        "badtitle": "Ugyldig tittel",
        "prefixindex": "Alle sider med prefiks",
        "prefixindex-namespace": "All sider med prefiks ($1 navnerom)",
        "prefixindex-submit": "Vis",
-       "prefixindex-strip": "Fjern prefiks fra listen",
+       "prefixindex-strip": "Skjul prefikset i resultatene",
        "shortpages": "Korte sider",
        "longpages": "Lange sider",
        "deadendpages": "Blindveisider",
        "movepage-moved": "'''«$1» ble flyttet til «$2»'''",
        "movepage-moved-redirect": "En omdirigering har blitt opprettet.",
        "movepage-moved-noredirect": "Det ble ikke opprettet en omdirigering.",
+       "movepage-delete-first": "Målsiden har for mange revisjoner til å slettes som del av en sideflytting. Slett siden manuelt først og prøv så igjen.",
        "articleexists": "En side med det navnet finnes allerede eller det valgte navn er ugyldig.\nVelg et annet navn.",
        "cantmove-titleprotected": "Du kan ikke flytte en side til dette navnet, fordi den nye tittelen er beskyttet fra opprettelse.",
        "movetalk": "Flytt tilhørende diskusjonsside.",
        "pageinfo-category-files": "Antall filer",
        "pageinfo-user-id": "Bruker-ID",
        "pageinfo-file-hash": "Hash-verdi",
+       "pageinfo-view-protect-log": "Vis beskyttelsesloggen for denne siden.",
        "markaspatrolleddiff": "Merk som patruljert",
        "markaspatrolledtext": "Merk denne siden som patruljert",
        "markaspatrolledtext-file": "Merk denne filversjonen som patruljert",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Passordet kan ikke matche spesifikt svartelistede passord",
        "passwordpolicies-policy-maximalpasswordlength": "Passordet kan maksimalt være på $1 {{PLURAL:$1|tegn}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Passordet kan ikke være {{PLURAL:$1|det populære passordet|i lista over $1 populære passord}}",
-       "easydeflate-invaliddeflate": "Det gitte innholdet er ikke riktig komprimert"
+       "easydeflate-invaliddeflate": "Det gitte innholdet er ikke riktig komprimert",
+       "unprotected-js": "Av sikkerhetsårsaker kan ikke JavaScript lastes fra ubeskyttede sider. Bare skap JavaScript i MediaWiki-navnerommet eller som en brukerunderside"
 }
index aae8f3a..2eababd 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "Volglieste uutbreien, zodat alle wiezigingen zichtbaor bin, en niet allinnig de leste wieziging",
        "tog-usenewrc": "Groepeer wiezigingen per zied in \"Leste wiezigingen\" en \"Mien volglieste\"",
        "tog-numberheadings": "Koppen vanzelf nummeren",
-       "tog-showtoolbar": "Laot de warkbalke zien",
        "tog-editondblclick": "Mit dubbelklik bewarken",
        "tog-editsectiononrightclick": "Bewarken van deelziejen meugelik maken mit n rechtermuusklik op n tussenkop",
        "tog-watchcreations": "Spul wa'k anmake op mien volglieste zetten",
index e704dee..703be26 100644 (file)
@@ -25,7 +25,6 @@
        "tog-extendwatchlist": "Oppasslist utwieden, dat se all, un nich blot de jüngsten, wiest",
        "tog-usenewrc": "Utwiedt letzte Ännern (bruukt JavaScript)",
        "tog-numberheadings": "Överschrieven automatsch nummereern",
-       "tog-showtoolbar": "Editeer-Warktüüchlist wiesen",
        "tog-editondblclick": "Sieden mit Dubbelklick ännern (JavaScript)",
        "tog-editsectiononrightclick": "En Afsatz mit en Rechtsklick ännern (Javascript)",
        "tog-watchcreations": "Nee schrevene Sieden op miene Oppasslist setten",
index 89db104..9ba4fee 100644 (file)
@@ -41,7 +41,6 @@
        "tog-extendwatchlist": "निगरानी सूचीलाई सबै परिवर्तनहरू देखाउने गरी बढाउने, हालैको परिवर्तनहरू बाहेक",
        "tog-usenewrc": "पृष्ठका भर्खरका परिवर्तन र अवलोकन सूचीको आधारमा सामूहिक परिवर्तनहरू",
        "tog-numberheadings": "शीर्षकहरूलाई स्वत:अङ्कित गर्नुहोस्",
-       "tog-showtoolbar": "सम्पादन औजारबट्टा देखाउने",
        "tog-editondblclick": "दोहोरो क्लिकमा पृष्ठ सम्पादन गर्ने",
        "tog-editsectiononrightclick": "शीर्षकमा दाहिने क्लिकद्वारा खण्ड सम्पादन सक्षम पार्ने",
        "tog-watchcreations": "मेरो निगरानी सूचीमा मैले सृजना गरेको पृष्ठ र अपलोड जोड्ने",
index f5f54da..a0df914 100644 (file)
        "tog-extendwatchlist": "Volglijst uitbreiden om alle wijzigingen te tonen, en niet alleen de recentste",
        "tog-usenewrc": "Wijzigingen per pagina groeperen in recente wijzigingen en op mijn volglijst",
        "tog-numberheadings": "Koppen automatisch nummeren",
-       "tog-showtoolbar": "Bewerkingswerkbalk weergeven",
        "tog-editondblclick": "Dubbelklikken voor bewerken",
        "tog-editsectiononrightclick": "Bewerken van deelpagina’s mogelijk maken met een rechtermuisklik op een tussenkop",
        "tog-watchcreations": "Pagina's die ik aanmaak en bestanden die ik upload aan mijn volglijst toevoegen",
        "badarticleerror": "Deze handeling kan niet op deze pagina worden uitgevoerd.",
        "cannotdelete": "De pagina of het bestand \"$1\" kon niet verwijderd worden.\nMogelijk is deze al door iemand anders verwijderd.",
        "cannotdelete-title": "Pagina \"$1\" kan niet verwijderd worden",
+       "delete-scheduled": "De pagina \"$1\" staat voor verwijdering ingepland.\nEen ogenblik geduld alstublieft.",
        "delete-hook-aborted": "Het verwijderen is afgebroken door een hook.\nEr is geen toelichting beschikbaar.",
        "no-null-revision": "Het was niet mogelijk een lege nieuwe versie te maken voor de pagina \"$1\"",
        "badtitle": "Ongeldige paginanaam",
        "subject-preview": "Voorvertoning van het onderwerp:",
        "previewerrortext": "Er is een fout opgetreden tijdens het weergeven van uw wijzigingen.",
        "blockedtitle": "Gebruiker is geblokkeerd",
+       "blocked-email-user": "<strong>Uw gebruikersnaam is geblokkeerd voor het versturen van e-mail. U kunt nog steeds andere pagina's op deze wiki bewerken.</strong> U kunt de volledige details van de blokkade bekijken op de pagina met uw [[Special:MyContributions|gebruikersbijdragen]].\n\nDe blokkade is opgelegd door $1.\n\nDe opgegeven reden is <em>$2</em>.\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n* Blokkadenummer #$5",
+       "blockedtext-partial": "<strong>Uw gebruikersnaam of IP-adres is geblokkeerd voor het maken van veranderingen aan deze pgina. U kunt nog steeds andere pagina's op deze wiki bewerken.</strong> U kunt de volledige details van de blokkade bekijken op de pagina met uw [[Special:MyContributions|gebruikersbijdragen]].\n\nDe blokkade is opgelegd door $1.\n\nDe opgegeven reden is <em>$2</em>.\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n* Blokkadenummer #$5",
        "blockedtext": "'''Uw gebruikersaccount of IP-adres is geblokkeerd.'''\n\nDe blokkade is uitgevoerd door $1.\nDe opgegeven reden is ''$2''.\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nU kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] om de blokkade te bespreken.\nU kunt geen gebruik maken van de functie \"{{int:emailuser}}\", tenzij u een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.\nUw huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
        "autoblockedtext": "Uw IP-adres is automatisch geblokkeerd, omdat het gebruikt is door een andere gebruiker, die geblokkeerd is door $1.\nDe opgegeven reden is:\n\n:''$2''\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nU kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] om de blokkade te bespreken.\n\nU kunt geen gebruik maken van de functie \"{{int:emailuser}}\", tenzij u een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]], en het gebruik van deze functie niet is geblokkeerd.\n\nUw huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
        "systemblockedtext": "Uw gebruikersaccount of IP-adres is automatisch geblokkeerd door MediaWiki.\nDe opgegeven reden is:\n\n:<em>$2</em>\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nUw huidige IP-adres is $3.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
        "ipb-disableusertalk": "Deze gebruiker de mogelijkheid ontnemen om tijdens de blokkade de eigen overlegpagina te bewerken",
        "ipb-change-block": "De gebruiker opnieuw blokkeren met deze instellingen",
        "ipb-confirm": "Blokkade bevestigen",
+       "ipb-sitewide": "Sitebreed",
+       "ipb-partial": "Gedeeltelijk",
+       "ipb-type-label": "Type",
+       "ipb-pages-label": "Pagina's",
        "badipaddress": "Geen geldig IP-adres",
        "blockipsuccesssub": "De blokkering is ingesteld",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] is geblokkeerd.<br />\nZie de [[Special:BlockList|blokkadelijst]] voor recente blokkades.",
        "createaccountblock": "aanmaken accounts uitgeschakeld",
        "emailblock": "e-mail uitgeschakeld",
        "blocklist-nousertalk": "kan eigen overlegpagina niet bewerken",
+       "blocklist-editing": "bewerken",
+       "blocklist-editing-sitewide": "bewerken (gehele wiki)",
        "ipblocklist-empty": "De blokkeerlijst is leeg.",
        "ipblocklist-no-results": "Dit IP-adres of deze gebruikersnaam is niet geblokkeerd.",
        "blocklink": "blokkeren",
        "logentry-block-block": "$1 {{GENDER:$2|heeft}} {{GENDER:$4|$3}} geblokkeerd voor de duur van $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|heeft}} {{GENDER:$4|$3}} gedeblokkeerd",
        "logentry-block-reblock": "$1 {{GENDER:$2|heeft}} de blokkade voor {{GENDER:$4|$3}} aangepast. Deze vervalt nu op $5 $6",
+       "logentry-partialblock-block": "$1 heeft {{GENDER:$4|$3}} {{GENDER:$2|geblokkeerd}} van het bewerken van de {{PLURAL:$8|pagina|pagina's}} $7 met als vervaltijd $5 $6",
+       "logentry-partialblock-reblock": "$1 heeft de blokkade van {{GENDER:$4|$3}} voor het voorkomen van bewerkingen van de {{PLURAL:$8|pagina|pagina's}} $7 {{GENDER:$2|gewijzigd}} met als vervaltijd $5 $6",
+       "logentry-non-editing-block-block": "$1 heeft {{GENDER:$4|$3}} {{GENDER:$2|geblokkeerd}} van het uitvoeren van niet-bewerking gerelateerde handelingen met als vervaltijd $5 $6",
+       "logentry-non-editing-block-reblock": "$1 heeft de blokkade van {{GENDER:$4|$3}} voor het voorkomen van het uitvoeren van niet-bewerking gerelateerde handelingen {{GENDER:$2|gewijzigd}} met als vervaltijd $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|heeft}} {{GENDER:$4|$3}} geblokkeerd voor de duur van $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|heeft}} de blokkade voor {{GENDER:$4|$3}} aangepast. Deze vervalt nu op $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|heeft}} $3 geïmporteerd via een bestandsupload",
        "mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Voeg een categorie toe...",
        "mw-widgets-usersmultiselect-placeholder": "Meer toevoegen...",
+       "mw-widgets-titlesmultiselect-placeholder": "Meer toevoegen...",
        "date-range-from": "Vanaf datum:",
        "date-range-to": "Tot datum:",
        "sessionmanager-tie": "Het is niet mogelijk om meerdere authenticatietypen voor verzoeken te combineren: $1.",
        "passwordpolicies-policy-passwordcannotmatchusername": "Wachtwoord mag niet hetzelfde zijn als de gebruikersnaam",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Wachtwoord mag niet overeenkomen met wachtwoorden op de zwarte lijst",
        "passwordpolicies-policy-maximalpasswordlength": "Wachtwoord moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten",
-       "passwordpolicies-policy-passwordcannotbepopular": "Watchwoord mag niet {{PLURAL:$1|overeenkomen met het bekende wachtwoord|voorkomen in de lijst met $1 bekende wachtwoorden}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "Watchwoord mag niet {{PLURAL:$1|overeenkomen met het bekende wachtwoord|voorkomen in de lijst met $1 bekende wachtwoorden}}",
+       "unprotected-js": "Vanwege veiligheidsredenen kan er geen JavaScript geladen worden vanaf onbeveiligde pagina's. Gelieve alleen JavaScript pagina's aan te maken in de MediaWiki: naamruimte of als een subpagina van een gebruikerspagina."
 }
index 6959f88..10ff132 100644 (file)
@@ -38,7 +38,6 @@
        "tog-extendwatchlist": "Utvid overvakingslista til å vise alle endringane, ikkje berre dei siste",
        "tog-usenewrc": "Grupper endringar etter side i siste endringane og på overvakingslista",
        "tog-numberheadings": "Vis nummererte overskrifter",
-       "tog-showtoolbar": "Vis endringsverktøyline",
        "tog-editondblclick": "Endre sider med dobbeltklikk",
        "tog-editsectiononrightclick": "Endre avsnitt ved å høgreklikke på avsnittsoverskrifter",
        "tog-watchcreations": "Legg til sidene eg opprettar og filene eg lastar opp på overvakingslista mi",
        "search-redirect": "(omdirigering frå $1)",
        "search-section": "(bolken $1)",
        "search-category": "(kategorien $1)",
+       "search-file-match": "(passar med filinnhald)",
        "search-suggest": "Meinte du: «$1»",
        "search-rewritten": "Viser resultat for $1. Søk i staden etter $2.",
        "search-interwiki-caption": "Resultat frå systerprosjekt",
index 38e4253..751a098 100644 (file)
@@ -10,7 +10,6 @@
        },
        "tog-underline": "Tsenya mothalafase go dihlomaganyo:",
        "tog-hideminor": "Fihla diphetogo tše nnyenyane",
-       "tog-showtoolbar": "Bontšha ''toolbar'' yago fetola",
        "tog-editondblclick": "Fetola matlakala ka go thathapa gabedi",
        "tog-editsectiononrightclick": "Dumella go fetola sekgao ka thathapa ka lagoja thaetlele ya sekgao",
        "tog-watchcreations": "Tsenya matlaka a mafsa ao ke a ngwalago go lenano laka la ditlhapetšo",
index 6913368..bf08d5c 100644 (file)
@@ -32,7 +32,6 @@
        "tog-extendwatchlist": "Espandir la lista de seguiment per afichar totas las modificacions e non pas solament las mai recentas",
        "tog-usenewrc": "Agropar los cambiaments per pagina dins los darrièrs cambiaments e la lista de seguiment",
        "tog-numberheadings": "Numerotar automaticament los títols",
-       "tog-showtoolbar": "Far veire la barra d'aisinas de modificacion (necessita JavaScript)",
        "tog-editondblclick": "Modificar de paginas amb un clic doble (necessita JavaScript)",
        "tog-editsectiononrightclick": "Activar la modificacion de seccions en fasent un clic dreit suls títols (necessita JavaScript)",
        "tog-watchcreations": "Apondre las paginas que creï e los fichièrs qu'impòrti a ma lista de seguiment",
index c9dc411..8a54239 100644 (file)
@@ -18,7 +18,6 @@
        "tog-extendwatchlist": "Levitä valvonduluvettelo ku ozuttua kai muutokset, ei vaiku jälgimäzii",
        "tog-usenewrc": "Ryhmittele muutokset sivun mugah uuzien muutoksien listal da valvonduluvettelol",
        "tog-numberheadings": "Automuattizesti numeroija kirjutuksien nimet",
-       "tog-showtoolbar": "Ozuta ruadovälinehpalki",
        "tog-editondblclick": "Edituiče sivuloi kaksoispainalduksel",
        "tog-editsectiononrightclick": "Kohendele sektsielöi painamal sektsien nimie hiiren oigiel näppäimel",
        "tog-watchcreations": "Ližiä minun luajitut sivut da ližätyt failat minun valvonduluvetteloh",
index 340a33a..a1417bd 100644 (file)
@@ -27,7 +27,6 @@
        "tog-extendwatchlist": "କେବଳ ନଗଦ ହିଁ ନୁହେଁ, ସବୁଯାକ ବଦଳକୁ ଦେଖାଇବା ପାଇଁ ଦେଖଣାତାଲିକାକୁ ପୂରା ଦେଖାଇବେ",
        "tog-usenewrc": "ନଗଦ ବଦଳରେ ପୃଷ୍ଠା ଅନୁଯାୟୀ ଗୋଷ୍ଠୀ ବଦଳ ଏବଂ ଦେଖଣା",
        "tog-numberheadings": "ଆପେଆପେ-ସଂଖ୍ୟାର ନାମଗୁଡ଼ିକ",
-       "tog-showtoolbar": "ସମ୍ପାଦନା ଟୁଲବାର ଦେଖାଇବେ",
        "tog-editondblclick": "ଦୁଇଥର କ୍ଲିକରେ ପୃଷ୍ଠା ବଦଳାଇବେ",
        "tog-editsectiononrightclick": "ବିଭାଗ ନାମରେ ଡାହାଣ କ୍ଲିକ କରି ବିଭାଗ ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ",
        "tog-watchcreations": "ମୋ ତିଆରି ପୃଷ୍ଠାସବୁକୁ ଏବଂ ମୋ ଅପଲୋଡ଼ଗୁଡ଼ିକୁ ମୋର ଦେଖଣାତାଲିକାରେ ଯୋଡ଼ନ୍ତୁ",
index 369e367..7be98b5 100644 (file)
@@ -18,7 +18,6 @@
        "tog-extendwatchlist": "Стырдæр цæстдард номхыгъд алы ивдимæ дæр, æрмæст фæстагимæ нал.",
        "tog-usenewrc": "Фæстаг æмæ цæстдард ивдтытæ фарсмæ гæсгæ иу кæнæт (домы JavaScript)",
        "tog-numberheadings": "Сæртæн хæдæвзæргæ номыр æвæрын",
-       "tog-showtoolbar": "Æвдисын ивыны панел (домы JavaScript)",
        "tog-editondblclick": "Фæрстæ дыкъæппæй ив (домы JavaScript)",
        "tog-editsectiononrightclick": "Хайы сæргондыл рахиз æркъæппæй ивыны фадат баиу кæнын",
        "tog-watchcreations": "Æз цы фæрстæ аразын æмæ цы файлтæ бавгæнын, уыдон мæ цæстдард уæнт.",
index e9ed794..f4874f7 100644 (file)
@@ -38,7 +38,6 @@
        "tog-extendwatchlist": "ਸਿਰਫ਼ ਤਾਜ਼ਾ ਹੀ ਨਹੀਂ, ਸਗੋਂ ਸਾਰੀਆਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਵਖਾਉਣ ਲਈ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਨੂੰ ਵਧਾਓ",
        "tog-usenewrc": "ਹਾਲੀਆ ਤਬਦੀਲੀਆਂ ਅਤੇ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਸਫ਼ੇ ਮੁਤਾਬਕ ਤਬਦੀਲੀਆਂ ਦੇ ਗਰੁੱਪ ਬਣਾਓ (ਜਾਵਾਸਕਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)",
        "tog-numberheadings": "ਆਟੋ-ਨੰਬਰ ਸਿਰਨਾਵੇਂ",
-       "tog-showtoolbar": "ਸੋਧ ਸੰਦਬਕਸਾ ਵੇਖੋ",
        "tog-editondblclick": "ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰਨ 'ਤੇ ਸਫ਼ੇ ਸੋਧੋ",
        "tog-editsectiononrightclick": "ਸੈਕਸ਼ਨ ਸਿਰਲੇਖਾਂ ’ਤੇ ਸੱਜੀ ਕਲਿੱਕ ਨਾਲ਼ ਸੋਧ ਚਾਲੂ ਕਰੋ (ਜਾਵਾਸਕਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)",
        "tog-watchcreations": "ਮੇਰੇ ਵਲੋਂ ਬਣਾਏ ਗਏ ਸਫ਼ੇ ਅਤੇ ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ",
index ade2ce4..449c63d 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "Dagdagan la reng babanten ba lang palto deng anggang mialilan, aliwa mu deng pekabayu.",
        "tog-usenewrc": "↓mesanting la reng bayung mengayalili (JavaScript)",
        "tog-numberheadings": "Tambing lang dinan nomiru deng pamagat",
-       "tog-showtoolbar": "Ipakit ya panaliling toolbar",
        "tog-editondblclick": "Iyalilan la reng bulung king dobling klik",
        "tog-editsectiononrightclick": "Paganan ya ing pamag-edit seksiyon (section editing) kapamilatan ning pamag right click kareng pamagat da reng seksiyon",
        "tog-watchcreations": "Idagdag la deng bulung a lelengan ku kareng babanten",
index 9e3fddb..e6f3335 100644 (file)
@@ -13,7 +13,6 @@
        "tog-newpageshidepatrolled": "Muche ches paches pormenées del lisse ed ches nouvèles paches",
        "tog-extendwatchlist": "Étènne l'lisse pou vir tortous ches cangemints, poin seulemint ches nouvieus",
        "tog-numberheadings": "liméro automatique ed ches intétes",
-       "tog-showtoolbar": "Afiquer chés otis pou l'édichon (i feut JavaScript)",
        "tog-editondblclick": "Éditer ches paches aveuc un doube buke (i feut JavaScript)",
        "tog-editsectiononrightclick": "Pérmet l'édichion del sekchion par un droé buke su ch'tite del sekchion (i feut JavaScript)",
        "tog-watchcreations": "Ajouter chés paches qu'éj crée et pi chés fichiés qu'éj téléquertche édseur em lisse à suire",
index 3aa864a..4ee1f81 100644 (file)
@@ -15,7 +15,6 @@
        "tog-hideminor": "Vaschdeggl klääne Beawaidunge vunde „Ledschde Ännarunge“",
        "tog-hidepatrolled": "Vaschdeggl gsischdede Ännarunge inde „Ledschde Ännarunge“",
        "tog-extendwatchlist": "Zaisch alle Ännarunge unn nedd nua die ledschde",
-       "tog-showtoolbar": "Weagzaisch fas Schaffe zaische",
        "tog-previewontop": "VoAbligg owwahalwb vum Beawaidungsfenschda zaische",
        "tog-previewonfirst": "Zaischn Voabligg baim erschdemol Schaffe",
        "tog-oldsig": "Voahonneni Unnaschrifd",
index d1b6bfa..f57e84b 100644 (file)
        "tog-extendwatchlist": "Pokazuj na liście obserwowanych wszystkie zmiany, nie tylko ostatnie",
        "tog-usenewrc": "Grupuj zmiany według stron na liście ostatnich zmian i obserwowanych",
        "tog-numberheadings": "Automatyczna numeracja nagłówków",
-       "tog-showtoolbar": "Pokaż pasek narzędzi",
        "tog-editondblclick": "Podwójne kliknięcie rozpoczyna edycję",
        "tog-editsectiononrightclick": "Kliknięcie prawym klawiszem myszy na tytule sekcji rozpoczyna jej edycję",
        "tog-watchcreations": "Dodawaj do obserwowanych tworzone przeze mnie strony oraz przesyłane przeze mnie pliki",
        "subject-preview": "Podgląd tematu:",
        "previewerrortext": "Wystąpił błąd podczas próby podglądu Twoich zmian.",
        "blockedtitle": "Użytkownik jest zablokowany",
+       "blocked-email-user": "<strong>Twoje konto zostało wyłączone z wysyłania wiadomości emaili innym użytkownikom. Wciąż możesz edytować inne strony na wiki.</strong> Więcej szczegółów na temat blokady znajdziesz na swojej [[Special:MyContributions|stroni wkładu]].\n\nBlokada została nałożona przez $1.\n\nPodany powód to: <em>$2</em>.\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zablokowany został: $7\n* Identyfikator blokady: #$5",
+       "blockedtext-partial": "<strong>Twoje konto lub adres IP zostało wyłączone z dokonywania zmian na tej stronie. Wciąż możesz edytować inne strony na wiki.</strong> Więcej szczegółów na temat blokady znajdziesz na swojej [[Special:MyContributions|stroni wkładu]].\n\nBlokada została nałożona przez $1.\n\nPodany powód to: <em>$2</em>.\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zablokowany został: $7\n* Identyfikator blokady: #$5",
        "blockedtext": "<strong>Twoje konto lub adres IP zostały zablokowane.</strong>\n\nBlokada została nałożona przez $1.\nPodany powód to: <em>$2</em>.\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zablokowany został: $7\n\nW celu wyjaśnienia przyczyny zablokowania możesz się skontaktować z $1 lub innym [[{{MediaWiki:Grouppage-sysop}}|administratorem]].\nNie możesz użyć funkcji „{{int:emailuser}}”, jeśli brak jest poprawnego adresu e‐mail w Twoich [[Special:Preferences|preferencjach]] lub jeśli taka możliwość została Ci zablokowana.\nTwój obecny adres IP to $3, a numer identyfikacyjny blokady to #$5.\nProsimy o podanie obu tych informacji przy wyjaśnianiu blokady.",
        "autoblockedtext": "Ten adres IP został zablokowany automatycznie, gdyż korzysta z niego inny użytkownik, zablokowany przez administratora $1.\nPowód blokady:\n\n:<em>$2</em>\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zablokowany został: $7\n\nMożesz skontaktować się z $1 lub jednym z pozostałych [[{{MediaWiki:Grouppage-sysop}}|administratorów]] w celu uzyskania informacji o blokadzie.\n\nNie możesz użyć funkcji „{{int:emailuser}}”, jeśli brak jest poprawnego adresu e‐mail w Twoich [[Special:Preferences|preferencjach]] lub jeśli taka możliwość została Ci zablokowana.\n\nTwój obecny adres IP to $3, a numer identyfikacyjny blokady to #$5.\nProsimy o podanie obu tych numerów przy wyjaśnianiu blokady.",
        "systemblockedtext": "Twoja nazwa użytkownika lub adres IP zostały automatycznie zablokowane przez MediaWiki.\nPodany powód to:\n\n:<em>$2</em>\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zamierzano zablokować: $7\n\nTwój obecny adres IP to $3.\nProsimy o dołączenie powyższych szczegółów w jakichkolwiek zadawanych pytaniach.",
        "ipb-disableusertalk": "Zablokuj możliwość edytowania przez tego użytkownika własnej strony dyskusji w czasie trwania blokady.",
        "ipb-change-block": "Zmień ustawienia blokady",
        "ipb-confirm": "Potwierdzam blokadę",
+       "ipb-sitewide": "Globalna",
+       "ipb-partial": "Częściowa",
+       "ipb-type-label": "Rodzaj",
+       "ipb-pages-label": "Strony",
        "badipaddress": "Niepoprawny adres IP",
        "blockipsuccesssub": "Zablokowanie powiodło się",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] {{GENDER:$1|został zablokowany|została zablokowana}}.<br />\nPrzejdź do [[Special:BlockList|listy blokad]], by przejrzeć blokady.",
        "tag-mw-rollback": "Wycofanie zmian",
        "tag-mw-rollback-description": "Edycja, która przywraca poprzednią wersję przy użyciu funkcji cofania zmian (rollback)",
        "tag-mw-undo": "Anulowanie edycji",
-       "tag-mw-undo-description": "Edycje, które są wycofaniem poprzednich edycji przy użyciu linku \"anuluj edycję\"",
+       "tag-mw-undo-description": "Edycje, które są wycofaniem poprzednich edycji przy użyciu linku „anuluj edycję”",
        "tags-title": "Znaczniki",
        "tags-intro": "Na tej stronie znajduje się lista znaczników, którymi oprogramowanie może oznaczyć edycje, oraz ich opisy.",
        "tags-tag": "Nazwa znacznika",
        "logentry-block-block": "$1 {{GENDER:$2|zablokował|zablokowała|zablokował(a)}} {{GENDER:$4|$3}}, czas blokady: $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|zdjął|zdjęła}} blokadę z {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|zmienił|zmieniła}} ustawienia blokady dla {{GENDER:$4|$3}}, czas blokady: $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|wyłączył|wyłączyła}} {{GENDER:$4|$3}} z edytowania {{PLURAL:$8|strony|stron}} $7, czas blokady: $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|zmienił|zmieniła}} ustawienia wyłączenia {{GENDER:$4|$3}} z edytowania {{PLURAL:$8|strony|stron}} $7, czas blokady: $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|zablokował|zablokowała}} {{GENDER:$4|$3}} wykonywanie operacji nieedycyjnych, czas blokady: $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{PLURAL:$2|zmienił|zmieniła}} ustawienia blokady wykonywania operacji nieedycyjnych {{GENDER:$4|$3}}, czas blokady: $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|zablokował|zablokowała}} {{GENDER:$4|$3}}, czas blokady: $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|zmienił|zmieniła}} ustawienia blokady dla {{GENDER:$4|$3}}, czas blokady: $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|zaimportował|zaimportowała}} $3 poprzez przesłanie pliku",
        "mw-widgets-titleinput-description-redirect": "przekierowanie do $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategorię...",
        "mw-widgets-usersmultiselect-placeholder": "Dodaj więcej...",
+       "mw-widgets-titlesmultiselect-placeholder": "Dodaj więcej…",
        "date-range-from": "Od daty:",
        "date-range-to": "Do daty:",
        "sessionmanager-tie": "Nie można łączyć kilku rodzajów uwierzytelniania dla zapytania: $1.",
        "passwordpolicies-policy-minimumpasswordlengthtologin": "Aby się zalogować, hasło musi mieć co najmniej $1 {{PLURAL:$1|znak|znaki|znaków}}",
        "passwordpolicies-policy-passwordcannotmatchusername": "Hasło nie może być takie samo jak nazwa użytkownika",
        "passwordpolicies-policy-maximalpasswordlength": "Hasło musi mieć mniej niż $1 {{PLURAL:$1|znak|znaki|znaków}}",
-       "passwordpolicies-policy-passwordcannotbepopular": "Hasło nie może być {{PLURAL:$1|popularne|na liście $1 popularnych haseł}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "Hasło nie może być {{PLURAL:$1|popularne|na liście $1 popularnych haseł}}",
+       "unprotected-js": "Ze względów bezpieczeństwa kod JavaScript nie może zostać załadowany z niezabezpieczonych stron. Prosimy dodawać JavaScript w przestrzeni MediaWiki lub jako podstronę strony użytkownika."
 }
index fcd5b19..78b9847 100644 (file)
@@ -31,7 +31,6 @@
        "tog-extendwatchlist": "Slarghé la lista ëd ròba che as ten sot-euj an manera che a la smon-a tute le modìfiche, nen mach j'ùltime",
        "tog-usenewrc": "Argropré le modìfiche për pàgina ant j'ùltime modìfiche e ant la lista dla ròba ch'as ten sot-euj",
        "tog-numberheadings": "Tìtoj ëd paràgraf<br />che as nùmero daspërlor",
-       "tog-showtoolbar": "Smon-e la bara dj'utiss ëd modìfica",
        "tog-editondblclick": "Dobia sgnacà për modifiché la pàgina",
        "tog-editsectiononrightclick": "Abilité la modìfica dle session ën sgnacand-je ansima ai tìtoj col tast drit dël rat",
        "tog-watchcreations": "Gionté le pàgine che i creo mi e j'archivi che i cario mi a la lista ëd lòn che im ten-o sot-euj",
index 449de37..249b0d1 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "نظر تھلے رکھے صفحے نوں ودھاو, تاں جے اوہ تبدیلیاں جیڑیاں کم دے قابل نیں ویکھیاں جا سکن",
        "tog-usenewrc": "نویاں تبدیلیاں اتے میری اکھ تھلے لسٹ وچ صفحہ وار گروپ تبدیلیاں",
        "tog-numberheadings": "آپ نمبر دین والیاں سرخیاں",
-       "tog-showtoolbar": "ایڈٹ ٹولبار وکھاؤ",
        "tog-editondblclick": "صفیاں تے ڈبل کلک کرن تے تبدیلیاں لیاؤ",
        "tog-editsectiononrightclick": "سیکشن سرخی تے تبدیلی لیاؤ سجے کلک نال",
        "tog-watchcreations": "صفے جیہڑے میں بناندا واں تے جیہڑیاں فائیلاں میں چڑھائواں اوہ میری اکھ تھلے لسٹ چ کر دیو",
index 27f1641..14e9e04 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "Waidinnais en listin stēisan nadirītan wissans, ni tēr panzdaumans kitawīdinsnans",
        "tog-usenewrc": "Tērpaus plattinsenin stēisan panzdauman kitawīdinsnan (izkīnina JavaScript)",
        "tog-numberheadings": "Autōmatiska galwasrīndan nummerinsna",
-       "tog-showtoolbar": "Waidinnais sawinzlin stēisan pagaptin (JavaScript)",
        "tog-editondblclick": "Redigīs pāusans pra dwigubban pellis gnesnan (JavaScript)",
        "tog-editsectiononrightclick": "Ermazīnginais redigīsnan stēisan pāusas sekciōnin pra tikrōman pellis knuppas gnesnan na tenesses tītelin",
        "tog-watchcreations": "Preidāis pāusans kawīdans as teīke prei majjan listin stēisan nadirītan",
index 69f317b..0440396 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "يوازې د وروستني بدلونونو د ښکاره کولو لپاره نه بلکه د ټولو بدلونونو د ښکاره کولو لپاره کتنلړ غځول",
        "tog-usenewrc": "په کتنلړ او وروستي بدلونو مخ باندې ډله ايز بدلونونه",
        "tog-numberheadings": "د سرليکونو خپلکاره شمېرايښودنه",
-       "tog-showtoolbar": "د سمون اوزارپټه ښکاره کول",
        "tog-editondblclick": "په دوه کلېک سره د مخونو سمون",
        "tog-editsectiononrightclick": "د ليکنې د يوې برخې په سرليک ښي کلېک کول د هغې برخې سمون چارنوي",
        "tog-watchcreations": "زما کتنلړ کې دې هغه مخونه چې زه يې جوړوم او هغه دوتنې چې زه يې پورته کوم ورگډې شي",
index 91a00b2..7feae69 100644 (file)
        "tog-extendwatchlist": "Expandir a lista de páginas vigiadas para mostrar todas as mudanças, não apenas as mais recentes",
        "tog-usenewrc": "Agrupar alterações por páginas nas mudanças recentes e nas páginas vigiadas",
        "tog-numberheadings": "Auto-numerar cabeçalhos",
-       "tog-showtoolbar": "Mostrar barra de ferramentas de edição",
        "tog-editondblclick": "Editar páginas no clique duplo",
        "tog-editsectiononrightclick": "Habilitar edição de seção por clique com o botão direito no título da seção (requer JavaScript)",
        "tog-watchcreations": "Adicionar as páginas e arquivos que \neu criar à minha lista de páginas vigiadas",
        "subject-preview": "Previsão do assunto/título:",
        "previewerrortext": "Ocorreu um erro ao tentar pré-visualizar suas alterações.",
        "blockedtitle": "O usuário está bloqueado",
+       "blocked-email-user": "<strong>O seu nome de usuário recebeu um bloqueio que impede o envio de e-mail. Pode, ainda assim, editar outras páginas desta wiki.</strong> Os detalhes completos do bloqueio podem ser vistos nas [[Special:MyContributions|contribuições da conta]].\n\nO bloqueio foi feito por $1.\n\nO motivo apresentado é <em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Alvo especificado: $7\n* Identificador do bloqueio #$5",
+       "blockedtext-partial": "<strong>O seu nome de usuário ou endereço IP recebeu um bloqueio que o impede de fazer alterações a esta página. Pode, ainda assim, editar outras páginas desta wiki.</strong> Os detalhes completos do bloqueio podem ser vistos nas [[Special:MyContributions|contribuições da conta]].\n\nO bloqueio foi feito por $1.\n\nO motivo apresentado é <em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Alvo especificado: $7\n* Identificador do bloqueio #$5",
        "blockedtext": "<strong>O seu nome de usuário ou endereço IP foram bloqueados.</strong>\n\nO bloqueio foi realizado por $1.\nO motivo apresentado foi <em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nPode contactar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir o bloqueio.\nNote que para utilizar a funcionalidade \"{{int:emailuser}}\" precisa de ter um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] e de não lhe ter sido bloqueado o uso desta funcionalidade.\nO seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.\nInclua todos os detalhes acima em quaisquer contatos relacionados com este bloqueio, por favor.",
        "autoblockedtext": "O seu endereço IP foi bloqueado de forma automática porque foi utilizado recentemente por outro usuário, o qual foi bloqueado por $1.\nO motivo apresentado foi:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nPode contactar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir o bloqueio.\n\nNote que para utilizar a funcionalidade \"{{int:emailuser}}\" precisa de ter um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] e de não lhe ter sido bloqueado o uso desta funcionalidade.\n\nO seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.\nInclua todos os detalhes acima em quaisquer contatos relacionados com este bloqueio, por favor.",
        "systemblockedtext": "O seu nome de usuário ou endereço IP foram bloqueados automaticamente pelo MediaWiki.\nO motivo fornecido é:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nO seu endereço IP atual é $3.\nInclua todos os detalhes acima em quaisquer contatos sobre este assunto, por favor.",
        "ipb-disableusertalk": "Impedir que este(a) usuário(a) edite a sua página de discussão enquanto estiver bloqueado(a)",
        "ipb-change-block": "Bloquear o usuário novamente com estes parâmetros",
        "ipb-confirm": "Confirmar bloqueio",
+       "ipb-sitewide": "Em todo o site",
+       "ipb-partial": "Parcial",
+       "ipb-type-label": "Tipo",
+       "ipb-pages-label": "Páginas",
        "badipaddress": "Endereço de IP inválido",
        "blockipsuccesssub": "Bloqueio bem sucedido",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />\nConsulte a [[Special:BlockList|lista de bloqueios]].",
        "createaccountblock": "criação de conta bloqueada",
        "emailblock": "impedido de enviar e-mail",
        "blocklist-nousertalk": "impossibilitado de editar a própria página de discussão",
+       "blocklist-editing": "edição",
+       "blocklist-editing-sitewide": "edição (todo o site)",
        "ipblocklist-empty": "A lista de bloqueios encontra-se vazia.",
        "ipblocklist-no-results": "O endereço de IP ou nome de usuário procurado não se encontra bloqueado.",
        "blocklink": "bloquear",
        "logentry-block-block": "$1 {{GENDER:$2|bloqueou}} {{GENDER:$4|$3}} com um tempo de expiração de $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|desbloqueou}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|modificou}} configurações de bloqueio para {{GENDER:$4|$3}} com um tempo de expiração de $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|aplicou a}} {{GENDER:$4|$3}} um bloqueio que impede a edição {{PLURAL:$8|da página|das páginas}} $7 com um prazo de expiração de $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|alterou}} as definições do bloqueio de {{GENDER:$4|$3}} para impedir a edição {{PLURAL:$8|da página|das páginas}} $7 com um prazo de expiração de $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|aplicou a}} {{GENDER:$4|$3}} um bloqueio que impede as operações que não sejam edições, com um prazo de expiração de $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|alterou}} as definições do bloqueio de {{GENDER:$4|$3}} para impedir as operações que não sejam edições, com um prazo de expiração de $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloqueou}} {{GENDER:$4|$3}} com um tempo de expiração de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|modificou}} configurações de bloqueio de {{GENDER:$4|$3}} com um tempo de expiração de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importado}} $3 por envio de arquivo",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Adicionar uma categoria...",
        "mw-widgets-usersmultiselect-placeholder": "Adicionar mais…",
+       "mw-widgets-titlesmultiselect-placeholder": "Adicionar mais…",
        "date-range-from": "Da data:",
        "date-range-to": "Para data:",
        "sessionmanager-tie": "Não é possível combinar vários tipos de autenticação de solicitação: $1.",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "A senha não pode corresponder senhas especificamente na lista negra",
        "passwordpolicies-policy-maximalpasswordlength": "A senha deve ser menor que $1 {{PLURAL:$1|caráter|caracteres}}",
        "passwordpolicies-policy-passwordcannotbepopular": "A senha não pode {{PLURAL:$1|ser a mais popular|estar na lista das $1 palavras-passe mais populares}}",
-       "easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido"
+       "easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido",
+       "unprotected-js": "Por razões de segurança o JavaScript não pode ser carregado de páginas desprotegidas. Por favor, crie apenas javascript no MediaWiki: namespace ou como uma subpágina do usuário"
 }
index f3ee41d..c81f4e7 100644 (file)
@@ -89,7 +89,6 @@
        "tog-extendwatchlist": "Listagem expandida de todas as mudanças às páginas vigiadas, não apenas das mais recentes",
        "tog-usenewrc": "Agrupar alterações por página nas mudanças recentes e páginas vigiadas",
        "tog-numberheadings": "Numerar cabeçalhos automaticamente",
-       "tog-showtoolbar": "Mostrar barra de edição",
        "tog-editondblclick": "Editar páginas quando houver um clique duplo",
        "tog-editsectiononrightclick": "Possibilitar a edição de secções por clique com o botão direito no título da secção",
        "tog-watchcreations": "Adicionar as páginas e ficheiros que eu criar às minhas páginas vigiadas",
        "and": "&#32;e",
        "faq": "Perguntas frequentes",
        "actions": "Ações",
-       "namespaces": "Domínios",
+       "namespaces": "Espaços nominais",
        "variants": "Variantes",
        "navigation-heading": "Menu de navegação",
        "errorpagetitle": "Erro",
        "subject-preview": "Antevisão do assunto:",
        "previewerrortext": "Ocorreu um erro enquanto tentava antever as suas alterações.",
        "blockedtitle": "O utilizador está bloqueado",
+       "blocked-email-user": "<strong>O seu nome de utilizador recebeu um bloqueio que impede o envio de correio eletrónico. Pode, ainda assim, editar outras páginas desta wiki.</strong> Os detalhes completos do bloqueio podem ser vistos nas [[Special:MyContributions|contribuições da conta]].\n\nO bloqueio foi feito por $1.\n\nO motivo apresentado é <em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Alvo especificado: $7\n* Identificador do bloqueio #$5",
+       "blockedtext-partial": "<strong>O seu nome de utilizador ou endereço IP recebeu um bloqueio que o impede de fazer alterações a esta página. Pode, ainda assim, editar outras páginas desta wiki.</strong> Os detalhes completos do bloqueio podem ser vistos nas [[Special:MyContributions|contribuições da conta]].\n\nO bloqueio foi feito por $1.\n\nO motivo apresentado é <em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Alvo especificado: $7\n* Identificador do bloqueio #$5",
        "blockedtext": "<strong>O seu nome de utilizador ou endereço IP foram bloqueados.</strong>\n\nO bloqueio foi realizado por $1.\nO motivo apresentado foi <em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nPode contactar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir o bloqueio.\nNote que para utilizar a funcionalidade \"{{int:emailuser}}\" precisa de ter um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências]] e de não lhe ter sido bloqueado o uso desta funcionalidade.\nO seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.\nInclua todos os detalhes acima em quaisquer contactos relacionados com este bloqueio, por favor.",
        "autoblockedtext": "O seu endereço IP foi bloqueado de forma automática porque foi utilizado recentemente por outro utilizador, o qual foi bloqueado por $1.\nO motivo apresentado foi:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nPode contactar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir o bloqueio.\n\nNote que para utilizar a funcionalidade \"{{int:emailuser}}\" precisa de ter um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências]] e de não lhe ter sido bloqueado o uso desta funcionalidade.\n\nO seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.\nInclua todos os detalhes acima em quaisquer contactos relacionados com este bloqueio, por favor.",
        "systemblockedtext": "O seu nome de utilizador ou endereço IP foram bloqueados automaticamente pelo MediaWiki.\nO motivo fornecido é:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nO seu endereço IP atual é $3.\nInclua todos os detalhes acima em quaisquer contactos sobre este assunto, por favor.",
        "content-model-json": "JSON",
        "content-json-empty-object": "Objeto vazio",
        "content-json-empty-array": "Matriz vazia",
-       "deprecated-self-close-category": "Páginas com etiquetas HTML auto-fechadas inválidas",
-       "deprecated-self-close-category-desc": "Esta página contém etiquetas HTML auto-fechadas, que são inválidas, tais como <code>&lt;b/></code> ou <code>&lt;span/></code>. O comportamento destas etiquetas será alterado em breve, para ser consistente com a especificação HTML5, pelo que o seu uso no texto wiki foi descontinuado.",
+       "deprecated-self-close-category": "Páginas com etiquetas HTML autofechadas inválidas",
+       "deprecated-self-close-category-desc": "Esta página contém etiquetas HTML autofechadas, que são inválidas, tais como <code>&lt;b/></code> e <code>&lt;span/></code>. O comportamento destas etiquetas será alterado em breve, para ser consistente com a especificação HTML5, pelo que o seu uso no texto wiki foi descontinuado.",
        "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] chama [[:$2]] com mais de um valor para o parâmetro \"$3\". Somente o último valor fornecido será utilizado.",
        "duplicate-args-category": "Páginas com argumentos de predefinições duplicados",
        "duplicate-args-category-desc": "A página contém chamadas de predefinições que passam à predefinição argumentos duplicados, tais como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "email-allow-new-users-label": "Permitir mensagens de correio de utilizadores novos",
        "email-blacklist-label": "Proibir estes utilizadores de me enviarem correio eletrónico:",
        "prefs-searchoptions": "Pesquisa",
-       "prefs-namespaces": "Domínios",
+       "prefs-namespaces": "Espaços nominais",
        "default": "padrão",
        "prefs-files": "Ficheiros",
        "prefs-custom-css": "CSS personalizado",
        "prefixindex": "Todas as páginas iniciadas por",
        "prefixindex-namespace": "Todas as páginas com prefixo (espaço nominal $1)",
        "prefixindex-submit": "Mostrar",
-       "prefixindex-strip": "Remover prefixo",
+       "prefixindex-strip": "Esconder o prefixo nos resultados",
        "shortpages": "Páginas curtas",
        "longpages": "Páginas longas",
        "deadendpages": "Páginas sem saída",
        "apisandbox-dynamic-error-exists": "Um parâmetro com o nome \"$1\" já existe.",
        "apisandbox-templated-parameter-reason": "Este [[Special:ApiHelp/main#main/templatedparams|parâmetro modelado]] é oferecido com base {{PLURAL:$1|no valor|nos valores}} de $2.",
        "apisandbox-deprecated-parameters": "Parâmetros obsoletos",
-       "apisandbox-fetch-token": "Auto-preencher o token",
+       "apisandbox-fetch-token": "Preencher automaticamente a chave",
        "apisandbox-add-multi": "Adicionar",
        "apisandbox-submit-invalid-fields-title": "Alguns campos são inválidos",
        "apisandbox-submit-invalid-fields-message": "Por favor, corrija os campos marcados e tente novamente.",
        "trackingcategories-desc": "Critérios de inclusão",
        "restricted-displaytitle-ignored": "Páginas com títulos de apresentação ignorados",
        "restricted-displaytitle-ignored-desc": "Esta página tem um <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ignorado porque não é equivalente ao título verdadeiro da página.",
-       "noindex-category-desc": "A página não é indexada por robôs porque contém a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está num domínio onde esta palavra mágica é permitida.",
-       "index-category-desc": "A página contém a palavra mágica <code><nowiki>__INDEX__</nowiki></code> (e está num domínio em que essa marca é permitida) e, portanto, será indexada pelos robôs mesmo quando normalmente não o seria.",
+       "noindex-category-desc": "A página não é indexada por robôs porque contém a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está num espaço nominal onde esta palavra mágica é permitida.",
+       "index-category-desc": "A página contém a palavra mágica <code><nowiki>__INDEX__</nowiki></code> (e está num espaço nominal em que esta palavra é permitida) e, portanto, será indexada por robôs mesmo quando normalmente não o seria.",
        "post-expand-template-inclusion-category-desc": "O tamanho da página é superior a <code>$wgMaxArticleSize</code>, após a expansão de todas as predefinições, pelo que algumas predefinições não foram expandidas.",
-       "post-expand-template-argument-category-desc": "O tamanho da página é superior a <code>$wgMaxArticleSize</code>, após a expansão de um argumento de predefinição (algo em chavetas triplas, como <code>{{{Foo}}}</code>).",
-       "expensive-parserfunction-category-desc": "A página tem demasiadas funções do analisador custosas (como <code>#ifexist</code>) incluídas. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "post-expand-template-argument-category-desc": "O tamanho da página é superior a <code>$wgMaxArticleSize</code>, após a expansão de um argumento de predefinição (algo entre chavetas triplas, como <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "A página inclui demasiadas funções exigentes do analisador sintático (como <code>#ifexist</code>). Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "A página contém uma hiperligação quebrada para um ficheiro (uma hiperligação para incorporar um ficheiro que não existe).",
-       "hidden-category-category-desc": "Esta é uma categoria com a marca <code><nowiki>__HIDDENCAT__</nowiki></code>, que faz com que ela não apareça na caixa de hiperligações de categoria nas páginas, por omissão.",
+       "hidden-category-category-desc": "Esta categoria contém <code><nowiki>__HIDDENCAT__</nowiki></code>, que faz com que ela não apareça na caixa de hiperligações de categoria das páginas, por omissão.",
        "trackingcategories-nodesc": "Sem descrição disponível.",
        "trackingcategories-disabled": "A categoria está desativada.",
        "mailnologin": "Não existe endereço de envio",
        "ipb-disableusertalk": "Impedir que este utilizador edite a sua página de discussão enquanto estiver bloqueado",
        "ipb-change-block": "Voltar a bloquear o utilizador com estes parâmetros",
        "ipb-confirm": "Confirmar o bloqueio",
+       "ipb-sitewide": "Em todo o site",
+       "ipb-partial": "Parcial",
+       "ipb-type-label": "Tipo",
+       "ipb-pages-label": "Páginas",
        "badipaddress": "Endereço IP inválido",
        "blockipsuccesssub": "Bloqueio efetuado",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />\nConsulte a [[Special:BlockList|lista de bloqueios]] para rever os bloqueios.",
        "ipblocklist-legend": "Procurar um utilizador bloqueado",
        "blocklist-userblocks": "Ocultar bloqueios de contas",
        "blocklist-tempblocks": "Ocultar bloqueios temporários",
-       "blocklist-addressblocks": "Ocultar bloqueios de IP único",
+       "blocklist-addressblocks": "Ocultar bloqueios de um IP individual",
        "blocklist-rangeblocks": "Ocultar bloqueios de gamas",
        "blocklist-timestamp": "Data e hora",
        "blocklist-target": "Destinatário",
        "createaccountblock": "criação de conta bloqueada",
        "emailblock": "correio eletrónico desativado",
        "blocklist-nousertalk": "impedido de editar a própria página de discussão",
+       "blocklist-editing": "edição",
+       "blocklist-editing-sitewide": "edição (todo o ''site'')",
        "ipblocklist-empty": "A lista de bloqueios encontra-se vazia.",
        "ipblocklist-no-results": "O endereço IP ou nome de utilizador procurado não se encontra bloqueado.",
        "blocklink": "bloquear",
        "specialpages-group-pagetools": "Ferramentas de página",
        "specialpages-group-wiki": "Dados e ferramentas",
        "specialpages-group-redirects": "Páginas especiais de redirecionamento",
-       "specialpages-group-spam": "Ferramentas anti-spam",
+       "specialpages-group-spam": "Ferramentas antispam",
        "specialpages-group-developer": "Ferramentas de desenvolvimento",
        "blankpage": "Página em branco",
        "intentionallyblankpage": "Esta página foi intencionalmente deixada em branco",
        "logentry-block-block": "$1 {{GENDER:$2|bloqueou}} {{GENDER:$4|$3}} com expiração a $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|desbloqueou}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|modificou}} parâmetros de bloqueio de {{GENDER:$4|$3}} com expiração a $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|aplicou a}} {{GENDER:$4|$3}} um bloqueio que impede a edição {{PLURAL:$8|da página|das páginas}} $7 com um prazo de expiração de $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|alterou}} as definições do bloqueio de {{GENDER:$4|$3}} para impedir a edição {{PLURAL:$8|da página|das páginas}} $7 com um prazo de expiração de $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|aplicou a}} {{GENDER:$4|$3}} um bloqueio que impede as operações que não sejam edições, com um prazo de expiração de $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|alterou}} as definições do bloqueio de {{GENDER:$4|$3}} para impedir as operações que não sejam edições, com um prazo de expiração de $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloqueou}} {{GENDER:$4|$3}} com expiração a $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|modificou}} parâmetros de bloqueio de {{GENDER:$4|$3}} com expiração a $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importou}} $3 através de carregamento de ficheiro",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Adicionar uma categoria...",
        "mw-widgets-usersmultiselect-placeholder": "Adicionar mais...",
+       "mw-widgets-titlesmultiselect-placeholder": "Adicionar mais...",
        "date-range-from": "Da data:",
        "date-range-to": "Até à data:",
        "sessionmanager-tie": "Não se pode combinar mais de um tipo de autenticação de pedidos: $1.",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "A palavra-passe não pode corresponder às especificamente bloqueadas pela lista negra",
        "passwordpolicies-policy-maximalpasswordlength": "A palavra-passe tem de ter menos de $1 {{PLURAL:$1|carácter|caracteres}}",
        "passwordpolicies-policy-passwordcannotbepopular": "A palavra-passe não pode {{PLURAL:$1|ser a mais popular|estar na lista das $1 palavras-passe mais populares}}",
-       "easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido"
+       "easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido",
+       "unprotected-js": "Por motivos de segurança o JavaScript de páginas desprotegidas não pode ser carregado. Crie javascript só no espaço nominal/domínio MediaWiki: ou numa subpágina do utilizador"
 }
index cbee32b..3f53707 100644 (file)
        "tog-extendwatchlist": "[[Special:Preferences]], tab 'Watchlist'. Offers user to show all applicable changes in watchlist (by default only the last change to a page on the watchlist is shown). {{Gender}}",
        "tog-usenewrc": "{{Gender}}\nUsed as label for the checkbox in [[Special:Preferences]], tab \"Recent changes\".\n\nOffers user to use alternative representation of [[Special:RecentChanges]] and watchlist.",
        "tog-numberheadings": "[[Special:Preferences]], tab 'Misc'. Offers numbered headings on content pages to user. {{Gender}}",
-       "tog-showtoolbar": "{{Gender}}\n[[Special:Preferences]], tab 'Edit'. Offers user to show edit toolbar in page edit screen.\n\nThis is the toolbar: [[Image:Toolbar.png]]",
        "tog-editondblclick": "{{Gender}}\n[[Special:Preferences]], tab 'Edit'. Offers user to open edit page on double click.",
        "tog-editsectiononrightclick": "{{Gender}}\n[[Special:Preferences]], tab 'Edit'. Offers user to edit a section by clicking on a section title.",
        "tog-watchcreations": "[[Special:Preferences]], tab 'Watchlist'. Offers user to add created pages to watchlist. {{Gender}}",
        "subject-preview": "Used as label for preview of the section title when adding a new section on a talk page.\n\nShould match {{msg-mw|subject}}.\n\nSee also:\n* {{msg-mw|Summary-preview}}\n\n{{Identical|Subject}}",
        "previewerrortext": "When a user has the editing preference LivePreview enabled, clicked the Preview or Show Changes button in the edit page and the action did not succeed.",
        "blockedtitle": "Used as title displayed for blocked users. The corresponding message body is one of the following messages:\n* {{msg-mw|Blockedtext|notext=1}}\n* {{msg-mw|Autoblockedtext|notext=1}}\n* {{msg-mw|Systemblockedtext}}",
+       "blocked-email-user": "Text displayed to partially blocked users that are blocked from sending email.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link)\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Autoblockedtext}}\n* {{msg-mw|Systemblockedtext}}",
+       "blockedtext-partial": "Text displayed to partially blocked users.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link)\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Autoblockedtext}}\n* {{msg-mw|Systemblockedtext}}",
        "blockedtext": "Text displayed to blocked users.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link)\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Autoblockedtext}}\n* {{msg-mw|Systemblockedtext}}",
        "autoblockedtext": "Text displayed to automatically blocked users.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - the blocking sysop (with a link to his/her userpage)\n* $2 - the reason for the block (in case of autoblocks: {{msg-mw|autoblocker}})\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the blocking sysop's username (plain text, without the link). Use it for GENDER.\n* $5 - the unique numeric identifier of the applied autoblock\n* $6 - the expiry of the block\n* $7 - the intended target of the block (what the blocking user specified in the blocking form)\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Blockedtext}}\n* {{msg-mw|Systemblockedtext}}",
        "systemblockedtext": "Text displayed to requests blocked by MediaWiki configuration.\n\n\"email this user\" should be consistent with {{msg-mw|Emailuser}}.\n\nParameters:\n* $1 - (Unused) A dummy user attributed as the blocker, possibly as a link to a user page.\n* $2 - the reason for the block\n* $3 - the current IP address of the blocked user\n* $4 - (Unused) the dummy blocking user's username (plain text, without the link).\n* $5 - A short string indicating the type of system block.\n* $6 - the expiry of the block\n* $7 - the intended target of the block\n* $8 - the timestamp when the block started\nSee also:\n* {{msg-mw|Grouppage-sysop}}\n* {{msg-mw|Blockedtext}}\n* {{msg-mw|Autoblockedtext}}",
        "ipb-disableusertalk": "{{doc-singularthey}}\nUsed as label for checkbox in [[Special:Block]].\n\nSee also:\n* {{msg-mw|ipbemailban}}\n* {{msg-mw|ipbenableautoblock}}\n* {{msg-mw|ipbhidename}}\n* {{msg-mw|ipbwatchuser}}\n* {{msg-mw|ipb-hardblock}}",
        "ipb-change-block": "Confirmation checkbox required for blocks that would override an earlier block. Appears together with {{msg-mw|ipb-needreblock}}.",
        "ipb-confirm": "Used as hidden field in the form on [[Special:Block]].",
+       "ipb-sitewide": "A type of block the user can select from on [[Special:Block]].",
+       "ipb-partial": "A type of block the user can select from on [[Special:Block]].",
+       "ipb-type-label": "The label of the type of editing restriction the admin would like to impose on [[Special:Block]].",
+       "ipb-pages-label": "The label for a autocomplete text field to specify pages to block a user from editing on [[Special:Block]].",
        "badipaddress": "An error message shown when one entered an invalid IP address in blocking page.",
        "blockipsuccesssub": "Used as page title in [[Special:Block]].\n\nThis message is the subject for the following message:\n* {{msg-mw|Blockipsuccesstext}}",
        "blockipsuccesstext": "Used in [[Special:Block]].\nThe title (subject) for this message is {{msg-mw|Blockipsuccesssub}}.\n\nParameters:\n* $1 - username, can be used for GENDER",
        "createaccountblock": "Part of the log entry of user block in [[Special:BlockList]].\n\nSee also:\n* {{msg-mw|Block-log-flags-nocreate}}\n{{Related|Blocklist}}",
        "emailblock": "Part of the log entry of user block in [[Special:BlockList]].\n{{Related|Blocklist}}\n{{Identical|E-mail blocked}}",
        "blocklist-nousertalk": "Used in [[Special:IPBlockList]] when \"Allow this user to edit own talk page while blocked\" option hasn't been flagged.\n\nSee also {{msg-mw|Block-log-flags-nousertalk}}.\n\nPart of the log entry of user block in [[Special:BlockList]].\n\n{{Related|Blocklist}}",
+       "blocklist-editing": "Used in [[Special:IPBlockList]] when a block is not a sitewide block.",
+       "blocklist-editing-sitewide": "Used in [[Special:IPBlockList]] when a block is a sitewide block.",
        "ipblocklist-empty": "Used in [[Special:BlockList]], if the target is not specified.\n\nSee also:\n* {{msg-mw|Ipblocklist-no-results}}",
        "ipblocklist-no-results": "Used in [[Special:BlockList]], if the target is specified.\n\nSee also:\n* {{msg-mw|Ipblocklist-empty}}",
        "blocklink": "Display name for a link that, when selected, leads to a form where a user can be blocked. Used in page history and recent changes pages. Example: \"''UserName (Talk | contribs | '''block''')''\".\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Block}}",
        "logentry-block-block": "{{Logentry|[[Special:Log/block]]}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string\n\nCf. {{msg-mw|Blocklogentry}}",
        "logentry-block-unblock": "{{Logentry|[[Special:Log/block]]}}\n* $4 - user name for gender or empty string for autoblocks\n\nCf. {{msg-mw|Unblocklogentry}}",
        "logentry-block-reblock": "{{Logentry|[[Special:Log/block]]}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string\n\nCf. {{msg-mw|Reblock-logentry}}",
+       "logentry-partialblock-block": "{{Logentry|[[Special:Log/block]]}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string\n* $7 - list of pages separated by a comma\n* $8 - total number of pages\n\nCf. {{msg-mw|Blocklogentry}}",
+       "logentry-partialblock-reblock": "{{Logentry|[[Special:Log/block]]}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string\n* $7 - list of pages separated by a comma\n* $8 - total number of pages\n\nCf. {{msg-mw|Reblock-logentry}}",
+       "logentry-non-editing-block-block": "{{Logentry|[[Special:Log/block]]}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string\n\nCf. {{msg-mw|Blocklogentry}}",
+       "logentry-non-editing-block-reblock": "{{Logentry|[[Special:Log/block]]}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string\n\nCf. {{msg-mw|Reblock-logentry}}",
        "logentry-suppress-block": "{{Logentry}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string",
        "logentry-suppress-reblock": "{{Logentry}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string",
        "logentry-import-upload": "{{Logentry|[[Special:Log/import]]}}",
        "mw-widgets-titleinput-description-redirect": "Description label for a redirect in the title input widget.",
        "mw-widgets-categoryselector-add-category-placeholder": "Placeholder displayed in the category selector widget after the capsules of already added categories.",
        "mw-widgets-usersmultiselect-placeholder": "Placeholder displayed in the input field, where new usernames are entered",
+       "mw-widgets-titlesmultiselect-placeholder": "Placeholder displayed in the input field, where new titles are entered",
        "date-range-from": "Label for an input field that specifies the start date of a date range filter.",
        "date-range-to": "Label for an input field that specifies the end date of a date range filter.",
        "sessionmanager-tie": "Used as an error message when multiple session sources are tied in priority.\n\nParameters:\n* $1 - List of dession type descriptions, from messages like {{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.",
index 9bc8be5..3ed8f93 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Watiqana sutisuyuta tukuy rurachinalla hukchaykunaman mast'ay, ama lliwmanta aswan ñaqhallachu",
        "tog-usenewrc": "Huñu hukchasqakuna p'anqallakama ñaqha hukchasqakunapi watiqasqakunapipas",
        "tog-numberheadings": "Uma siq'ikunata kikinmanta yupay",
-       "tog-showtoolbar": "Llamk'apuna sillwita rikuchiy",
        "tog-editondblclick": "P'anqakunata llamk'apuy iskaylla ñit'iywan",
        "tog-editsectiononrightclick": "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa",
        "tog-watchcreations": "Qallarisqay p'anqakunata churkusqay willañiqikunatapas watiqay",
index fbfc9e5..b176743 100644 (file)
@@ -14,7 +14,6 @@
        "tog-extendwatchlist": "Rikushka pankakunapak mushuk killkaykunapak kamupi, ama yallik mushuk killkaykunatalla rikuchina, tukuykunatami rikuchina",
        "tog-usenewrc": "Mushuk killkaykunata chapashka pankakunapak killkaykunatapash ashtawan alli rikuchina (Javascriptwanlla)",
        "tog-numberheadings": "Uma killkaykunata yupayta churak antawata llankachina",
-       "tog-showtoolbar": "Llamkana antakunata rikuchina (Javascriptwanlla)",
        "tog-editondblclick": "Ishkayta klik rurashpa pankapi killkanata kallarina (JavaScriptwanlla)",
        "tog-watchcreations": "Ñukapak wacharishka pankakunata rikuna",
        "tog-watchdefault": "Ñukapak shukchishka pankakunata rikuna",
index c673979..631ca50 100644 (file)
@@ -25,7 +25,6 @@
        "tog-extendwatchlist": "Extender la glista d'observaziun per mussar tut las midadas e betg be las ultimas",
        "tog-usenewrc": "Gruppar las midadas tenor pagina en las ''ultimas midadas'' e la ''glista d'observaziun''",
        "tog-numberheadings": "Numerar automaticamain ils titels",
-       "tog-showtoolbar": "Mussar la trav d'utensils per modifitgar",
        "tog-editondblclick": "Modifitgar paginas cun in clic dubel",
        "tog-editsectiononrightclick": "Activar la pussaivladad da modifitgar secziuns cun in clic dretg sin il titel",
        "tog-watchcreations": "Agiuntar paginas ch'jeu creesch e datotecas ch'jau transferesch a la glista d'observaziun",
index 8679c61..e278000 100644 (file)
@@ -46,7 +46,6 @@
        "tog-extendwatchlist": "Extinde lista de articole urmărite pentru a arăta toate schimbările efectuate, nu doar pe cele mai recente",
        "tog-usenewrc": "Grupează modificările după pagină în cadrul schimbărilor recente și listei paginilor urmărite",
        "tog-numberheadings": "Numerotează automat secțiunile",
-       "tog-showtoolbar": "Afișează bara de unelte pentru modificare",
        "tog-editondblclick": "Modifică paginile prin dublu clic",
        "tog-editsectiononrightclick": "Activează modificarea secțiunilor prin clic dreapta pe titlul secțiunii",
        "tog-watchcreations": "Adaugă paginile pe care le creez și fișierele pe care le încarc la lista mea de pagini urmărite",
index 5fc5e1d..579b3e5 100644 (file)
@@ -23,7 +23,6 @@
        "tog-extendwatchlist": "Spanne l'elenghe de le pàggene condrollate pe fa vedè tutte le cangiaminde fatte, none sulamende l'urteme",
        "tog-usenewrc": "Cangiaminde d'u gruppe pe pàgene jndr'à le urteme cangiaminde e elenghe de le pàggene condrollate",
        "tog-numberheadings": "Testate auto-numerate",
-       "tog-showtoolbar": "Fà vedè 'a barra de le cangiaminde",
        "tog-editondblclick": "Cange le pàggene cu 'nu doppie clic",
        "tog-editsectiononrightclick": "Abbilite le cangiaminde d'a sezione ausanne 'u pulsande destre d'u sciorge cazzanne sus a 'u titole",
        "tog-watchcreations": "Mitte le pàggene ca je agghie ccrejate jndr'à le pàggene condrollate",
        "ipb-disableusertalk": "Non ge face cangià a stu utende 'a pàgena de le 'ngazzaminde sue fine ca jè bloccate",
        "ipb-change-block": "Blocche 'n'otra vote l'utende cu ste 'mbostaziune",
        "ipb-confirm": "Conferme 'u blocche",
+       "ipb-sitewide": "Tutte 'u site",
+       "ipb-partial": "Parziale",
+       "ipb-type-label": "Tipe",
+       "ipb-pages-label": "Pàggene",
        "badipaddress": "Indirizze IP invalide",
        "blockipsuccesssub": "Blocche effettuate",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] ha state bloccate.<br />\nVide [[Special:BlockList|'a liste de le IP bloccate]] pe revedè le blocche.",
        "createaccountblock": "sulamende l'utinde anonime",
        "emailblock": "e-mail blocchete",
        "blocklist-nousertalk": "Non ge puè cangià 'a pàgene de le 'ngazzaminde toje",
+       "blocklist-editing": "stoche a cange",
+       "blocklist-editing-sitewide": "stoche a cange (tutte 'u site)",
        "ipblocklist-empty": "'A liste de le blocche jè vacande.",
        "ipblocklist-no-results": "L'indirizze IP ca è cerchete o 'u nome utende non ge sonde blocchete.",
        "blocklink": "blocche",
        "mw-widgets-titleinput-description-redirect": "redirezionate sus a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Aggiunge 'na categorije...",
        "mw-widgets-usersmultiselect-placeholder": "Aggiunge de cchiù...",
+       "mw-widgets-titlesmultiselect-placeholder": "Aggiunge de cchiù...",
        "date-range-from": "Da 'a date:",
        "date-range-to": "'Mbonde 'a date:",
        "sessionprovider-generic": "$1 sessiune",
index 0155b22..1f1a790 100644 (file)
        "tog-extendwatchlist": "Расширить список наблюдения, включая все изменения, а не только последние <small>(они могут быть сгруппированы настройкой на вкладке «[[Служебная:Настройки#mw-prefsection-rc|Свежие правки]]»)</small>",
        "tog-usenewrc": "Группировать изменения в свежих правках и списке наблюдения",
        "tog-numberheadings": "Автоматически нумеровать заголовки",
-       "tog-showtoolbar": "Показывать панель инструментов при редактировании",
        "tog-editondblclick": "Править страницы по двойному щелчку",
        "tog-editsectiononrightclick": "Править секции при правом щелчке мышью на заголовке",
        "tog-watchcreations": "Добавлять в список наблюдения созданные мной страницы и загруженные мной файлы",
        "subject-preview": "Предпросмотр темы/заголовка:",
        "previewerrortext": "При попытке отобразить предварительный просмотр ваших изменений произошла ошибка.",
        "blockedtitle": "Участник заблокирован",
+       "blocked-email-user": "<strong>Для вашей учётной записи заблокирована отправка электронной почты. Но вы по-прежнему можете редактировать страницы в этом вики-проекте.</strong> Вы можете увидеть все подробности блокировки на странице [[Special:MyContributions|вклада учётной записи]].\n\nБлокировка произведена администратором $1.\n\nУказана следующая причина: <em>$2</em>.\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n* Идентификатор блокировки: #$5",
+       "blockedtext-partial": "<strong>Для вашей учётной записи заблокирована возможность изменения этой страницы. Но вы по-прежнему можете редактировать другие страницы в этом вики-проекте.</strong> Вы можете увидеть все подробности блокировки на странице [[Special:MyContributions|вклада учётной записи]].\n\nБлокировка произведена администратором $1.\n\nУказана следующая причина: <em>$2</em>.\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n* Идентификатор блокировки: #$5",
        "blockedtext": "<strong>Ваша учётная запись или IP-адрес заблокированы.</strong>\n\nБлокировка произведена администратором $1.\nУказана следующая причина: <em>$2</em>.\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВы можете связаться с $1 или любым другим [[{{MediaWiki:Grouppage-sysop}}|администратором]], чтобы обсудить блокировку.\nОбратите внимание, что вы не сможете использовать функцию «{{int:emailuser}}», если в своих [[Special:Preferences|персональных настройках]] не задали или не подтвердили корректный адрес электронной почты, или если ваша блокировка включает запрет отправки писем подобным образом.\nВаш IP-адрес — $3, идентификатор блокировки — $5.\nПожалуйста, указывайте эти сведения в любых своих обращениях.",
        "autoblockedtext": "Ваш IP-адрес автоматически заблокирован в связи с тем, что он ранее использовался кем-то из участников, заблокированных администратором $1. \nБыла указана следующая причина блокировки:\n\n: «$2».\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВы можете связаться с $1 или любым другим [[{{MediaWiki:Grouppage-sysop}}|администратором]], чтобы обсудить блокировку.\n\nОбратите внимание, что вы не сможете использовать функцию «{{int:emailuser}}», если в своих [[Special:Preferences|персональных настройках]] не задали или не подтвердили корректный адрес электронной почты, или если ваша блокировка включает запрет отправки писем подобным образом.\n\nВаш IP-адрес — $3, идентификатор блокировки — #$5.\nПожалуйста, указывайте эти сведения в любых своих обращениях.",
        "systemblockedtext": "Ваше имя участника или IP-адрес были автоматически заблокированы MediaWiki.\nУказана следующая причина:\n\n:<em>$2</em>\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВаш текущий IP-адрес $3.\nПожалуйста, указывайте все эти сведения в любых своих обращениях.",
        "prefixindex": "Указатель по началу названий страниц",
        "prefixindex-namespace": "Указатель по началу страниц (пространство имён «{{ns:$1}}»)",
        "prefixindex-submit": "Показать",
-       "prefixindex-strip": "СкÑ\80Ñ\8bÑ\82Ñ\8c Ð¿Ñ\80еÑ\84икÑ\81 Ð² Ñ\81пиÑ\81ке Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82ов",
+       "prefixindex-strip": "СкÑ\80Ñ\8bÑ\82Ñ\8c Ð¿Ñ\80еÑ\84икÑ\81 Ð² Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82аÑ\85",
        "shortpages": "Короткие страницы",
        "longpages": "Длинные страницы",
        "deadendpages": "Тупиковые страницы",
        "ipb-disableusertalk": "Запретить этому участнику редактировать свою страницу обсуждения",
        "ipb-change-block": "Переблокировать участника с этими настройками",
        "ipb-confirm": "Подтвердить блокировку",
+       "ipb-sitewide": "Во всём проекте",
+       "ipb-partial": "Частичная",
+       "ipb-type-label": "Тип",
+       "ipb-pages-label": "Страницы",
        "badipaddress": "IP-адрес записан в неправильном формате, или участника с таким именем не существует.",
        "blockipsuccesssub": "Блокировка произведена",
        "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] {{GENDER:$1|заблокирован|заблокирована}}.<br />\nСм. [[Special:BlockList|список заблокированных IP-адресов]] для просмотра блокировок.",
        "createaccountblock": "создание учётных записей запрещено",
        "emailblock": "отправка писем запрещена",
        "blocklist-nousertalk": "не может править свою страницу обсуждения",
+       "blocklist-editing": "редактирование",
+       "blocklist-editing-sitewide": "редактирование (во всём проекте)",
        "ipblocklist-empty": "Список блокировок пуст.",
        "ipblocklist-no-results": "Заданный IP-адрес или имя участника не заблокированы.",
        "blocklink": "заблокировать",
        "mw-widgets-titleinput-description-redirect": "перенаправление на $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Добавить категорию…",
        "mw-widgets-usersmultiselect-placeholder": "Добавить ещё…",
+       "mw-widgets-titlesmultiselect-placeholder": "Добавить ещё…",
        "date-range-from": "С даты:",
        "date-range-to": "По дату:",
        "sessionmanager-tie": "Невозможно использовать одновременно несколько типов проверки подлинности запроса: $1.",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Пароль не может совпадать ни с одним паролем, внесённым в чёрный список",
        "passwordpolicies-policy-maximalpasswordlength": "Пароль должен быть короче $1 {{PLURAL:$1|символа|символов}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Пароль не может соответствовать {{PLURAL:$1|самому часто используемому паролю|какому-либо из $1 самых часто используемых паролей}}",
-       "easydeflate-invaliddeflate": "Предоставленное содержимое не спущено надлежащим образом"
+       "easydeflate-invaliddeflate": "Предоставленное содержимое не спущено надлежащим образом",
+       "unprotected-js": "По соображениям безопасности JavaScript нельзя загружать с незащищенных страниц. Пожалуйста, создавайте скрипты только в пространстве имён MediaWiki: или как подстраницы участника."
 }
index 97fc212..eb7b144 100644 (file)
@@ -25,7 +25,6 @@
        "tog-extendwatchlist": "Росшыреный список слїдованых сторінок, обсягує вшыткы зміны, не лем послїднї",
        "tog-usenewrc": "В послїднїх змінах і слїдованых сторінках зґруповати зміны по сторінках",
        "tog-numberheadings": "Автоматічно чісловати надписы",
-       "tog-showtoolbar": "Вказати панел інштрументів",
        "tog-editondblclick": "Едітовати двоїтым кликом",
        "tog-editsectiononrightclick": "Дозволити едітованя секції сторінкы через кликаня правов клапков мышкы на надписы сторінок",
        "tog-watchcreations": "Придавати сторінкы створены мнов тай файлы мнов наладованы до мого списку слїдованых",
index 6ce1512..3425db2 100644 (file)
@@ -36,7 +36,6 @@
        "tog-extendwatchlist": "न केवलं सद्योजातानि अपि तु निरीक्षासूचेः सर्वाणि परिवर्तनानि दृश्यन्ताम्",
        "tog-usenewrc": "सद्यः परिवर्तनावल्यां, निरीक्षासूचौ च पृष्ठानि विभागानुसारं प्रदर्श्यन्ताम् (जावा-लिपिः अपेक्ष्यते)",
        "tog-numberheadings": "शीर्षकाणि स्वयमेव यथाक्रमं करोतु",
-       "tog-showtoolbar": "उपकरण-पट्टिका दर्श्यताम्",
        "tog-editondblclick": "वारद्वयं टक्टकायनेन (Click) पृष्ठानि सम्पाद्यन्ताम् (जावा-लिपिः अपेक्ष्यते)",
        "tog-editsectiononrightclick": "विभागशीर्षकाणामुपरि दक्षिणक्लिक्-करणेन विभागः सम्पाद्यताम् ।",
        "tog-watchcreations": "मया रचितानि पृष्ठानि मम निरीक्षासूचौ योज्यन्ताम् ।",
index b7218fa..a566792 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "Кэтээһин тупсарыллыбыт тиһигэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)",
        "tog-usenewrc": "Саҥа уларытыы уонна кэтэбил тиһиктэригэр уларыйыылары бөлөхтүүргэ",
        "tog-numberheadings": "Түһүмэхтэр ааттарын нүөмэрдээ",
-       "tog-showtoolbar": "Көннөрүү хапталын көрдөр",
        "tog-editondblclick": "Хоһулатан баттаан сирэйи уларытыы",
        "tog-editsectiononrightclick": "Түһүмэх баһын уҥа тимэҕинэн баттаан түһүмэҕи уларытыы",
        "tog-watchcreations": "Суруйбут ыстатыйаларбын уонна укпут билэлэрбин кэтээн көрүүгэ киллэрэн ис",
index b3d4986..525f31d 100644 (file)
@@ -31,7 +31,6 @@
        "tog-extendwatchlist": "ᱠᱷᱟᱹᱞᱤ ᱱᱮᱛᱚᱜ ᱵᱚᱫᱚᱞᱟᱜ ᱫᱚ ᱵᱟᱝ, ᱡᱚᱛᱚ ᱵᱟᱫᱚᱞᱟᱜ ᱜᱮ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ ᱯᱷᱟᱭᱞᱟᱣᱢᱮ",
        "tog-usenewrc": "ᱱᱟᱣᱟᱱᱟᱜ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱠᱩ ᱟᱨ ᱨᱚᱠᱟ ᱵᱚᱫᱚᱞᱟᱠᱟᱱ ᱯᱟᱸᱦᱴᱟᱨᱮ ᱵᱚᱫᱚᱞᱟᱠᱠᱳ ᱢᱤᱛᱥᱟᱶ ᱧᱮᱞᱢᱮ",
        "tog-numberheadings": "ᱢᱩᱬᱩᱛ ᱠᱟᱛᱷᱟᱠᱩ ᱫᱚ ᱟᱪᱛᱮᱜᱮ ᱯᱤᱲᱦᱤ ᱯᱤᱲᱦᱤᱛᱮ ᱥᱟᱡᱟᱜᱢᱟ",
-       "tog-showtoolbar": "ᱦᱟᱹᱛᱤᱭᱟᱹᱨ ᱠᱟᱸᱛ ᱩᱫᱩᱜᱽ ᱢᱮ",
        "tog-editondblclick": "ᱵᱟᱨ ᱫᱷᱟᱣ ᱞᱤᱱ ᱠᱟᱛᱮ ᱥᱟᱦᱴᱟᱠᱩ ᱵᱚᱫᱚᱞᱢᱮ",
        "tog-editsectiononrightclick": "ᱯᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ ᱜᱩᱴ ᱠᱟᱛᱷᱟᱨᱮ ᱡᱚᱡᱚᱢ ᱥᱮᱡ ᱞᱤᱱ ᱦᱚᱛᱮᱛᱮ <br /> ᱯᱟᱸᱦᱴᱟ ᱥᱟᱯᱲᱟᱣ ᱞᱟᱜᱤᱛᱛᱮ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱮᱢ ᱦᱩᱭᱩᱜ ᱢᱟ (JavaScript)",
        "tog-watchcreations": "ᱥᱟᱦᱴᱟᱠᱩ ᱥᱮᱞᱮᱫᱢᱮ ᱤᱧᱟᱜ ᱛᱮᱭᱟᱨ ᱟᱨ ᱨᱮᱫᱠᱩ ᱤᱧᱟᱜ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ ᱨᱟᱠᱟᱵ ᱢᱮ",
index 6297db0..2601aa3 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "Ammània sa watchlist pro ammustrare totu sos càmbios, non sos prus reghentes ebbia",
        "tog-usenewrc": "Pone in pare sos càmbios de cada pàgina in sos ùrtimos càmbios e in sa watchlist",
        "tog-numberheadings": "Auto-numeratzione de sos tìtulos",
-       "tog-showtoolbar": "Ammustra sa mustra de sa barra de sas ainas",
        "tog-editondblclick": "Càmbia pàginas cun duos click",
        "tog-editsectiononrightclick": "Abìlita su càmbiu de sas setziones cun click de dereta in sos tìtulos de sas setziones",
        "tog-watchcreations": "Annanghe is pàginas chi apo creadu e is documentos chi apo carrigadu in sa lista mea de pàginas annotadas",
index 77524a4..317824d 100644 (file)
@@ -27,7 +27,6 @@
        "tog-extendwatchlist": "Ammustra tutti li canciamenti ntâ lista taliata, nun sulu lu cchiù ricenti",
        "tog-usenewrc": "Raggruppa li canciamenti pi pàggina ntâ lista dî canciamenti ricenti e ntâ lista taliata",
        "tog-numberheadings": "Nummirazzioni autumàtica dî tìtuli di paràgrafu",
-       "tog-showtoolbar": "Ammustra la barra dî strummenta pû canciamentu",
        "tog-editondblclick": "Duppiu click pi canciari l'artìculu",
        "tog-editsectiononrightclick": "Attiva lu canciamentu di na sizzioni quannu si clicca cu buttuni drittu supra a lu sò tìtulu",
        "tog-watchcreations": "Agghiunci li pàggini chi creu e li file chi càrricu â mè lista taliata",
index d58c150..968713c 100644 (file)
@@ -38,7 +38,6 @@
        "tog-extendwatchlist": "Mak watchleet bigger tae shaw aw chynges, no just the maist recent",
        "tog-usenewrc": "Groop chynges bi page in recent chynges n watchleet",
        "tog-numberheadings": "Autæ-nummer heidins",
-       "tog-showtoolbar": "Shaw eidit tuilbaur",
        "tog-editondblclick": "Eidit pages oan dooble-clap (JavaScript)",
        "tog-editsectiononrightclick": "Enable section editin bi richt-clapin on section teitles",
        "tog-watchcreations": "Eik pages that Ah cræft n files that Ah uplaid til ma watchleet",
index b82e2b8..0ed5e69 100644 (file)
@@ -20,7 +20,6 @@
        "tog-hidecategorization": "صفحن جا زمرا لڪايو",
        "tog-extendwatchlist": "تازه ترين بدران سموريون تبديليون ڏيکارڻ لاءِ زير نظر فهرست کي وسيع ڪريو.",
        "tog-numberheadings": "سُرخين کي خودڪاراً نمبر ڏيو",
-       "tog-showtoolbar": "سنوار اوزار ڏيکاريو",
        "tog-editondblclick": "ٻٽي ڪلڪ تي صفحا سنواريو",
        "tog-watchcreations": "منھنجا سرجيل صفحا ۽ منھنجا چاڙھيل فائيل منھنجي نظر ۾ فھرست تي رکو",
        "tog-watchdefault": "منھنجا ترميميل صفحا ۽ فائيل  منھنجي نظر ۾ فھرست ۾ رکو",
        "right-editinterface": "واپرائيندڙ باهمرُو کي سنواريو",
        "right-viewmywatchlist": "پنهنجي نظر ۾ فھرست ڏسو",
        "right-editmywatchlist": "پنهنجي نگھداشت واري فهرست کي سنواريو. ياد رکو ڪجهه ڪم هن اختيار کان سواءِ پڻ ممڪن آهن.",
+       "right-viewmyprivateinfo": "پنهنجي ذاتي معلومات ڏسو (جيئن: برق ٽپال پتو، اصل نالو وغيره)",
        "right-editmyprivateinfo": "پنهنجي ذاتي معلومات سنواريو (جيئن برق ٽپال، اصل نالو)",
        "right-editmyoptions": "پنهنجون ترجيحون سنواريو",
        "right-import": "ٻين وڪيز کان صفحا درآمديو",
        "right-importupload": "ڪو فائيل چاڙهي صفحا درآمديو",
        "right-patrol": "ٻين جي ترميمن کي گشت-ڪيل طور نشان لڳايو",
+       "right-autopatrol": "سندس تخليق ڪيل مضمون پاڻمرادو گشت ڪيل ڄاڻايا ويندا آهن.",
        "right-mergehistory": "صفحن جي سوانح سنواريو",
        "right-userrights": "واپرائيندڙ جا سڀ حق سنواريو",
        "right-userrights-interwiki": "ٻين وڪين تي واپرائيندڙن جا حق سنواريو",
index 69434b2..7688f2a 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "Musthra tutti li mudìfigghi a li abbaidaddi ippiziari, nò soru l'ulthimi.",
        "tog-usenewrc": "Utirizza l'ulthimi mudìfigghi abanzaddi (dumanda JavaScript)",
        "tog-numberheadings": "Numarazioni otomàtigga di li tìturi di sezzioni",
-       "tog-showtoolbar": "Musthra barra di l'isthrumenti di mudìfigga",
        "tog-editondblclick": "Mudìfigga di li pàgini attrabessu dóppiu clic",
        "tog-editsectiononrightclick": "Mudìfigga di li sezzioni attrabessu lu clic dresthu i' lu tìturu",
        "tog-watchcreations": "Aggiungi li pàgini criaddi a l'abbaidaddi ippiziari",
index c7b403e..088cf35 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "Viiddit čuovvunlisttu, nu ahte čájeha buot dahkon rievdadusaid, iige dušše ođđaseamos",
        "tog-usenewrc": "Viiddiduvvon varas rievdadusat -listu (gáibida JavaScript)",
        "tog-numberheadings": "Nummaraste bajilčállagiid",
-       "tog-showtoolbar": "Čájet rievdadangaskaomiid",
        "tog-editondblclick": "Rievdat siidduid duppaldeaddilemiin (JavaScript)",
        "tog-editsectiononrightclick": "Rievdat osiid nu ahte deaddilat bajilčállaga sáhpána olgeš boaluin (JavaScript)",
        "tog-watchcreations": "Lasit siidduid maid lean álggahan mu čuovvunlistui",
index 64faa2e..3b834eb 100644 (file)
@@ -15,7 +15,6 @@
        "tog-extendwatchlist": "Expand listade cáminot zo cohuatlöx jömde quíix applicablix",
        "tog-usenewrc": "Camjöx cmaa enhancöx (JavaScript)",
        "tog-numberheadings": "Auto-numberom text corridór",
-       "tog-showtoolbar": "Cohuatlöx ticpatlöx toolbar (JavaScript)",
        "tog-editondblclick": "Ticpatlöx páhinám 2 clickám mii (JavaScript)",
        "tog-editsectiononrightclick": "Ton ticpatlöx seccion pok clickám mii<br /> seccion titelám iti (JavaScript)",
        "tog-watchcreations": "Plusöx páhinám he hun he listade cáminot",
index 9a26fdc..6474f00 100644 (file)
@@ -15,7 +15,6 @@
        "tog-extendwatchlist": "Hawgay maašeedaa hayandi ka barmawey kul cebe, manti ikokorantaa hinne",
        "tog-usenewrc": "Barmawey marga moo bande barmay korawey nda hawgayhayey ra",
        "tog-numberheadings": "Boŋdekerey boŋkabuyan",
-       "tog-showtoolbar": "Goyjinay žeeri fasalyan cebe",
        "tog-editondblclick": "Naagu cee hinka ka moɲey fasal",
        "tog-editsectiononrightclick": "Kanbe guma dunbu maaɲey naagu ka dunbu fasalyan tunandi",
        "tog-watchcreations": "Moɲey kaŋ ay k'i tee nda tukey kaŋ ay g'i zumandi tonton ay hawgayhayey ga",
index be33940..dee485f 100644 (file)
@@ -17,7 +17,6 @@
        "tog-extendwatchlist": "Ėšpliestė keravuojamu sāroša, ka ruodītu ne tėktās vielībūsius pakeitėmus",
        "tog-usenewrc": "Skėrstītė keitėmus vielībūsiūs pakeitėmūs ė keravuojamu poslapiu sārašė",
        "tog-numberheadings": "Autuomatėškā numeroutė skėrsnelius",
-       "tog-showtoolbar": "Ruodītė keitėmu rakondėnė",
        "tog-editondblclick": "Poslapiu keitėms kāp dosīk spaudi ont poslapė",
        "tog-editsectiononrightclick": "Ijongtė skėrsneliu keitėma kāp paspaudi skėrsnelė pavadėnėma so dešėnio pelies mīgtoko",
        "tog-watchcreations": "Pridietė poslapius, katrūs padėrbo, keravuojamu sārošap",
index b9f2371..4140377 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "Proširi spisak praćenja za pogled svih izmjena, ne samo nedavnih",
        "tog-usenewrc": "Promene u grupi po stranici u spisku nedavnih izmhena i nadgledanih stranica (zahtijeva JavaScript)",
        "tog-numberheadings": "Automatski numeriši podnaslove",
-       "tog-showtoolbar": "Pokaži alatnu traku (potreban JavaScript)",
        "tog-editondblclick": "Izmijeni stranice dvostrukim klikom (potreban JavaScript)",
        "tog-editsectiononrightclick": "Uključite uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka (JavaScript)",
        "tog-watchcreations": "Dodaj stranice koje sam stvorio i dadtoteke koje sam poslao u moj spisak praćenih stranica",
index 9f69585..3a290b5 100644 (file)
@@ -15,7 +15,6 @@
        "tog-extendwatchlist": "Ssaɣḍ umuɣ n tisniwin lli n ttfur bac ad n ẓṛṛa imbddln maci ɣir imaynutn",
        "tog-usenewrc": "Skr s imbddln imaynutn lli n sastwa (ira mayad JavaScript)",
        "tog-numberheadings": "nmra n nsmiat wahdot",
-       "tog-showtoolbar": "ⵙⴱⴰⵢⵏ ⴷ ⵜⵉⵏⵉⵎⴰⵙⵙⵏ ⵏ ⵓⵙⵏⴼⵍ",
        "tog-editondblclick": "ⵙⵏⴼⵍ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵙ ⵓⵙⵉⵏⴽⵍⵉⴽ",
        "tog-editsectiononrightclick": "Yan uklik s tsga tafasi f uzwl n w-ayyaw bac ad tsbadlt ɣtad (ira JavaScript)",
        "tog-watchcreations": "Zaydn tasniwin lli skrɣ i umuɣ n tilli ssuġiɣ.",
index 997b36e..1960002 100644 (file)
@@ -19,7 +19,6 @@
        "tog-extendwatchlist": "မႄႇၼႄ သဵၼ်ႈၸိုဝ်ႈ တႃႇၼႄလွင်ႈလႅၵ်ႈလၢႆႊတင်းသဵင်ႈ၊ ဢၼ်ဢမ်ႇၵႃး ၸိူဝ်းလႅၵ်ႈလၢႆႈပႆႇပေႃးႁိုင်",
        "tog-usenewrc": "လွင်ႈလႅၵ်ႈလၢႆႊၼႃႈလိၵ်ႈၸုမ်း ၼႂ်းလွင်ႈလႅၵ်ႈလၢႆႊလႄႈသဵၼ်ႈၸိုဝ်ႈ ဢၼ်ပူၼ်ႉမႃးပႆႇႁိုင်",
        "tog-numberheadings": "ႁူဝ်ၶေႃႈၶပ်ႉတူဝ်ၼပ်ႉဝႅၼ်ႊဝႅၼ်ႊ",
-       "tog-showtoolbar": "ၼႄပၼ် ႁၢဝ်းၶိူင်ႈထတ်းမႄး",
        "tog-editondblclick": "ၼဵၵ်းၵူပ်ႉသေ ထတ်းမႄးၼႃႈလိၵ်ႈ",
        "tog-editsectiononrightclick": "ၼဵၵ်းၼိူဝ်ႁူဝ်ၶေႃႈၵၼ်ႊသေ ၽုၺ်ႇၵၢၼ်ထတ်းမႄးၵၼ်ႊ",
        "tog-watchcreations": "ထႅမ်ၼႃႈလိၵ်ႈ​ လႄႈ ၾၢႆႇ ဢၼ်ၵဝ်ၶႃႈသၢင်ႈၼၼ်ႉ သႂ်ႇတီႈသဵၼ်ႈမၢႆၵဝ်ၶႃႈ",
index a1493ae..05a4d49 100644 (file)
@@ -12,7 +12,6 @@
        "tog-extendwatchlist": "Ssemɣer umuɣ n uɛessi iwakken ad muqleɣ akk n wayen zemreɣ ad beddleɣ",
        "tog-usenewrc": "Ssegrew ibeddlen s usebtar deg ibeddilen imaynuten d umuɣ n uḍfar",
        "tog-numberheadings": "Izwal ɣur-sen imḍanen mebla ma serseɣ-iten",
-       "tog-showtoolbar": "Ssken tafeggagt n ifecka n ubeddel",
        "tog-editondblclick": "Beddel isebtar mi wekkiɣ snat n tikwal",
        "tog-editsectiononrightclick": "Ssermed abeddel n tigezmi s ukliki ayeffus ɣef izwal",
        "tog-watchcreations": "Rnu isebtar i xelqeɣ deg wumuɣ n uɛessi inu",
index a35c06a..3af2a71 100644 (file)
@@ -45,7 +45,6 @@
        "tog-extendwatchlist": "මෑත වෙනස්වීම් පමණක් නොව, අදාළ සියළු වෙනස්වීම් දක්වා පෙන්වන අයුරින් මුර-ලැයිස්තුව පුළුල් කරන්න",
        "tog-usenewrc": "මෑත වෙනස්වීම් සහ මුර ලැයිස්තුව හී පිටුව අනුව සමූහ වෙනස්වීම්",
        "tog-numberheadings": "ශීර්ෂ-නාම ස්වයංක්‍රීයව අංකනය කරන්න",
-       "tog-showtoolbar": "සංස්කරණ මෙවලම්තීරුව පෙන්වන්න",
        "tog-editondblclick": "ද්විත්ව-ක්ලික් කිරීම මගින් පිටු සංස්කරණය අරඹන්න",
        "tog-editsectiononrightclick": "ඡේද ශීර්ෂ මත දකුණු-ක්ලික් කිරීමෙන් ඡේද සංස්කරණය සක්‍රීය කරන්න",
        "tog-watchcreations": "මම තනන පිටු හා මම උඩුගත කරන ගොනු මාගේ මුරලැයිස්තුවට එක් කරන්න",
index cd490af..bbd8d5f 100644 (file)
@@ -50,7 +50,6 @@
        "tog-extendwatchlist": "Rozšíriť zoznam sledovaných stránok, aby zobrazoval všetky úpravy, nie len posledné",
        "tog-usenewrc": "Zoskupiť zmeny v posledných úpravách a na zozname sledovaných stránok podľa stránky",
        "tog-numberheadings": "Automaticky číslovať nadpisy",
-       "tog-showtoolbar": "Zobraziť panel nástrojov úprav",
        "tog-editondblclick": "Upravovať stránky po dvojitom kliknutí",
        "tog-editsectiononrightclick": "Umožniť upravovanie sekcie kliknutím pravým tlačidlom myši na nadpisy sekcií",
        "tog-watchcreations": "Pridávať stránky, ktoré vytvorím a súbory, ktoré nahrám medzi sledované",
index 80a0620..f77ecb9 100644 (file)
@@ -11,7 +11,6 @@
        "tog-newpageshidepatrolled": "نویں ورقیاں دی فہرست وچوں نگرانی ہیٹھ ورقے لُکاؤ",
        "tog-hidecategorization": "ورقیاں دیاں ونکی بندی لُکاؤ",
        "tog-numberheadings": "سرخیاں کوں خود کار نمبر ݙیوو",
-       "tog-showtoolbar": "آلات ترمیم ݙکھاؤ",
        "tog-editondblclick": "ڈبل کلک نال ورقے وچ تبدیلیاں کرو",
        "tog-previewontop": "تبدیلی آلے خانے کنوں پہلے پریویو ݙکھاؤ",
        "tog-previewonfirst": "پہلی تبدیلی تے پری ویویو ݙکھاؤ",
        "whatlinkshere-filters": "چھاݨے",
        "whatlinkshere-submit": "ڄلو",
        "ipbreason": "سبب:",
+       "ipb-partial": "جزوی",
+       "ipb-type-label": "قسم",
+       "ipb-pages-label": "ورقے",
        "autoblocklist-submit": "ڳولو",
        "blocklist-reason": "سبب:",
        "infiniteblock": "بے انت",
+       "blocklist-editing": "زیر ترمیم",
        "blocklink": "پابندی لاؤ",
        "contribslink": "حصے داری",
        "blocklogpage": "پابندی دی لاگ",
        "logentry-upload-overwrite": "$1 نے $3 دا نواں نسخہ {{GENDER:$2|اپلوڈ کیتا}}",
        "searchsuggest-search": "ڳولو",
        "duration-days": "$1 {{PLURAL:$1|ݙینہ}}",
+       "mw-widgets-titlesmultiselect-placeholder": "ٻیا شامل کرو۔۔۔",
        "randomrootpage": "بے ترتيب بنیادی ورقہ"
 }
index 4e32140..3c11916 100644 (file)
@@ -28,7 +28,6 @@
        "tog-extendwatchlist": "Razširi spisek nadzorov, da bo prikazoval vse spremembe, ne le najnovejše",
        "tog-usenewrc": "Združi spremembe posamezne strani na zadnjih spremembah in spisku nadzorov",
        "tog-numberheadings": "Samodejno številči poglavja",
-       "tog-showtoolbar": "Prikaži urejevalno orodno vrstico",
        "tog-editondblclick": "Omogoči urejanje strani z dvojnim klikom",
        "tog-editsectiononrightclick": "Omogoči urejanje razdelkov z desnim klikanjem njihovih naslovov",
        "tog-watchcreations": "Na spisek nadzorov dodaj vse ustvarjene strani in moje naložene datoteke",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Geslo se ne sme ujemati s posebej prepovedanimi gesli",
        "passwordpolicies-policy-maximalpasswordlength": "Geslo ne sme biti daljše od $1 {{PLURAL:$1|znak|znaka|znake|znakov}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Geslo ne sme biti {{PLURAL:$1|1=popularno geslo|na seznamu $1 popularnih gesel}}",
-       "easydeflate-invaliddeflate": "Dana vsebina ni pravilno stisnjena"
+       "easydeflate-invaliddeflate": "Dana vsebina ni pravilno stisnjena",
+       "unprotected-js": "Iz varnostnih razlogov JavaScripta ni možno naložiti z nezaščitenih strani. Prosimo, da JavaScript ustvarite samo v imenskem prostoru MediaWiki ali kot uporabniško podstran."
 }
index 21fa4f4..caa94b9 100644 (file)
@@ -27,7 +27,6 @@
        "tog-extendwatchlist": "Erweiterte Beobachtungsliste zur Oazeige oller Änderunga",
        "tog-usenewrc": "Erweiterte Darstellung dar „Letzta Änderunga“ (benetigt JavaScript)",
        "tog-numberheadings": "Ieberschrifta automatisch nummeriern",
-       "tog-showtoolbar": "Bearbta Werkzichleiste aozäan (beneeticht JavaScript)",
        "tog-editondblclick": "Seita mit Doppelklick bearbta (JavaScript)",
        "tog-editsectiononrightclick": "Eenzelne Obschniete per Rechtsklick bearbta (JavaScript)",
        "tog-watchcreations": "Salber derstallte Seyta automatisch beobachta",
index 726c5d4..1ac0131 100644 (file)
@@ -17,7 +17,6 @@
        "tog-extendwatchlist": "Balaari liiska waardiyaha si loo arko dhamaan isbedelada, ma ahan oo kaliya kuwa dhow",
        "tog-usenewrc": "Isticmaal isbdelada dhowdhow oo la'horumariyey (waxaa loo baahanyahay JavaScript)",
        "tog-numberheadings": "Lambarada automaatik ahaan u tirinaayo Cinwaanada",
-       "tog-showtoolbar": "Itus bedelka qalabka shaqada (waxaa loo baahanyahay JavaScript)",
        "tog-editondblclick": "wax ka bedel maqaalada labo jeer la riixay (waxaa loo baahanyahay JavaScript)",
        "tog-editsectiononrightclick": "Fasax cutub wax ka bedelida hadii batoonka midig ee dooliga <br /> dhag lagu siiyo cinwaanka korkiisa (JavaScript)",
        "tog-watchcreations": "Ku dar boggaga aan aniga sameeyay liiskayga waardiyaha",
index d6b68a7..9e938b5 100644 (file)
@@ -49,7 +49,6 @@
        "tog-extendwatchlist": "Zgjero listën e të gjitha faqeve të vëzhguara në mënyrë që t'i tregojë të gjitha ndryshimet, jo vetëm më të fundit.",
        "tog-usenewrc": "Grupo ndryshimet sipas faqes në ndryshimet më të fundit dhe listën e vëzhgimit (kërkon JavaScript)",
        "tog-numberheadings": "Numërim automatik i titujve",
-       "tog-showtoolbar": "Shfaq shiritin e veglave të redaktorit",
        "tog-editondblclick": "Redakto faqe në klikim të dyfishtë",
        "tog-editsectiononrightclick": "Aktivizo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit",
        "tog-watchcreations": "Shto faqet e krijuara dhe skedarët e ngarkuar nga unë në listën time të mbikqyrjes",
index f1c8230..a4e5b1c 100644 (file)
@@ -50,7 +50,6 @@
        "tog-extendwatchlist": "Прошири списак надгледања за приказ свих промена, не само недавних",
        "tog-usenewrc": "Групиши промене по страници у скорашњим изменама и списку надгледања",
        "tog-numberheadings": "Аутоматски нумериши наслове",
-       "tog-showtoolbar": "Прикажи траку са алаткама за уређивање",
        "tog-editondblclick": "Омогући уређивање страница двоструким кликом",
        "tog-editsectiononrightclick": "Омогући уређивање одељака десним кликом на њихове наслове",
        "tog-watchcreations": "Додај странице које направим и датотеке које отпремим на мој списак надгледања",
        "createacct-another-username-ph": "Унесите корисничко име",
        "yourpassword": "Лозинка:",
        "userlogin-yourpassword": "Лозинка",
-       "userlogin-yourpassword-ph": "Унесите своју лозинку",
+       "userlogin-yourpassword-ph": "Унесите лозинку",
        "createacct-yourpassword-ph": "Унесите лозинку",
        "yourpasswordagain": "Поново унеси лозинку:",
        "createacct-yourpasswordagain": "Потврдите лозинку",
        "createacct-benefit-body1": "{{PLURAL:$1|измена|измене|измена}}",
        "createacct-benefit-body2": "{{PLURAL:$1|страница|странице|страница}}",
        "createacct-benefit-body3": "недавно {{PLURAL:$1|активни корисник|активна корисника|активних корисника}}",
-       "badretype": "УнеÑ\82е Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ се не поклапају.",
+       "badretype": "Ð\9bозинке ÐºÐ¾Ñ\98е Ñ\81Ñ\82е Ñ\83нели се не поклапају.",
        "usernameinprogress": "Налог за ово корисничко име се већ прави, сачекајте.",
        "userexists": "Унесено корисничко име је већ у употреби.\nОдаберите друго.",
        "loginerror": "Грешка при пријављивању",
        "resetpass-validity-soft": "Ваша лозинка није важећа: $1\n\nИзаберите нову одмах или кликните на „{{int:authprovider-resetpass-skip-label}}“ да је промените касније.",
        "passwordreset": "Ресетовање лозинке",
        "passwordreset-text-one": "Попуните овај образац да бисте добили привремену лозинку на имејл.",
-       "passwordreset-text-many": "{{PLURAL:$1|Ð\98Ñ\81пÑ\83ниÑ\82е Ñ\98едно Ð¾Ð´ Ð¿Ð¾Ñ\99а ÐºÐ°ÐºÐ¾ Ð±Ð¸Ñ\81Ñ\82е Ð´Ð¾Ð±Ð¸Ð»Ð¸ Ð¿Ñ\80ивÑ\80еменÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð½Ð° Ð¸Ð¼ÐµÑ\98л.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Ð\98Ñ\81пÑ\83ниÑ\82е Ñ\98едно Ð¾Ð´ Ð¿Ð¾Ñ\99а ÐºÐ°ÐºÐ¾ Ð±Ð¸Ñ\81Ñ\82е Ð´Ð¾Ð±Ð¸Ð»Ð¸ Ð¿Ñ\80ивÑ\80еменÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¿Ñ\83Ñ\82ем Ð¸Ð¼ÐµÑ\98ла.}}",
        "passwordreset-disabled": "Ресетовање лозинке је онемогућено на овом викију.",
        "passwordreset-emaildisabled": "Имејл је онемогућен на овом викију.",
        "passwordreset-username": "Корисничко име:",
        "subject-preview": "Преглед теме:",
        "previewerrortext": "Дошло је до грешке при покушају прегледа промена.",
        "blockedtitle": "Корисник је блокиран",
+       "blocked-email-user": "<strong>Вашем корисничком имену је блокирано слање имејлова. Још увек можете да уређујете друге странице на овом викију.</strong> Можете да видите потпуне детаље блокаде на [[Special:MyContributions|доприносима налога]].\n\nБлокаду је извршио/ла $1.\n\nНаведен је следећи разлог: <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Намењена кориснику/ци или IP адреси: $7\n* ID блокаде #$5",
+       "blockedtext-partial": "<strong>Вашем корисничком имену или IP адреси је блокирано прављење промена на овој страници. Још увек можете да уређујете друге странице на овом викију.</strong> Можете да видите потпуне детаље блокаде на [[Special:MyContributions|доприносима налога]].\n\nБлокаду је извршио/ла $1.\n\nНаведен је следећи разлог: <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Намењена кориснику/ци или IP адреси: $7\n* ID блокаде #$5",
        "blockedtext": "<strong>Ваше корисничко име или IP адреса је блокирана.</strong>\n\nБлокаду је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Блокирани: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте дискутовали о блокади.\nНе можете да користите функцију „{{int:emailuser}}” осим ако сте навели валидну имејл-адресу у својим [[Special:Preferences|подешавањима налога]] и нисте блокирани од коришћења исте.\nВаша тренутна IP адреса је $3, а ID блокаде #$5.\nНаведите све горње детаље при прављењу било каквих упита.",
        "autoblockedtext": "Ваша IP адреса је аутоматски блокирана јер ју је користио други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Име корисника: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте расправљали о блокади.\n\nЗапамтите да не можете да користите функцију „{{int:emailuser}}“ осим ако сте навели важећу имејл-адресу у својим [[Special:Preferences|подешавањима]].\n\nВаша тренутна IP адреса је $3, а ID блокаде $5.\nУкључите све горње детаље при прављењу било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "ipb-disableusertalk": "Онемогући кориснику да уређује своју страницу за разговор",
        "ipb-change-block": "Поновно блокирај корисника с овим подешавањима",
        "ipb-confirm": "Потврди блокирање",
+       "ipb-sitewide": "На целом сајту",
+       "ipb-partial": "Делимично",
+       "ipb-type-label": "Врста",
+       "ipb-pages-label": "Странице",
        "badipaddress": "Неважећа IP адреса",
        "blockipsuccesssub": "Блокирање је успело",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана}}.<br />\nПогледајте [[Special:BlockList|списак]] за преглед блокада.",
        "createaccountblock": "отварање налога је онемогућено",
        "emailblock": "имејл је онемогућен",
        "blocklist-nousertalk": "забрањено уређивање сопствене странице за разговор",
+       "blocklist-editing": "уређивање",
+       "blocklist-editing-sitewide": "уређивање (на целом сајту)",
        "ipblocklist-empty": "Списак блокирања је празан.",
        "ipblocklist-no-results": "Тражена IP адреса или корисничко име није блокирано.",
        "blocklink": "блокирај",
        "tooltip-pt-preferences": "{{GENDER:|Ваша}} подешавања",
        "tooltip-pt-watchlist": "Списак страница чије промене надгледате",
        "tooltip-pt-mycontris": "Списак {{GENDER:|ваших}} доприноса",
-       "tooltip-pt-anoncontribs": "Ð\9bиÑ\81Ñ\82а измена направљених са ове IP адресе",
+       "tooltip-pt-anoncontribs": "СпиÑ\81ак измена направљених са ове IP адресе",
        "tooltip-pt-login": "Предлажемо вам да се пријавите, иако то није обавезно",
        "tooltip-pt-login-private": "Морате да се пријавите да бисте користили овај Вики",
        "tooltip-pt-logout": "Одјавите се",
        "dberr-usegoogle": "У међувремену, покушајте да претражите помоћу Гугла.",
        "dberr-outofdate": "Имајте на уму да њихови примерци нашег садржаја могу бити застарели.",
        "dberr-cachederror": "Ово је привремено меморисан примерак стране који можда није ажуран.",
-       "htmlform-invalid-input": "Ð\9fоÑ\81Ñ\82оÑ\98е Ð¿Ñ\80облеми Ñ\81а Ð²Ð°Ñ\88им Ñ\83ноÑ\81ом.",
+       "htmlform-invalid-input": "Ð\9fоÑ\81Ñ\82оÑ\98е Ð¿Ñ\80облеми Ñ\81а Ð½ÐµÐºÐ¸Ð¼ Ð¾Ð´ Ð²Ð°Ñ\88иÑ\85 Ñ\83ноÑ\81а.",
        "htmlform-select-badoption": "Вредност коју сте навели није валидна опција.",
        "htmlform-int-invalid": "Наведена вредност није цели број.",
        "htmlform-float-invalid": "Наведена вредност није број.",
        "logentry-block-block": "$1 је {{GENDER:$2|блокирао|блокирала}} {{GENDER:$4|$3}} у трајању од $5 $6",
        "logentry-block-unblock": "$1 је {{GENDER:$2|деблокирао|деблокирала}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања за блокирање {{GENDER:$4|корисника|кориснице}} {{GENDER:$4|$3}} у трајању од $5 $6",
+       "logentry-partialblock-block": "$1 је {{GENDER:$2|блокирао|блокирала}} уређивање {{PLURAL:$8|странице|страница}} $7 {{GENDER:$4|кориснику|корисници|кориснику/ци}} $3 са временом истека од $5 $6",
+       "logentry-non-editing-block-block": "$1 је {{GENDER:$2|блокирао|блокирала}} неуређивачке радње {{GENDER:$4|кориснику|корисници|кориснику/ци}} $3 са временом истека од $5 $6",
+       "logentry-non-editing-block-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања блокаде неуређивачких радњи {{GENDER:$4|кориснику|корисници|кориснику/ци}} $3 са временом истека од $5 $6",
        "logentry-suppress-block": "$1 је {{GENDER:$2|блокирао|блокирала}} {{GENDER:$4|$3}} у трајању од $5 $6",
        "logentry-suppress-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања за блокирање {{GENDER:$4|корисника|кориснице}} {{GENDER:$4|$3}} у трајању од $5 $6",
        "logentry-import-upload": "$1 је {{GENDER:$2|увезао|увезла}} $3 отпремањем датотеке",
        "mw-widgets-titleinput-description-redirect": "преусмерава на $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Додајте категорију…",
        "mw-widgets-usersmultiselect-placeholder": "Додајте још…",
+       "mw-widgets-titlesmultiselect-placeholder": "Додајте још…",
        "date-range-from": "Од датума:",
        "date-range-to": "До датума:",
        "sessionmanager-tie": "Не можете да комбинујете више типова потврде идентитета: $1.",
        "passwordpolicies-policy-passwordcannotmatchusername": "Лозинка не може да буде иста као корисничко име",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Лозинка се не може подударати са лозинкама на црној листи",
        "passwordpolicies-policy-maximalpasswordlength": "Лозинка мора да буде краћа од $1 {{PLURAL:$1|знака|знакова}}",
-       "passwordpolicies-policy-passwordcannotbepopular": "Лозинка не може да буде {{PLURAL:$1|популарна лозинка|на списку $1 популарних лозинки}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "Лозинка не може да буде {{PLURAL:$1|популарна лозинка|на списку $1 популарних лозинки}}",
+       "unprotected-js": "Из безбедносних разлога, JavaScript не може да се учита са незаштићене странице. Само направите JavaScript у именском простору „Медијавики:” или као корисничку подстраницу"
 }
index 09b96de..78040ab 100644 (file)
@@ -43,7 +43,6 @@
        "tog-extendwatchlist": "Proširi spisak nadgledanja za prikaz svih promena, ne samo nedavnih",
        "tog-usenewrc": "Grupiši promene po stranici u skorašnjim izmenama i spisku nadgledanja",
        "tog-numberheadings": "Automatski numeriši naslove",
-       "tog-showtoolbar": "Prikaži traku sa alatkama za uređivanje",
        "tog-editondblclick": "Omogući uređivanje stranica dvostrukim klikom",
        "tog-editsectiononrightclick": "Omogući uređivanje odeljaka desnim klikom na njihove naslove",
        "tog-watchcreations": "Dodaj stranice koje napravim i datoteke koje otpremim na moj spisak nadgledanja",
index 15a7147..05343e9 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "Moro langa \"Tan luku\" réy",
        "tog-usenewrc": "Moro betre Laste Kenki (JavaScript)",
        "tog-numberheadings": "Gi den ede wan nomru sondro fu yepi",
-       "tog-showtoolbar": "Sori Kenki-Wrokosani-barki (JavaScript)",
        "tog-editondblclick": "Naki tu tron fu kenki (JavaScript)",
        "tog-editsectiononrightclick": "Gi primisi fu kenki pisi-papira nanga wan naki n'a leti-anu sey na tapu wan pisi-ede (JavaScript)",
        "tog-watchcreations": "Tan luku den papira di mi meki",
index 83390c7..e8a5ed0 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Uutgediende Beooboachtengslieste tou Anwiesenge fon aal Annerengen",
        "tog-usenewrc": "Fermeerde Deerstaalenge fon do \"Lääste Annerengen\" (bruukt Javascript)",
        "tog-numberheadings": "Uurskrifte automatisk nuumerierje",
-       "tog-showtoolbar": "Beoarbaidengs-Reewen anwiese",
        "tog-editondblclick": "Sieden mäd Dubbeldklik beoarbaidje (JavaScript)",
        "tog-editsectiononrightclick": "Eenpelde Ousatse mäd Gjuchtsklik beoarbaidje (JavaScript)",
        "tog-watchcreations": "Aal do sälwen näi anlaide Sieden beooboachtje",
index bcf7bc5..f175311 100644 (file)
@@ -26,7 +26,6 @@
        "tog-extendwatchlist": "Legaan béréndélan ngarah sakabéh parobahanana kaawaskeun",
        "tog-usenewrc": "Parobahan grup dumasar kaca dina béréndélan anu anyar robah jeung daptar awaseun",
        "tog-numberheadings": "Nomeran lulugu sacara otomatis",
-       "tog-showtoolbar": "Témbongkeun tulbar édit",
        "tog-editondblclick": "Édit kaca ku klik ganda",
        "tog-editsectiononrightclick": "Fungsikeun ngédit sub-bagean kalawan klik-katuhu dina judul bagéan",
        "tog-watchcreations": "Tambahkeun kaca-kaca jieunan kuring jeung berkas muatan kuring kana daptar awaseun",
index ed82a7f..2c461bd 100644 (file)
@@ -89,7 +89,6 @@
        "tog-extendwatchlist": "Utöka bevakningslistan till att visa alla ändringar, inte bara den senaste",
        "tog-usenewrc": "Gruppera ändringar efter sida i senaste ändringar och bevakningslistan",
        "tog-numberheadings": "Numrera rubriker automatiskt",
-       "tog-showtoolbar": "Visa redigeringsverktygsraden",
        "tog-editondblclick": "Redigera sidor med dubbelklick",
        "tog-editsectiononrightclick": "Aktivera redigering av avsnitt genom högerklick på underrubriker",
        "tog-watchcreations": "Lägg till sidor jag skapar och filer jag laddar upp till min bevakningslista",
        "badarticleerror": "Den åtgärden kan inte utföras på den här sidan.",
        "cannotdelete": "Sidan eller filen \"$1\" kunde inte raderas.\nDen kanske redan har raderats av någon annan.",
        "cannotdelete-title": "Sidan \"$1\" kan inte raderas",
+       "delete-scheduled": "Sidan \"$1\" är schemalagd för radering.\nHa tålamod.",
        "delete-hook-aborted": "Borttagning avbruten av hook.\nDen gav ingen förklaring.",
        "no-null-revision": "Kunde inte skapa ny tom version för sidan \"$1\"",
        "badtitle": "Felaktig titel",
        "subject-preview": "Förhandsgranskning av ämne:",
        "previewerrortext": "Ett fel uppstod när dina ändringar skulle förhandsgranskas.",
        "blockedtitle": "Användaren är blockerad",
+       "blocked-email-user": "<strong>Ditt användarnamn har blockerats från att skicka e-post. Du kan fortfarande redigera andra sidor på denna wiki.</strong> Du kan se de fullständiga blockeringsdetaljerna på [[Special:MyContributions|kontobidragen]].\n\nBlockeringen gjordes av $1.\n\nAnledningen var <em>$2</em>.\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6\n* Blockeringen är avsedd för: $7\n* Blockerings-ID nr $5",
+       "blockedtext-partial": "<strong>Ditt användarnamn eller IP-adress har blockerats från att göra ändringar på denna sida. Du kan fortfarande redigera andra sidor på denna wiki.</strong> Du kan se de fullständiga blockeringsdetaljerna på [[Special:MyContributions|kontobidrag]].\n\nBlockeringen gjordes av $1.\n\nAnledningen var <em>$2</em>.\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6\n* Blockeringen är avsedd för: $7\n* Blockerings-ID nr $5",
        "blockedtext": "'''Din IP-adress eller ditt användarnamn är blockerat.'''\n\nBlockeringen utfördes av $1 med motiveringen: ''$2''.\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6.\n* Blockeringen var avsedd för: $7.\n\nDu kan kontakta $1 eller någon annan av [[{{MediaWiki:Grouppage-sysop}}|administratörerna]] för att diskutera blockeringen.\nOm du är inloggad och har uppgivit en e-postadress i dina [[Special:Preferences|inställningar]] så kan du använda funktionen \"{{int:emailuser}}\", såvida du inte blivit blockerad från funktionen.\n\nDin IP-adress är $3 och blockerings-ID är #$5.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "autoblockedtext": "Din IP-adress har blockerats automatiskt eftersom den har använts av en annan användare som blockerats av $1.\nMotiveringen av blockeringen var:\n\n:''$2''\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6\n* Blockeringen är avsedd för: $7\n\nDu kan kontakta $1 eller någon annan [[{{MediaWiki:Grouppage-sysop}}|administratör]] för att diskutera blockeringen.\n\nObservera att du inte kan använda dig av funktionen \"{{int:emailuser}}\" om du inte har registrerat en giltig e-postadress i [[Special:Preferences|dina inställningar]] eller om du har blivit blockerad från att skicka e-post.\n\nDin nuvarande IP-adress är $3, och blockerings-ID är #$5.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "systemblockedtext": "Ditt användarnamn eller IP-adress h    ar blockerats automatiskt av MediaWiki.\n\nMotiveringen av blockeringen var:\n\n:<em>$2</em>\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6\n* Blockeringen är avsedd för: $7\n\nDin nuvarande IP-adress är $3.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "prefixindex": "Alla sidor med prefix",
        "prefixindex-namespace": "Alla sidor med prefix ($1 namnrymder)",
        "prefixindex-submit": "Visa",
-       "prefixindex-strip": "Avlägsna prefix i lista",
+       "prefixindex-strip": "Dölj prefixet i resultaten",
        "shortpages": "Korta sidor",
        "longpages": "Långa sidor",
        "deadendpages": "Sidor utan länkar",
        "ipb-disableusertalk": "Hindra användaren från att redigera sin egen diskussionssida under blockeringen",
        "ipb-change-block": "Återblockera användaren med de här inställningarna",
        "ipb-confirm": "Bekräfta blockering",
+       "ipb-sitewide": "Hela webbplatsen",
+       "ipb-partial": "Partiell",
+       "ipb-type-label": "Typ",
+       "ipb-pages-label": "Sidor",
        "badipaddress": "Du har inte skrivit IP-adressen korrekt.",
        "blockipsuccesssub": "Blockeringen är utförd",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] har blockerats.<br />\nFör att se alla aktuella blockeringar, gå till [[Special:BlockList|listan över blockeringar]].",
        "movepage-moved": "'''\"$1\" har flyttats till \"$2\"'''",
        "movepage-moved-redirect": "En omdirigering har skapats.",
        "movepage-moved-noredirect": "Skapandet av en omdirigering avbröts.",
+       "movepage-delete-first": "Målsidan har för många revisioner att radera som del av sidflyttningen. Radera först sidan manuellt och försök sedan igen.",
        "articleexists": "Antingen existerar redan en sida med det namnet, eller så har du valt ett namn som inte är tillåtet.\nVälj något annat namn istället.",
        "cantmove-titleprotected": "Du kan inte flytta sidan till den titeln, eftersom den nya titeln har skyddats från att skapas.",
        "movetalk": "Flytta tillhörande diskussionssida",
        "logentry-block-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} med en varaktighet på $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|avblockerade}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningar för {{GENDER:$4|$3}} med en varaktighet på $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} från att redigera {{PLURAL:$8||sidorna}} $7 med en varaktighet på $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningarna för {{GENDER:$4|$3}} som förhindrar redigeringar på {{PLURAL:$8||sidorna}} $7 med en varaktighet på $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} från icke-redigerande handlingar med en varaktighet på $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningarna för {{GENDER:$4|$3}} för icke-redigerande handlingar med en varaktighet på $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} med en varaktighet på $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningar för {{GENDER:$4|$3}} med en varaktighet på $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importerade}} $3 genom filuppladdning",
        "mw-widgets-titleinput-description-redirect": "omdirigerar till $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Lägg till en kategori...",
        "mw-widgets-usersmultiselect-placeholder": "Lägg till fler...",
+       "mw-widgets-titlesmultiselect-placeholder": "Lägg till fler...",
        "date-range-from": "Från datum:",
        "date-range-to": "Till datum:",
        "sessionmanager-tie": "Kan inte kombinera flera begäransautentiseringstyper: $1.",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Lösenordet kan inte matcha specifikt svartlistade lösenord",
        "passwordpolicies-policy-maximalpasswordlength": "Lösenordet måste vara högst $1 {{PLURAL:$1|tecken}} långt",
        "passwordpolicies-policy-passwordcannotbepopular": "Lösenordet kan inte vara {{PLURAL:$1|det populäraste lösenordet|i listan över de $1 populäraste lösenorden}}",
-       "easydeflate-invaliddeflate": "Innehåll som tillhandahålls är inte helt komprimerat"
+       "easydeflate-invaliddeflate": "Innehåll som tillhandahålls är inte helt komprimerat",
+       "unprotected-js": "Av säkerhetsskäl kan inte JavaScript läsas in från oskyddade sidor. Skapa endast JavaScript i namnrymden MediaWiki: eller som en användarundersida."
 }
index a0e1e10..18de234 100644 (file)
@@ -30,7 +30,6 @@
        "tog-extendwatchlist": "Tanua orodha ya maangalizi ili kuonyesha mabadiliko yote yaliyofanyika, si hilo la mwisho tu.",
        "tog-usenewrc": "Mabadiliko ya kundi kwa kurasa kwenye mabadiliko ya karibuni na orodha ya maangalizi",
        "tog-numberheadings": "Vichwa vya habari vijipange namba-vyenyewe",
-       "tog-showtoolbar": "Onyesha mwambaa wa zana za kuhariria",
        "tog-editondblclick": "Hariri ukurasa kwa kubonyeza mara mbili",
        "tog-editsectiononrightclick": "Wezesha sehemu ya kuandikia kwa kubonyeza kitufe cha kulia cha puku yako kwa kubonyeza kwenye vichwa vya sehemu",
        "tog-watchcreations": "Ongeza kurasa nilizoumba katika maangalizi yangu",
index 8a9a78e..11b8cbc 100644 (file)
@@ -32,7 +32,6 @@
        "tog-extendwatchlist": "Pokŏż na mojij pozōrliście wszyjske, a niy jyno niydŏwne pōmiany",
        "tog-usenewrc": "Potajluj pōmiany podug zajtōw we niydŏwnych pōmianach i pozōrliście",
        "tog-numberheadings": "Automatycznŏ nōmeracyjŏ titlōw",
-       "tog-showtoolbar": "Pokŏż spisek nŏczyniōw",
        "tog-editondblclick": "Edycyjõ napoczynajōm dwa klikniyncia (JavaScript)",
        "tog-editsectiononrightclick": "Klikniyncie prawym kneflym myszy na titlu tajli<br />napoczynŏ jigo edycyjõ(JavaScript)",
        "tog-watchcreations": "Przidej zajty, kere żech napisoł i pliki, kere żech wciepoł, na mojã pozōrlistã",
index e2a152b..e6f33f6 100644 (file)
@@ -65,7 +65,6 @@
        "tog-extendwatchlist": "அனைத்து பொருத்தமான மாற்றங்களைக் காட்டுமாறு கவனிப்புப் பட்டியலை விரிவாக்கு",
        "tog-usenewrc": "அண்மைய மாற்றங்கள் மற்றும் கவனிப்புப் பட்டியல் பக்கத்தில் மாற்றங்களை பக்கத்தை பொறுத்து குழுவாக்கு",
        "tog-numberheadings": "தலைப்புகளுக்கு தானியங்கி இலக்கமிடு",
-       "tog-showtoolbar": "கருவிப்பட்டையைக் காட்டு",
        "tog-editondblclick": "இரட்டைச் சொடுக்கில் பக்கங்களைத் தொகு",
        "tog-editsectiononrightclick": "பிரிவுத் தலைப்பின் மீது வலச் சொடுக்குவதன் மூலம் பகுதித்  தொகுப்பை செயலாக்கவும்",
        "tog-watchcreations": "நான் உருவாக்கும் பக்கங்கள் மற்றும் பதிவேற்றும் கோப்புகளை எனது கவனிப்புப் பட்டியலில் சேர்க்கவும்.",
index cfd4c2b..4aaf3a0 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "ಕೇವಲೊ ಇಂಚಿಪೊದ ಬದಲಾವನೆಲತ್ತಂದೆ, ಸಂಬಂದೊ ಇಪ್ಪುನ ಮಾತ ಬದಲಾವನೆನ್ಲಾ ತೋಜುಲೆಕ ಪಟ್ಟಿನ್ ವಿಸ್ತರಿಪುಲೆ",
        "tog-usenewrc": "ಇಂಚಿಪೊದ ಬದಲಾವಣೆ ಬೊಕ್ಕೊ ವೀಕ್ಷಣಾಪಟ್ಟಿಡ್ ಪುಟೊತ ಅನುಸಾರ ಗುಂಪು ಬದಲಾವಣೆಲು",
        "tog-numberheadings": "ತರೆಬರವುಲೆಗ್ ಕ್ರಮಸಂಖ್ಯೆಲೆನ್ ತೋಜಾವು",
-       "tog-showtoolbar": "ಸಂಪಾದನೆದ ಉಪಕರನೊ ಪಟ್ಟಿನ್ ತೋಜಾವು",
        "tog-editondblclick": "ರಡ್ಡ್ ಸರ್ತಿ ಒತ್ತ್‌ನಗ ಪುಟೊನು ಸಂಪೊಲಿಪುನಂಚ ಆವಡ್",
        "tog-editsectiononrightclick": "ಪುಟೊತ ವಿಬಾಗೊಲೆನ್ ಐತ ಸೀರ್ಸಿಕೆನ್ ರಡ್ಡ್ ಸರ್ತಿ ಒತ್ತ್‌ನಗ ಸಂಪೊಲಿಪುನಂಚ ಉಪ್ಪಡ್",
        "tog-watchcreations": "ಯಾನ್ ಉಂಡುಮಲ್ತಿನ ಪುಟೊಕ್ಲೆನ್ ಬೊಕ್ಕ ಅಪ್ಲೋಡ್ ಮಲ್ತಿ ಕಡತೊಲೆನ್ ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
index 6548aaa..ef21d2e 100644 (file)
@@ -26,7 +26,8 @@
                        "Matma Rex",
                        "WP MANIKHANTA",
                        "SrihariThalla",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Pavan santhosh.s"
                ]
        },
        "tog-underline": "లంకె క్రీగీత:",
@@ -37,7 +38,6 @@
        "tog-extendwatchlist": "కేవలం ఇటీవలి మార్పులే కాక, మార్పులన్నీ చూపించటానికి నా వీక్షణా జాబితాను పెద్దది చేయి",
        "tog-usenewrc": "ఇటీవలి మార్పులు, వీక్షణ జాబితాలలో మార్పులను పేజీ వారీగా చూపించు",
        "tog-numberheadings": "శీర్షికలకు అప్రమేయంగా వరుస సంఖ్యలు చేర్చు",
-       "tog-showtoolbar": "దిద్దుబాటు పనిముట్ల పట్టీని చూపించు",
        "tog-editondblclick": "డబుల్‌ క్లిక్కు చేసినప్పుడు పేజీని మార్చు",
        "tog-editsectiononrightclick": "విభాగాల శీర్షికల మీద కుడినొక్కుతో విభాగపు దిద్దుబాటును చేతనం చేయి",
        "tog-watchcreations": "నేను సృష్టించే పేజీలను, దస్త్రాలనూ నా వీక్షణ జాబితాకు చేర్చు",
        "subject-preview": "విషయపు మునుజూపు:",
        "previewerrortext": "మీ మార్పులు మునుజూపు చూపడంలో లోపం దొర్లింది.",
        "blockedtitle": "వాడుకరి నిరోధించబడ్డారు",
+       "blockedtext-partial": "<strong>ఈ పేజీల్లో మార్పులు చేయకుండా మీ వాడుకరి పేరు లేక ఐపీ అడ్రస్‌ను నిరోధం విధించారు. మీరు ఇంకా వికీలోని ఇతర పేజీల్లో మార్పులు చేయవచ్చు.</strong> [[Special:MyContributions|నా మార్పులు]] అన్న దగ్గర నిరోధానికి సంబంధించిన పూర్తి వివరాలు మీరు చూడవచ్చు.\n\nఈ నిరోధాన్ని $1 విధించారు.\n\nఅందుకు ఇచ్చిన కారణం ఇదీ: <em>$2</em>.\n\n* నిరోధం మొదలైన సమయం: $8\n* నిరోధించిన కాలం : $6\n* ఉద్దేశిత నిరోధిత వాడుకరి: $7\n* నిరోధించిన ఐడీ #$5",
        "blockedtext": "<strong>మీ వాడుకరిపేరును లేదా ఐ.పి. చిరునామాను నిరోధించారు.</strong>\n\nనిరోధించినవారు $1.\nఅందుకు వారు ఇచ్చిన కారణం: <em>$2</em>.\n\n* నిరోధం మొదలైన సమయం: $8\n* నిరోధించిన కాలం: $6\n* నిరోధానికి గురైనవారు: $7\n\nఈ నిరోధంపై చర్చించేందుకు మీరు $1 ను గాని, మరెవరైనా [[{{MediaWiki:Grouppage-sysop}}|నిర్వాహకుని]] గాని సంప్రదించవచ్చు.\nమీ [[Special:Preferences|ఖాతా అభిరుచులలో]] సరైన ఈ-మెయిలు చిరునామా ఇచ్చివుండకపోయినా లేదా మిమ్మల్ని 'ఈ వాడుకరికి ఈ-మెయిలు పంపు' సౌలభ్యాన్ని వాడుకోవడం నుండి నిరోధించివున్నా మీరు ఈమెయిలు ద్వారా సంప్రదించలేరు.\nమీ ప్రస్తుత ఐ.పీ. చిరునామా $3, నిరోధపు ID #$5.\nమీ సంప్రదింపులన్నిటిలోనూ పై వివరాలను పేర్కొనండి.",
        "autoblockedtext": "మీ ఐపీ చిరునామా ఆటోమాటిగ్గా నిరోధించబడింది. ఎందుకంటే ఇదే ఐపీ చిరునామాని ఓ నిరోధిత వాడుకరి ఉపయోగించారు. ఆ వాడుకరిని $1 నిరోధించారు.\nఅందుకు ఇచ్చిన కారణం ఇదీ:\n\n:<em>$2</em>\n\n* నిరోధం మొదలైన సమయం: $8\n* నిరోధించిన కాలం: $6\n* ఉద్దేశించిన నిరోధిత వాడుకరి: $7\n\nఈ నిరోధం గురించి చర్చించేందుకు మీరు $1 ను గానీ, లేదా ఇతర [[{{MediaWiki:Grouppage-sysop}}|నిర్వాహకులను]] గానీ సంప్రదించండి.\n\nమీ [[Special:Preferences|అభిరుచులలో]] సరైన ఈమెయిలు ఐడీని ఇచ్చి ఉంటే తప్ప, మీరు \"ఈ వాడుకరికి ఈమెయిలు పంపు\" అనే అంశాన్ని వాడజాలరని గమనించండి. ఆ సౌలభ్యాన్ని వాడటం నుండి మిమ్మల్ని నిరోధించలేదు.\n\nమీ ప్రస్తుత ఐపీ చిరునామా $3, నిరోధపు ఐడీ: $5.\nమీ సంప్రదింపులన్నిటిలోను అన్ని పై వివరాలను ఉదహరించండి.",
        "systemblockedtext": "మీడియావికీ మీ వాడుకరిపేరు లేదా ఐపీ అడ్రసును ఆటోమాటిగ్గా నిరోధించింది.\nఅందుకు ఇచ్చిన కారణం:\n\n:<em>$2</em>\n\n* నిరోధం మొదలైన సమయం: $8\n* నిరోధం ముగిసే సమయం: $6\n* నిరోధానికి గురైనవారు: $7\n\nమీ ప్రస్తుత ఐపీ అడ్రసు $3.\nమీ సంప్రదింపులన్నిటిలోనూ పై వివరాలను పేర్కొనండి.",
        "userpage-userdoesnotexist": "\"$1\" అనే వాడుకరి ఖాతా నమోదయిలేదు. మీరు ఈ పేజీని సృష్టించాలని/సరిదిద్దాలని అనుకుంటున్నారేమో చూడండి.",
        "userpage-userdoesnotexist-view": "వాడుకరి ఖాతా \"$1\" నమోదుకాలేదు.",
        "blocked-notice-logextract": "ప్రస్తుతం ఈ వాడుకరిని నిరోధించారు.\nనిరోధపు చిట్టాలోని చివరి పద్దుని మీ సమాచారం కోసం ఈ క్రింద ఇస్తున్నాం:",
-       "clearyourcache": "<strong>గమనిక:</strong> భద్రపరచిన తర్వాత, మార్పులను చూడాలంటే మీ విహారిణి యొక్క కోశాన్ని తీసేయాల్సిరావచ్చు.\n*<strong>ఫైర్‌ఫాక్స్‌ / సఫారి:</strong> <em>Shift</em> మీటని నొక్కిపట్టి <em>Reload</em>ని నొక్కండి లేదా <em>Ctrl-F5</em> గానీ <em>Ctrl-R</em> (మాకింటోషులో <em>⌘-Shift-R</em>) గానీ నొక్కండి\n* <strong>గూగుల్ క్రోమ్:</strong> <em>Ctrl-Shift-R</em> (మాక్ లో <em>⌘-Shift-R</em>) నొక్కండి\n*<strong>ఇంటర్నెట్ ఎక్ప్లోరర్:</strong> <em>Ctrl</em> ను నొక్కిపట్టి <em>Refresh</em> నొక్కండి లేదా <em>Ctrl-F5</em> నొక్కండి.\n*<em>ఒపెరా:</em> <em>Tools → Preferences</em> ద్వారా కోశాన్ని ఖాళీ చెయ్యండి",
+       "clearyourcache": "<strong>గమనిక:</strong> భద్రపరచిన తర్వాత, మార్పులను చూడాలంటే మీ విహారిణి యొక్క కోశాన్ని తీసేయాల్సిరావచ్చు.\n*<strong>ఫైర్‌ఫాక్స్‌ / సఫారి:</strong> <em>Shift</em> మీటని నొక్కిపట్టి <em>Reload</em>ని నొక్కండి లేదా <em>Ctrl-F5</em> గానీ <em>Ctrl-R</em> (మాకింటోషులో <em>⌘-Shift-R</em>) గానీ నొక్కండి\n* <strong>గూగుల్ క్రోమ్:</strong> <em>Ctrl-Shift-R</em> (మాక్ లో <em>⌘-Shift-R</em>) నొక్కండి\n*<strong>ఇంటర్నెట్ ఎక్ప్లోరర్:</strong> <em>Ctrl</em> ను నొక్కిపట్టి <em>Refresh</em> నొక్కండి లేదా <em>Ctrl-F5</em> నొక్కండి.\n* <strong>ఓపెరా:</strong> <em>Menu → Settings</em> వెళ్ళి (మ్యాక్‌లో <em>Opera → Preferences</em>కు వెళ్ళాలి) తర్వాత <em>Privacy & security → Clear browsing data → Cached images and files</em>కు వెళ్ళండి.",
        "usercssyoucanpreview": "<strong>చిట్కా:</strong> భద్రపరిచేముందు మీ కొత్త CSSని పరీక్షించడానికి \"{{int:showpreview}}\" బొత్తాన్ని వాడండి.",
        "userjsyoucanpreview": "<strong>చిట్కా:</strong> భద్రపరిచేముందు మీ కొత్త జావాస్క్రిప్టుని పరీక్షించడానికి \"{{int:showpreview}}\" బొత్తాన్ని వాడండి.",
        "usercsspreview": "<strong>మీరు వాడుకరి CSSను కేవలం సరిచూస్తున్నారని గుర్తుంచుకోండి.\nదాన్నింకా భద్రపరచలేదు!</strong>",
        "recentchangeslinked-feed": "సంబంధిత మార్పులు",
        "recentchangeslinked-toolbox": "సంబంధిత మార్పులు",
        "recentchangeslinked-title": "\"$1\" కు సంబంధించిన మార్పులు",
-       "recentchangeslinked-summary": "à°\8fà°¦à±\88నా à°ªà±\87à°\9cà±\80à°\95à°¿ à°²à±\87దా à°ªà±\87à°\9cà±\80à°¨à±\81à°\82à°¡à°¿ à°²à°¿à°\82à°\95à±\88 à°\89à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°\9cà°°à°¿à°\97à°¿à°¨ à°®à°¾à°°à±\8dà°ªà±\81లనà±\81 à°\9aà±\82à°¸à±\87à°\82à°¦à±\81à°\95à±\81 à°\86 à°ªà±\87à°\9cà±\80 à°ªà±\87à°°à±\81 à°\87à°µà±\8dà°µà°\82à°¡à°¿. (à°\8fà°¦à±\88నా à°µà°°à±\8dà°\97à°\82à°²à±\8bని à°ªà±\87à°\9cà±\80లనà±\81 à°\9aà±\82à°¸à±\87à°\82à°¦à±\81à°\95à±\81, à°µà°°à±\8dà°\97à°\82 à°ªà±\87à°°à±\81 à°\87à°µà±\8dà°µà°\82à°¡à°¿).  [[Special:Watchlist|à°®à±\80 à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితా]]à°²à±\8b à°\89à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°\9cà°°à°¿à°\97à°¿à°¨ à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 <strong>à°¬à±\8aà°¦à±\8dà°¦à±\81</strong>à°\97à°¾ à°\89à°\82à°\9fాయి.",
+       "recentchangeslinked-summary": "à°\8fà°¦à±\88నా à°ªà±\87à°\9cà±\80à°²à±\8b à°\95ానà±\80, à°\86 à°ªà±\87à°\9cà±\80 à°¨à±\81à°\82à°¡à°¿ à°²à°¿à°\82à°\95à±\88 à°\89à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°\95ానà±\80 à°\9cà°°à°¿à°\97à°¿à°¨ à°®à°¾à°°à±\8dà°ªà±\81లనà±\81 à°\9aà±\82à°¸à±\87à°\82à°¦à±\81à°\95à±\81 à°\86 à°ªà±\87à°\9cà±\80 à°ªà±\87à°°à±\81 à°\87à°µà±\8dà°µà°\82à°¡à°¿. (à°\8fà°¦à±\88నా à°µà°°à±\8dà°\97à°\82à°²à±\8bని à°ªà±\87à°\9cà±\80లనà±\81 à°\9aà±\82à°¸à±\87à°\82à°¦à±\81à°\95à±\81, {{ns:category}}:వరà±\8dà°\97à°\82 à°ªà±\87à°°à±\81 à°\87à°µà±\8dà°µà°\82à°¡à°¿).  [[Special:Watchlist|à°®à±\80 à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితా]]à°²à±\8bని à°ªà±\87à°\9cà±\80à°²à±\8dà°²à±\8b à°\9cà°°à°¿à°\97à°¿à°¨ à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 <strong>à°¬à±\8aà°¦à±\8dà°¦à±\81</strong>à°\97à°¾ à°\95నిపిసà±\8dà°¤ాయి.",
        "recentchangeslinked-page": "పేజీ పేరు:",
        "recentchangeslinked-to": "లేదంటే, ఇచ్చిన పేజీకి లింకయివున్న పేజీలలో జరిగిన మార్పులను చూపించు",
        "recentchanges-page-added-to-category": "[[:$1]] ను వర్గానికి చేర్చాం",
        "zip-wrong-format": "ఇచ్చినది ZIP ఫైలు కాదు.",
        "zip-bad": "ఫైలు చెడిపోయిన, లేదా చదవడానికి వీల్లేని ZIP ఫైలు అయ్యుండాలి.\nదానిపై భద్రతా పరమైన పరీక్ష చెయ్యలేం.",
        "zip-unsupported": "ఇది MediaWiki కి పట్టులేని ZIP అంశాలు కలిగిన ZIP ఫైలు.\nదీనిపై సరైన భద్రతా పరీక్షలు చెయ్యలేం.",
-       "uploadstash": "à°­à±\8bషాణà°\82 à°\8eà°\95à±\8dà°\95à°¿à°\82à°ªు",
+       "uploadstash": "à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà°¿ à°¦à°¾à°\9aు",
        "uploadstash-summary": "ఎక్కించినప్పటికీ వికీలో ప్రచురితం కాని  (లేదా ఎక్కింపు జరుగుతున్న) ఫైళ్ళు ఈ పేజీలో కనిపిస్తాయి. ఈ ఫైళ్ళు ఎక్కించిన వాడుకరికి తప్ప మరొకరికి కనబడవు.",
        "uploadstash-clear": "భోషాణం లోని ఫైళ్లను తీసివెయ్యి",
        "uploadstash-nofiles": "మీకు ఫైళ్ళ భోషాణమేమీ లేదు.",
        "prefixindex": "ఉపసర్గతో అన్ని పేజీలు",
        "prefixindex-namespace": "ఉపసర్గతో ఉన్న పేజీలు ($1 పేరుబరి)",
        "prefixindex-submit": "చూపించు",
-       "prefixindex-strip": "à°\9cాబితాలà±\8b à°\86దిపదానà±\8dని à°¤à±\80సివà±\87యి",
+       "prefixindex-strip": "ఫలితాలà±\8dà°²à±\8b à°\89పసరà±\8dà°\97లనà±\81 à°¦à°¾à°\9aà±\81",
        "shortpages": "చిన్న పేజీలు",
        "longpages": "పొడవు పేజీలు",
        "deadendpages": "అగాధ (డెడ్ఎండ్) పేజీలు",
        "ipb-disableusertalk": "నిరోధంలో ఉండగా ఈ వాడుకరి తన స్వంత చర్చ పేజీలో మార్పుచేర్పులు చెయ్యకుండా నిరోధించు",
        "ipb-change-block": "ఈ అమరికలతో వాడుకరిని పునర్నిరోధించు",
        "ipb-confirm": "నిరోధాన్ని ధృవపరచండి",
+       "ipb-sitewide": "సైట్ వ్యాప్తంగా",
+       "ipb-partial": "పాక్షికం",
+       "ipb-type-label": "రకం",
+       "ipb-pages-label": "పేజీలు",
        "badipaddress": "సరైన ఐ.పి. అడ్రసు కాదు",
        "blockipsuccesssub": "నిరోధం విజయవంతం అయింది",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] నిరోధించబడింది.<br />\nనిరోధాల సమీక్ష కొరకు [[Special:BlockList|నిరోధాల జాబితా]] చూడండి.",
        "pageinfo-header-restrictions": "పేజీ సంరక్షణ",
        "pageinfo-header-properties": "పేజీ లక్షణాలు",
        "pageinfo-display-title": "చూపించే శీర్షిక",
+       "pageinfo-default-sort": "అప్రమేయంగా విడదీసే కీ",
        "pageinfo-length": "పేజీ నిడివి (బైట్లలో)",
        "pageinfo-article-id": "పేజీ ఐడీ",
        "pageinfo-language": "పేజీ విషయపు భాష",
        "version-libraries-description": "వివరణ",
        "version-libraries-authors": "రచయితలు",
        "redirect": "ఫైలు పేరు, వాడుకరి ఐడీ, పేజీ ఐడీ, కూర్పు ఐడీ లేదా లాగ్ ఐడీ పేరిట దారిమార్పు చెయ్యండి",
+       "redirect-summary": "ఒక దస్త్రానికి (దస్త్రం పేరు ఇవ్వాలి) కానీ, ఒక పేజీకి (రివిజన్ ఐడీ కానీ, పేజీ పేరు కానీ ఇవ్వాలి) కానీ, ఒక వాడుకరి పేరుకు కానీ (అంకెలతో కూడిన వాడుకరి ఐడీ ఇవ్వాలి), లాగ్ ఎంట్రీకి (లాగ్ ఐడీ ఇవ్వాలి) కానీ తీసుకువెళ్తుంది. వాడే పద్ధతి: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "వెళ్ళు",
        "redirect-lookup": "చూడు:",
        "redirect-value": "విలువ:",
        "logentry-block-block": "$1, {{GENDER:$4|$3}}ను {{GENDER:$2|నిరోధించారు}}. నిరోధ కాలం: $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$4|$3}} పై ఉన్న {{GENDER:$2|నిరోధాన్ని ఎత్తివేసారు}}",
        "logentry-block-reblock": "$1 {{GENDER:$4|$3}} యొక్క నిరోధపు కాలం తీరిపోయే వ్యవధిని $5 $6 గా సెట్టింగులను {{GENDER:$2|మార్చారు}}",
+       "logentry-partialblock-block": "{{GENDER:$4|$3}} {{PLURAL:$8}} పేజీల్లో ($7) మార్పులు చేయకుండా $1 {{GENDER:$2|నిరోధించారు}}. నిరోధించిన కాలం : $5 $6",
+       "logentry-partialblock-reblock": "{{GENDER:$4|$3}} {{PLURAL:$8}} పేజీల్లో ($7) మార్పులు చేయకుండా $1 {{GENDER:$2|నిరోధించారు}}. నిరోధించిన కాలం : $5 $6",
+       "logentry-non-editing-block-block": "$5 $6 సమయానికి నిరోధం ముగిసే వరకు {{GENDER:$4|$3}}ని $1 దిద్దుబాట్లు కాకుండా ఇతర చర్యల నుంచి {{GENDER:$2|నిరోధించారు}}",
+       "logentry-non-editing-block-reblock": "{{GENDER:$4|$3}} నిరోధాల సెట్టింగులను $1 {{GENDER:$2|మార్చారు}}. ప్రస్తుతం నిరోధ కాలపు గడువు: $5 $6.",
        "logentry-suppress-block": "$1, {{GENDER:$4|$3}}ను {{GENDER:$2|నిరోధించారు}}. నిరోధ కాలం: $5 $6",
        "logentry-suppress-reblock": "$1, {{GENDER:$4|$3}} యొక్క నిరోధాల సెట్టింగులను {{GENDER:$2|మార్చారు}}. నిరోధ కాలం: $5 $6",
        "logentry-import-upload": "$1, $3 ను దస్త్రం ఎక్కింపు ద్వారా {{GENDER:$2|దిగుమతి చేసారు}}",
        "mw-widgets-titleinput-description-redirect": "$1 కు దారిమార్పు",
        "mw-widgets-categoryselector-add-category-placeholder": "ఓ వర్గాన్ని చేర్చండి...",
        "mw-widgets-usersmultiselect-placeholder": "మరిన్ని చేర్చండి...",
+       "mw-widgets-titlesmultiselect-placeholder": "మరింత చేర్చండి...",
        "date-range-from": "తేదీ నుండి",
        "date-range-to": "తేదీ వరకు",
        "sessionprovider-generic": "$1 సెషన్లు",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "కూకీ-ఆధారిత సెషన్లు",
+       "randomrootpage": "యాదృచ్ఛిక మూల పేజీ",
        "log-action-filter-block": "నిరోధపు రకం:",
        "log-action-filter-delete": "తొలగింపు రకం:",
        "log-action-filter-import": "Type of import:",
index 8c7b63a..0f6d694 100644 (file)
@@ -12,7 +12,6 @@
        "tog-underline": "Subliña ligasaun sira:",
        "tog-hideminor": "Lá'os hatudu muda ki-ki'ik iha mudansa foufoun sira",
        "tog-usenewrc": "Iha lista \"mudansa foufoun sira\" no \"lista hateke\": Hatudu mudansa iha grupu sira - grupu ida ba pájina ida",
-       "tog-showtoolbar": "Hatudu kaixa edita",
        "tog-watchcreations": "Hateke pájina no imajen sira-ne'ebé ha'u kria/tau iha arkivu laran",
        "tog-watchdefault": "Hateke pájina sira-ne'ebé ha'u edita",
        "tog-watchmoves": "Hateke pájina sira-ne'ebé ha'u book",
index e41b212..574a587 100644 (file)
@@ -26,7 +26,6 @@
        "tog-extendwatchlist": "Густариши феҳристи пайгириҳо барои нишон додани ҳамаи тағйирот, на танҳо аз ҳама охирин",
        "tog-usenewrc": "Гурӯҳбандии тағийрот бар пояи сафҳа дар тағийроти охир ва феҳристи пайгириҳо",
        "tog-numberheadings": "шуморагузори~и худкори инвонҳо",
-       "tog-showtoolbar": "Намоиши навори абзори вироиш",
        "tog-editondblclick": "Вироиш намудани саҳифаҳо ҳангоми ду карат пахш намудани тугмаи мушак",
        "tog-editsectiononrightclick": "Ба кор андохтани вироиши сарлавҳаҳои қисматҳо бо клики рост",
        "tog-watchcreations": "Саҳифаҳое, ки месозам ва парвандаҳое, ки боргузорӣ мекунам ба феҳристи пайгириҳоям афзуда шавад.",
index 7839f18..989f4fd 100644 (file)
@@ -15,7 +15,6 @@
        "tog-extendwatchlist": "Gustarişi fehristi pajgiriho baroi nişon dodani hamai taƣjirotho, na tanho az hama oxirin",
        "tog-usenewrc": "Az taƣjiroti oxiri gustarişjofta istifoda bared(ÇavaSkript lozim ast)",
        "tog-numberheadings": "şumoraguzori~i xudkori invonho",
-       "tog-showtoolbar": "Namoişi navori abzori viroiş (JavaScript)",
        "tog-editondblclick": "Viroiş namudani sahifaho hangomi du karat paxş namudani tugmai muşak (JavaScript)",
        "tog-editsectiononrightclick": "Ba kor andoxtani viroişi sarlavhahoi qismatho bo kliki rost (ÇavaSkript)",
        "tog-watchcreations": "Doxil namudani sahifahoe, ki man soxtaam ba fehristi nazaroti man",
index 17e1956..90b9c4d 100644 (file)
                ]
        },
        "tog-underline": "การขีดเส้นใต้ลิงก์:",
-       "tog-hideminor": "à¸\8bà¹\88อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อยà¹\83à¸\99หà¸\99à¹\89าà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ลà¹\88าสุà¸\94",
+       "tog-hideminor": "ซ่อนการแก้ไขเล็กน้อยในหน้าเปลี่ยนแปลงล่าสุด",
        "tog-hidepatrolled": "ซ่อนการแก้ไขที่ตรวจสอบแล้วในหน้าปรับปรุงล่าสุด",
        "tog-newpageshidepatrolled": "ซ่อนหน้าที่ตรวจสอบแล้วในรายการหน้าใหม่",
        "tog-hidecategorization": "ซ่อนการจัดหมวดหมู่หน้า",
        "tog-extendwatchlist": "ขยายรายการเฝ้าดูให้แสดงการเปลี่ยนแปลงทั้งหมด ไม่เพียงการเปลี่ยนแปลงล่าสุด",
-       "tog-usenewrc": "à¸\88ัà¸\94à¸\81ลุà¹\88มà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\81à¸\9aà¹\88à¸\87à¸\95ามหà¸\99à¹\89าà¹\83à¸\99รายà¸\81ารà¸\9bรัà¸\9aà¸\9bรุงล่าสุดและรายการเฝ้าดู",
+       "tog-usenewrc": "à¸\88ัà¸\94à¸\81ลุà¹\88มà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\81à¸\9aà¹\88à¸\87à¸\95ามหà¸\99à¹\89าà¹\83à¸\99รายà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงล่าสุดและรายการเฝ้าดู",
        "tog-numberheadings": "กำหนดเลขพาดหัวอัตโนมัติ",
-       "tog-showtoolbar": "แสดงแถบเครื่องมือแก้ไข",
        "tog-editondblclick": "แก้ไขหน้าเมื่อคลิกสองครั้ง",
        "tog-editsectiononrightclick": "เปิดใช้งานการแก้ไขส่วนโดยคลิกขวาที่ชื่อเรื่องของส่วนนั้น",
        "tog-watchcreations": "เพิ่มหน้าที่ฉันสร้างและไฟล์ที่ฉันอัปโหลดเข้ารายการเฝ้าดู",
@@ -63,9 +62,9 @@
        "tog-watchlisthideown": "ซ่อนการแก้ไขของฉันจากรายการเฝ้าดู",
        "tog-watchlisthidebots": "ซ่อนการแก้ไขของบอตจากรายการเฝ้าดู",
        "tog-watchlisthideminor": "ซ่อนการแก้ไขเล็กน้อยจากรายการเฝ้าดู",
-       "tog-watchlisthideliu": "à¸\8bà¹\88อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\82à¸\94ยà¸\9cูà¹\89à¹\83à¸\8aà¹\89ลà¹\87อà¸\81อิà¸\99จากรายการเฝ้าดู",
+       "tog-watchlisthideliu": "à¸\8bà¹\88อà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\82à¸\94ยà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aจากรายการเฝ้าดู",
        "tog-watchlistreloadautomatically": "โหลดรายการเฝ้าดูใหม่อัตโนมัติเมื่อใดที่มีการเปลี่ยนตัวกรอง (ต้องการจาวาสคริปต์)",
-       "tog-watchlistunwatchlinks": "à¹\80à¸\9eิà¹\88มลิà¸\87à¸\81à¹\8cà¹\80ลิà¸\81à¹\80à¸\9dà¹\89าà¸\94ู/à¹\80à¸\9dà¹\89าà¸\94ูà¹\82à¸\94ยà¸\95รà¸\87à¹\80à¸\82à¹\89าหà¸\99à¹\88วยรายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู (ต้องการจาวาสคริปต์เพื่อเปิดปิดการใช้งาน)",
+       "tog-watchlistunwatchlinks": "à¹\80à¸\9eิà¹\88มà¹\80à¸\84รืà¹\88อà¸\87หมายà¹\80ลิà¸\81à¹\80à¸\9dà¹\89าà¸\94ู/à¹\80à¸\9dà¹\89าà¸\94ูà¹\82à¸\94ยà¸\95รà¸\87 ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) à¸¥à¸\87à¹\83à¸\99หà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\9dà¹\89าà¸\94ูà¸\97ีà¹\88มีà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87 (ต้องการจาวาสคริปต์เพื่อเปิดปิดการใช้งาน)",
        "tog-watchlisthideanons": "ซ่อนการแก้ไขโดยผู้ใช้นิรนามจากรายการเฝ้าดู",
        "tog-watchlisthidepatrolled": "ซ่อนการแก้ไขที่ตรวจสอบแล้วจากรายการเฝ้าดู",
        "tog-watchlisthidecategorization": "ซ่อนการจัดหมวดหมู่หน้า",
        "tool-link-userrights-readonly": "ดูกลุ่ม{{GENDER:$1|ผู้ใช้}}",
        "tool-link-emailuser": "ส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้",
        "imagepage": "ดูหน้าไฟล์",
-       "mediawikipage": "à¸\94ูหà¸\99à¹\89าสาร",
+       "mediawikipage": "à¸\94ูหà¸\99à¹\89าà¸\82à¹\89อà¸\84วาม",
        "templatepage": "ดูหน้าแม่แบบ",
        "viewhelppage": "ดูหน้าคำอธิบาย",
        "categorypage": "ดูหน้าหมวดหมู่",
        "youhavenewmessages": "คุณมี$1 ($2)",
        "youhavenewmessagesfromusers": "คุณมี $1จาก{{PLURAL:$3|ผู้ใช้คนอื่น|ผู้ใช้ $3 คน}} ($2)",
        "youhavenewmessagesmanyusers": "คุณมี $1จากผู้ใช้หลายคน ($2)",
-       "newmessageslinkplural": "$1 สารใหม่",
+       "newmessageslinkplural": "ข้อความใหม่ $1 ข้อความ",
        "newmessagesdifflinkplural": "$1 การเปลี่ยนแปลงล่าสุด",
-       "youhavenewmessagesmulti": "à¸\84ุà¸\93มีสารใหม่ที่ $1",
+       "youhavenewmessagesmulti": "à¸\84ุà¸\93มีà¸\82à¹\89อà¸\84วามใหม่ที่ $1",
        "editsection": "แก้ไข",
        "editold": "แก้ไข",
        "viewsourceold": "ดูโค้ด",
        "nstab-special": "หน้าพิเศษ",
        "nstab-project": "หน้าโครงการ",
        "nstab-image": "ไฟล์",
-       "nstab-mediawiki": "สาร",
+       "nstab-mediawiki": "à¸\82à¹\89อà¸\84วาม",
        "nstab-template": "แม่แบบ",
        "nstab-help": "หน้าคำอธิบาย",
        "nstab-category": "หมวดหมู่",
        "databaseerror-query": "คำสั่ง: $1",
        "databaseerror-function": "ฟังก์ชัน: $1",
        "databaseerror-error": "ข้อผิดพลาด: $1",
+       "transaction-duration-limit-exceeded": "เพื่อเป็นการหลีกเลี่ยงการทำซ้ำไม่ให้มีความล่าช้าสูง การดำเนินการนี้ถูกยกเลิกเนื่องจากระยะเวลาในการเขียน ($1) สูงเกินกว่าระยะเวลาที่จำกัดไว้ $2 วินาที\nหากคุณกำลังเปลี่ยนแปลงหลายรายการในครั้งเดียว ให้ลองทำการดำเนินการที่เล็กกว่าแทน",
        "laggedslavemode": "<strong>คำเตือน:</strong> หน้านี้อาจไม่มีการปรับข้อมูลล่าสุด",
        "readonly": "ฐานข้อมูลถูกล็อก",
        "enterlockreason": "ใส่เหตุแห่งการล็อก ทั้งเวลาที่คาดว่าจะปลดล็อก",
        "badarticleerror": "ไม่สามารถดำเนินปฏิบัติการนี้ในหน้านี้",
        "cannotdelete": "ไม่สามารถลบหน้าหรือไฟล์ \"$1\" \nผู้อื่นอาจลบไปแล้ว",
        "cannotdelete-title": "ไม่สามารถลบหน้า ''$1''",
+       "delete-scheduled": "มีการกำหนดเวลาลบหน้า \"$1\" แล้ว\nโปรดรอสักครู่",
        "delete-hook-aborted": "การลบถูกฮุกยกเลิก\nโดยไม่มีคำชี้แจง",
        "no-null-revision": "ไม่สามารถสร้างรุ่นแก้ไขว่างใหม่ของหน้า \"$1\"",
        "badtitle": "ใช้ชื่อเรื่องนี้ไม่ได้",
        "protectedpagetext": "หน้านี้ถูกล็อกเพื่อป้องกันการแก้ไขหรือปฏิบัติการอื่น",
        "viewsourcetext": "คุณสามารถดูและคัดลอกโค้ดของหน้านี้",
        "viewyourtext": "คุณสามารถดูและคัดลอกต้นฉบับ<strong>การแก้ไขของคุณ</strong>มาหน้านี้ได้",
-       "protectedinterface": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99à¸\82à¹\89อà¸\84วามสà¹\88วà¸\99à¸\95à¹\88อà¸\9bระสาà¸\99สำหรับซอฟต์แวร์บนวิกินี้ และถูกป้องกันมิให้แก้ไขเพื่อป้องกันการก่อกวน\nหากต้องการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [https://translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
-       "editinginterface": "<strong>à¸\84ำà¹\80à¸\95ือà¸\99:</strong> à¸«à¸\99à¹\89าà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าสำหรัà¸\9aà¸\81ำหà¸\99à¸\94à¸\82à¹\89อà¸\84วามà¹\83à¸\99สà¹\88วà¸\99à¹\81สà¸\94à¸\87à¸\9cลà¸\82อà¸\87à¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8c\nà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\88ะมีà¸\9cลà¸\95à¹\88อà¸\81ารà¹\81สà¸\94à¸\87à¸\9cลà¸\82อà¸\87สà¹\88วà¸\99à¸\95à¹\88อà¸\9bระสาà¸\99ผู้ใช้ที่ปรากฏแก่ผู้ใช้อื่นบนวิกินี้",
+       "protectedinterface": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99à¸\82à¹\89อà¸\84วามอิà¸\99à¹\80à¸\95อรà¹\8cà¹\80à¸\9fà¸\8bสำหรับซอฟต์แวร์บนวิกินี้ และถูกป้องกันมิให้แก้ไขเพื่อป้องกันการก่อกวน\nหากต้องการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [https://translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
+       "editinginterface": "<strong>à¸\84ำà¹\80à¸\95ือà¸\99:</strong> à¸«à¸\99à¹\89าà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าสำหรัà¸\9aà¸\81ำหà¸\99à¸\94à¸\82à¹\89อà¸\84วามà¹\83à¸\99อิà¸\99à¹\80à¸\95อรà¹\8cà¹\80à¸\9fà¸\8bà¸\82อà¸\87à¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8c\nà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¸\88ะมีà¸\9cลà¸\95à¹\88อà¸\81ารà¹\81สà¸\94à¸\87à¸\9cลà¸\82อà¸\87อิà¸\99à¹\80à¸\95อรà¹\8cà¹\80à¸\9fà¸\8bผู้ใช้ที่ปรากฏแก่ผู้ใช้อื่นบนวิกินี้",
        "translateinterface": "ในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [https://translatewiki.net/ translatewiki.net] โครงการแปลเป็นภาษาถิ่นของมีเดียวิกิ",
        "cascadeprotected": "หน้านี้ถูกป้องกันมิให้แก้ไข เพราะถูกรวมอยู่ใน{{PLURAL:$1|page, which is|หน้าต่อไปนี้}} ซึ่งถูกล็อกโดยเปิดตัวเลือก \"ต่อเรียง\":\n$2",
        "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
        "invalidtitle-knownnamespace": "ชื่อเรื่องที่มีเนมสเปซ \"$2\" กับข้อความ \"$3\" ไม่ถูกต้อง",
        "invalidtitle-unknownnamespace": "ชื่อเรื่องที่ไม่ทราบเนมสเปซหมายเลข $1 กับข้อความ \"$2\" ไม่ถูกต้อง",
        "exception-nologin": "ยังไม่ได้เข้าสู่ระบบ",
-       "exception-nologin-text": "à¹\82à¸\9bรà¸\94ลà¹\87อà¸\81อิà¸\99à¹\80à¸\9eืà¹\88อสามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87หà¸\99à¹\89าหรือà¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\99ี้",
+       "exception-nologin-text": "à¹\82à¸\9bรà¸\94à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\80à¸\9eืà¹\88อà¹\83หà¹\89สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87หà¸\99à¹\89าหรือà¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\99ีà¹\89à¹\84à¸\94้",
        "exception-nologin-text-manual": "โปรด$1เพื่อสามารถเข้าถึงหน้าหรือปฏิบัติการนี้",
        "virus-badscanner": "โครงแบบผิดพลาด: ไม่รู้จักตัวสแกนไวรัส: <em>$1</em>",
        "virus-scanfailed": "การสแกนล้มเหลว (โค้ด $1)",
        "virus-unknownscanner": "โปรแกรมป้องกันไวรัสที่ไม่รู้จัก:",
-       "logouttext": "<strong>à¸\84ุà¸\93ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8cà¹\81ลà¹\89ว</strong>\n\nหมายà¹\80หà¸\95ุวà¹\88า à¸\9aาà¸\87หà¸\99à¹\89าอาà¸\88ยัà¸\87à¹\81สà¸\94à¸\87à¸\9cลà¹\80สมือà¸\99วà¹\88าà¸\84ุà¸\93ยัà¸\87ลà¹\87อà¸\81อิà¸\99อยูà¹\88 à¸\88à¸\99à¸\81วà¹\88าà¸\84ุà¸\93ล้างแคชเบราว์เซอร์ของคุณ",
-       "cannotlogoutnow-title": "à¹\84มà¹\88สามารà¸\96ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8cà¹\84à¸\94à¹\89à¸\82à¸\93ะนี้",
-       "cannotlogoutnow-text": "à¹\84มà¹\88สามารà¸\96ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8cได้เมื่อกำลังใช้ $1",
+       "logouttext": "<strong>à¸\84ุà¸\93ออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9aà¹\81ลà¹\89ว</strong>\n\nสัà¸\87à¹\80à¸\81à¸\95วà¹\88าà¸\9aาà¸\87หà¸\99à¹\89าอาà¸\88ยัà¸\87à¹\81สà¸\94à¸\87à¸\9cลà¹\80สมือà¸\99วà¹\88าà¸\84ุà¸\93ยัà¸\87à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aอยูà¹\88 à¸\88à¸\99à¸\81วà¹\88าà¸\84ุà¸\93à¸\88ะล้างแคชเบราว์เซอร์ของคุณ",
+       "cannotlogoutnow-title": "à¹\84มà¹\88สามารà¸\96ออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9aà¹\84à¸\94à¹\89à¸\95อà¸\99นี้",
+       "cannotlogoutnow-text": "à¹\84มà¹\88สามารà¸\96ออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9aได้เมื่อกำลังใช้ $1",
        "welcomeuser": "ยินดีต้อนรับ $1!",
        "welcomecreation-msg": "สร้างบัญชีของคุณแล้ว\nคุณสามารถเปลี่ยน[[Special:Preferences|การตั้งค่า]] {{SITENAME}} ของคุณได้หากต้องการ",
        "yourname": "ชื่อผู้ใช้:",
        "userlogin-signwithsecure": "ใช้การเชื่อมต่อที่ปลอดภัย",
        "cannotlogin-title": "ไม่สามารถเข้าสู่ระบบได้",
        "cannotlogin-text": "ไม่สามารถเข้าสู่ระบบได้",
-       "cannotloginnow-title": "à¹\84มà¹\88สามารà¸\96ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8cà¹\84à¸\94à¹\89à¸\82à¸\93ะนี้",
-       "cannotloginnow-text": "à¹\84มà¹\88สามารà¸\96ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8cได้เมื่อกำลังใช้ $1",
+       "cannotloginnow-title": "à¹\84มà¹\88สามารà¸\96à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\84à¸\94à¹\89à¸\95อà¸\99นี้",
+       "cannotloginnow-text": "à¹\84มà¹\88สามารà¸\96à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aได้เมื่อกำลังใช้ $1",
        "cannotcreateaccount-title": "ไม่สามารถสร้างบัญชีได้",
        "cannotcreateaccount-text": "การสร้างบัญชีโดยตรงไม่ได้เปิดใช้งานบนวิกินี้",
        "yourdomainname": "โดเมนของคุณ:",
        "externaldberror": "มีข้อผิดพลาดของฐานข้อมูลการพิสูจน์ตัวจริง หรือคุณไม่ได้รับอนุญาตให้ปรับบัญชีภายนอกของคุณ",
        "login": "เข้าสู่ระบบ",
        "login-security": "ยืนยันตัวตนของคุณ",
-       "nav-login-createaccount": "ลà¹\87อà¸\81อิà¸\99 / สร้างบัญชี",
+       "nav-login-createaccount": "à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a / สร้างบัญชี",
        "logout": "ออกจากระบบ",
        "userlogout": "ออกจากระบบ",
        "notloggedin": "ยังไม่ได้เข้าสู่ระบบ",
        "createacct-realname": "ชื่อจริง (เลือกไม่ใส่ได้)",
        "createacct-reason": "เหตุผล",
        "createacct-reason-ph": "เหตุใดคุณจึงสร้างอีกบัญชี",
-       "createacct-reason-help": "สารที่แสดงในปูมการสร้างบัญชี",
+       "createacct-reason-help": "à¸\82à¹\89อà¸\84วามที่แสดงในปูมการสร้างบัญชี",
        "createacct-submit": "สร้างบัญชีของคุณ",
        "createacct-another-submit": "สร้างบัญชี",
        "createacct-continue-submit": "สร้างบัญชีต่อ",
        "badretype": "รหัสผ่านที่คุณกรอกไม่ตรง",
        "usernameinprogress": "การสร้างบัญชีสำหรับชื่อผู้ใช้นี้อยู่ระหว่างดำเนินการแล้ว\nโปรดรอสักครู่",
        "userexists": "ชื่อผู้ใช้ที่กรอกมีผู้ใช้แล้ว \nกรุณาเลือกชื่ออื่น",
-       "loginerror": "ลà¹\87อà¸\81อิà¸\99à¸\9cิà¸\94à¸\9eลาà¸\94",
+       "loginerror": "à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a",
        "createacct-error": "การสร้างบัญชีผิดพลาด",
        "createaccounterror": "ไม่สามารถสร้างบัญชี: $1",
-       "nocookiesnew": "สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\81ลà¹\89ว à¹\81à¸\95à¹\88ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87อà¸\81อิà¸\99 \n{{SITENAME}} à¹\83à¸\8aà¹\89à¸\84ุà¸\81à¸\81ีà¹\89à¹\80à¸\9eืà¹\88อลà¹\87อà¸\81อิà¸\99à¸\9cูà¹\89à¹\83à¸\8aà¹\89\nà¸\84ุà¸\93à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\84ุà¸\81à¸\81ีà¹\89\nà¹\82à¸\9bรà¸\94à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99 à¹\81ลà¹\89วลà¹\87อà¸\81อิà¸\99พร้อมชื่อผู้ใช้และรหัสผ่านใหม่ของคุณ",
+       "nocookiesnew": "สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\81ลà¹\89ว à¹\81à¸\95à¹\88ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a \n{{SITENAME}} à¹\83à¸\8aà¹\89à¸\84ุà¸\81à¸\81ีà¹\89à¹\80à¸\9eืà¹\88อà¸\99ำà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a\nà¸\84ุà¸\93à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\84ุà¸\81à¸\81ีà¹\89\nà¹\82à¸\9bรà¸\94à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99 à¹\81ลà¹\89วà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aพร้อมชื่อผู้ใช้และรหัสผ่านใหม่ของคุณ",
        "nocookieslogin": "{{SITENAME}} ใช้คุกกี้เพื่อล็อกอินผู้ใช้\nคุณปิดใช้งานคุกกี้\nกรุณาเปิดใช้งานและลองอีกครั้ง",
        "nocookiesfornew": "บัญชีผู้ใช้ไม่ถูกสร้าง เนื่องจากเราไม่สามารถยืนยันต้นทาง\nกรุณาทำให้แน่ใจว่าคุณได้เปิดใช้งานคุกกี้ โหลดหน้านี้ใหม่และลองอีกครั้ง",
        "createacct-loginerror": "บัญชีผู้ใช้ถูกสร้างสำเร็จแล้ว แต่คุณไม่สามารถเข้าสู่ระบบได้โดยอัตโนมัติ โปรด[[Special:UserLogin|เข้าสู่ระบบด้วยตนเอง]]",
        "noname": "คุณไม่ได้ใส่ชื่อผู้ใช้ที่ถูกต้อง",
        "loginsuccesstitle": "เข้าสู่ระบบแล้ว",
-       "loginsuccess": "<strong>à¸\82à¸\93ะà¸\99ีà¹\89à¸\84ุà¸\93ลà¹\87อà¸\81อิà¸\99สูà¹\88 {{SITENAME}} à¹\83à¸\99à¸\8aืà¹\88อ \"$1\"</strong>",
+       "loginsuccess": "<strong>à¸\95อà¸\99à¸\99ีà¹\89à¸\84ุà¸\93à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a {{SITENAME}} à¹\83à¸\99à¸\8aืà¹\88อ \"$1\" à¹\81ลà¹\89ว</strong>",
        "nosuchuser": "ไม่มีผู้ใช้ชื่อ \"$1\"\nชื่อผู้ใช้นั้นไวต่ออักษรใหญ่เล็ก\nกรุณาตรวจการสะกดอีกครั้ง หรือ[[Special:CreateAccount|สร้างบัญชีใหม่]]",
        "nosuchusershort": "ไม่มีผู้ใช้ชื่อ \"$1\" \nกรุณาตรวจสอบการสะกด",
        "nouserspecified": "คุณต้องระบุชื่อผู้ใช้",
-       "login-userblocked": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81 à¹\84มà¹\88อà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89ลà¹\87อà¸\81อิà¸\99",
+       "login-userblocked": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81 à¹\84มà¹\88อà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a",
        "wrongpassword": "กรอกชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง \nโปรดลองอีกครั้ง",
        "wrongpasswordempty": "รหัสผ่านที่กรอกว่าง\nโปรดลองอีกครั้ง",
        "passwordtooshort": "รหัสผ่านต้องมีอย่างน้อย $1 อักขระ",
        "password-login-forbidden": "ห้ามใช้ชื่อผู้ใช้และรหัสผ่านนี้",
        "mailmypassword": "ตั้งรหัสผ่านใหม่",
        "passwordremindertitle": "รหัสผ่านชั่วคราวใหม่สำหรับ {{SITENAME}}",
-       "passwordremindertext": "à¸\9cูà¹\89à¹\83à¸\94à¸\9cูà¹\89หà¸\99ึà¹\88à¸\87 (à¸\88าà¸\81à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี $1) à¸\82อà¹\83หà¹\89สà¹\88à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\82อà¸\87 {{SITENAME}} ($4) à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวสำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89 \"$2\" à¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99 à¹\81ละà¸\81ำหà¸\99à¸\94à¹\80à¸\9bà¹\87à¸\99 \"$3\" à¸«à¸²à¸\81à¹\80à¸\9bà¹\87à¸\99à¹\80à¸\88à¸\95à¸\99าà¸\82อà¸\87à¸\84ุà¸\93 à¸\84ุà¸\93à¸\88ำà¸\95à¹\89อà¸\87ลà¹\87อà¸\81อิà¸\99à¹\81ละà¹\80ลือà¸\81รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\83à¸\99à¸\82à¸\93ะà¸\99ีà¹\89 \nรหัสผ่านชั่วคราวของคุณจะหมดอายุใน $5 วัน\n\nหากเป็นบุคคลอื่นที่ขอรหัสผ่านใหม่ หรือหากคุณจำรหัสผ่านของคุณได้แล้ว และไม่ต้องการเปลี่ยนรหัสผ่านใหม่อีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
+       "passwordremindertext": "à¸\9cูà¹\89à¹\83à¸\94à¸\9cูà¹\89หà¸\99ึà¹\88à¸\87 (à¸\88าà¸\81à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี $1) à¸\82อà¹\83หà¹\89สà¹\88à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\82อà¸\87 {{SITENAME}} ($4) à¸£à¸«à¸±à¸ªà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวสำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89 \"$2\" à¸\96ูà¸\81สรà¹\89าà¸\87à¸\82ึà¹\89à¸\99 à¹\81ละà¸\81ำหà¸\99à¸\94à¹\80à¸\9bà¹\87à¸\99 \"$3\" à¸«à¸²à¸\81à¹\80à¸\9bà¹\87à¸\99à¹\80à¸\88à¸\95à¸\99าà¸\82อà¸\87à¸\84ุà¸\93 à¸\84ุà¸\93à¸\88ะà¸\95à¹\89อà¸\87à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\81ละà¹\80ลือà¸\81รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\97ัà¸\99à¸\97ี\nรหัสผ่านชั่วคราวของคุณจะหมดอายุใน $5 วัน\n\nหากเป็นบุคคลอื่นที่ขอรหัสผ่านใหม่ หรือหากคุณจำรหัสผ่านของคุณได้แล้ว และไม่ต้องการเปลี่ยนรหัสผ่านใหม่อีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
        "noemail": "ไม่มีการบันทึกที่อยู่อีเมลสำหรับผู้ใช้ \"$1\"",
        "noemailcreate": "คุณจำต้องใส่ที่อยู่อีเมลให้ถูกต้อง",
-       "passwordsent": "รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bยัà¸\87à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\97ีà¹\88ลà¸\87à¸\97ะà¹\80à¸\9aียà¸\99à¹\84วà¹\89à¸\82อà¸\87 \"$1\"\nà¸\81รุà¸\93าลà¹\87อà¸\81อิà¸\99อีกครั้งหลังได้รับอีเมล",
+       "passwordsent": "รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bยัà¸\87à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\97ีà¹\88ลà¸\87à¸\97ะà¹\80à¸\9aียà¸\99à¹\84วà¹\89à¸\82อà¸\87 \"$1\"\nà¸\81รุà¸\93าà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aอีกครั้งหลังได้รับอีเมล",
        "blocked-mailpassword": "เลขที่อยู่ไอพีของคุณถูกบล็อกมิให้แก้ไข ทำให้ไม่สามารถใช้ฟังก์ชันกู้รหัสผ่าน เพื่อป้องกันการใช้ในทางที่ผิด",
        "eauthentsent": "อีเมลยืนยันถูกส่งไปยังที่อยู่อีเมลที่ระบุไว้แล้ว \nก่อนที่อีเมลอื่นจะถูกส่งไปยังบัญชีนั้น คุณต้องปฏิบัติตามคำสั่งในอีเมลเพื่อยืนยันว่าบัญชีนั้นเป็นของคุณจริง ๆ",
        "throttled-mailpassword": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้วใน $1 ชั่วโมงที่ผ่านมา \nอีเมลตั้งรหัสผ่านใหม่จะส่งไปหนึ่งครั้งต่อ $1 ชั่วโมงเท่านั้น เพื่อป้องกันการกระทำผิด",
        "accountcreated": "สร้างบัญชีแล้ว",
        "accountcreatedtext": "สร้างบัญชีผู้ใช้สำหรับ [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|พูดคุย]]) แล้ว",
        "createaccount-title": "การสร้างบัญชีสำหรับ {{SITENAME}}",
-       "createaccount-text": "มีà¸\9aาà¸\87à¸\84à¸\99สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¹\82à¸\94ยà¹\83à¸\8aà¹\89à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93à¸\9aà¸\99 {{SITENAME}} ($4) à¹\82à¸\94ยà¹\83à¸\8aà¹\89à¸\8aืà¹\88อ \"$2\" à¹\81ละรหัสà¸\9cà¹\88าà¸\99 \"$3\" \nà¸\84ุà¸\93à¸\84วรลà¹\87อà¸\81อิà¸\99และเปลี่ยนรหัสผ่านทันที\n\nคุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เป็นความผิดพลาด",
+       "createaccount-text": "มีà¸\9aาà¸\87à¸\84à¸\99สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¹\82à¸\94ยà¹\83à¸\8aà¹\89à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93à¸\9aà¸\99 {{SITENAME}} ($4) à¹\82à¸\94ยà¹\83à¸\8aà¹\89à¸\8aืà¹\88อ \"$2\" à¹\81ละรหัสà¸\9cà¹\88าà¸\99 \"$3\" \nà¸\84ุà¸\93à¸\84วรà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aและเปลี่ยนรหัสผ่านทันที\n\nคุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เป็นความผิดพลาด",
        "login-throttled": "ที่ผ่านมาคุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
-       "login-abort-generic": "à¸\81ารลà¹\87อà¸\81อิà¸\99ของคุณไม่สำเร็จ - ล้มเลิกแล้ว",
+       "login-abort-generic": "à¸\81ารà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aของคุณไม่สำเร็จ - ล้มเลิกแล้ว",
        "login-migrated-generic": "บัญชีของคุณถูกย้ายแล้ว และไม่มีชื่อผู้ใช้ของคุณอยู่บนวิกินี้อีก",
        "loginlanguagelabel": "ภาษา: $1",
-       "suspicious-userlogout": "à¸\84ำà¸\82อลà¹\87อà¸\81à¹\80อาà¸\95à¹\8cของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย",
+       "suspicious-userlogout": "à¸\84ำà¸\82อออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9aของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย",
        "createacct-another-realname-tip": "ไม่จำเป็นต้องใส่ชื่อจริง\nหากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน",
        "pt-login": "เข้าสู่ระบบ",
        "pt-login-button": "เข้าสู่ระบบ",
        "user-mail-no-addy": "พยายามส่งอีเมลโดยไม่มีที่อยู่อีเมล",
        "user-mail-no-body": "พยายามส่งอีเมลที่มีเนื้อหาว่างหรือสั้นอย่างไร้เหตุผล",
        "changepassword": "เปลี่ยนรหัสผ่าน",
-       "resetpass_announce": "à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\88ึà¸\87à¸\88ะà¹\80สรà¹\87à¸\88สิà¹\89à¸\99à¸\81ารลà¹\87อà¸\81อิà¸\99",
+       "resetpass_announce": "à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¸\81ารà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\80สรà¹\87à¸\88สมà¸\9aูรà¸\93à¹\8c",
        "resetpass_text": "<!-- เพิ่มข้อความที่นี่ -->",
        "resetpass_header": "เปลี่ยนรหัสผ่านบัญชี",
        "oldpassword": "รหัสผ่านเดิม:",
        "newpassword": "รหัสผ่านใหม่:",
        "retypenew": "พิมพ์รหัสผ่านใหม่อีกครั้ง:",
-       "resetpass_submit": "à¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\81ละลà¹\87อà¸\81อิà¸\99",
+       "resetpass_submit": "à¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\81ละà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a",
        "changepassword-success": "เปลี่ยนรหัสผ่านของคุณสำเร็จ!",
-       "changepassword-throttled": "ลà¹\88าสุà¸\94à¸\84ุà¸\93à¸\9eยายามลà¹\87อà¸\81อิà¸\99มาà¸\81à¸\84รัà¹\89à¸\87à¹\80à¸\81ิà¸\99à¹\84à¸\9b\nà¸\81รุà¸\93ารอ $1 à¸\81à¹\88อà¸\99ลองอีกครั้ง",
+       "changepassword-throttled": "ลà¹\88าสุà¸\94à¸\84ุà¸\93à¸\9eยายามà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aหลายà¸\84รัà¹\89à¸\87à¹\80à¸\81ิà¸\99à¹\84à¸\9b\nà¸\81รุà¸\93ารอà¹\80à¸\9bà¹\87à¸\99à¹\80วลา $1à¹\81ลà¹\89วà¸\88ึà¸\87ลองอีกครั้ง",
        "botpasswords": "รหัสผ่านบอต",
-       "botpasswords-summary": "<em>รหัสà¸\9cà¹\88าà¸\99à¸\9aอà¸\95</em>อà¸\99ุà¸\8dาà¸\95à¸\81ารà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\83หà¹\89à¸\81ัà¸\9aà¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\9cà¹\88าà¸\99à¸\97าà¸\87 API à¹\82à¸\94ยà¹\84มà¹\88à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¹\83à¸\9aรัà¸\9aรอà¸\87à¸\81ารลà¹\87อà¸\81อิà¸\99หลัà¸\81à¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\99ีà¹\89 à¸ªà¸´à¸\97à¸\98ิà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\80มืà¹\88อลà¹\87อà¸\81อิà¸\99ด้วยรหัสผ่านบอตอาจถูกจำกัด\n\nถ้าคุณไม่ทราบว่าทำไมคุณอาจต้องการดำเนินการนี้ คุณไม่ควรดำเนินการนี้ และไม่ควรให้ผู้ใดขอให้คุณสร้างรหัสผ่านไว้ให้พวกเขาเหล่านั้น",
+       "botpasswords-summary": "<em>รหัสà¸\9cà¹\88าà¸\99à¸\9aอà¸\95</em>อà¸\99ุà¸\8dาà¸\95à¸\81ารà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¹\83หà¹\89à¸\81ัà¸\9aà¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\9cà¹\88าà¸\99à¸\97าà¸\87 API à¹\82à¸\94ยà¹\84มà¹\88à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¹\83à¸\9aรัà¸\9aรอà¸\87à¸\81ารà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aหลัà¸\81à¸\82อà¸\87à¸\9aัà¸\8dà¸\8aีà¸\99ีà¹\89 à¸ªà¸´à¸\97à¸\98ิà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\80มืà¹\88อà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aด้วยรหัสผ่านบอตอาจถูกจำกัด\n\nถ้าคุณไม่ทราบว่าทำไมคุณอาจต้องการดำเนินการนี้ คุณไม่ควรดำเนินการนี้ และไม่ควรให้ผู้ใดขอให้คุณสร้างรหัสผ่านไว้ให้พวกเขาเหล่านั้น",
        "botpasswords-disabled": "รหัสผ่านสำหรับบอตถูกปิดใช้",
-       "botpasswords-no-central-id": "หาà¸\81à¸\95à¹\89อà¸\87à¸\81ารà¹\83à¸\8aà¹\89รหัสà¸\9cà¹\88าà¸\99à¸\9aอà¸\95 à¸\84ุà¸\93à¸\95à¹\89อà¸\87ลà¹\87อà¸\81อิà¸\99ในชื่อบัญชีผู้ใช้ที่เป็นกลาง",
+       "botpasswords-no-central-id": "หาà¸\81à¸\95à¹\89อà¸\87à¸\81ารà¹\83à¸\8aà¹\89รหัสà¸\9cà¹\88าà¸\99à¸\9aอà¸\95 à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aในชื่อบัญชีผู้ใช้ที่เป็นกลาง",
        "botpasswords-existing": "รหัสผ่านบอตที่มีอยู่",
        "botpasswords-createnew": "สร้างรหัสผ่านบอตใหม่",
        "botpasswords-editexisting": "แก้ไขรหัสผ่านบอตที่มีอยู่เดิม",
        "botpasswords-updated-body": "ปรับรหัสผานบอตสำหรับชื่อบอต \"$1\" ของผู้ใช้ \"$2\" แล้ว",
        "botpasswords-deleted-title": "ลบรหัสผ่านบอตแล้ว",
        "botpasswords-deleted-body": "ลบรหัสผ่านบอตสำหรับชื่อบอต \"$1\" ของผู้ใช้ชื่อ \"$2\" แล้ว",
-       "botpasswords-newpassword": "รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\97ีà¹\88à¸\88ะà¹\83à¸\8aà¹\89à¸\81ัà¸\9a <strong>$1</strong> à¸\84ือ <strong>$2</strong> <em>à¹\82à¸\9bรà¸\94à¹\80à¸\81à¹\87à¸\9aà¸\9aัà¸\99à¸\97ึà¸\81à¸\82à¹\89อมูลà¸\99ีà¹\89à¹\84วà¹\89 à¹\80à¸\9eืà¹\88อà¹\83หà¹\89สามารà¸\96à¸\99ำà¹\84à¸\9bà¹\83à¸\8aà¹\89อà¹\89าà¸\87อิà¸\87à¹\83à¸\99ภายหลัà¸\87à¹\84à¸\94à¹\89</em> <br> (à¹\83à¸\99à¸\81รà¸\93ีà¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\9aอà¸\95à¹\80à¸\81à¹\88าà¸\8bึà¹\88à¸\87à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¸\8aืà¹\88อลà¹\87อà¸\81อิà¸\99เหมือนกับชื่อผู้ใช้ โปรดใช้ <strong>$3</strong> เป็นชื่อผู้ใช้และ <strong>$4</strong> เป็นรหัสผ่าน)",
+       "botpasswords-newpassword": "รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\97ีà¹\88à¸\88ะà¹\83à¸\8aà¹\89à¸\81ัà¸\9a <strong>$1</strong> à¸\84ือ <strong>$2</strong> <em>à¹\82à¸\9bรà¸\94à¹\80à¸\81à¹\87à¸\9aà¸\9aัà¸\99à¸\97ึà¸\81à¸\82à¹\89อมูลà¸\99ีà¹\89à¹\84วà¹\89 à¹\80à¸\9eืà¹\88อà¹\83หà¹\89สามารà¸\96à¸\99ำà¹\84à¸\9bà¹\83à¸\8aà¹\89อà¹\89าà¸\87อิà¸\87à¹\83à¸\99ภายหลัà¸\87à¹\84à¸\94à¹\89</em> <br> (à¹\83à¸\99à¸\81รà¸\93ีà¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\9aอà¸\95à¹\80à¸\81à¹\88าà¸\8bึà¹\88à¸\87à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aเหมือนกับชื่อผู้ใช้ โปรดใช้ <strong>$3</strong> เป็นชื่อผู้ใช้และ <strong>$4</strong> เป็นรหัสผ่าน)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider ไม่พร้อมใช้งาน",
-       "botpasswords-restriction-failed": "à¸\82à¹\89อà¸\88ำà¸\81ัà¸\94à¸\82อà¸\87รหัสà¸\9cà¹\88าà¸\99à¸\9aอà¸\95หà¹\89ามà¹\84มà¹\88à¹\83หà¹\89ลà¹\87อà¸\81อินครั้งนี้",
+       "botpasswords-restriction-failed": "à¸\82à¹\89อà¸\88ำà¸\81ัà¸\94à¸\82อà¸\87รหัสà¸\9cà¹\88าà¸\99à¸\9aอà¸\95หà¹\89ามà¹\84มà¹\88à¹\83หà¹\89à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\83นครั้งนี้",
        "botpasswords-invalid-name": "ชื่อผู้ใช้ที่ระบุไม่มีเครื่องหมายคั่นในรหัสผ่านบอต (\"$1\")",
        "botpasswords-not-exist": "ผู้ใช้ \"$1\" ไม่มีรหัสผ่านบอต \"$2\".",
        "botpasswords-needs-reset": "รหัสผ่านบอตสำหรับชื่อบอต \"$2\" ของผู้ใช้ชื่อ \"$1\" ต้องรีเซ็ต",
        "botpasswords-locked": "คุณไม่สามารถเข้าสู่ระบบด้วยรหัสผ่านบอตได้เนื่องจากบัญชีของคุณถูกล็อกอยู่",
        "resetpass_forbidden": "ไม่สามารถเปลี่ยนรหัสผ่านได้",
        "resetpass_forbidden-reason": "ไม่สามารถเปลี่ยนรหัสผ่านได้: $1",
-       "resetpass-no-info": "à¸\84ุà¸\93à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87ลà¹\87อà¸\81อิà¸\99เพื่อเข้าถึงหน้านี้โดยตรง",
+       "resetpass-no-info": "à¸\84ุà¸\93à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aเพื่อเข้าถึงหน้านี้โดยตรง",
        "resetpass-submit-loggedin": "เปลี่ยนรหัสผ่าน",
        "resetpass-submit-cancel": "ยกเลิก",
        "resetpass-wrong-oldpass": "รหัสผ่านชั่วคราวหรือปัจจุบันไม่ถูกต้อง\nคุณอาจเปลี่ยนรหัสผ่านของคุณสำเร็จแล้ว หรือขอรหัสผ่านชั่วคราวใหม่แล้ว",
        "resetpass-recycled": "โปรดเปลี่ยนรหัสผ่านใหม่ให้ต่างจากรหัสผ่านปัจจุบัน",
-       "resetpass-temp-emailed": "à¸\84ุà¸\93ลà¹\87อà¸\81อิà¸\99à¸\94à¹\89วยรหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวà¸\97ีà¹\88สà¹\88à¸\87à¸\97าà¸\87อีà¹\80มล\nà¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\97ีà¹\88à¸\99ีà¹\88à¸\88ึà¸\87à¸\88ะà¹\80สรà¹\87à¸\88สิà¹\89à¸\99à¸\81ารลà¹\87อà¸\81อิà¸\99:",
+       "resetpass-temp-emailed": "à¸\84ุà¸\93à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¸\94à¹\89วยรหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวà¸\97ีà¹\88สà¹\88à¸\87à¸\97าà¸\87อีà¹\80มล\nà¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¸\97ีà¹\88à¸\99ีà¹\88à¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¸\81ารà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\80สรà¹\87à¸\88สมà¸\9aูรà¸\93à¹\8c:",
        "resetpass-temp-password": "รหัสผ่านชั่วคราว:",
        "resetpass-abort-generic": "การเปลี่ยนรหัสผ่านถูกส่วนขยายยกเลิก",
-       "resetpass-expired": "รหัสà¸\9cà¹\88าà¸\99à¸\82อà¸\87à¸\84ุà¸\93หมà¸\94อายุà¹\81ลà¹\89ว à¹\82à¸\9bรà¸\94à¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\80à¸\9eืà¹\88อลà¹\87อà¸\81อิà¸\99",
+       "resetpass-expired": "รหัสà¸\9cà¹\88าà¸\99à¸\82อà¸\87à¸\84ุà¸\93หมà¸\94อายุà¹\81ลà¹\89ว à¹\82à¸\9bรà¸\94à¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\80à¸\9eืà¹\88อà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a",
        "resetpass-expired-soft": "รหัสผ่านของคุณหมดอายุแล้วและจำเป็นต้องเปลี่ยนใหม่ โปรดเลือกรหัสผ่านใหม่ขณะนี้ หรือคลิก \"{{int:authprovider-resetpass-skip-label}}\" เพื่อเปลี่ยนใหม่ทีหลัง",
        "resetpass-validity-soft": "รหัสผ่านของคุณไม่สมเหตุสมผล: $1\n\nโปรดเลือกรหัสผ่านใหม่ในขณะนี้ หรือคลิก \"{{int:authprovider-resetpass-skip-label}}\" เพื่อเปลี่ยนใหม่ทีหลัง",
        "passwordreset": "ตั้งรหัสผ่านใหม่",
        "passwordreset-domain": "โดเมน:",
        "passwordreset-email": "ที่อยู่อีเมล:",
        "passwordreset-emailtitle": "รายละเอียดบัญชีบน {{SITENAME}}",
-       "passwordreset-emailtext-ip": "à¸\9aาà¸\87à¸\84à¸\99 (à¸\8bึà¹\88à¸\87อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\88าà¸\81à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี $1) à¸\82อà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¹\83หมà¹\88à¸\9aà¸\99{{SITENAME}} ($4) à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\94ัà¸\87à¸\81ลà¹\88าวà¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87à¸\81ัà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\99ีà¹\89:\n\n$2\n\n{{PLURAL:$3|รหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวà¸\99ีà¹\89|รหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวà¹\80หลà¹\88าà¸\99ีà¹\89}}à¸\88ะหมà¸\94อายุà¹\83à¸\99 $5 à¸§à¸±à¸\99\nà¸\95อà¸\99à¸\99ีà¹\89à¸\84ุà¸\93à¸\84วรลà¹\87อà¸\81อิà¸\99และเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
+       "passwordreset-emailtext-ip": "à¸\9aาà¸\87à¸\84à¸\99 (à¸\8bึà¹\88à¸\87อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\84ุà¸\93 à¸\88าà¸\81à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eี $1) à¸\82อà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¸\82อà¸\87à¸\84ุà¸\93à¹\83หมà¹\88à¸\9aà¸\99{{SITENAME}} ($4) à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\94ัà¸\87à¸\81ลà¹\88าวà¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87à¸\81ัà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\99ีà¹\89:\n\n$2\n\n{{PLURAL:$3|รหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวà¸\99ีà¹\89|รหัสà¸\9cà¹\88าà¸\99à¸\8aัà¹\88วà¸\84ราวà¹\80หลà¹\88าà¸\99ีà¹\89}}à¸\88ะหมà¸\94อายุà¹\83à¸\99 $5 à¸§à¸±à¸\99\nà¸\95อà¸\99à¸\99ีà¹\89à¸\84ุà¸\93à¸\84วรà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
        "passwordreset-emailtext-user": "ผู้ใช้ $1 บน {{SITENAME}} ขอตั้งรหัสผ่านของคุณใหม่สำหรับ {{SITENAME}} ($4) {{PLURAL:$3||}}บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
        "passwordreset-emailelement": "ชื่อผู้ใช้: \n$1\n\nรหัสผ่านชั่วคราว: \n$2",
        "passwordreset-emailsentemail": "หากที่อยู่อีเมลนี้สัมพันธ์กับบัญชีของคุณ เช่นนั้นจะส่งอีเมลตั้งรหัสผ่านใหม่",
        "passwordreset-nodata": "ไม่ได้ระบุชื่อผู้ใช้และรหัสผ่านไว้",
        "changeemail": "เปลี่ยนหรือลบที่อยู่อีเมล",
        "changeemail-header": "กรอกแบบนี้เพื่อเปลี่ยนที่อยู่อีเมลของคุณ หากคุณต้องการลบการเชื่อมโยงของที่อยู่อีเมลใด ๆ จากบัญชีของคุณ ให้เว้นที่อยู่อีเมลใหม่ว่างเมื่อส่งแบบ",
-       "changeemail-no-info": "à¸\84ุà¸\93à¸\88ำà¸\95à¹\89อà¸\87ลà¹\87อà¸\81อิà¸\99เพื่อเข้าถึงหน้านี้โดยตรง",
+       "changeemail-no-info": "à¸\84ุà¸\93à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aเพื่อเข้าถึงหน้านี้โดยตรง",
        "changeemail-oldemail": "ที่อยู่อีเมลปัจจุบัน:",
        "changeemail-newemail": "ที่อยู่อีเมลใหม่:",
        "changeemail-newemail-help": "เว้นว่างเขตข้อมูลนี้หากคุณต้องการลบที่อยู่อีเมลของคุณ คุณจะไม่สามารถตั้งรหัสผ่านที่ลืมใหม่และจะไม่ได้รับอีเมลจากวิกินี้ถ้าลบที่อยู่อีเมล",
        "changeemail-none": "(ไม่มี)",
        "changeemail-password": "รหัสผ่าน {{SITENAME}} ของคุณ:",
        "changeemail-submit": "เปลี่ยนอีเมล",
-       "changeemail-throttled": "à¸\84ุà¸\93à¹\84à¸\94à¹\89à¸\9eยายามลà¹\87อà¸\81อิà¸\99หลายà¸\84รัà¹\89à¸\87à¹\80à¸\81ิà¸\99à¹\84à¸\9b\nà¸\81รุà¸\93ารอ $1 à¸\81à¹\88อà¸\99ลองอีกครั้ง",
+       "changeemail-throttled": "à¸\84ุà¸\93à¹\84à¸\94à¹\89à¸\9eยายามà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aหลายà¸\84รัà¹\89à¸\87à¹\80à¸\81ิà¸\99à¹\84à¸\9b\nà¸\81รุà¸\93ารอà¹\80à¸\9bà¹\87à¸\99à¹\80วลา $1à¹\81ลà¹\89วà¸\88ึà¸\87ลองอีกครั้ง",
        "changeemail-nochange": "กรุณากรอกที่อยู่อีเมลอื่น",
        "resettokens": "ตั้งโทเค็นใหม่",
        "resettokens-text": "คุณสามารถตั้งโทเค็นใหม่ ซึ่งให้การเข้าถึงข้อมูลส่วนตัวบางอย่างที่เกี่ยวข้องกับบัญชีของคุณที่นี่\n\nคุณควรตั้งโทเค็นใหม่ หากคุณบอกผู้อื่นโดยมิได้ตั้งใจหรือบัญชีของคุณถูกเจาะ",
        "showpreview": "แสดงตัวอย่าง",
        "showdiff": "แสดงการเปลี่ยนแปลง",
        "blankarticle": "<strong>คำเตือน:</strong> หน้าที่คุณกำลังสร้างว่าง หากคุณคลิก \"$1\" อีกครั้ง จะสร้างหน้าโดยไม่มีเนื้อหาใด",
-       "anoneditwarning": "<strong>à¸\84ำà¹\80à¸\95ือà¸\99:</strong> à¸\84ุà¸\93มิà¹\84à¸\94à¹\89ลà¹\87อà¸\81อิà¸\99 à¸ªà¸²à¸\98ารà¸\93ะà¸\88ะà¹\80หà¹\87à¸\99à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93หาà¸\81à¸\84ุà¸\93à¹\81à¸\81à¹\89à¹\84à¸\82 à¸«à¸²à¸\81à¸\84ุà¸\93<strong>[$1 à¸¥à¹\87อà¸\81อิà¸\99]</strong>หรือ<strong>[$2 à¸ªà¸£à¹\89าà¸\87à¸\9aัà¸\8dà¸\8aี]</strong> à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¸\88ะà¸\96ือวà¹\88าà¹\80à¸\9bà¹\87à¸\99à¸\82อà¸\87à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87à¸\84ุà¸\93 à¸£à¹\88วมà¸\81ัà¸\9aà¸\9bระà¹\82ยà¸\8aà¸\99à¹\8cอืà¹\88à¸\99",
+       "anoneditwarning": "<strong>à¸\84ำà¹\80à¸\95ือà¸\99:</strong> à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a à¸ªà¸²à¸\98ารà¸\93ะà¸\88ะà¹\80หà¹\87à¸\99à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93หาà¸\81à¸\84ุà¸\93à¸\97ำà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\83à¸\94à¹\86 à¸«à¸²à¸\81à¸\84ุà¸\93<strong>[$1 à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a]</strong>หรือ<strong>[$2 à¸ªà¸£à¹\89าà¸\87à¸\9aัà¸\8dà¸\8aี]</strong> à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¸\88ะà¸\96ือวà¹\88าà¹\80à¸\9bà¹\87à¸\99à¸\82อà¸\87à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87à¸\84ุà¸\93 à¸\9eรà¹\89อมà¸\97ัà¹\89à¸\87อาà¸\88มีà¸\9bระà¹\82ยà¸\8aà¸\99à¹\8cอืà¹\88à¸\99à¹\86 à¸\94à¹\89วย",
        "anonpreviewwarning": "<em>คุณมิได้ล็อกอิน การบันทึกจะเก็บเลขที่อยู่ไอพีของคุณในประวัติการแก้ไขของหน้านี้</em>",
        "missingsummary": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ให้ความย่อการแก้ไข\nถ้าคุณคลิก \"$1\" อีก จะบันทึกการแก้ไขของคุณโดยเว้นไว้",
        "selfredirect": "<strong>คำเตือน:</strong> คุณกำลังสร้างการเปลี่ยนทางไปบทความเดียวกัน\nคุณอาจระบุเป้าหมายของการเปลี่ยนทางผิด หรือคุณอาจแก้ไขหน้าผิด \nหากคุณคลิก \"$1\" อีกครั้ง จะสร้างการเปลี่ยนทาง",
        "subject-preview": "ตัวอย่างเรื่อง:",
        "previewerrortext": "เกิดข้อผิดพลาดขณะกำลังพยายามดูตัวอย่างการเปลี่ยนแปลงของคุณ",
        "blockedtitle": "ผู้ใช้ถูกบล็อก",
+       "blocked-email-user": "<strong>ชื่อผู้ใช้ของคุณถูกบล็อกไม่ให้ส่งอีเมล แต่คุณยังสามารถแก้ไขหน้าอื่นที่อยู่บนวิกินี้ได้</strong> คุณสามารถดูรายละเอียดการบล็อกแบบเต็มได้ที่[[Special:MyContributions|ส่วนร่วมบัญชี]]\n\nผู้ที่ทำการบล็อกคือ $1\n\nเหตุผลสำหรับการบล็อกคือ <em>$2</em>\n\n* เริ่มการบล็อก: $8\n* สิ้นสุดการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n* ไอดีการบล็อก #$5",
+       "blockedtext-partial": "<strong>ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อกไม่ให้ทำการเปลี่ยนแปลงหน้านี้ แต่คุณยังสามารถแก้ไขหน้าอื่นที่อยู่บนวิกินี้ได้</strong> คุณสามารถดูรายละเอียดการบล็อกแบบเต็มได้ที่[[Special:MyContributions|ส่วนร่วมบัญชี]]\n\nผู้ที่ทำการบล็อกคือ $1\n\nเหตุผลสำหรับการบล็อกคือ <em>$2</em>\n\n* เริ่มการบล็อก: $8\n* สิ้นสุดการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n* ไอดีการบล็อก #$5",
        "blockedtext": "<strong>ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อก</strong>\n\nการบล็อกนี้ดำเนินการโดย $1\nซึ่งให้เหตุผลว่า ''$2''\n\n* เริ่มการบล็อก: $8\n* หมดเขตการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ได้\nคุณไม่สามารถใช้คุณลักษณะ \"{{int:emailuser}}\" จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้ความสามารถนี้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดแสดงรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
-       "autoblockedtext": "เลขที่อยู่ไอพีของคุณถูกบล็อกอัตโนมัติ เพราะเคยมีผู้ใช้อื่นใช้ ซึ่งถูกบล็อกโดย $1\nโดยให้เหตุผลว่า\n\n:<em>$2</em>\n\n* เริ่มการบล็อก: $8\n* สิ้นสุดการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ \nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลที่ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดรวมรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
+       "autoblockedtext": "เลขที่อยู่ไอพีของคุณถูกบล็อกอัตโนมัติ เพราะเคยมีผู้ใช้อื่นใช้ ซึ่งถูกบล็อกโดย $1\nโดยให้เหตุผลว่า\n\n:<em>$2</em>\n\n* เริ่มการบล็อก: $8\n* สิ้นสุดการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ \nคุณไม่สามารถใช้คุณลักษณะ \"{{int:emailuser}}\" จนกว่าจะระบุที่อยู่อีเมลที่ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดรวมรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
        "systemblockedtext": "ชื่อผู้ใช้หรือที่อยู่ไอพีของคุณถูกบล็อกอัตโนมัติโดยมีเดียวิกิ\nเหตุผลสำหรับการบล็อกคือ:\n\n:<em>$2</em>\n\n* เริ่มการบล็อก: $8\n* สิ้นสุดการบล็อก: $6\n* ผู้ดำเนินการบล็อก: $7\n\nไอพีแอดเดรสปัจจุบันของคุณคือ $3\nโปรดแจ้งรายละเอียดทั้งหมดข้างต้น ถ้าคุณมีข้อสงสัยใด ๆ",
        "blockednoreason": "ไม่ได้ให้เหตุผล",
        "whitelistedittext": "คุณต้อง$1เพื่อแก้ไขหน้า",
        "confirmedittext": "คุณต้องยืนยันที่อยู่อีเมลของคุณก่อนแก้ไขหน้า \nโปรดตั้งและตรวจสอบความสมเหตุสมผลของที่อยู่อีเมลของคุผ่าน[[Special:Preferences|การตั้งค่าผู้ใช้]]",
        "nosuchsectiontitle": "ไม่พบส่วน",
        "nosuchsectiontext": "คุณพยายามแก้ไขส่วนที่ไม่มีอยู่ \nส่วนดังกล่าวอาจถูกย้ายหรือลบขณะที่คุณดูหน้าอยู่",
-       "loginreqtitle": "à¸\95à¹\89อà¸\87ลà¹\87อà¸\81อิà¸\99",
+       "loginreqtitle": "à¸\95à¹\89อà¸\87à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a",
        "loginreqlink": "เข้าสู่ระบบ",
        "loginreqpagetext": "กรุณา$1เพื่อดูหน้าอื่น",
        "accmailtitle": "ส่งรหัสผ่านแล้ว",
-       "accmailtext": "สà¹\88à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\81à¸\9aà¸\9aสุà¹\88มà¸\82อà¸\87 [[User talk:$1|$1]] à¹\84à¸\9b $2 à¹\81ลà¹\89ว à¸ªà¸²à¸¡à¸²à¸£à¸\96à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99à¹\83à¸\99หà¸\99à¹\89า<em>[[Special:ChangePassword|à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99]]</em> à¸«à¸¥à¸±à¸\87ลà¹\87อà¸\81อิà¸\99",
+       "accmailtext": "สà¹\88à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\81à¸\9aà¸\9aสุà¹\88มà¸\82อà¸\87 [[User talk:$1|$1]] à¹\84à¸\9b $2 à¹\81ลà¹\89ว à¸ªà¸²à¸¡à¸²à¸£à¸\96à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99à¹\83à¸\99หà¸\99à¹\89า<em>[[Special:ChangePassword|à¹\80à¸\9bลีà¹\88ยà¸\99รหัสà¸\9cà¹\88าà¸\99]]</em> à¹\84à¸\94à¹\89หลัà¸\87à¸\88าà¸\81à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\81ลà¹\89ว",
        "newarticle": "(ใหม่)",
        "newarticletext": "คุณตามลิงก์ไปยังหน้าที่ยังไม่มีในขณะนี้\nในการสร้างหน้า เริ่มพิมพ์ในกล่องด้านล่าง (ดูข้อมูลเพิ่มเติมใน[$1 หน้าคำอธิบาย])\nถ้าคุณเข้ามาหน้านี้โดยผิดพลาด ให้กดปุ่ม<strong>ถอยหลัง</strong> (back) ของเบราว์เซอร์",
-       "anontalkpagetext": "----\n<em>หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99ามà¸\8bึà¹\88à¸\87ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89สรà¹\89าà¸\87หรือà¹\83à¸\8aà¹\89à¸\9aัà¸\8dà¸\8aี</em>\nà¸\94ัà¸\87à¸\99ัà¹\89à¸\99à¹\80ราà¸\88ึà¸\87ระà¸\9aุà¸\95ัวà¸\95à¸\99à¹\82à¸\94ยà¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¹\81à¸\97à¸\99\nà¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\99ีà¹\89อาà¸\88มีà¸\9cูà¹\89à¹\83à¸\8aà¹\89รà¹\88วมà¸\81ัà¸\99หลายà¸\84à¸\99\nà¸\96à¹\89าà¸\84ุà¸\93à¹\80à¸\9bà¹\87à¸\99à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99าม à¹\81ละรูà¹\89สึà¸\81วà¹\88าà¸\84ุà¸\93à¹\84à¸\94à¹\89รัà¸\9aà¸\84วามà¹\80หà¹\87à¸\99à¸\97ีà¹\88à¹\84มà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87สà¹\88à¸\87หาà¸\84ุà¸\93 à¸\81รุà¸\93า[[Special:CreateAccount|สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aี]]หรือ[[Special:UserLogin|ลà¹\87อà¸\81อิà¸\99]] เพื่อป้องกันการสับสนกับผู้ใช้นิรนามรายอื่นในอนาคต",
+       "anontalkpagetext": "----\n<em>หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¸\84ุยà¸\81ัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9aà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99ามà¸\8bึà¹\88à¸\87ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89สรà¹\89าà¸\87หรือà¹\83à¸\8aà¹\89à¸\9aัà¸\8dà¸\8aี</em>\nà¸\94ัà¸\87à¸\99ัà¹\89à¸\99à¹\80ราà¸\88ึà¸\87ระà¸\9aุà¸\95ัวà¸\95à¸\99à¹\82à¸\94ยà¹\83à¸\8aà¹\89à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¹\81à¸\97à¸\99\nà¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\99ีà¹\89อาà¸\88มีà¸\9cูà¹\89à¹\83à¸\8aà¹\89รà¹\88วมà¸\81ัà¸\99หลายà¸\84à¸\99\nà¸\96à¹\89าà¸\84ุà¸\93à¹\80à¸\9bà¹\87à¸\99à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ิรà¸\99าม à¹\81ละรูà¹\89สึà¸\81วà¹\88าà¸\84ุà¸\93à¹\84à¸\94à¹\89รัà¸\9aà¸\84วามà¹\80หà¹\87à¸\99à¸\97ีà¹\88à¹\84มà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87สà¹\88à¸\87หาà¸\84ุà¸\93 à¸\81รุà¸\93า[[Special:CreateAccount|สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aี]]หรือ[[Special:UserLogin|à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a]] เพื่อป้องกันการสับสนกับผู้ใช้นิรนามรายอื่นในอนาคต",
        "noarticletext": "ปัจจุบันไม่มีข้อความในหน้านี้\nคุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อเรื่องหน้านี้]]ในหน้าอื่น <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง] หรือ[{{fullurl:{{FULLPAGENAME}}|action=edit}} แก้ไขหน้านี้]</span>",
        "noarticletext-nopermission": "ปัจจุบันไม่มีข้อความในหน้านี้\nคุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อหน้านี้]]ในหน้าอื่น หรือ<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง]</span> แต่คุณไม่มีสิทธิสร้างหน้านี้",
        "missing-revision": "ไม่มีรุ่นแก้ไข #$1 ของหน้าชื่อ \"{{FULLPAGENAME}}\" \n\nปกติเกิดจากการตามการโยงประวัติเก่าไปยังหน้าที่ถูกลบแล้ว\nดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
        "previewnote": "<strong>พึงระลึกว่านี่เป็นเพียงการแสดงตัวอย่าง</strong>\nยังไม่ได้บันทึกการเปลี่ยนแปลงของคุณ!",
        "continue-editing": "ไปพื้นที่แก้ไข",
        "previewconflict": "ตัวอย่างนี้สะท้อนข้อความในพื้นที่แก้ไขข้อความส่วนบนซึ่งจะปรากฏหากคุณเลือกบันทึก",
-       "session_fail_preview": "à¸\82ออภัย! à¹\80ราà¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\82à¹\89อมูลà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารสูà¸\8dหาย\n\nà¸\84ุà¸\93อาà¸\88ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8cà¹\84à¸\9bà¹\81ลà¹\89ว <strong>à¹\82à¸\9bรà¸\94à¸\95รวà¸\88à¸\94ูà¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\84ุà¸\93ลà¹\87อà¸\81อิà¸\99อยูà¹\88 à¹\81ลà¹\89วลอà¸\87อีà¸\81à¸\84รัà¹\89à¸\87</strong> \nหาà¸\81ยัà¸\87à¹\80สียอยูà¹\88 à¸¥à¸­à¸\87[[Special:UserLogout|ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8c]]à¹\81ละลà¹\87อà¸\81อิà¸\99à¸\81ลัà¸\9aมา แล้วตรวจดูว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้",
-       "session_fail_preview_html": "à¸\82ออภัย! à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¸\95à¹\88อà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\82à¹\89อมูลà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารสูญหาย\n\n<em>เนื่องจาก {{SITENAME}} เปิดใช้งานเอชทีเอ็มแอลล้วน การแสดงตัวอย่างจะถูกซ่อนไว้เพื่อป้องกันการโจมตีด้วยจาวาสคริปต์</em>\n\n<strong>หากนี่เป็นความพยายามแก้ไขโดยชอบ โปรดลองอีกครั้งหนึ่ง</strong> \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา และตรวจดูให้แน่ใจว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้",
+       "session_fail_preview": "à¸\82ออภัย! à¹\80ราà¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\82à¹\89อมูลà¹\80à¸\8bสà¸\8aัà¸\99สูà¸\8dหาย\n\nà¸\84ุà¸\93อาà¸\88ออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9aà¹\84à¸\9bà¹\81ลà¹\89ว <strong>à¹\82à¸\9bรà¸\94à¸\95รวà¸\88à¸\94ูà¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\84ุà¸\93à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aอยูà¹\88 à¹\81ลà¹\89วลอà¸\87อีà¸\81à¸\84รัà¹\89à¸\87</strong> \nหาà¸\81ยัà¸\87à¹\80สียอยูà¹\88 à¸¥à¸­à¸\87[[Special:UserLogout|ออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9a]]à¹\81ละà¸\81ลัà¸\9aà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\83หมà¹\88 แล้วตรวจดูว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้",
+       "session_fail_preview_html": "à¸\82ออภัย! à¹\84มà¹\88สามารà¸\96à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¸\95à¹\88อà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\82à¹\89อมูลà¹\80à¸\8bสà¸\8aัà¸\99สูญหาย\n\n<em>เนื่องจาก {{SITENAME}} เปิดใช้งานเอชทีเอ็มแอลล้วน การแสดงตัวอย่างจะถูกซ่อนไว้เพื่อป้องกันการโจมตีด้วยจาวาสคริปต์</em>\n\n<strong>หากนี่เป็นความพยายามแก้ไขโดยชอบ โปรดลองอีกครั้งหนึ่ง</strong> \nหากยังเสียอยู่ ลอง[[Special:UserLogout|ล็อกเอาต์]]และล็อกอินกลับมา และตรวจดูให้แน่ใจว่าเบราว์เซอร์ที่คุณใช้อนุญาตคุกกี้จากไซต์นี้",
        "token_suffix_mismatch": "<strong>การแก้ไขของคุณถูกปฏิเสธ เนื่องจากเครื่องลูกข่ายของคุณทำให้อักขระเครื่องหมายวรรคตอนในโทเค็นการแก้ไขเสีย</strong>\nการแก้ไขนี้ถูกปฏิเสธเพื่อป้องกันการวิบัติของข้อความหน้า\nบางครั้งเกิดปัญหานี้ขึ้นเมื่อคุณใช้บริการเว็บพร็อกซีนิรนามที่มีจุดบกพร่อง",
        "edit_form_incomplete": "<strong>แบบแก้ไขบางส่วนไปไม่ถึงเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังอยู่และลองอีกครั้ง</strong>",
        "editing": "กำลังแก้ไข $1",
        "template-semiprotected": "(ถูกกึ่งป้องกัน)",
        "hiddencategories": "หน้านี้มี {{PLURAL:$1|1 หมวดหมู่ซ่อน|$1 หมวดหมู่ซ่อน}}:",
        "edittools": "<!-- ข้อความนี้จะแสดงผลใต้ฟอร์มสำหรับการแก้ไขและอัปโหลด -->",
-       "nocreatetext": "{{SITENAME}} à¸\88ำà¸\81ัà¸\94à¸\81ารสรà¹\89าà¸\87หà¸\99à¹\89าà¹\83หมà¹\88\nà¸\84ุà¸\93สามารà¸\96ยà¹\89อà¸\99à¸\81ลัà¸\9aà¹\84à¸\9bà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88มีอยูà¹\88à¹\80à¸\94ิม à¸«à¸£à¸·à¸­[[Special:UserLogin|ลà¹\87อà¸\81อิà¸\99หรือสร้างบัญชีผู้ใช้]]",
+       "nocreatetext": "{{SITENAME}} à¹\84à¸\94à¹\89à¸\88ำà¸\81ัà¸\94à¸\81ารสรà¹\89าà¸\87หà¸\99à¹\89าà¹\83หมà¹\88\nà¸\84ุà¸\93สามารà¸\96ยà¹\89อà¸\99à¸\81ลัà¸\9aà¹\84à¸\9bà¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88มีอยูà¹\88à¹\80à¸\94ิม à¸«à¸£à¸·à¸­[[Special:UserLogin|à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aหรือสร้างบัญชีผู้ใช้]]",
        "nocreate-loggedin": "คุณไม่มีสิทธิสร้างหน้าใหม่",
        "sectioneditnotsupported-title": "ไม่สนับสนุนการแก้ไขหัวข้อย่อย",
        "sectioneditnotsupported-text": "ไม่สนับสนุนการแก้ไขหัวข้อย่อยในหน้านี้",
        "postedit-confirmation-saved": "บันทึกการแก้ไขของคุณแล้ว",
        "postedit-confirmation-published": "เผยแพร่การแก้ไขของคุณแล้ว",
        "edit-already-exists": "ไม่สามารถสร้างหน้าใหม่ได้\nเพราะมีแล้ว",
-       "defaultmessagetext": "à¸\82à¹\89อà¸\84วามสารปริยาย",
+       "defaultmessagetext": "à¹\80à¸\99ืà¹\89อหาà¸\82à¹\89อà¸\84วามปริยาย",
        "content-failed-to-parse": "แจงส่วนเนื้อหา $2 ของตัวแบบ $1 ล้มเหลว: $3",
        "invalid-content-data": "ข้อมูลเนื้อหาไม่ถูกต้อง",
        "content-not-allowed-here": "ไม่อนุญาตเนื้อหา \"$1\" ในหน้า [[$2]]",
-       "editwarning-warning": "à¸\81ารออà¸\81à¸\88าà¸\81หà¸\99à¹\89าà¸\99ีà¹\89อาà¸\88à¸\97ำà¹\83หà¹\89à¸\84วามà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\97ีà¹\88à¸\84ุà¸\93à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารสูà¸\8dหาย\nà¸\96à¹\89าà¸\84ุà¸\93ลà¹\87อà¸\81อิà¸\99แล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน \"{{int:prefs-editing}}\" ในการตั้งค่าของคุณ",
+       "editwarning-warning": "à¸\81ารออà¸\81à¸\88าà¸\81หà¸\99à¹\89าà¸\99ีà¹\89อาà¸\88à¸\97ำà¹\83หà¹\89à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\97ัà¹\89à¸\87หมà¸\94à¸\97ีà¹\88à¸\84ุà¸\93à¹\84à¸\94à¹\89à¸\97ำสูà¸\8dหาย\nà¸\96à¹\89าà¸\84ุà¸\93à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน \"{{int:prefs-editing}}\" ในการตั้งค่าของคุณ",
        "editpage-invalidcontentmodel-title": "ไม่รองรับรูปแบบเนื้อหานี้",
        "editpage-invalidcontentmodel-text": "ไม่รองรับโมเดลเนื้อหา \"$1\"",
        "editpage-notsupportedcontentformat-title": "รูปแบบเนื้อหาไม่ได้รับการรองรับ",
        "content-json-empty-object": "วัตถุเปล่า",
        "content-json-empty-array": "แถวเปล่า",
        "deprecated-self-close-category": "หน้าที่ใช้ป้าย HTML ที่ปิดเองที่ไม่ถูกต้อง",
+       "deprecated-self-close-category-desc": "หน้านี้มีป้ายระบุ HTML ที่ปิดเองที่ไม่ถูกต้อง เช่น <code>&lt;b/></code> หรือ <code>&lt;span/></code> ลักษณะการทำงานของป้ายระบุเหล่านี้จะเปลี่ยนในไม่ช้าเพื่อให้สอดคล้องกับคุณสมบัติของ HTML5 ดังนั้นป้ายระบุเหล่านี้ในข้อความวิกิจะถูกเลิกใช้",
        "duplicate-args-warning": "<strong>คำเตือน:</strong> [[:$1]] กำลังเรียกใช้ [[:$2]] ด้วยค่ามากกว่าหนึ่งค่าสำหรับตัวแปร \"$3\" เฉพาะค่าสุดท้ายที่ระบุเท่านั้นจะถูกนำมาใช้",
        "duplicate-args-category": "หน้าที่ใช้อาร์กิวเมนต์ซ้ำในการเรียกแม่แบบ",
+       "duplicate-args-category-desc": "หน้านี้มีการเรียกแม่แบบที่ใช้อาร์กิวเมนต์ซ้ำ เช่น <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> หรือ <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>",
        "expensive-parserfunction-warning": "<strong>คำเตือน:</strong> หน้านี้มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป\n\nหน้านี้ควรมีการเรียกใช้น้อยกว่า $2  ครั้ง แต่ปัจจุบันมีการเรียกใช้ $1 ครั้ง",
        "expensive-parserfunction-category": "หน้าที่มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป",
        "post-expand-template-inclusion-warning": "<strong>คำเตือน:</strong> แม่แบบที่นำมารวมมีขนาดใหญ่เกินไป\nจะไม่รวมบางแม่แบบเข้ามา",
        "parser-template-recursion-depth-warning": "เกินขีดจำกัดความลึกการเรียกแม่แบบซ้ำ ($1)",
        "language-converter-depth-warning": "เกินขีดจำกัดความลึกตัวแปลงผันภาษา ($1)",
        "node-count-exceeded-category": "หน้าที่จำนวนปมเกิน",
+       "node-count-exceeded-category-desc": "หน้านี้มีปมเกินจำนวนสูงสุด",
        "node-count-exceeded-warning": "หน้าเกินจำนวนปม",
        "expansion-depth-exceeded-category": "หน้าที่ความลึกการขยายเกิน",
+       "expansion-depth-exceeded-category-desc": "หน้านี้มีความลึกการขยายเกินขีดสูงสุด",
        "expansion-depth-exceeded-warning": "หน้าเกินความลึกการขยาย",
        "parser-unstrip-loop-warning": "พบวงวน unstrip",
-       "unstrip-depth-warning": "ขีดจำกัดการเรียกซ้ำ unstrip เกิน ($1)",
+       "unstrip-depth-warning": "ขีดจำกัดความลึก unstrip เกิน ($1)",
+       "unstrip-depth-category": "หน้าที่ขีดจำกัดความลึก unstrip เกิน",
+       "unstrip-size-warning": "ขีดจำกัดขนาด unstrip เกิน ($1)",
+       "unstrip-size-category": "หน้าที่ขีดจำกัดขนาด unstrip เกิน",
        "converter-manual-rule-error": "พบข้อผิดพลาดในกฎการแปลงผันภาษาด้วยมือ",
        "undo-success": "สามารถย้อนการแก้ไขนี้กลับได้ \nกรุณาตรวจสอบข้อแตกต่างด้านล่างเพื่อทวนสอบว่านี่เป็นสิ่งที่คุณต้องการทำ แล้วบันทึกการเปลี่ยนแปลงด้านล่างเพื่อเสร็จสิ้นการย้อนการแก้ไขกลับ",
        "undo-failure": "การแก้ไขนี้ไม่สามารถย้อนกลับได้ เนื่องจากขัดแย้งกับการแก้ไขระหว่างกลาง",
        "revdelete-no-change": "<strong>คำเตือน:</strong> รายการวันที่ $2 เวลา $1 ตั้งค่าทัศนวิสัยตามที่ขออยู่แล้ว",
        "revdelete-concurrent-change": "มีข้อผิดพลาดในการดัดแปรรายการลงวันที่ $2 เวลา $1: ดูเหมือนว่ามีผู้เปลี่ยนสถานะของรายการขณะคุณพยายามดัดแปร\nโปรดตรวจสอบปูม",
        "revdelete-only-restricted": "มีข้อผิดพลาดในการซ่อนรายการวันที่ $2 เวลา $1: คุณไม่สามารถยับยั้งมิให้ผู้ดูแลระบบดูรุ่นนี้ได้โดยไม่เลือกตัวเลือกทัศนวิสัยอื่นด้วย",
-       "revdelete-reason-dropdown": "*à¹\80หà¸\95ุà¸\9cลà¸\81ารลà¸\9aà¸\97ัà¹\88วà¹\84à¸\9b\n** à¸¥à¸°à¹\80มิà¸\94ลิà¸\82สิà¸\97à¸\98ิà¹\8c\n** à¸\84วามà¹\80หà¹\87à¸\99à¹\84มà¹\88à¹\80หมาะสมหรือสารสà¸\99à¹\80à¸\97ศสà¹\88วà¸\99à¸\9aุà¸\84à¸\84ล\n** à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88à¹\80หมาะสม\n** à¸ªà¸²à¸£à¸ªà¸\99à¹\80à¸\97ศที่อาจหมิ่นประมาท",
+       "revdelete-reason-dropdown": "*à¹\80หà¸\95ุà¸\9cลà¸\81ารลà¸\9aà¸\97ัà¹\88วà¹\84à¸\9b\n** à¸¥à¸°à¹\80มิà¸\94ลิà¸\82สิà¸\97à¸\98ิà¹\8c\n** à¸\84วามà¹\80หà¹\87à¸\99à¹\84มà¹\88à¹\80หมาะสมหรือà¸\82à¹\89อมูลสà¹\88วà¸\99à¸\9aุà¸\84à¸\84ล\n** à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88à¹\80หมาะสม\n** à¸\82à¹\89อมูลที่อาจหมิ่นประมาท",
        "revdelete-otherreason": "เหตุผลอื่น/เพิ่มเติม:",
        "revdelete-reasonotherlist": "เหตุผลอื่น",
        "revdelete-edit-reasonlist": "แก้ไขเหตุผลการลบ",
        "preferences": "ตั้งค่าผู้ใช้",
        "mypreferences": "ตั้งค่าผู้ใช้",
        "prefs-edits": "จำนวนการแก้ไข:",
-       "prefsnologintext2": "à¹\82à¸\9bรà¸\94ลà¹\87อà¸\81อิà¸\99à¹\80à¸\9eืà¹\88อà¹\80à¸\9bลีà¹\88ยà¸\99การตั้งค่าของคุณ",
+       "prefsnologintext2": "à¹\82à¸\9bรà¸\94à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\80à¸\9eืà¹\88อà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87การตั้งค่าของคุณ",
        "prefs-skin": "หน้าตา",
        "skin-preview": "ตัวอย่าง",
        "datedefault": "ไม่ตั้งค่า",
        "prefs-watchlist-edits": "จำนวนการเปลี่ยนแปลงมากสุดที่แสดงในรายการเฝ้าดู:",
        "prefs-watchlist-edits-max": "จำนวนสูงสุด: 1000",
        "prefs-watchlist-token": "โทเค็นรายการเฝ้าดู:",
+       "prefs-watchlist-managetokens": "จัดการโทเค็น",
        "prefs-misc": "เบ็ดเตล็ด",
        "prefs-resetpass": "เปลี่ยนรหัสผ่าน",
        "prefs-changeemail": "เปลี่ยนหรือลบที่อยู่อีเมล",
        "stub-threshold": "ความยาวของหน้าที่ใช้เป็นเส้นแบ่งในการระบุหน้าโครง เพื่อจะให้มีการจัดรูปแบบเฉพาะตัว สำหรับลิงก์ที่โยงมายังโครง ($1):",
        "stub-threshold-sample-link": "ตัวอย่าง",
        "stub-threshold-disabled": "ปิดใช้งาน",
-       "recentchangesdays": "à¸\88ำà¸\99วà¸\99วัà¸\99à¸\97ีà¹\88à¹\81สà¸\94à¸\87à¹\83à¸\99à¸\9bรัà¸\9aà¸\9bรุงล่าสุด:",
+       "recentchangesdays": "à¸\88ำà¸\99วà¸\99วัà¸\99à¸\97ีà¹\88à¹\81สà¸\94à¸\87à¹\83à¸\99à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงล่าสุด:",
        "recentchangesdays-max": "มากสุด $1 วัน",
        "recentchangescount": "จำนวนการแก้ไขที่แสดงในเปลี่ยนแปลงล่าสุด ประวัติหน้า และในปูม โดยปริยาย:",
        "prefs-help-recentchangescount": "จำนวนสูงสุด: 1000",
        "default": "ค่าปริยาย",
        "prefs-files": "ไฟล์",
        "prefs-custom-css": "สไตล์ชีตปรับแต่งเอง",
+       "prefs-custom-json": "JSON กำหนดเอง",
        "prefs-custom-js": "จาวาสคริปต์ปรับแต่งเอง",
-       "prefs-common-config": "CSS / จาวาสคริปต์รวมสำหรับทุกหน้าตา:",
+       "prefs-common-config": "CSS/JSON/จาวาสคริปต์รวมสำหรับทุกหน้าตา:",
        "prefs-reset-intro": "คุณสามารถใช้หน้านี้ตั้งการตั้งค่าของคุณเป็นค่าปริยายของเว็บใหม่\nไม่สามารถทำกลับได้",
        "prefs-emailconfirm-label": "การยืนยันอีเมล:",
        "youremail": "อีเมล:",
        "gender-unknown": "เมื่อกล่าวถึงคุณ ซอฟต์แวร์จะใช้คำที่ไม่ระบุเพศทุกเมื่อที่เป็นไปได้",
        "gender-male": "ชาย",
        "gender-female": "หญิง",
-       "prefs-help-gender": "à¹\80ลือà¸\81à¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89หรือà¹\84มà¹\88à¸\81à¹\87à¹\84à¸\94à¹\89\nà¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cà¹\83à¸\8aà¹\89à¸\84à¹\88าà¸\99ีà¹\89à¹\80à¸\9eืà¹\88อà¸\95ิà¸\94à¸\95à¹\88อà¸\84ุà¸\93à¹\81ละà¸\81ลà¹\88าวà¸\96ึà¸\87à¸\84ุà¸\93à¹\82à¸\94ยà¹\83à¸\8aà¹\89à¹\80à¸\9eศà¸\97าà¸\87à¹\84วยาà¸\81รà¸\93à¹\8cà¸\97ีà¹\88à¹\80หมาะสมà¹\80มืà¹\88อà¸\95ิà¸\94à¸\95à¹\88อà¸\9cูà¹\89อืà¹\88à¸\99\nสารสà¸\99à¹\80à¸\97ศนี้เปิดเผยต่อสาธารณะ",
+       "prefs-help-gender": "à¹\80ลือà¸\81à¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\99ีà¹\89หรือà¹\84มà¹\88à¸\81à¹\87à¹\84à¸\94à¹\89\nà¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cà¹\83à¸\8aà¹\89à¸\84à¹\88าà¸\99ีà¹\89à¹\80à¸\9eืà¹\88อà¸\95ิà¸\94à¸\95à¹\88อà¸\84ุà¸\93à¹\81ละà¸\81ลà¹\88าวà¸\96ึà¸\87à¸\84ุà¸\93à¹\82à¸\94ยà¹\83à¸\8aà¹\89à¹\80à¸\9eศà¸\97าà¸\87à¹\84วยาà¸\81รà¸\93à¹\8cà¸\97ีà¹\88à¹\80หมาะสมà¹\80มืà¹\88อà¸\95ิà¸\94à¸\95à¹\88อà¸\9cูà¹\89อืà¹\88à¸\99\nà¸\82à¹\89อมูลนี้เปิดเผยต่อสาธารณะ",
        "email": "อีเมล",
        "prefs-help-realname": "ไม่ต้องใช้ชื่อจริง \nหากใช้ จะใช้เพื่อบ่งชี้งานของคุณว่ามาจากคุณ",
        "prefs-help-email": "ไม่จำเป็นต้องใส่ที่อยู่อีเมล แต่จำเป็นสำหรับการตั้งรหัสผ่านใหม่หากคุณลืมรหัสผ่าน",
        "prefs-help-email-others": "คุณยังสามารถเลือกให้ผู้อื่นติดต่อคุณโดยอีเมลผ่านลิงก์บนหน้าผู้ใช้หรือหน้าพูดคุยกับผู้ใช้ของคุณ\nไม่เปิดเผยที่อยู่อีเมลของคุณเมื่อผู้ใช้อื่นติดต่อคุณ",
        "prefs-help-email-required": "ต้องการที่อยู่อีเมล",
-       "prefs-info": "สารสà¸\99à¹\80à¸\97ศเบื้องต้น",
+       "prefs-info": "à¸\82à¹\89อมูลเบื้องต้น",
        "prefs-i18n": "สากลวิวัตน์",
        "prefs-signature": "ลายเซ็น",
        "prefs-dateformat": "รูปแบบวันที่",
        "group-autoconfirmed": "ผู้ใช้ทั่วไป",
        "group-bot": "บอต",
        "group-sysop": "ผู้ดูแลระบบ",
+       "group-interface-admin": "ผู้ดูแลอินเตอร์เฟซ",
        "group-bureaucrat": "ผู้ดูแลระบบสิทธิแต่งตั้ง",
        "group-suppress": "ผู้ดูแลประวัติ",
        "group-all": "(ทั้งหมด)",
        "group-autoconfirmed-member": "{{GENDER:$1|ผู้ใช้ทั่วไป}}",
        "group-bot-member": "{{GENDER:$1|บอต}}",
        "group-sysop-member": "{{GENDER:$1|ผู้ดูแลระบบ}}",
+       "group-interface-admin-member": "{{GENDER:$1|ผู้ดูแลอินเตอร์เฟซ}}",
        "group-bureaucrat-member": "{{GENDER:$1|ผู้ดูแลระบบสิทธิแต่งตั้ง}}",
        "group-suppress-member": "{{GENDER:$1|ผู้ดูแลประวัติ}}",
        "grouppage-user": "{{ns:project}}:ผู้ใช้",
        "grouppage-autoconfirmed": "{{ns:project}}:ผู้ใช้ทั่วไป",
        "grouppage-bot": "{{ns:project}}:บอต",
        "grouppage-sysop": "{{ns:project}}:ผู้ดูแลระบบ",
+       "grouppage-interface-admin": "{{ns:project}}:ผู้ดูแลอินเตอร์เฟซ",
        "grouppage-bureaucrat": "{{ns:project}}:ผู้ดูแลระบบสิทธิแต่งตั้ง",
        "grouppage-suppress": "{{ns:project}}:ผู้ดูแลประวัติ",
        "right-read": "อ่านหน้า",
        "right-createpage": "สร้างหน้า (ที่ไม่ใช่หน้าอภิปราย)",
        "right-createtalk": "สร้างหน้าอภิปราย",
        "right-createaccount": "สร้างบัญชีผู้ใช้ใหม่",
-       "right-autocreateaccount": "ลà¹\87อà¸\81อิà¸\99à¹\82à¸\94ยà¹\83à¸\8aà¹\89บัญชีผู้ใช้ภายนอกอัตโนมัติ",
+       "right-autocreateaccount": "à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¸\94à¹\89วยบัญชีผู้ใช้ภายนอกอัตโนมัติ",
        "right-minoredit": "ทำเครื่องหมายการแก้ไขเป็นการแก้ไขเล็กน้อย",
        "right-move": "ย้ายหน้า",
        "right-move-subpages": "ย้ายหน้าพร้อมหน้าย่อย",
        "right-purge": "ล้างแคชของเว็บไซต์โดยไม่ยืนยัน",
        "right-autoconfirmed": "ไม่ได้รับผลจากขีดจำกัดอัตรายึดเลขที่อยู่ไอพี",
        "right-bot": "กำหนดเป็นกระบวนการอัตโนมัติ",
-       "right-nominornewtalk": "หาà¸\81à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อยà¹\83à¸\99หà¸\99à¹\89าอภิà¸\9bรายà¸\88ะà¸\97ำà¹\83หà¹\89à¸\81ารà¹\81à¸\88à¹\89à¸\87สารใหม่ปรากฏ",
+       "right-nominornewtalk": "หาà¸\81à¹\84มà¹\88มีà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89อยà¹\83à¸\99หà¸\99à¹\89าอภิà¸\9bรายà¸\88ะà¸\97ำà¹\83หà¹\89à¸\81ารà¹\81à¸\88à¹\89à¸\87à¸\82à¹\89อà¸\84วามใหม่ปรากฏ",
        "right-apihighlimits": "ใช้ข้อจำกัดที่สูงขึ้นในคำสั่งเอพีไอ",
        "right-writeapi": "ใช้การเขียนเอพีไอ",
        "right-delete": "ลบหน้า",
        "grant-highvolume": "การแก้ไขในปริมาณสูง",
        "grant-oversight": "ซ่อนผู้ใช้ และ ยับยั้งรุ่นปรับปรุง",
        "grant-patrol": "ลาดตระเวนตรวจการเปลี่ยนแปลงหน้าต่าง ๆ",
-       "grant-privateinfo": "à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¸\82à¹\89อมูลสà¹\88วà¸\99à¸\9aุà¸\84à¸\84ล",
+       "grant-privateinfo": "à¹\80à¸\82à¹\89าà¸\96ึà¸\87à¸\82à¹\89อมูลสà¹\88วà¸\99à¸\95ัว",
        "grant-protect": "ล็อกและปลดล็อกหน้าต่าง ๆ",
        "grant-rollback": "ย้อนการเปลี่ยนแปลงในหน้ารวดเดียว",
        "grant-sendemail": "ส่งอีเมลหาผู้ใช้อื่น",
        "action-editmyoptions": "แก้ไขการตั้งค่าของคุณ",
        "action-editmywatchlist": "แก้ไขรายการเฝ้าดูของคุณ",
        "action-viewmywatchlist": "ดูรายการเฝ้าดูของคุณ",
-       "action-viewmyprivateinfo": "à¸\94ูสารสà¸\99à¹\80à¸\97ศส่วนตัวของคุณ",
+       "action-viewmyprivateinfo": "à¸\94ูà¸\82à¹\89อมูลส่วนตัวของคุณ",
        "action-editmyprivateinfo": "แก้ไขสารสนเทศส่วนตัวของคุณ",
        "action-editcontentmodel": "แก้ไขตัวแบบเนื้อหาของหน้า",
        "action-managechangetags": "สร้างและ(เ)ปิดใช้งานป้ายระบุ",
        "rcfilters-watchlist-edit-watchlist-button": "แก้ไขรายการหน้าเฝ้าดูของคุณ",
        "rcfilters-watchlist-showupdated": "การเปลี่ยนแปลงหน้าที่คุณไม่ได้ชมตั้งแต่มีการเปลี่ยนแปลงแสดงด้วย <strong>ตัวหนา</strong> โดยมีเครื่องหมายเข้ม",
        "rcfilters-preference-label": "ซ่อนรุ่นปรับปรุงของรายการเปลี่ยนแปลงล่าสุด",
-       "rcfilters-preference-help": "ยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\81ารออà¸\81à¹\81à¸\9aà¸\9aอิà¸\99à¹\80à¸\95อรà¹\8cà¹\80à¸\9fà¸\8bà¹\83หมà¹\88à¸\9bี 2560 à¹\81ละอุà¸\9bà¸\81รà¸\93à¹\8cทั้งหมดที่เพิ่มเข้ามาหลังจากนั้น",
+       "rcfilters-preference-help": "ยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\81ารออà¸\81à¹\81à¸\9aà¸\9aอิà¸\99à¹\80à¸\95อรà¹\8cà¹\80à¸\9fà¸\8bà¹\83หมà¹\88à¸\9bี 2560 à¹\81ละà¹\80à¸\84รืà¹\88อà¸\87มือทั้งหมดที่เพิ่มเข้ามาหลังจากนั้น",
        "rcfilters-watchlist-preference-label": "ซ่อนรายการเฝ้าดูรุ่นปรับปรุง",
-       "rcfilters-watchlist-preference-help": "ย้อนการออกแบบอินเตอร์เฟซใหม่ปี 2560 และเครื่องมือที่เพิ่มเข้ามาหลังจากนั้น",
+       "rcfilters-watchlist-preference-help": "ยà¹\89อà¸\99à¸\81ลัà¸\9aà¸\81ารออà¸\81à¹\81à¸\9aà¸\9aอิà¸\99à¹\80à¸\95อรà¹\8cà¹\80à¸\9fà¸\8bà¹\83หมà¹\88à¸\9bี 2560 à¹\81ละà¹\80à¸\84รืà¹\88อà¸\87มือà¸\97ีà¹\88à¹\80à¸\9eิà¹\88มà¹\80à¸\82à¹\89ามาหลัà¸\87à¸\88าà¸\81à¸\99ัà¹\89à¸\99",
        "rcfilters-filter-showlinkedfrom-label": "แสดงการเปลี่ยนแปลงในหน้าที่ลิงก์มาจาก",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>หน้าที่ลิงก์มา</strong>จากหน้าที่เลือก",
        "rcfilters-filter-showlinkedto-label": "แสดงการเปลี่ยนแปลงในหน้าที่ลิงก์ไป",
        "img-auth-nopathinfo": "PATH_INFO สูญหาย\nเซิร์ฟเวอร์ของคุณอาจไม่ได้ถูกตั้งให้ส่งสารสนเทศนี้\nอาจเป็นแบบ CGI-based และไม่สามารถสนับสนุน img_auth\nดูที่ https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "ที่อยู่ที่ร้องขอไม่ได้อยู่ในสารบบอัพโหลดที่กำหนดไว้",
        "img-auth-badtitle": "ไม่สามารถสร้างชื่อเรื่องที่ถูกต้องจาก \"$1\"",
-       "img-auth-nologinnWL": "à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87อà¸\81อิà¸\99และ \"$1\" ไม่ได้อยู่ในรายชื่อผู้ใช้ที่ได้รับอนุญาต (whitelist)",
+       "img-auth-nologinnWL": "à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aและ \"$1\" ไม่ได้อยู่ในรายชื่อผู้ใช้ที่ได้รับอนุญาต (whitelist)",
        "img-auth-nofile": "ไม่มีไฟล์ \"$1\"",
        "img-auth-isdir": "คุณกำลังพยายามเข้าถึงสารบบ \"$1\"\nอนุญาตเฉพาะการเข้าถึงไฟล์",
        "img-auth-streaming": "กำลังดึงข้อมูล \"$1\"",
        "linkstoimage-redirect": "$1 (ไฟล์เปลี่ยนทาง) $2",
        "duplicatesoffile": "$1 ไฟล์ต่อไปนี้ เป็นไฟล์เดียวกับไฟล์นี้ ([[Special:FileDuplicateSearch/$2|รายละเอียดเพิ่มเติม]]):",
        "sharedupload": "ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น",
-       "sharedupload-desc-there": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88à¹\83à¸\8aà¹\89à¸\9aà¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99\nà¸\81รุà¸\93าà¸\94ู[หà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c $2] à¸ªà¸³à¸«à¸£à¸±à¸\9aสารสà¸\99à¹\80à¸\97ศเพิ่มเติม",
+       "sharedupload-desc-there": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มาà¸\88าà¸\81 $1 à¹\81ละอาà¸\88à¹\83à¸\8aà¹\89à¸\9aà¸\99à¹\82à¸\84รà¸\87à¸\81ารอืà¹\88à¸\99\nà¸\81รุà¸\93าà¸\94ู[หà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c $2] à¸ªà¸³à¸«à¸£à¸±à¸\9aà¸\82à¹\89อมูลเพิ่มเติม",
        "sharedupload-desc-here": "ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น\nคำอธิบายใน[$2 หน้าคำอธิบายไฟล์]แสดงไว้ด้านล่างนี้",
        "sharedupload-desc-edit": "ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น\nคุณอาจต้องการแก้ไขคำอธิบายใน[$2 หน้าคำอธิบายไฟล์]นั้น",
        "sharedupload-desc-create": "ไฟล์นี้มาจาก $1 และอาจมีใช้ไฟล์นี้ในโครงการอื่น\nคุณอาจต้องการแก้ไขคำอธิบายใน[$2 หน้าคำอธิบายไฟล์]นั้น",
        "booksources": "แหล่งหนังสือ",
        "booksources-search-legend": "ค้นหาแหล่งหนังสือ",
        "booksources-search": "ค้นหา",
-       "booksources-text": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cอืà¹\88à¸\99à¸\97ีà¹\88à¸\82ายหà¸\99ัà¸\87สือà¹\83หมà¹\88à¹\81ละหà¸\99ัà¸\87สือà¹\83à¸\8aà¹\89à¹\81ลà¹\89ว à¹\81ละอาà¸\88มีสารสà¸\99à¹\80à¸\97ศเพิ่มเติมเกี่ยวกับหนังสือที่คุณกำลังมองหา:",
+       "booksources-text": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¹\84à¸\9bยัà¸\87à¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cอืà¹\88à¸\99à¸\97ีà¹\88à¸\82ายหà¸\99ัà¸\87สือà¹\83หมà¹\88à¹\81ละหà¸\99ัà¸\87สือà¹\83à¸\8aà¹\89à¹\81ลà¹\89ว à¹\81ละอาà¸\88มีà¸\82à¹\89อมูลเพิ่มเติมเกี่ยวกับหนังสือที่คุณกำลังมองหา:",
        "booksources-invalid-isbn": "รหัส ISBN ที่ให้ไว้ไม่ถูกต้อง กรุณาตรวจสอบจากต้นฉบับอีกครั้ง",
        "specialloguserlabel": "ผู้ดำเนินการ:",
        "speciallogtitlelabel": "เป้าหมาย (ชื่อเรื่องหรือ {{ns:user}}:ชื่อผู้ใช้ สำหรับผู้ใช้):",
        "activeusers-noresult": "ไม่พบผู้ใช้",
        "activeusers-submit": "แสดงผู้ใช้ที่ยังเคลื่อนไหว",
        "listgrouprights": "สิทธิกลุ่มผู้ใช้",
-       "listgrouprights-summary": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ลุà¹\88มà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\99ิยามà¸\9aà¸\99วิà¸\81ิà¸\99ีà¹\89 à¹\81ละสิà¸\97à¸\98ิà¸\81ารà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87\nอาà¸\88มี[[{{MediaWiki:Listgrouprights-helppage}}|สารสà¸\99à¹\80à¸\97ศเพิ่มเติม]]เกี่ยวกับสิทธิหนึ่ง ๆ",
+       "listgrouprights-summary": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ลุà¹\88มà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\99ิยามà¸\9aà¸\99วิà¸\81ิà¸\99ีà¹\89 à¹\81ละสิà¸\97à¸\98ิà¸\81ารà¹\80à¸\82à¹\89าà¸\96ึà¸\87à¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87\nอาà¸\88มี[[{{MediaWiki:Listgrouprights-helppage}}|à¸\82à¹\89อมูลเพิ่มเติม]]เกี่ยวกับสิทธิหนึ่ง ๆ",
        "listgrouprights-key": "คำอธิบาย:\n* <span class=\"listgrouprights-granted\">สิทธิที่ได้รับแต่งตั้ง</span>\n* <span class=\"listgrouprights-revoked\">สิทธิที่ถูกเพิกถอน</span>",
        "listgrouprights-group": "กลุ่ม",
        "listgrouprights-rights": "สิทธิ",
        "listgrants-grant": "การให้สิทธิ",
        "listgrants-rights": "สิทธิ",
        "trackingcategories": "หมวดหมู่ค้นหาและติดตาม",
-       "trackingcategories-summary": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารหมวà¸\94หมูà¹\88à¸\84à¹\89à¸\99หาà¹\81ละà¸\95ิà¸\94à¸\95ามà¸\8bึà¹\88à¸\87à¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cมีà¹\80à¸\94ียวิà¸\81ิà¸\88ัà¸\94à¸\81ารอัà¸\95à¹\82à¸\99มัà¸\95ิ à¸ªà¸²à¸¡à¸²à¸£à¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\80หลà¹\88าà¸\99ีà¹\89à¹\84à¸\94à¹\89à¹\82à¸\94ยà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99สารระบบที่เกี่ยวข้องในเนมสเปซ {{ns:8}}",
+       "trackingcategories-summary": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81สà¸\94à¸\87รายà¸\81ารหมวà¸\94หมูà¹\88à¸\84à¹\89à¸\99หาà¹\81ละà¸\95ิà¸\94à¸\95ามà¸\8bึà¹\88à¸\87à¸\8bอà¸\9fà¸\95à¹\8cà¹\81วรà¹\8cมีà¹\80à¸\94ียวิà¸\81ิà¸\88ัà¸\94à¸\81ารอัà¸\95à¹\82à¸\99มัà¸\95ิ à¸ªà¸²à¸¡à¸²à¸£à¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\80หลà¹\88าà¸\99ีà¹\89à¹\84à¸\94à¹\89à¹\82à¸\94ยà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\82à¹\89อà¸\84วามระบบที่เกี่ยวข้องในเนมสเปซ {{ns:8}}",
        "trackingcategories-msg": "หมวดหมู่ค้นหาและติดตาม",
-       "trackingcategories-name": "à¸\8aืà¹\88อสาร",
+       "trackingcategories-name": "à¸\8aืà¹\88อà¸\82à¹\89อà¸\84วาม",
        "trackingcategories-desc": "เกณฑ์การรวมหมวดหมู่",
        "restricted-displaytitle-ignored": "หน้าที่มีชื่อเรื่องแสดงที่ถูกละเลย",
        "restricted-displaytitle-ignored-desc": "หน้ามี <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ที่ถูกละเลย เพราะไม่สมนัยกับชื่อเรื่องแท้จริงของหน้า",
        "noindex-category-desc": "โรบอตไม่สามารถทำดัชนีหน้านี้เพราะมีเมจิกเวิร์ด <code><nowiki>__NOINDEX__</nowiki></code> อยู่และอยู่ในเนมสเปซซึ่งอนุญาตตัวบ่งชี้นี้",
        "index-category-desc": "หน้านี้มี <code><nowiki>__INDEX__</nowiki></code> อยู่ (และอยู่ในเนมสเปซซึ่งอนุญาตตัวบ่งชี้นี้) ฉะนั้น โรบอตจึงทำดัชนี้ได้ ซึ่งปกติไม่สามารถทำได้",
        "post-expand-template-inclusion-category-desc": "การแทนที่แม่แบบทั้งหมดทำให้ขนาดของหน้าใหญ่กว่า <code>$wgMaxArticleSize</code> จึงไม่มีการแทนที่แม่แบบบางตัว",
+       "post-expand-template-argument-category-desc": "หน้านี้มีขนาดใหญ่กว่า <code>$wgMaxArticleSize</code> หลังจากขยายอาร์กิวเมนต์ของแม่แบบ (สิ่งที่อยู่ภายในวงเล็บปีกกาสามวง เช่น <code>{{{Foo}}}</code>)",
        "broken-file-category-desc": "หน้ามีลิงก์ไฟล์เสีย (ลิงก์เพื่อฝังตัวไฟล์เมื่อไม่มีไฟล์)",
        "hidden-category-category-desc": "หมวดหมู่นี้มี <code><nowiki>__HIDDENCAT__</nowiki></code> ในเนื้อหาหน้า ซึ่งป้องกันมิให้แสดงในกล่องลิงก์หมวดหมู่ในหน้าโดยปริยาย",
        "trackingcategories-nodesc": "ไม่มีคำอธิบาย",
        "trackingcategories-disabled": "ปิดใช้งานหมวดหมู่",
        "mailnologin": "ไม่มีที่อยู่ส่ง",
-       "mailnologintext": "à¸\84ุà¸\93à¸\95à¹\89อà¸\87[[Special:UserLogin|ลà¹\87อà¸\81อิà¸\99]]และมีที่อยู่อีเมลที่สมเหตุสมผลใน[[Special:Preferences|การตั้งค่า]]ของคุณเพื่อส่งอีเมลหาผู้ใช้อื่น",
+       "mailnologintext": "à¸\84ุà¸\93à¸\95à¹\89อà¸\87[[Special:UserLogin|à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a]]และมีที่อยู่อีเมลที่สมเหตุสมผลใน[[Special:Preferences|การตั้งค่า]]ของคุณเพื่อส่งอีเมลหาผู้ใช้อื่น",
        "emailuser": "ส่งอีเมลหาผู้ใช้นี้",
        "emailuser-title-target": "ส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}",
        "emailuser-title-notarget": "อีเมลผู้ใช้",
-       "emailpagetext": "คุณสามารถใช้แบบด้านล่างส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้\nที่อยู่อีเมลที่คุณกรอกใน[[Special:Preferences|การตั้งค่าส่วนตัวของคุณ]]จะปรากฏเป็นที่อยู่ \"จาก\" ของอีเมล ซึ่งผู้รับสามารถตอบกลับคุณได้โดยตรง",
+       "emailpagetext": "à¸\84ุà¸\93สามารà¸\96à¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87สà¹\88à¸\87à¸\82à¹\89อà¸\84วามอีà¹\80มลหา{{GENDER:$1|à¸\9cูà¹\89à¹\83à¸\8aà¹\89}}à¸\99ีà¹\89\nà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\97ีà¹\88à¸\84ุà¸\93à¸\81รอà¸\81à¹\83à¸\99[[Special:Preferences|à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าสà¹\88วà¸\99à¸\95ัวà¸\82อà¸\87à¸\84ุà¸\93]]à¸\88ะà¸\9bราà¸\81à¸\8fà¹\80à¸\9bà¹\87à¸\99à¸\97ีà¹\88อยูà¹\88 \"à¸\88าà¸\81\" à¸\82อà¸\87อีà¹\80มล à¸\8bึà¹\88à¸\87à¸\9cูà¹\89รัà¸\9aสามารà¸\96à¸\95อà¸\9aà¸\81ลัà¸\9aà¸\84ุà¸\93à¹\84à¸\94à¹\89à¹\82à¸\94ยà¸\95รà¸\87",
        "defemailsubject": "อีเมล {{SITENAME}} จากผู้ใช้ \"$1\"",
        "usermaildisabled": "ปิดใช้งานการส่งอีเมลหาผู้ใช้",
        "usermaildisabledtext": "คุณไม่สามารถส่งอีเมลหาผู้ใช้อื่นบนวิกินี้",
        "emailfrom": "จาก:",
        "emailto": "ถึง:",
        "emailsubject": "เรื่อง:",
-       "emailmessage": "สาร:",
+       "emailmessage": "à¸\82à¹\89อà¸\84วาม:",
        "emailsend": "ส่ง",
-       "emailccme": "สà¹\88à¸\87อีà¹\80มลสำà¹\80à¸\99าสารของฉันหาฉัน",
+       "emailccme": "สà¹\88à¸\87อีà¹\80มลสำà¹\80à¸\99าà¸\82à¹\89อà¸\84วามของฉันหาฉัน",
        "emailccsubject": "คัดลอกสารของคุณไป $1: $2",
        "emailsent": "ส่งอีเมลแล้ว",
-       "emailsenttext": "สà¹\88à¸\87สารอีเมลของคุณแล้ว",
+       "emailsenttext": "สà¹\88à¸\87à¸\82à¹\89อà¸\84วามอีเมลของคุณแล้ว",
        "emailuserfooter": "$1 ส่งอีเมลนี้ถึง $2 โดยฟังก์ชัน \"{{int:emailuser}}\" ที่ {{SITENAME}} อีเมลของคุณจะถูกส่งไปที่ผู้ส่งคนเดิมโดยตรง โดยจะเปิดเผยที่อยู่อีเมลให้พวกเขาเห็น",
        "usermessage-summary": "ฝากสารระบบ",
        "usermessage-editor": "ตัวส่งสารของระบบ",
        "mywatchlist": "รายการเฝ้าดู",
        "watchlistfor2": "สำหรับ $1 $2",
        "nowatchlist": "ไม่มีรายการในรายการเฝ้าดูของคุณ",
-       "watchlistanontext": "à¹\82à¸\9bรà¸\94ลà¸\87à¸\8aืà¹\88อà¹\80à¸\82à¹\89าเพื่อดูหรือแก้ไขรายการในรายการเฝ้าดูของคุณ",
+       "watchlistanontext": "à¹\82à¸\9bรà¸\94à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aเพื่อดูหรือแก้ไขรายการในรายการเฝ้าดูของคุณ",
        "watchnologin": "ยังไม่ได้เข้าสู่ระบบ",
        "addwatch": "เพิ่มเข้ารายการเฝ้าดู",
        "addedwatchtext": "เพิ่มหน้า \"[[:$1]]\" และหน้าอภิปรายเข้า[[Special:Watchlist|รายการเฝ้าดู]]ของคุณแล้ว",
        "enotif_lastvisited": "ดู $1 สำหรับการเปลี่ยนแปลงทั้งหมดตั้งแต่คุณชมครั้งสุดท้าย",
        "enotif_lastdiff": "เพื่อดูการเปลี่ยนแปลงนี้ ให้ดู $1",
        "enotif_anon_editor": "ผู้ใช้นิรนาม $1",
-       "enotif_body": "à¹\80รียà¸\99 $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nà¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อà¸\82อà¸\87à¸\9cูà¹\89à¹\80à¸\82ียà¸\99: $PAGESUMMARY $PAGEMINOREDIT\n\nà¸\95ิà¸\94à¸\95à¹\88อà¸\9cูà¹\89à¹\80à¸\82ียà¸\99:\nà¹\80มล: $PAGEEDITOR_EMAIL\nวิà¸\81ิ: $PAGEEDITOR_WIKI\n\nà¸\88ะà¹\84มà¹\88มีà¸\9bระà¸\81าศอืà¹\88à¸\99หาà¸\81มีà¸\81ิà¸\88à¸\81รรมà¹\80à¸\9eิà¹\88มà¹\80à¸\95ิม à¹\80วà¹\89à¸\99à¹\80สียà¹\81à¸\95à¹\88à¸\84ุà¸\93à¸\88ะà¹\80à¸\82à¹\89าà¸\8aมหà¸\99à¹\89าà¸\99ีà¹\89à¸\82à¸\93ะà¸\97ีà¹\88à¸\81ำลัà¸\87ลà¹\87อà¸\81อิà¸\99อยู่ คุณยังสามารถตั้งค่าตัวบ่งชี้ประกาศใหม่สำหรับหน้าที่คุณเฝ้าดูทุกหน้าในรายการเฝ้าดูของคุณ\n\nระบบประกาศ {{SITENAME}} ที่เป็นมิตรของคุณ\n\n--\nในการเปลี่ยนการตั้งค่าประกาศอีเมลของคุณ โปรดดู\n{{canonicalurl:{{#special:Preferences}}}}\n\nในการเปลี่ยนการตั้งค่ารายการเฝ้าดูของคุณ โปรดดู\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nในการลบหน้าจากรายการเฝ้าดูของคุณ โปรดดู\n$UNWATCHURL\n\nผลป้อนกลับและความช่วยเหลือเพิ่มเติม:\n$HELPPAGE",
+       "enotif_body": "à¹\80รียà¸\99 $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nà¸\84ำอà¸\98ิà¸\9aายอยà¹\88าà¸\87ยà¹\88อà¸\82อà¸\87à¸\9cูà¹\89à¹\80à¸\82ียà¸\99: $PAGESUMMARY $PAGEMINOREDIT\n\nà¸\95ิà¸\94à¸\95à¹\88อà¸\9cูà¹\89à¹\80à¸\82ียà¸\99:\nà¹\80มล: $PAGEEDITOR_EMAIL\nวิà¸\81ิ: $PAGEEDITOR_WIKI\n\nà¸\88ะà¹\84มà¹\88มีà¸\9bระà¸\81าศอืà¹\88à¸\99หาà¸\81มีà¸\81ิà¸\88à¸\81รรมà¹\80à¸\9eิà¹\88มà¹\80à¸\95ิม à¹\80วà¹\89à¸\99à¹\80สียà¹\81à¸\95à¹\88à¸\84ุà¸\93à¸\88ะà¹\80à¸\82à¹\89าà¸\8aมหà¸\99à¹\89าà¸\99ีà¹\89à¸\82à¸\93ะà¸\97ีà¹\88à¸\81ำลัà¸\87à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aอยู่ คุณยังสามารถตั้งค่าตัวบ่งชี้ประกาศใหม่สำหรับหน้าที่คุณเฝ้าดูทุกหน้าในรายการเฝ้าดูของคุณ\n\nระบบประกาศ {{SITENAME}} ที่เป็นมิตรของคุณ\n\n--\nในการเปลี่ยนการตั้งค่าประกาศอีเมลของคุณ โปรดดู\n{{canonicalurl:{{#special:Preferences}}}}\n\nในการเปลี่ยนการตั้งค่ารายการเฝ้าดูของคุณ โปรดดู\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nในการลบหน้าจากรายการเฝ้าดูของคุณ โปรดดู\n$UNWATCHURL\n\nผลป้อนกลับและความช่วยเหลือเพิ่มเติม:\n$HELPPAGE",
        "enotif_minoredit": "นี่เป็นการแก้ไขเล็กน้อย",
        "created": "ถูกสร้าง",
        "changed": "ถูกเปลี่ยนแปลง",
        "revertpage-nouser": "ย้อนการแก้ไขโดยผู้ใช้ไม่ระบุชื่อไปยังรุ่นล่าสุดโดย {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "ย้อนการแก้ไขโดย $1; \nเปลี่ยนกลับไปรุ่นล่าสุดโดย $2",
        "rollback-success-notify": "ย้อนการแก้ไขโดย $1;\nเปลี่ยนกลับไปรุ่นล่าสุดโดย $2 [$3 แสดงการเปลี่ยนแปลง]",
-       "sessionfailure-title": "à¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารล้มเหลว",
-       "sessionfailure": "à¸\94ูà¹\80หมือà¸\99มีà¸\9bัà¸\8dหาà¸\81ัà¸\9aà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารลà¹\87อà¸\81อิà¸\99à¸\82อà¸\87à¸\84ุà¸\93\nà¸\81ารà¸\81ระà¸\97ำà¸\99ีà¹\89à¸\96ูà¸\81ยà¸\81à¹\80ลิà¸\81à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\81ารลัà¸\81ลอà¸\9aà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารà¹\84วà¹\89à¸\81à¹\88อà¸\99 \nà¸\81รุà¸\93าà¸\81รอà¸\81à¹\81à¸\9aà¸\9aอีกครั้ง",
+       "sessionfailure-title": "à¹\80à¸\8bสà¸\8aัà¸\99ล้มเหลว",
+       "sessionfailure": "à¸\94ูà¹\80หมือà¸\99มีà¸\9bัà¸\8dหาà¸\81ัà¸\9aà¹\80à¸\8bสà¸\8aัà¸\99à¸\81ารà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¸\82อà¸\87à¸\84ุà¸\93\nà¸\81ารà¸\81ระà¸\97ำà¸\99ีà¹\89à¸\96ูà¸\81ยà¸\81à¹\80ลิà¸\81à¹\80à¸\9eืà¹\88อà¹\80à¸\9bà¹\87à¸\99à¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\81ารลัà¸\81ลอà¸\9aà¹\80à¸\8bสà¸\8aัà¸\99à¹\84วà¹\89à¸\81à¹\88อà¸\99 \nà¸\81รุà¸\93าà¸\81รอà¸\81à¹\81à¸\9aà¸\9aà¸\9fอรà¹\8cมà¹\83หมà¹\88อีกครั้ง",
        "changecontentmodel-title-label": "ชื่อหน้า:",
        "changecontentmodel-reason-label": "เหตุผล:",
        "changecontentmodel-submit": "ความเปลี่ยนแปลง",
        "movepagetalktext": "หากคุณเลือกกล่องนี้ หน้าคุยของหน้านี้จะถูกย้ายไปชื่อเรื่องใหม่โดยอัตโนมัติเว้นแต่ปลายทางมีหน้าคุยไม่ว่างแล้ว\n\nในกรณีเหล่านี้ คุณจะต้องย้ายหรือผสานหน้าเองหากต้องการ",
        "moveuserpage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าผู้ใช้ โปรดทราบว่าหน้าผู้ใช้เท่านั้นที่จะถูกเปลี่ยนชื่อ แต่ผู้ใช้จะ<em>ไม่</em>ถูกเปลี่ยนชื่อ",
        "movecategorypage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าหมวดหมู่ โปรดทราบว่า จะย้ายเฉพาะหน้าและทุกหน้าในหมวดหมู่เก่าจะ<em>ไม่</em>ถูกจัดเข้าหมวดหมู่ใหม่",
-       "movenologintext": "à¸\96à¹\89าà¸\95à¹\89อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าà¸\99ีà¹\89 à¸\95à¹\89อà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\9cูà¹\89à¹\83à¸\8aà¹\89ลà¸\87à¸\97ะà¹\80à¸\9aียà¸\99à¹\81ละ[[Special:UserLogin|ลà¹\87อà¸\81อิà¸\99]]",
+       "movenologintext": "หาà¸\81à¸\95à¹\89อà¸\87à¸\81ารยà¹\89ายหà¸\99à¹\89าà¸\99ีà¹\89 à¸\95à¹\89อà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\9cูà¹\89à¹\83à¸\8aà¹\89ลà¸\87à¸\97ะà¹\80à¸\9aียà¸\99à¹\81ละ[[Special:UserLogin|à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a]]",
        "movenotallowed": "คุณไม่มีสิทธิเปลี่ยนชื่อหน้า",
        "movenotallowedfile": "คุณไม่มีสิทธิย้ายไฟล์",
        "cant-move-user-page": "คุณไม่มีสิทธิย้ายหน้าผู้ใช้ (แยกจากหน้าย่อย)",
        "export-download": "ส่งออกมาเป็นไฟล์",
        "export-templates": "รวมแม่แบบมาด้วย",
        "export-pagelinks": "จำนวนลำดับของหน้าที่ถูกเชื่อมโยงทั้งหมด:",
-       "allmessages": "สารà¸\82อà¸\87ระบบ",
+       "allmessages": "à¸\82à¹\89อà¸\84วามระบบ",
        "allmessagesname": "ชื่อ",
-       "allmessagesdefault": "à¸\82à¹\89อà¸\84วามสารà¹\82à¸\94ยปริยาย",
+       "allmessagesdefault": "à¹\80à¸\99ืà¹\89อหาà¸\82à¹\89อà¸\84วามปริยาย",
        "allmessagescurrent": "ข้อความปัจจุบัน",
-       "allmessagestext": "à¸\99ีà¹\88à¸\84ือรายà¸\81ารà¸\82à¹\89อà¸\84วามà¸\82อà¸\87ระà¸\9aà¸\9aà¸\97ีà¹\88อยูà¹\88à¹\83à¸\99à¹\80à¸\99มสà¹\80à¸\9bà¸\8bมีà¹\80à¸\94ียวิà¸\81ิ\nà¸\81รุà¸\93าอà¹\88าà¸\99หà¸\99à¹\89า[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation à¹\80à¸\97ศวิวัà¸\95à¸\99à¹\8cà¸\82อà¸\87มีà¹\80à¸\94ียวิà¸\81ิ] à¹\81ละ [https://translatewiki.net translatewiki.net] à¸\96à¹\89าคุณอยากที่จะช่วยแปลข้อความของระบบมีเดียวิกิ",
+       "allmessagestext": "à¸\99ีà¹\88à¸\84ือรายà¸\81ารà¸\82à¹\89อà¸\84วามà¸\82อà¸\87ระà¸\9aà¸\9aà¸\97ีà¹\88อยูà¹\88à¹\83à¸\99à¹\80à¸\99มสà¹\80à¸\9bà¸\8bมีà¹\80à¸\94ียวิà¸\81ิ\nà¸\81รุà¸\93าอà¹\88าà¸\99หà¸\99à¹\89า[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation à¹\80à¸\97ศวิวัà¸\95à¸\99à¹\8cà¸\82อà¸\87มีà¹\80à¸\94ียวิà¸\81ิ] à¹\81ละ [https://translatewiki.net translatewiki.net] à¸«à¸²à¸\81คุณอยากที่จะช่วยแปลข้อความของระบบมีเดียวิกิ",
        "allmessagesnotsupportedDB": "หน้านี้ไม่สามารถใช้งานได้เนื่องจาก '''$wgUseDatabaseMessages''' ถูกระงับการใช้งาน",
        "allmessages-filter-legend": "กรอง",
        "allmessages-filter": "กรองตามสถานะที่เลือก:",
        "thumbnail-more": "ขยาย",
        "filemissing": "ไฟล์สูญหาย",
        "thumbnail_error": "มีข้อผิดพลาดในการสร้างรูปย่อ: $1",
-       "thumbnail_error_remote": "สารข้อผิดพลาดจาก $1:\n$2",
+       "thumbnail_error_remote": "à¸\82à¹\89อà¸\84วามข้อผิดพลาดจาก $1:\n$2",
        "djvu_page_error": "หน้าเดจาวู (DjVu) เกินขนาด",
        "djvu_no_xml": "ไม่สามารถส่งเอกซ์เอ็มแอล (XML) สำหรับไฟล์เดจาวู (DjVu)",
        "thumbnail-dest-create": "ไม่สามารถบันทึกรูปย่อลงในปลายทางได้",
        "import-nonewrevisions": "ทุกรุ่นมาจากการนำเข้าข้อมูลก่อนหน้านี้",
        "xml-error-string": "$1 ที่บรรทัด $2 คอลัมน์ $3 (ไบต์ที่ $4): $5",
        "import-upload": "อัปโหลดข้อมูล XML",
-       "import-token-mismatch": "à¸\82à¹\89อมูลà¹\80à¸\8bà¸\8aà¸\8aัà¸\99สูà¸\8dหาย\n\nà¸\84ุà¸\93อาà¸\88ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8c '''à¸\81รุà¸\93ายืà¸\99ยัà¸\99วà¹\88าà¸\84ุà¸\93ยัà¸\87ลà¹\87อà¸\81อิà¸\99à¹\81ละลอà¸\87อีà¸\81à¸\84รัà¹\89à¸\87'''\nหาà¸\81ยัà¸\87à¹\84มà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\9cล à¹\83หà¹\89ลอà¸\87[[Special:UserLogout|ลà¹\87อà¸\81à¹\80อาà¸\95à¹\8c]]à¸\81à¹\88อà¸\99à¹\81ลà¹\89วลà¹\87อà¸\81อิà¸\99à¸\81ลัà¸\9aมา และตรวจสอบว่าเบราว์เซอร์ของคุณอนุญาตคุกกี้จากเว็บไซต์นี้",
+       "import-token-mismatch": "à¸\82à¹\89อมูลà¹\80à¸\8bสà¸\8aัà¸\99สูà¸\8dหาย\n\nà¸\84ุà¸\93อาà¸\88ออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9aà¹\84à¸\9bà¹\81ลà¹\89ว '''à¸\81รุà¸\93ายืà¸\99ยัà¸\99วà¹\88าà¸\84ุà¸\93ยัà¸\87à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\81ละลอà¸\87อีà¸\81à¸\84รัà¹\89à¸\87'''\nหาà¸\81ยัà¸\87à¹\84มà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\9cล à¹\83หà¹\89ลอà¸\87[[Special:UserLogout|ออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9a]]à¸\81à¹\88อà¸\99à¹\81ลà¹\89วà¸\81ลัà¸\9aà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\83หมà¹\88 และตรวจสอบว่าเบราว์เซอร์ของคุณอนุญาตคุกกี้จากเว็บไซต์นี้",
        "import-invalid-interwiki": "ไม่สามารถนำข้อมูลเข้าจากวิกิที่กำหนดได้",
        "import-error-create": "หน้า \"$1\" ยังไม่ได้ถูกนำเข้า เนื่องจากคุณไม่ได้รับอนุญาตให้สามารถสร้างได้",
        "import-options-wrong": "{{PLURAL:$2|ตัวเลือก|ตัวเลือก}}ผิด:<nowiki>$1</nowiki>",
        "tooltip-pt-watchlist": "รายการหน้าที่คุณกำลังเฝ้าดูการเปลี่ยนแปลง",
        "tooltip-pt-mycontris": "รายการการเข้ามีส่วนร่วมของ{{GENDER:|คุณ}}",
        "tooltip-pt-anoncontribs": "รายการการแก้ไขจากเลขที่อยู่ไอพีนี้",
-       "tooltip-pt-login": "สà¸\99ัà¸\9aสà¸\99ุà¸\99à¹\83หà¹\89à¸\84ุà¸\93ลà¹\87อà¸\81อิà¸\99 แต่ไม่บังคับ",
+       "tooltip-pt-login": "à¹\81à¸\99ะà¸\99ำà¹\83หà¹\89à¸\84ุà¸\93à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a แต่ไม่บังคับ",
        "tooltip-pt-login-private": "คุณต้องล็อกอินจึงจะใช้วิกินี้ได้",
        "tooltip-pt-logout": "ออกจากระบบ",
-       "tooltip-pt-createaccount": "สà¸\99ัà¸\9aสà¸\99ุà¸\99à¹\83หà¹\89à¸\84ุà¸\93สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¹\81ละลà¹\87อà¸\81อิà¸\99 แต่ไม่บังคับ",
+       "tooltip-pt-createaccount": "à¹\81à¸\99ะà¸\99ำà¹\83หà¹\89à¸\84ุà¸\93สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¹\81ละà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a แต่ไม่บังคับ",
        "tooltip-ca-talk": "อภิปรายเกี่ยวกับหน้าเนื้อหา",
        "tooltip-ca-edit": "แก้ไขหน้านี้",
        "tooltip-ca-addsection": "เริ่มส่วนใหม่",
        "tooltip-n-mainpage": "เยี่ยมชมหน้าหลัก",
        "tooltip-n-mainpage-description": "เยี่ยมชมหน้าหลัก",
        "tooltip-n-portal": "เกี่ยวกับโครงการ สิ่งที่คุณทำได้ วิธีการค้นหา",
-       "tooltip-n-currentevents": "ค้นหาเหตุการณ์ปัจจุบัน",
-       "tooltip-n-recentchanges": "รายà¸\81ารà¸\9bรัà¸\9aà¸\9bรุงล่าสุดในวิกินี้",
+       "tooltip-n-currentevents": "à¸\84à¹\89à¸\99หาà¸\82à¹\89อมูลà¹\80à¸\9aืà¹\89อà¸\87หลัà¸\87à¹\83à¸\99à¹\80หà¸\95ุà¸\81ารà¸\93à¹\8cà¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99",
+       "tooltip-n-recentchanges": "รายà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงล่าสุดในวิกินี้",
        "tooltip-n-randompage": "โหลดหน้าสุ่ม",
        "tooltip-n-help": "อธิบายการใช้งาน",
        "tooltip-t-whatlinkshere": "รายการหน้าวิกิทุกหน้าที่ลิงก์มาที่นี่",
-       "tooltip-t-recentchangeslinked": "รายà¸\81ารà¸\9bรัà¸\9aà¸\9bรุงล่าสุดในหน้าที่ลิงก์จากหน้านี้",
+       "tooltip-t-recentchangeslinked": "รายà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงล่าสุดในหน้าที่ลิงก์จากหน้านี้",
        "tooltip-feed-rss": "ฟีดชนิดอาร์เอสเอส (RSS) ของหน้านี้",
        "tooltip-feed-atom": "ฟีดอะตอม (Atom) ของหน้านี้",
        "tooltip-t-contributions": "รายการการมีส่วนร่วมของ{{GENDER:$1|ผู้ใช้นี้}}",
        "tooltip-t-emailuser": "ส่งอีเมลถึง{{GENDER:$1|ผู้ใช้นี้}}",
-       "tooltip-t-info": "สารสà¸\99à¹\80à¸\97ศเพิ่มเติมเกี่ยวกับหน้านี้",
+       "tooltip-t-info": "à¸\82à¹\89อมูลเพิ่มเติมเกี่ยวกับหน้านี้",
        "tooltip-t-upload": "อัปโหลดไฟล์",
        "tooltip-t-specialpages": "รายการหน้าพิเศษทั้งหมด",
        "tooltip-t-print": "รุ่นที่พร้อมพิมพ์ของหน้านี้",
        "tooltip-ca-nstab-special": "หน้านี้เป็นหน้าพิเศษ ไม่สามารถแก้ไขได้",
        "tooltip-ca-nstab-project": "ดูหน้าโครงการ",
        "tooltip-ca-nstab-image": "ดูหน้าภาพไฟล์",
-       "tooltip-ca-nstab-mediawiki": "à¸\94ูสารระบบ",
+       "tooltip-ca-nstab-mediawiki": "à¸\94ูà¸\82à¹\89อà¸\84วามระบบ",
        "tooltip-ca-nstab-template": "ดูแม่แบบ",
        "tooltip-ca-nstab-help": "ดูหน้าคำอธิบาย",
        "tooltip-ca-nstab-category": "ดูหน้าหมวดหมู่",
        "spam_blanking": "รุ่นการปรับปรุงทุกรุ่นประกอบไปด้วยลิงก์ไปยังเว็บ $1 (ทำหน้าว่าง)",
        "spam_deleting": "ทุกรุ่นที่มีลิงก์ไปยัง $1 กำลังลบ",
        "simpleantispam-label": "การตรวจสอบสแปม\n<strong>อย่า</strong>กรอกช่องนี้!",
-       "pageinfo-title": "สารสà¸\99à¹\80à¸\97ศสำหรับ \"$1\"",
-       "pageinfo-not-current": "à¸\82ออภัย à¹\84มà¹\88สามารà¸\96à¹\83หà¹\89สารสà¸\99à¹\80à¸\97ศนี้สำหรับรุ่นปรับปรุงเก่าได้",
+       "pageinfo-title": "à¸\82à¹\89อมูลสำหรับ \"$1\"",
+       "pageinfo-not-current": "à¸\82ออภัย à¹\84มà¹\88สามารà¸\96à¹\83หà¹\89à¸\82à¹\89อมูลนี้สำหรับรุ่นปรับปรุงเก่าได้",
        "pageinfo-header-basic": "สารสนเทศเบื้องต้น",
        "pageinfo-header-edits": "ประวัติการแก้ไข",
        "pageinfo-header-restrictions": "การล็อกหน้า",
        "pageinfo-magic-words": "{{PLURAL:$1|คำสั่งพิเศษ}} ($1)",
        "pageinfo-hidden-categories": "หมวดหมู่ที่ซ่อนอยู่ ($1)",
        "pageinfo-templates": "แม่แบบที่ใช้ ($1)",
-       "pageinfo-toolboxlink": "สารสà¸\99à¹\80à¸\97ศหน้า",
+       "pageinfo-toolboxlink": "à¸\82à¹\89อมูลหน้า",
        "pageinfo-redirectsto": "เปลี่ยนทางไป",
        "pageinfo-redirectsto-info": "สนเทศ",
        "pageinfo-contentpage": "นับเป็นหน้าเนื้อหา",
        "pageinfo-protect-cascading": "การล็อกที่ต่อเรียงจากหน้านี้",
        "pageinfo-protect-cascading-yes": "ใช่",
        "pageinfo-protect-cascading-from": "การล็อกต่อเรียงจาก",
-       "pageinfo-category-info": "สารสà¸\99à¹\80à¸\97ศหมวดหมู่",
+       "pageinfo-category-info": "à¸\82à¹\89อมูลหมวดหมู่",
        "pageinfo-category-total": "จำนวนสมาชิกรวม",
        "pageinfo-category-pages": "จำนวนหน้า",
        "pageinfo-category-subcats": "จำนวนหมวดหมู่ย่อย",
        "markaspatrolledtext-file": "ทำเครื่องหมายรุ่นไฟล์นี้ว่าตรวจสอบแล้ว",
        "markedaspatrolled": "ตรวจสอบแล้ว",
        "markedaspatrolledtext": "กำหนดรุ่นที่เลือกของ [[:$1]] ว่าตรวจสอบแล้ว",
-       "rcpatroldisabled": "à¸\81ารà¸\95รวà¸\88สอà¸\9aหà¸\99à¹\89าà¸\9bรัà¸\9aà¸\9bรุงล่าสุดถูกปิดใช้งาน",
+       "rcpatroldisabled": "à¸\81ารà¸\95รวà¸\88สอà¸\9aหà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงล่าสุดถูกปิดใช้งาน",
        "rcpatroldisabledtext": "ปัจจุบันฟังก์ชันการตรวจสอบหน้าปรับปรุงล่าสุดถูกปิดใช้งาน",
        "markedaspatrollederror": "ไม่สามารถทำเครื่องหมายว่าตรวจสอบแล้ว",
        "markedaspatrollederrortext": "คุณจำเป็นต้องระบุรุ่นการแก้ไขที่กำหนดว่าตรวจสอบแล้ว",
        "yesterday-at": "เมื่อวานเมื่อ $1 น.",
        "bad_image_list": "รูปแบบแสดงต่อไปนี้:\n\nเฉพาะรายการที่แสดง (ในแถวขึ้นต้นด้วย *) โดยลิงก์แรกของแต่ละแถวเป็นลิงก์ไปยังภาพที่เสีย\nโดยลิงก์ถัดไปเป็นข้อยกเว้น เช่น บทความที่ภาพถูกจัดในบรรทัดเดียวกับส่วนข้อความ",
        "metadata": "ข้อมูลอภิพันธุ์",
-       "metadata-help": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีสารสà¸\99à¹\80à¸\97ศà¹\80à¸\9eิà¹\88มà¹\80à¸\95ิม à¸­à¸²à¸\88à¹\80à¸\9eิà¹\88มà¸\88าà¸\81à¸\81ลà¹\89อà¸\87à¸\96à¹\88ายรูà¸\9bà¸\94ิà¸\88ิà¸\97ัลหรือสà¹\81à¸\81à¸\99à¹\80à¸\99อรà¹\8cà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88อสรà¹\89าà¸\87หรือà¹\81à¸\9bลà¸\87ภาà¸\9eà¹\80à¸\9bà¹\87à¸\99à¸\94ิà¸\88ิà¸\97ัล\nหาà¸\81à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¸\96ูà¸\81à¸\94ัà¸\94à¹\81à¸\9bรà¸\88าà¸\81สà¸\96าà¸\99ะà¸\95à¹\89à¸\99à¸\89à¸\9aัà¸\9a à¸£à¸²à¸¢à¸¥à¸°à¹\80อียà¸\94à¸\9aาà¸\87อยà¹\88าà¸\87อาà¸\88à¹\84มà¹\88สะà¸\97à¹\89อà¸\99à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\96ูà¸\81à¸\94ัà¸\94à¹\81à¸\9bลอย่างสมบูรณ์",
+       "metadata-help": "à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89มีà¸\82à¹\89อมูลà¹\80à¸\9eิà¹\88มà¹\80à¸\95ิม à¸­à¸²à¸\88à¹\80à¸\9eิà¹\88มà¸\88าà¸\81à¸\81ลà¹\89อà¸\87à¸\96à¹\88ายรูà¸\9bà¸\94ิà¸\88ิà¸\97ัลหรือสà¹\81à¸\81à¸\99à¹\80à¸\99อรà¹\8cà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88อสรà¹\89าà¸\87หรือà¹\81à¸\9bลà¸\87ภาà¸\9eà¹\80à¸\9bà¹\87à¸\99à¸\94ิà¸\88ิà¸\97ัล\nหาà¸\81à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89à¸\96ูà¸\81à¹\81à¸\81à¹\89à¹\84à¸\82à¸\88าà¸\81สà¸\96าà¸\99ะà¸\95à¹\89à¸\99à¸\89à¸\9aัà¸\9a à¸£à¸²à¸¢à¸¥à¸°à¹\80อียà¸\94à¸\9aาà¸\87อยà¹\88าà¸\87อาà¸\88à¹\84มà¹\88สะà¸\97à¹\89อà¸\99à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¸\96ูà¸\81à¹\81à¸\81à¹\89à¹\84à¸\82อย่างสมบูรณ์",
        "metadata-expand": "แสดงรายละเอียดขยาย",
        "metadata-collapse": "ซ่อนรายละเอียดขยาย",
        "metadata-fields": "เขตข้อมูลข้อมูลอภิพันธุ์ของภาพดังที่แสดงรายการไว้ในข้อความนี้ จะถูกรวมบนหน้าภาพเมื่อตารางข้อมูลอภิพันธุ์ถูกยุบ \nเขตข้อมูลอื่น ๆ จะถูกซ่อนโดยปริยาย\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "confirmemail_pending": "รหัสยืนยันได้ส่งไปยังอีเมลของคุณแล้ว \nถ้าคุณเพิ่งสร้างบัญชี คุณอาจต้องรอสักครู่ให้รหัสส่งไปถึงที่อยู่อีเมลคุณ แทนที่จะขอรหัสยืนยันใหม่ทันที",
        "confirmemail_send": "ส่งรหัสยืนยันทางอีเมล",
        "confirmemail_sent": "ส่งอีเมลสำหรับการยืนยันแล้ว",
-       "confirmemail_oncreate": "รหัสยืà¸\99ยัà¸\99à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bยัà¸\87à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93\nรหัสà¸\99ีà¹\89à¹\84มà¹\88à¸\81ำหà¸\99à¸\94à¹\83หà¹\89à¸\95à¹\89อà¸\87ลà¹\87อà¸\81อิà¸\99 แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้",
+       "confirmemail_oncreate": "รหัสยืà¸\99ยัà¸\99à¸\96ูà¸\81สà¹\88à¸\87à¹\84à¸\9bยัà¸\87à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93\nรหัสà¸\99ีà¹\89à¹\84มà¹\88à¸\81ำหà¸\99à¸\94à¹\83หà¹\89à¸\95à¹\89อà¸\87à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้",
        "confirmemail_sendfailed": "{{SITENAME}}ไม่สามารถส่งอีเมลยืนยันได้\nโปรดตรวจสอบที่อยู่อีเมลว่าอักขระทั้งหมดถูกต้อง\n\nข้อความตีกลับ: $1",
        "confirmemail_invalid": "รหัสยืนยันไม่ถูกต้อง \nรหัสอาจหมดอายุแล้ว",
        "confirmemail_needlogin": "คุณต้อง $1 เพื่อยืนยันที่อยู่อีเมลของคุณ",
-       "confirmemail_success": "อีà¹\80มลà¸\84ุà¸\93à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารยืà¸\99ยัà¸\99à¹\81ลà¹\89ว\nà¸\84ุà¸\93อาà¸\88[[Special:UserLogin|ลà¹\87อà¸\81อิà¸\99]]à¸\95อà¸\99à¸\99ีà¹\89à¹\81ละสà¸\99ุà¸\81à¸\81ัà¸\9aà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82วิà¸\81ิ",
+       "confirmemail_success": "อีà¹\80มลà¸\84ุà¸\93à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารยืà¸\99ยัà¸\99à¹\81ลà¹\89ว\nà¸\84ุà¸\93สามารà¸\96[[Special:UserLogin|à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a]]à¸\95อà¸\99à¸\99ีà¹\89à¹\81ละสà¸\99ุà¸\81à¸\81ัà¸\9aà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82วิà¸\81ิà¹\84à¸\94à¹\89à¹\80ลย",
        "confirmemail_loggedin": "อีเมลคุณได้รับการยืนยันแล้ว",
        "confirmemail_subject": "การยืนยันที่อยู่อีเมลของ{{SITENAME}}",
        "confirmemail_body": "ใครบางคน ซึ่งอาจจะเป็นคุณ จากหมายเลขไอพี $1 ได้ลงทะเบียนในชื่อ \"$2\" โดยใช้อีเมลนี้ที่ {{SITENAME}}\n\nเพื่อยืนยันว่าบัญชีผู้ใช้นี้เป็นของคุณอย่างแน่อน และใช้งานฟีเจอร์ส่งอีเมลหาผู้ใช้บน {{SITENAME}} กดลิงก์นี้ในเว็บเบราวเซอร์ของคุณ:\n\n$3\n\nถ้าคุณ*ไม่*ได้ลงทะเบียน กรุณากดลิงก์ด้านล่างเพื่อยกเลิกการยืนยันที่อยู่อีเมล\n\n$5\n\nรหัสยืนยันนี้จะหมดอายุเมื่อ $4",
        "version-ext-colheader-description": "คำอธิบาย",
        "version-ext-colheader-credits": "ผู้ประพันธ์",
        "version-license-title": "ใบอนุญาตสำหรับ $1",
-       "version-license-not-found": "à¹\84มà¹\88à¸\9eà¸\9aสารสà¸\99à¹\80à¸\97ศà¹\83à¸\9aอà¸\99ุà¸\8dาà¸\95ลà¸\87รายละเอียดสำหรับส่วนขยายนี้",
+       "version-license-not-found": "à¹\84มà¹\88à¸\9eà¸\9aà¸\82à¹\89อมูลà¹\83à¸\9aอà¸\99ุà¸\8dาà¸\95à¹\81à¸\9aà¸\9aละเอียดสำหรับส่วนขยายนี้",
        "version-credits-title": "ข้อความให้เกียรติเจ้าของงานสำหรับ $1",
-       "version-credits-not-found": "à¹\84มà¹\88à¸\9eà¸\9aสารสà¸\99à¹\80à¸\97ศà¸\82à¹\89อà¸\84วามà¹\83หà¹\89à¹\80à¸\81ียรà¸\95ิà¹\80à¸\88à¹\89าà¸\82อà¸\87à¸\87าà¸\99ลà¸\87รายละเอียดสำหรับส่วนขยายนี้",
+       "version-credits-not-found": "à¹\84มà¹\88à¸\9eà¸\9aà¸\82à¹\89อมูลà¸\82à¹\89อà¸\84วามà¹\83หà¹\89à¹\80à¸\81ียรà¸\95ิà¹\80à¸\88à¹\89าà¸\82อà¸\87à¸\87าà¸\99à¹\81à¸\9aà¸\9aละเอียดสำหรับส่วนขยายนี้",
        "version-poweredby-credits": "วิกินี้จัดทำโดย '''[https://www.mediawiki.org/ MediaWiki]''', สงวนลิขสิทธิ์ © 2001-$1 โดย $2",
        "version-poweredby-others": "ผู้อื่น",
        "version-poweredby-translators": "ผู้แปล translatewiki.net",
        "tags-delete-not-allowed": "ลบป้ายระบุที่ส่วนขยายนิยามไม่ได้ยกเว้นส่วนขยายนั้นเจาะจงอนุญาต",
        "tags-delete-not-found": "ไม่มีป้ายระบุ \"$1\"",
        "tags-delete-too-many-uses": "ป้ายะรุบ \"$1\" มีผลใช้ในกว่า $2 รุ่น ฉะนั้นจึงไม่สามารถลบ",
+       "tags-activate-reason": "เหตุผล:",
        "tags-activate-submit": "เปิดใช้งาน",
        "tags-deactivate-title": "ปิดใช้งานป้ายระบุ",
+       "tags-deactivate-reason": "เหตุผล:",
+       "tags-edit-reason": "เหตุผล:",
        "comparepages": "เปรียบเทียบหน้า",
        "compare-page1": "หน้า 1",
        "compare-page2": "หน้า 2",
        "feedback-bugornote": "หากคุณได้อธิบายปัญหาทางเทคนิคในรายละเอียดแล้ว โปรด[$1 รายงานจุดบกพร่อง]\nมิฉะนั้น คุณสามารถแบบอย่างง่ายด้านล่าง ความเห็นของคุณจะถูกเพิ่มเข้าสู่ \"[$3 $2]\" ร่วมกับชื่อผู้ใช้ของคุณ",
        "feedback-cancel": "ยกเลิก",
        "feedback-close": "เสร็จสิ้น",
-       "feedback-message": "สาร:",
+       "feedback-message": "à¸\82à¹\89อà¸\84วาม:",
        "feedback-subject": "เรื่อง:",
        "feedback-submit": "ตกลง",
        "feedback-thanks": "ขอบคุณ! ผลป้อนกลับของคุณถูกโพสต์ไปยังหน้า \"[$2 $1]\" แล้ว",
        "limitreport-templateargumentsize": "ขนาดอาร์กิวเมนต์แม่แบบ",
        "limitreport-templateargumentsize-value": "$1/$2 ไบต์",
        "limitreport-expansiondepth": "ความลึกการขยายสูงสุด",
+       "limitreport-unstrip-depth": "ความลึกการเรียกซ้ำ Unstrip",
        "expandtemplates": "ขยายแม่แบบ",
        "expand_templates_output": "ผลลัพธ์",
        "expand_templates_ok": "ตกลง",
        "pagelang-language": "ภาษา",
        "pagelang-use-default": "ใช้ภาษาโดยปริยาย",
        "pagelang-select-lang": "เลือกภาษา",
+       "pagelang-reason": "เหตุผล",
        "pagelang-submit": "ส่ง",
        "right-pagelang": "เปลี่ยนภาษาหน้า",
        "action-pagelang": "เปลี่ยนภาษาหน้า",
        "mediastatistics-header-drawing": "ภาพวาดเส้น (ภาพเวกเตอร์)",
        "mediastatistics-header-audio": "เสียง",
        "mediastatistics-header-video": "วิดีทัศน์",
+       "json-error-depth": "ความลึกสแตกสูงสุดเกิน",
        "headline-anchor-title": "โยงมาส่วนนี้",
        "special-characters-group-latin": "ละติน",
        "special-characters-group-latinextended": "ละตินส่วนขยาย",
        "special-characters-group-canadianaboriginal": "แคนาดาพื้นเมืองดั้งเดิม",
        "special-characters-title-minus": "เครื่องหมายลบ",
        "mw-widgets-dateinput-no-date": "ไม่เลือกวันที่",
+       "mw-widgets-usersmultiselect-placeholder": "เพิ่ม...",
+       "mw-widgets-titlesmultiselect-placeholder": "เพิ่ม...",
        "date-range-from": "ตั้งแต่วันที่:",
        "date-range-to": "ถึงวันที่:",
        "randomrootpage": "สุ่มหน้าราก",
        "log-action-filter-suppress-reblock": "การระงับผู้ใช้โดยการบล็อกใหม่",
        "log-action-filter-upload-upload": "อัปโหลดใหม่",
        "log-action-filter-upload-overwrite": "อัปโหลดใหม่",
-       "authmanager-authn-not-in-progress": "à¹\84มà¹\88อยูà¹\88ระหวà¹\88าà¸\87à¸\81ารà¸\9eิสูà¸\88à¸\99à¹\8cà¸\95ัวà¸\88ริà¸\87หรือà¸\82à¹\89อมูลà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น",
+       "authmanager-authn-not-in-progress": "à¹\84มà¹\88อยูà¹\88ระหวà¹\88าà¸\87à¸\81ารà¸\9eิสูà¸\88à¸\99à¹\8cà¸\95ัวà¸\88ริà¸\87หรือà¸\82à¹\89อมูลà¹\80à¸\8bสà¸\8aัà¸\99สูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น",
        "authmanager-authn-no-primary": "เอกสารทางการที่ให้ไม่สามารถพิสูจน์ตัวจริงได้",
        "authmanager-authn-no-local-user": "เอกสารทางการที่ให้ไม่สัมพันธ์กับผู้ใช้ใดในวิกินี้",
        "authmanager-authn-no-local-user-link": "เอกสารทางการที่ให้ไม่สัมพันธ์กับผู้ใช้ใดในวิกินี้ ล็อกอินอีกทางหนึ่ง หรือสร้างผู้ใช้ใหม่ และคุณจะมีตัวเลือกให้ลิงก์เอกสารทางการก่อนหน้าของคุณไปบัญชีนั้น",
        "authmanager-change-not-supported": "ไม่สามารถเปลี่ยนเอกสารทางการที่ให้ได้ เพราะไม่มีความต้องการใช้",
        "authmanager-create-disabled": "ปิดใช้งานการสร้างบัญชี",
        "authmanager-create-from-login": "กรุณากรอกเขตข้อมูลเพื่อสร้างบัญชี",
-       "authmanager-create-not-in-progress": "à¹\84มà¹\88อยูà¹\88ระหวà¹\88าà¸\87à¸\81ารสรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีหรือà¸\82à¹\89อมูลà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น",
+       "authmanager-create-not-in-progress": "à¹\84มà¹\88อยูà¹\88ระหวà¹\88าà¸\87à¸\81ารสรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีหรือà¸\82à¹\89อมูลà¹\80à¸\8bสà¸\8aัà¸\99สูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น",
        "authmanager-create-no-primary": "เอกสารทางการที่ให้ไม่สามารถใช้สำหรับการสร้างบัญชีได้",
        "authmanager-link-no-primary": "เอกสารทางการที่ให้ไม่สามารถใช้สำหรับการเชื่อมโยงบัญชี",
-       "authmanager-link-not-in-progress": "à¹\84มà¹\88อยูà¹\88ระหวà¹\88าà¸\87à¸\81ารà¹\82ยà¸\87à¸\9aัà¸\8dà¸\8aีหรือà¸\82à¹\89อมูลà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารสูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น",
+       "authmanager-link-not-in-progress": "à¹\84มà¹\88อยูà¹\88ระหวà¹\88าà¸\87à¸\81ารà¹\82ยà¸\87à¸\9aัà¸\8dà¸\8aีหรือà¸\82à¹\89อมูลà¹\80à¸\8bสà¸\8aัà¸\99สูญหาย กรุณาเริ่มใหม่ตั้งแต่ต้น",
        "authmanager-authplugin-setpass-failed-title": "การเปลี่ยนรหัสผ่านล้มเหลว",
        "authmanager-authplugin-setpass-failed-message": "ปลั๊กอินการพิสูจน์ตัวจริงปฏิเสธการเปลี่ยนรหัสผ่าน",
        "authmanager-authplugin-create-fail": "ปลั๊กอินการพิสูจน์ตัวจริงปฏิเสธการสร้างบัญชี",
        "authmanager-autocreate-noperm": "ไม่อนุญาตการสร้างบัญชีอัตโนมัติ",
        "authmanager-autocreate-exception": "ปิดใช้งานการสร้างบัญชีอัตโนมัติชั่วคราวเนื่องจากข้อผิดพลาดก่อนหน้านี้",
        "authmanager-userdoesnotexist": "บัญชีผู้ใช้ \"$1\"ยังไม่ลงทะเบียน",
-       "authmanager-userlogin-remembermypassword-help": "à¸\84วรà¸\88à¸\94à¸\88ำรหัสà¸\9cà¹\88าà¸\99à¸\99าà¸\99à¹\80à¸\81ิà¸\99à¸\84วามยาวà¸\82อà¸\87à¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารหรือไม่",
+       "authmanager-userlogin-remembermypassword-help": "à¸\84วรà¸\88à¸\94à¸\88ำรหัสà¸\9cà¹\88าà¸\99à¸\99าà¸\99à¹\80à¸\81ิà¸\99à¸\84วามยาวà¸\82อà¸\87à¹\80à¸\8bสà¸\8aัà¸\99หรือไม่",
        "authmanager-username-help": "ชื่อผู้ใช้สำหรับการพิสูจน์ตัวจริง",
        "authmanager-password-help": "รหัสผ่านสำหรับการพิสูจน์ตัวจริง",
        "authmanager-domain-help": "โดเมนสำหรับการพิสูจน์ตัวจริงภายนอก",
index eff94a5..7173a02 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "Gözegçilik sanawyny, diňe soňky däl-de, eýsem ähli üýtgeşmeleri görkezer ýaly edip giňelt",
        "tog-usenewrc": "Güýçlendirilen soňky üýtgeşmelerden peýdalanyň (JavaScript bolmaly)",
        "tog-numberheadings": "Atlary awtomatik usulda belgile",
-       "tog-showtoolbar": "Redaktirleme mahalynda gural panelini görkez (JavaScript)",
        "tog-editondblclick": "Sahypany jübüt tyklap, redaktirläp başla (JavaScript)",
        "tog-editsectiononrightclick": "Bölümleri bölümiň adyna sag tyklap redaktirlemäge mümkinçilik döret (JavaScript)",
        "tog-watchcreations": "Döreden sahypalarymy gözegçilik sanawyma goş",
index f81415e..e4ba136 100644 (file)
@@ -34,7 +34,6 @@
        "tog-extendwatchlist": "Palawigin ang tala ng binabantayan upang maipakita ang lahat ng mga pagbabago, hindi lamang ang pinakahuling pagbabago",
        "tog-usenewrc": "Ipangkat ang mga pagbabago ayon sa pahina sa mga huling pagbabago at tala ng binabantayan",
        "tog-numberheadings": "Automatikong bilangin ang mga pamagat",
-       "tog-showtoolbar": "Ipakita ang ''toolbar'' ng pagbabago",
        "tog-editondblclick": "Magbago ng mga pahina sa dalawahang pagpindot",
        "tog-editsectiononrightclick": "Payagan ang mga pagbabagong panseksyon sa pakanang pagpindot ng mga panseksyong pamagat",
        "tog-watchcreations": "Idagdag sa aking tala ng mga binabantayan ang mga pahinang nilikha ko at mga talaksang ikinarga kong paitaas",
index d443304..d47975f 100644 (file)
        "tog-extendwatchlist": "İzleme listesini sadece en son değil, tüm değişiklikleri gösterecek şekilde genişlet",
        "tog-usenewrc": "Son değişiklikler ve izleme listesindeki değişiklikleri sayfalara göre gruplandır",
        "tog-numberheadings": "Başlıkları otomatik numaralandır",
-       "tog-showtoolbar": "Düzenleme araç çubuğunu göster",
        "tog-editondblclick": "Çift tıklandığında sayfaları düzenle",
        "tog-editsectiononrightclick": "Bölüm başlıklarına sağ tıklayarak bölüm düzenlemeyi etkinleştir",
        "tog-watchcreations": "Oluşturduğum sayfaları ve yüklediğim dosyaları izleme listeme ekle",
index 7068765..10ce72f 100644 (file)
@@ -13,7 +13,6 @@
        "tog-extendwatchlist": "Ndlandlamuxa ku komba kucinca hikwako, handle ka ku cinca ka sweswinyana ntsena",
        "tog-usenewrc": "Tirhisa kucinca ka sweswinyana loku hlutiweke (yitirhisa ntsalo wa Java)",
        "tog-numberheadings": "Tinhloko-mhaka leti hleriweke",
-       "tog-showtoolbar": "Komba xiangarhi xo cinca (yitirhisa ntsalo wa Java)",
        "tog-editondblclick": "Lulamisa matluka hi ku thlava kambirhi (yitirhisa ntsalo wa Java)",
        "tog-editsectiononrightclick": "Pfula ku lulamisa hi swiyenge hi ku thlava nhlokomhaka ya xiyenge (yitirhisa ntsalo wa Java)",
        "tog-watchcreations": "Hoxa matluka lawa ndzi matumbuluxaka eka leswi ndziswi languteke",
index 6ea99c2..46fb9e0 100644 (file)
@@ -40,7 +40,6 @@
        "tog-extendwatchlist": "Соңгыларын гына түгел, ә барлык үзгәртүләрне эченә алган, киңәйтелгән күзәтү исемлеге",
        "tog-usenewrc": "Соңгы үзгәртүләрдә һәм күзәтү исемлегендә үзгәрешләрне төркемләргә",
        "tog-numberheadings": "Атамалар автомат рәвештә номерлансын",
-       "tog-showtoolbar": "Үзгәртү вакытында коралларның өске панеле күрсәтелсен",
        "tog-editondblclick": "Битләргә ике чирттерү белән үзгәртү бите ачылсын",
        "tog-editsectiononrightclick": "Бүлек исеменә тычканның уң чирттермәсе белән төрткәч үзгәртү",
        "tog-watchcreations": "Мин төзегән битләр һәм йөкләгән файллар күзәтү исемлегемә өстәлсен",
index cab0be7..c7e349c 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Soñğıların ğına tügel, ä barlıq üzgärtülärne eçenä alğan, kiñäytelgän küzätü isemlege",
        "tog-usenewrc": "Yaxşırtılğan soñğı üzgärtülär isemlege qullanılsın (JavaScript kiräk)",
        "tog-numberheadings": "Atamalar avtomat räweştä nomerlansın",
-       "tog-showtoolbar": "Üzgärtü waqıtında qorallarnıñ öske panele kürsätelsen (JavaScript kiräk)",
        "tog-editondblclick": "Bitlärgä ike çirtterü belän üzgärtü bite açılsın (JavaScript kiräk)",
        "tog-editsectiononrightclick": "Bülek isemenä tıçqannıñ uñ çirttermäse belän törtkäç üzgärtü bite açılsın (JavaScript kiräk)",
        "tog-watchcreations": "Tözegän bitlärem küzätü isemlegemä östälsen",
index 712a68b..8f0dee5 100644 (file)
@@ -19,7 +19,6 @@
        "tog-newpageshidepatrolled": "Чаа арыннарның даңзындан истээн арыннарны чажырары",
        "tog-usenewrc": "Чаа өскерлиишкиннерниң өөделеттинген даңзызын ажыглаар (JavaScript херек)",
        "tog-numberheadings": "Эгелерин авто-санаар",
-       "tog-showtoolbar": "Өскертир херекселдерни көргүзер (JavaScript)",
        "tog-editondblclick": "Арынны өскертирде ийи катап базар (JavaScript)",
        "tog-watchcreations": "Мээң чаяан арыннарымны хайгаарал даңзымче немээри.",
        "tog-watchdefault": "Мээң өскерткен арыннарымны хайгаарал даңзымче немээри.",
index 52519e5..a20b490 100644 (file)
@@ -24,7 +24,6 @@
        "tog-extendwatchlist": "Чаклан списокын вань тупатонъёсты возьматыны (озьытэк берпуметӥоссэс гинэ)",
        "tog-usenewrc": "Выль тупатонъёслэсь списоксэс умояллям сямен возьматыны (JavsScript кулэ)",
        "tog-numberheadings": "Заголовокъёсты автоматически нумеровать карыны",
-       "tog-showtoolbar": "Тупатон тӥрлыкъёслэн панельзэс возьматыны",
        "tog-editondblclick": "Бамъёсты шырлэсь зӥбонзэ кык пол зӥбыса тупатыны (JavaScript кулэ)",
        "tog-editsectiononrightclick": "Cекциолэсь заголовок вылазы шырлэн бур кнопкаеныз зӥбыса тупатонзэс лэзьыны (JavaScript кулэ)",
        "tog-watchcreations": "Мынэсьтым кылдытэм бамъёсме но ӝуткам файлъёсме чаклан списокам пыртыны",
index 15bf314..2107474 100644 (file)
@@ -26,7 +26,6 @@
        "tog-extendwatchlist": "كۆزىتىش تىزىملىكىدە يېقىنقى ئۆزگەرتىشنىلا كۆرسەتمەي بەلكى ھەممە ئۆزگەرتىشنى كۆرسىتىش",
        "tog-usenewrc": "يېقىنقى ئۆزگەرتىش ۋە كۆزەت تىزىملىلىگىدىكى بەتلەر ئۆزگىرىشىگە ئاساسەن گۇرۇپپىلاش",
        "tog-numberheadings": "ماۋزۇغا ئۆزلۈكىدىن تەرتىپ نومۇرى قوش",
-       "tog-showtoolbar": "تەھرىر قورال بالداقنى كۆرسەت",
        "tog-editondblclick": "قوش چەككەندە بەت تەھرىرلە",
        "tog-editsectiononrightclick": "تېمىنى ئوڭ چېكىپ ئابزاس تەھرىرلەشكە يول قوي",
        "tog-watchcreations": "مەن قۇرغان بەت ۋە يۈكلىگەن ھۆججەتلەرنى كۆزەت تىزىملىكىمگە قوش",
index 7e23a0b..8629986 100644 (file)
@@ -88,7 +88,6 @@
        "tog-extendwatchlist": "Розгорнути список спостереження, щоб показати всі зміни, а не лише останні",
        "tog-usenewrc": "Групувати редагування на сторінках останніх змін та списку спостереження",
        "tog-numberheadings": "Автоматично нумерувати заголовки",
-       "tog-showtoolbar": "Показувати панель інструментів",
        "tog-editondblclick": "Перейти в режим редагування сторінки подвійним клацанням мишки",
        "tog-editsectiononrightclick": "Перейти в режим редагування розділу клацанням правою кнопкою мишки на назву розділу",
        "tog-watchcreations": "Додавати створені мною сторінки і завантажені файли до мого списку спостереження",
        "subject-preview": "Попередній перегляд теми:",
        "previewerrortext": "Сталася помилка при спробі попереднього перегляду Ваших змін.",
        "blockedtitle": "Користувача заблоковано",
+       "blocked-email-user": "<strong>Для вашого імені користувача заблокована можливість надсилання електронної пошти. Але ви ще можете редагувати інші сторінки у цій вікі.</strong> Всі подробиці блокування ви можете побачити на сторінці [[Special:MyContributions|внеску облікового запису]].\n\nБлокування виконав адміністратор $1.\n\nВказана наступна причина: $2.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Ціль блокування: $7\n* Ідентифікатор блокування: #$5",
+       "blockedtext-partial": "<strong>Для вашого імені користувача або IP-адреси заблокована можливість змінення  цієї сторінки. Але ви ще можете редагувати інші сторінки у цій вікі.</strong> Всі подробиці блокування ви можете побачити на сторінці [[Special:MyContributions|внеску облікового запису]].\n\nБлокування виконав адміністратор $1.\n\nВказана наступна причина: $2.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Ціль блокування: $7\n* Ідентифікатор блокування: #$5",
        "blockedtext": "<strong>Ваш обліковий запис або IP-адреса заблоковані.</strong>\n\nБлокування виконане адміністратором $1.\nПричина блокування: <em>$2</em>.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Діапазон блокування: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете використати функцію \"{{int:emailuser}}\", якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
        "autoblockedtext": "Ваша IP-адреса автоматично заблокована у зв'язку з тим, що вона раніше використовувалася кимось із користувачів, якого заблокував $1.\nПричина блокування блокування:\n\n:<em>$2</em>\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете скористатися функцією \"{{int:emailuser}}\", так як не маєте дійсної електронної пошти, зареєстрованої в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
        "systemblockedtext": "Ваше ім'я користувача або IP-адресу було автоматично заблоковано MediaWiki.\nВказана причина:\n\n:<em>$2</em>\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Ціль блокування: $7\n\nВаша поточна IP-адреса — $3.\nБудь ласка, додайте всі вказані подробиці до будь-яких запитів, які Ви будете робити.",
        "sp-contributions-logs": "журнали",
        "sp-contributions-talk": "обговорення",
        "sp-contributions-userrights": "управління правами {{GENDER:$1|користувача|користувачки}}",
-       "sp-contributions-blocked-notice": "Цей ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87 Ð½Ð°Ñ\80азÑ\96 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¸Ð¹. Ð\9eÑ\81Ñ\82аннÑ\96й Ð·Ð°Ð¿Ð¸Ñ\81 Ñ\83 Ð¶Ñ\83Ñ\80налÑ\96 Ð±Ð»Ð¾ÐºÑ\83ванÑ\8c Ñ\82акий:",
+       "sp-contributions-blocked-notice": "Цей ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87 Ð½Ð°Ñ\80азÑ\96 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¸Ð¹. Ð\9dижÑ\87е Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾ Ð¾Ñ\81Ñ\82аннÑ\96й Ð·Ð°Ð¿Ð¸Ñ\81 Ñ\83 Ð¶Ñ\83Ñ\80налÑ\96 Ð±Ð»Ð¾ÐºÑ\83ванÑ\8c:",
        "sp-contributions-blocked-notice-anon": "Доступ з цієї IP-адреси зараз заблокований.\nДалі наведено останній запис з журналу блокувань:",
        "sp-contributions-search": "Пошук внеску",
        "sp-contributions-username": "IP-адреса або ім'я користувача:",
        "ipb-disableusertalk": "Заборонити користувачеві редагувати свою сторінку обговорення під час блокування",
        "ipb-change-block": "Переблокувати користувача з цими налаштуваннями",
        "ipb-confirm": "Підтвердити блокування",
+       "ipb-sitewide": "У всій вікі",
+       "ipb-partial": "Частково",
+       "ipb-type-label": "Тип",
+       "ipb-pages-label": "Сторінки",
        "badipaddress": "IP-адреса записана в невірному форматі, або користувача з таким іменем не існує.",
        "blockipsuccesssub": "Блокування проведено",
        "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] заблоковано.<br />\nДив. [[Special:BlockList|список заблокованих IP-адрес]] для перегляду блокувань.",
        "createaccountblock": "створення облікових записів заблоковане",
        "emailblock": "листи заборонені",
        "blocklist-nousertalk": "не може редагувати свою сторінку обговорення",
+       "blocklist-editing": "редагування",
+       "blocklist-editing-sitewide": "редагування (у всій вікі)",
        "ipblocklist-empty": "Список блокувань порожній.",
        "ipblocklist-no-results": "Запрохані IP-адреса або ім'я користувача не заблоковані.",
        "blocklink": "заблокувати",
        "logentry-block-block": "$1 {{GENDER:$2|заблокував|заблокувала}} {{GENDER:$4|$3}} на термін $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|розблокував|розблокувала}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|переблокував|переблокувала}} {{GENDER:$4|$3}} на термін $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|заблокував|заблокувала}} {{GENDER:$4|$3}} від редагування {{PLURAL:$8||сторінок}} $7 на термін $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|змінив|змінила}} блокувальні налаштування для {{GENDER:$4|$3}}, заперечуючи зміни {{PLURAL:$8||сторінок}} $7 на термін $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|заблокував|заблокувала}} {{GENDER:$4|$3}} від нередагуючих дій на термін $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|змінив|змінила}} блокувальні налаштування для {{GENDER:$4|$3}} від нередагуючих дій на термін $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|заблокував}} {{GENDER:$4|$3}} строком на $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|змінив}} блокування для {{GENDER:$4|$3}} на період $5 $6",
        "logentry-import-upload": "$1 імпортува{{GENDER:$2|в|ла}} $3 через завантаження файлів",
        "mw-widgets-titleinput-description-redirect": "перенаправлення на $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Додати категорію...",
        "mw-widgets-usersmultiselect-placeholder": "Додати ще...",
+       "mw-widgets-titlesmultiselect-placeholder": "Додати ще...",
        "date-range-from": "Від дати:",
        "date-range-to": "До дати:",
        "sessionmanager-tie": "Не можна поєднувати кілька типів автентифікації запиту: $1.",
index c20392f..098a3be 100644 (file)
@@ -50,7 +50,6 @@
        "tog-extendwatchlist": "حالیہ ترین تبدیلیوں کی بجائے تمام تبدیلیاں دیکھنے کے لیے زیر نظر فہرست کو وسیع کریں",
        "tog-usenewrc": "حالیہ تبدیلیاں اور زیر نظر فہرست میں تبدیلیوں کو بلحاظ صفحہ گروہ بند کریں",
        "tog-numberheadings": "سرخیوں کو خودکار نمبر دیں",
-       "tog-showtoolbar": "آلات ترمیم دکھائیں",
        "tog-editondblclick": "دہرے کلک پر صفحات کی ترمیم کریں",
        "tog-editsectiononrightclick": "قطعہ کے عنوانات پر رائیٹ کلک کے ذریعے قطعہ کی ترمیم کاری فعال کریں",
        "tog-watchcreations": "میرے تخلیق کردہ صفحات اور اپلوڈ کردہ فائلوں کو میری زیر نظر فہرست میں شامل کریں",
index cf94891..b4ccf28 100644 (file)
@@ -25,7 +25,6 @@
        "tog-extendwatchlist": "Kengaytirilgan kuzatuv roʻyxati: faqat oxirgi paytdagi emas, barcha oʻzgarishlar koʻrsatiladi",
        "tog-usenewrc": "Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish",
        "tog-numberheadings": "Sarlavhalarni avtomatik raqamlash",
-       "tog-showtoolbar": "Tahrirlash asboblarini koʻrsatish",
        "tog-editondblclick": "Sichqonchaning chap tugmasini ikki marta bosib tahrirlashni boshlash",
        "tog-editsectiononrightclick": "Boʻlim sarlavhasiga sichqonchaning oʻng tugmasini bosib tahrirlashni boshlash",
        "tog-watchcreations": "Men yaratgan sahifalar va yuklagan fayllar kuzatuv roʻyxatimga qoʻshilsin",
index 830734a..cfcd32b 100644 (file)
@@ -34,7 +34,6 @@
        "tog-extendwatchlist": "Mostra tute łe modifeghe a i oservai spesałi, no soło l'ultima",
        "tog-usenewrc": "Ragrupa ƚe modifeghe par pàgina inte i ultemi canbiamenti e inte ƚe tegnùe d'òcio",
        "tog-numberheadings": "Numerasion automatega de i titołi de sesion",
-       "tog-showtoolbar": "Mostra ƚa bara de i strumenti de modifega",
        "tog-editondblclick": "Modifega de ƚe pàgine co dopio clic",
        "tog-editsectiononrightclick": "Modifega de ƚe sesion co clic dreto so'l tìtoƚo",
        "tog-watchcreations": "Xonta łe pàjine creae e i file cargai a łe tegnùe d'ocio",
index b55152f..f6682e1 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Levitagat kaclendnimikirjutez, miše nähta kaik toižetused.",
        "tog-usenewrc": "Kävutagat paremboitud tantoižed toižetused (pidab otta radho JavaScript)",
        "tog-numberheadings": "Nomeruida avtomatižikš pälkirjutesed",
-       "tog-showtoolbar": "Ozutada redaktiruindan panel'",
        "tog-editondblclick": "Redaktiruida lehtpoled kaksitadud plokul",
        "tog-editsectiononrightclick": "Redaktiruida sekcijad hiren oiktal plokul pälkirjutesele",
        "tog-watchcreations": "Ližata kaik minai sätud lehtpoled da failad minun kaclendkirjuteshe",
index b24dbfb..f4bb715 100644 (file)
        "tog-extendwatchlist": "Mở rộng danh sách theo dõi để hiển thị tất cả các thay đổi, chứ không chỉ các thay đổi gần đây",
        "tog-usenewrc": "Thu gọn các thay đổi theo trang trong thay đổi gần đây và danh sách theo dõi",
        "tog-numberheadings": "Tự động đánh số các đề mục",
-       "tog-showtoolbar": "Hiển thị thanh định dạng",
        "tog-editondblclick": "Nhấn đúp để sửa đổi trang",
-       "tog-editsectiononrightclick": "Bấm chuột phải vào đề mục để sửa đổi phần trang",
+       "tog-editsectiononrightclick": "Bấm chuột phải vào tên đề mục để sửa đổi đề mục đó",
        "tog-watchcreations": "Tự động theo dõi các trang tôi tạo và các tập tin tôi tải lên",
        "tog-watchdefault": "Tự động theo dõi các trang và tập tin tôi sửa",
        "tog-watchmoves": "Tự động theo dõi các trang và tập tin tôi di chuyển",
        "tog-watchdeletion": "Tự động theo dõi các trang và tập tin tôi xóa",
-       "tog-watchuploads": "Thêm các tập tin tải lên của tôi vào danh sách theo dõi của tôi",
+       "tog-watchuploads": "Thêm các tập tin tôi tải lên vào danh sách theo dõi của tôi",
        "tog-watchrollback": "Tự động theo dõi các trang tôi lùi sửa",
        "tog-minordefault": "Mặc định đánh dấu tất cả sửa đổi của tôi là sửa đổi nhỏ",
        "tog-previewontop": "Hiển thị phần xem trước nằm trên hộp sửa đổi",
        "tog-watchlisthidebots": "Ẩn các sửa đổi của robot khỏi danh sách theo dõi",
        "tog-watchlisthideminor": "Ẩn các sửa đổi nhỏ khỏi danh sách theo dõi",
        "tog-watchlisthideliu": "Ẩn sửa đổi của thành viên đã đăng nhập khỏi danh sách theo dõi",
-       "tog-watchlistreloadautomatically": "Tự động tải lại danh sách theo dõi khi nào bộ lọc được thay đổi (cần JavaScript)",
-       "tog-watchlistunwatchlinks": "Thêm nút ngừng theo dõi/theo dõi ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) trực tiếp vào trang theo dõi có thay đổi (cần JavaScript để bật/tắt)",
+       "tog-watchlistreloadautomatically": "Tự động tải lại danh sách theo dõi mỗi khi thay đổi bộ lọc (cần JavaScript)",
+       "tog-watchlistunwatchlinks": "Thêm nút ngừng theo dõi/theo dõi ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) vào ngay trang tôi theo dõi khi có thay đổi (cần JavaScript để dùng chức năng này)",
        "tog-watchlisthideanons": "Ẩn sửa đổi của người dùng vô danh khỏi danh sách theo dõi",
        "tog-watchlisthidepatrolled": "Ẩn sửa đổi đã tuần tra trong danh sách theo dõi",
        "tog-watchlisthidecategorization": "Ẩn việc xếp thể loại",
        "tog-ccmeonemails": "Gửi bản sao cho tôi khi gửi thư điện tử cho người khác",
-       "tog-diffonly": "Ẩn nội dung trang dưới phần so sánh phiên bản",
+       "tog-diffonly": "Không hiện nội dung trang ở phía dưới phần so sánh phiên bản",
        "tog-showhiddencats": "Hiển thị thể loại ẩn",
        "tog-norollbackdiff": "Bỏ qua bản so sánh sau khi lùi sửa",
        "tog-useeditwarning": "Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang",
-       "tog-prefershttps": "Luôn kết nối an toàn khi đã đăng nhập",
+       "tog-prefershttps": "Luôn sử dụng kết nối an toàn khi đã đăng nhập",
        "underline-always": "Luôn luôn",
        "underline-never": "Không bao giờ",
        "underline-default": "Mặc định của giao diện hoặc trình duyệt",
        "listingcontinuesabbrev": "(tiếp theo)",
        "index-category": "Trang được ghi chỉ mục",
        "noindex-category": "Trang không hiển thị trong bộ máy tìm kiếm",
-       "broken-file-category": "Trang nhúng tập tin không tồn tại",
+       "broken-file-category": "Trang có sử dụng tập tin không tồn tại",
        "about": "Giới thiệu",
        "article": "Trang nội dung",
        "newwindow": "(mở cửa sổ mới)",
        "morenotlisted": "Danh sách này có thể không đầy đủ.",
        "mypage": "Trang cá nhân",
        "mytalk": "Tin nhắn",
-       "anontalk": "Thảo luận",
+       "anontalk": "Tin nhắn",
        "navigation": "Xem nhanh",
        "and": "&#32;và",
        "faq": "Câu hỏi thường gặp",
        "tagline": "Từ {{SITENAME}}",
        "help": "Trợ giúp",
        "search": "Tìm kiếm",
-       "search-ignored-headings": " #<!-- để yên dòng này --> <pre>\n# Công cụ tìm kiếm sẽ bỏ qua các đề mục này.\n# Các thay đổi trên danh sách này sẽ có hiệu lực một khi trang có đề mục được đưa vào chỉ mục.\n# Để bắt trang phải được đưa lại vào chỉ mục, thực hiện một sửa đổi vô hiệu quả.\n# Cú pháp:\n#   * Tất cả mọi thứ từ ký hiệu “#” để cuối dòng là chú thích.\n#   * Mỗi dòng có nội dung là đúng tên đề mục để bỏ qua, phân biệt chữ hoa/thường.\nTham khảo\nChú thích\nLiên kết ngoài\nXem thêm\nĐọc thêm\n #</pre> <!-- để yên dòng này -->",
+       "search-ignored-headings": " #<!-- để yên dòng này --> <pre>\n# Công cụ tìm kiếm sẽ bỏ qua các đề mục này.\n# Các thay đổi trong danh sách này sẽ có hiệu lực ngay khi trang chứa đề mục được đưa vào chỉ mục.\n# Để bắt buộc trang phải được đưa trở lại vào chỉ mục, hãy thực hiện một sửa đổi rỗng.\n# Cú pháp:\n#   * Tất cả mọi thứ từ ký hiệu “#” đến cuối dòng là chú thích.\n#   * Mỗi dòng có nội dung là bản sao của tên đề mục cần bỏ qua, phân biệt chữ hoa/thường.\nTham khảo\nChú thích\nLiên kết ngoài\nXem thêm\nĐọc thêm\n #</pre> <!-- để yên dòng này -->",
        "searchbutton": "Tìm kiếm",
        "go": "Xem",
        "searcharticle": "Xem",
        "specialpage": "Trang đặc biệt",
        "personaltools": "Công cụ cá nhân",
        "talk": "Thảo luận",
-       "views": "Các hiển thị",
+       "views": "Giao diện",
        "toolbox": "Công cụ",
        "tool-link-userrights": "Thay đổi nhóm {{GENDER:$1}}người dùng",
        "tool-link-userrights-readonly": "Xem {{GENDER:$1}}nhóm người dùng",
        "tool-link-emailuser": "Gửi thư cho {{GENDER:$1}}người dùng này",
        "imagepage": "Xem trang tập tin",
-       "mediawikipage": "Thông điệp giao diện",
+       "mediawikipage": "Xem thông điệp giao diện",
        "templatepage": "Xem trang bản mẫu",
        "viewhelppage": "Xem trang trợ giúp",
        "categorypage": "Xem trang thể loại",
        "viewtalkpage": "Xem trang thảo luận",
-       "otherlanguages": "Trong ngôn ngữ khác",
+       "otherlanguages": "Ngôn ngữ khác",
        "redirectedfrom": "(đổi hướng từ $1)",
        "redirectpagesub": "Trang đổi hướng",
        "redirectto": "Đổi hướng đến:",
        "badaccess-group0": "Bạn không được phép thực hiện thao tác này.",
        "badaccess-groups": "Chỉ những thành viên trong {{PLURAL:$2|nhóm|các nhóm}} $1 mới được thực hiện thao tác này.",
        "versionrequired": "Cần phiên bản $1 của MediaWiki",
-       "versionrequiredtext": "Cần phiên bản $1 của MediaWiki để sử dụng trang này. Xem [[Special:Version|trang phiên bản]].",
+       "versionrequiredtext": "Cần phiên bản $1 của MediaWiki để sử dụng trang này. \nXem [[Special:Version|phiên bản hiện hành]].",
        "ok": "OK",
        "pagetitle": "$1 – {{SITENAME}}",
        "retrievedfrom": "Lấy từ “$1”",
        "youhavenewmessages": "Bạn có $1 ($2).",
-       "youhavenewmessagesfromusers": "Bạn có $1 từ {{PLURAL:$3|người dùng khác|$3 người dùng}} ($2).",
+       "youhavenewmessagesfromusers": "Bạn có $1 từ {{PLURAL:$3|một người dùng|$3 người dùng}} ($2).",
        "youhavenewmessagesmanyusers": "Bạn có $1 từ nhiều người dùng ($2).",
        "newmessageslinkplural": "{{PLURAL:$1}}tin nhắn mới",
        "newmessagesdifflinkplural": "{{PLURAL:$1|thay đổi|999=các thay đổi}} gần đây",
        "confirmable-confirm": "{{GENDER:$1}}Bạn chắc chứ?",
        "confirmable-yes": "Có",
        "confirmable-no": "Không",
-       "thisisdeleted": "Xem hay phục hồi $1 ?",
+       "thisisdeleted": "Xem hay phục hồi $1?",
        "viewdeleted": "Xem $1?",
        "restorelink": "{{PLURAL:$1|một|$1}} sửa đổi đã xóa",
-       "feedlinks": "Nạp:",
+       "feedlinks": "Nguồn cấp dữ liệu:",
        "feed-invalid": "Định dạng nguồn cấp dữ liệu không hợp lệ.",
        "feed-unavailable": "Nguồn cấp dữ liệu không có sẵn tại đây",
        "site-rss-feed": "Nguồn cấp RSS của $1",
        "nosuchaction": "Không có tác vụ này",
        "nosuchactiontext": "Wiki không hiểu được tác vụ được yêu cầu trong địa chỉ URL.\nCó thể bạn đã gõ nhầm địa chỉ URL, hoặc nhấn vào một liên kết sai.\nNó cũng có thể là dấu hiệu của một lỗi trong phần mềm mà {{SITENAME}} sử dụng.",
        "nosuchspecialpage": "Không có trang đặc biệt nào có tên này",
-       "nospecialpagetext": "<strong>Bạn đã đi đến một liên kết trang đặc biệt không tồn tại.</strong>\n\nCó danh sách trang đặc biệt tại [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Bạn đã đi đến một liên kết trang đặc biệt không tồn tại.</strong>\n\nDanh sách trang đặc biệt có thể xem tại [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Lỗi",
        "databaseerror": "Lỗi cơ sở dữ liệu",
        "databaseerror-text": "Xuất hiện lỗi truy vấn cơ sở dữ liệu.\nĐiều này có thể xảy ra do một lỗi phần mềm.",
        "databaseerror-query": "Truy vấn: $1",
        "databaseerror-function": "Hàm: $1",
        "databaseerror-error": "Lỗi: $1",
-       "transaction-duration-limit-exceeded": "Để tránh việc tăng độ trễ sao chép quá mức, giao dịch này bị hủy bỏ vì thời gian ghi ($1) vượt quá giới hạn là $2 giây.\nNếu bạn muốn thay đổi nhiều mục cùng lúc, hãy thử thực hiện nhiều tác vụ nhỏ hơn thay thế.",
+       "transaction-duration-limit-exceeded": "Để tránh việc tăng độ trễ sao chép quá mức, giao dịch này bị hủy bỏ vì thời gian ghi ($1) vượt quá giới hạn là $2 giây.\nNếu bạn muốn thay đổi nhiều mục cùng lúc, hãy thay bằng nhiều tác vụ nhỏ hơn.",
        "laggedslavemode": "Cảnh báo: Trang có thể chưa được cập nhật.",
        "readonly": "Cơ sở dữ liệu bị khóa",
        "enterlockreason": "Nêu lý do khóa, cùng với thời hạn khóa",
        "nonwrite-api-promise-error": "Đầu đề HTTP “Promise-Non-Write-API-Action” được gửi nhưng yêu cầu là cho mô đun ghi của API.",
        "internalerror": "Lỗi nội bộ",
        "internalerror_info": "Lỗi nội bộ: $1",
-       "internalerror-fatal-exception": "Ngoại lệ chí tử loại “$1”",
+       "internalerror-fatal-exception": "Lỗi chí tử loại “$1”",
        "filecopyerror": "Không thể chép tập tin “$1” đến “$2”.",
        "filerenameerror": "Không thể đổi tên tập tin “$1” thành “$2”.",
        "filedeleteerror": "Không thể xóa tập tin “$1”.",
-       "directorycreateerror": "Không thể tạo được danh mục “$1”.",
+       "directorycreateerror": "Không thể tạo được thư mục “$1”.",
        "directoryreadonlyerror": "Thư mục “$1” là chỉ-đọc.",
        "directorynotreadableerror": "Không đọc được thư mục “$1”.",
        "filenotfound": "Không tìm thấy tập tin “$1”.",
        "cannotdelete": "Không thể xóa trang hay tập tin “$1”. Có thể nó đã bị ai đó xóa rồi.",
        "cannotdelete-title": "Không thể xóa trang “$1”",
        "delete-hook-aborted": "Một phần bổ trợ phần mềm đã bỏ qua việc xóa này.\nKhông có lý do nào được đưa ra.",
-       "no-null-revision": "Không thể tạo phiên bản không nội dung mới cho trang “$1”",
+       "no-null-revision": "Không thể tạo phiên bản trống mới cho trang “$1”",
        "badtitle": "Tựa trang sai",
        "badtitletext": "Tựa trang yêu cầu không đúng, rỗng, hoặc là một liên kết ngôn ngữ hoặc liên kết wiki sai. Nó có thể chứa một hoặc nhiều ký tự mà tựa trang không thể sử dụng.",
        "title-invalid-empty": "Tiêu đề trang được yêu cầu rỗng hoặc chỉ chứa tên của một không gian tên.",
        "title-invalid-characters": "Tiêu đề trang đã yêu cầu chứa ký tự không hợp lệ: “$1”.",
        "title-invalid-relative": "Tiêu đề có đường dẫn tương đối. Tiêu đề trang tương đối (./, ../) là không hợp lệ, bởi chúng thường sẽ không thể đến được khi được xử lý bởi trình duyệt của người dùng.",
        "title-invalid-magic-tilde": "Tiêu đề trang đã yêu cầu chứa dãy dấu ngã không hợp lệ (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "Tiêu đề trang đã yêu cầu quá dài. Tiêu đề phải ngắn hơn $1 byte theo mã hóa UTF-8.",
-       "title-invalid-leading-colon": "Tiêu đề trang đã yêu cầu chứa dấu hai chấm ở đầu là không hợp lệ.",
-       "perfcached": "Dữ liệu sau được lấy từ bộ nhớ đệm và có thể đã lỗi thời. Tối đa có sẵn {{PLURAL:$1|một kết quả|$1 kết quả}} trong bộ nhớ đệm.",
+       "title-invalid-too-long": "Tiêu đề trang được yêu cầu quá dài. Tiêu đề phải ngắn hơn $1 byte theo mã hóa UTF-8.",
+       "title-invalid-leading-colon": "Tiêu đề trang được yêu cầu chứa dấu hai chấm ở đầu là không hợp lệ.",
+       "perfcached": "Dữ liệu sau được lấy từ vùng nhớ đệm và có thể đã lỗi thời. Tối đa có sẵn {{PLURAL:$1|một kết quả|$1 kết quả}} trong vùng nhớ đệm.",
        "perfcachedts": "Dữ liệu dưới đây được đưa vào vùng nhớ đệm và được cập nhật lần cuối lúc $1. Tối đa có sẵn {{PLURAL:$4|một kết quả|$4 kết quả}} trong vùng nhớ đệm.",
        "querypage-no-updates": "Việc cập nhật trang này hiện đã bị tắt. Dữ liệu ở đây có thể bị lỗi thời.",
        "viewsource": "Xem mã nguồn",
        "prefixindex": "Tất cả các trang trùng với tiền tố",
        "prefixindex-namespace": "Tất cả các trang trùng với tiền tố (không gian tên $1)",
        "prefixindex-submit": "Xem",
-       "prefixindex-strip": "Ẩn tiền tố trong danh sách",
+       "prefixindex-strip": "Ẩn tiền tố trong kết quả",
        "shortpages": "Trang ngắn nhất",
        "longpages": "Trang dài nhất",
        "deadendpages": "Trang đường cùng",
index 60d1098..4df9726 100644 (file)
@@ -22,7 +22,6 @@
        "tog-extendwatchlist": "Stäänükön galädalisedi ad jonön votükamis tefik valik, e no te nulikünos",
        "tog-usenewrc": "Grupön votükamis pado in votukäms nulik e galädalised",
        "tog-numberheadings": "Givön itjäfidiko nümis dilädatiädes",
-       "tog-showtoolbar": "Jonön redakamastumemi",
        "tog-editondblclick": "Dälön redakön padis pö drän telik mugaknopa",
        "tog-editsectiononrightclick": "Dälön redakami diläda me klik mugaknopa detik su dilädatiäds",
        "tog-watchcreations": "Läükön padis fa ob pejafölis e ragivis fa ob pelöpükölis lä galädalised obik",
index 0c2b2dd..8d48b01 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Laendaq perräkaemisnimekirjä, et nätäq kõiki muutmiisi, mitte õnnõ kõgõ perämäidsi",
        "tog-usenewrc": "Sordiq viimädseq muutmisõq ja muutmisnimekirän leheküle perrä",
        "tog-numberheadings": "Päälkirjo automaatnummõrdus",
-       "tog-showtoolbar": "Näütäq toimõndusõ tüüriistaripa",
        "tog-editondblclick": "Toimõndaq artikliid topõltklõpsu pääle",
        "tog-editsectiononrightclick": "Lupaq lõikõ toimõndaq hüäpoolidsõ klõpsutusõga lõigu päälkirä pääl",
        "tog-watchcreations": "Panõq muq luuduq leheq ja üleslaadiduq teedüstüq muq perräkaemisnimekirjä",
index fa6bb02..657031e 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "Ragrandi l' djivêye po mostrer tos les candjmints, nén seulmint les dierins",
        "tog-usenewrc": "Rashonner par pådje dins les dierins candjmints et l' djivêye des shuvous (i fåt JavaScript)",
        "tog-numberheadings": "Limerotaedje otomatike des tites",
-       "tog-showtoolbar": "Mostrer l' bår d' usteyes e môde candjmint",
        "tog-editondblclick": "Candjî les pådjes avou on dobe-clitch",
        "tog-editsectiononrightclick": "Candjî les seccions avou on dobe-clitch so les tites",
        "tog-watchcreations": "Radjouter a m' djivêye des shuvous les pådjes ki dj' askepeye et les fitchîs ki dj' eberwete",
index 6ebb34a..7662af2 100644 (file)
@@ -23,7 +23,6 @@
        "tog-extendwatchlist": "Padako-a an angay timan-an agod makita an tanan nga kabag-ohan, diri la an gibag-ohi",
        "tog-usenewrc": "Grupo nga mga pagbag-o kada pakli ha kababag-o pala ngan mga barantayon nga talaan",
        "tog-numberheadings": "Auto-nga-ihap nga mga pagngaran",
-       "tog-showtoolbar": "Igpakita an edit toolbar",
        "tog-editondblclick": "Igliwat in mga pakli ha doble nga klik",
        "tog-editsectiononrightclick": "Tugoti in pagliwat hin seksyon ha pag klik-ha-tuo dida hin mga ngaran o titulo hin seksyon",
        "tog-watchcreations": "Igdugang in mga pakli nga akon ginhimo ngan mga paypay nga akon ginkarga ngadto han akon angay timan-an",
index f9dc81b..159e614 100644 (file)
@@ -20,7 +20,6 @@
        "tog-extendwatchlist": "Yatalal limu toppte bi ngir muy wone bépp coppite, déet yu mujj yi rekk",
        "tog-usenewrc": "Jëfandikool coppite yu mujj yees gënal (laaj na JavaScript)",
        "tog-numberheadings": "Koj yi jox lim seen bopp",
-       "tog-showtoolbar": "Wone bànqaasu njëlu coppite bi (JavaScript)",
        "tog-editondblclick": "Cuq cuqaatal ngir soppi aw xët (JavaScript)",
        "tog-editsectiononrightclick": "Soppi ab xaaj cib cuqub ndeyjoor ci kojam  (JavaScript)",
        "tog-watchcreations": "Yokk ci sama limu toppte xët yi may sos",
index 2047dbf..b5875e5 100644 (file)
@@ -34,7 +34,6 @@
        "tog-extendwatchlist": "扩展关注表来显示所有改动,弗光是最近个",
        "tog-usenewrc": "使用折叠版个近段辰光个改动搭关注表",
        "tog-numberheadings": "標題自動編號",
-       "tog-showtoolbar": "显示编辑工具条",
        "tog-editondblclick": "双击编辑页面",
        "tog-editsectiononrightclick": "右击段落标题编辑段落",
        "tog-watchcreations": "拿我建个页面搭我传个文件加到我个关注表里去",
index 5709fc5..fa49d4f 100644 (file)
@@ -15,7 +15,6 @@
        "tog-extendwatchlist": "Һанц отхн биш хамг ясврта өргн оврлң",
        "tog-usenewrc": "Ясрулсн шидрә сольлһна сеткүл олзлх (JavaScript кергтә)",
        "tog-numberheadings": "Эврәр һарцг тойглх",
-       "tog-showtoolbar": "Ясврин зевсг үзүлх",
        "tog-editondblclick": "Давхр шавдлһар халх ясх",
        "tog-editsectiononrightclick": "Һарцг барун шавдсар салвр чиклх",
        "tog-watchcreations": "Мини бүтәсн халхс болн орулсн боомгуд оврлңд немх",
index 0dd1dcf..c891977 100644 (file)
@@ -29,7 +29,6 @@
        "tog-extendwatchlist": "გოფაჩი ოთოჸუჯე ერკებული არძო თირაფეფიშ ოძირაფალო, ამარდეიან თირაფეფიშ მეკოროცხილო",
        "tog-usenewrc": "ბოლო ცვლილებების და კონტროლის სიის ცვლილებების დაჯგუფება",
        "tog-numberheadings": "ავტომატურო დონომერე დუდჯოხოეფი",
-       "tog-showtoolbar": "რედაქტირაფაშ ხეჭკუდეფიშ ძირაფა",
        "tog-editondblclick": "ხასჷლეფიშ რედაქტირაფა ჟირმანგი გეწკანტაფათ",
        "tog-editsectiononrightclick": "ჩართი სექციაშ რედაქტირაფა სექციაშ ჯოხოშა მარძგვან გეწკანტაფათ",
        "tog-watchcreations": "ქიგუძინი ჩქიმ კონტროლიშ ერკბულს ჩქიმ დუნარცხუა ხასჷლეფი დო ეხარგელი ფაილეფი",
index 4d21f32..85abd85 100644 (file)
@@ -30,7 +30,6 @@
        "tog-extendwatchlist": "פארברייטערן די אויפפאסן ליסטע צו צייגן אלע פאסנדע ענדערונגען (אנדערשט: בלויז די לעצטע ענדערונג פון יעדן בלאט)",
        "tog-usenewrc": "גרופירן ענדערונגען לויטן בלאט אין \"לעצטע ענדערונגען\" און אויפֿפאסן ליסטע",
        "tog-numberheadings": "נומערירן קעפּלעך אויטאָמאַטיש",
-       "tog-showtoolbar": "ווײַזן רעדאקטירן געצייג-שטאנג",
        "tog-editondblclick": "רעדאַקטירן בלעטער דורך טאָפּל־קליק",
        "tog-editsectiononrightclick": "באמעגלעכן אפטייל רעדאקטירן דורכן רעכטס־קליקן אויף אפטייל קעפלעך",
        "tog-watchcreations": "צולייגן בלעטער וואס איך באשאף און טעקעס וואס איך לאד ארויף צו מיין אכטונג ליסטע",
index 7ad682b..cda22a2 100644 (file)
@@ -21,7 +21,6 @@
        "tog-extendwatchlist": "Ìfẹ̀ àmójútó láti ṣ'àfihàn gbogbo àtúnṣe, kìí ṣe tuntun nìkan",
        "tog-usenewrc": "Ìtò àwọn àtúnṣe gẹ́gẹ́bí ojúewé nínú àwọn àtúnṣe tuntun àti ìmújútó",
        "tog-numberheadings": "Àwọn àkọlé nọmba-araẹni",
-       "tog-showtoolbar": "Ìfihàn pẹpẹ irinṣẹ́ àtúnṣe",
        "tog-editondblclick": "Ṣ'àtúnṣe àwọn ojúewé ní kíkàn lẹ́mẹjì",
        "tog-editsectiononrightclick": "Ìgbàláyè àtúnṣe abala nípa klííkì ọ̀tún lórí àkọlé abala",
        "tog-watchcreations": "Ṣ'àfikún ojúewé tí mo dá àti àwọn fáìlì tí mo rùsókè mọ́ ìmójútó mi",
index 7f82f70..40d8a42 100644 (file)
        "tog-extendwatchlist": "展開監視清單去顯示全部更改,唔係淨係最新嘅",
        "tog-usenewrc": "最近修改同監視清單顯示群組修改",
        "tog-numberheadings": "標題自動編號",
-       "tog-showtoolbar": "顯示修改工具列",
        "tog-editondblclick": "撳兩下改嘢",
        "tog-editsectiononrightclick": "可以撳右掣更改個別段落",
        "tog-watchcreations": "將我開嘅頁同上傳嘅檔案加入監視清單",
        "tog-watchdefault": "將我修改嘅頁同檔案加入監視清單",
        "tog-watchmoves": "將我移動嘅頁同檔案加入監視清單",
        "tog-watchdeletion": "將我刪除嘅頁同檔案加入監視清單",
-       "tog-watchuploads": "加入我監視清單入面上載嘅檔案",
+       "tog-watchuploads": "加我上載嘅檔去監視清單度",
        "tog-watchrollback": "將我反轉過嘅頁加落監視清單",
        "tog-minordefault": "預設全部編輯做細修改",
        "tog-previewontop": "喺修改欄上邊顯示預覽",
        "listingcontinuesabbrev": "續",
        "index-category": "做咗索引嘅版",
        "noindex-category": "未做索引嘅版",
-       "broken-file-category": "æ\9c\89失æ\95\88æ\96\87件é\8f\88æ\8e¥嘅版",
+       "broken-file-category": "æ\96\87件é\8f\88æ\8e¥å£\9eå\92\97嘅版",
        "about": "關於",
        "article": "內容頁",
        "newwindow": "(響新視窗度打開)",
        "trackingcategories-name": "訊息名",
        "trackingcategories-desc": "分類收錄標準",
        "post-expand-template-inclusion-category-desc": "由於呢篇頁面嘥士喺擴展之前,已經超出咗<code>$wgMaxArticleSize</code>限制,所以好多模都擴展唔到。",
+       "broken-file-category-desc": "呢版有文件鏈接壞咗(即係連去一個唔存在嘅文件)。",
        "trackingcategories-nodesc": "冇解說資料",
        "trackingcategories-disabled": "類停用咗",
        "mailnologin": "冇傳送地址",
index a26730f..3ee0aa8 100644 (file)
@@ -16,7 +16,6 @@
        "tog-extendwatchlist": "Uutebreide volglieste hebruuk'n om aolle wiezigieng'n te bekiek'n, en nie alleêne de laeste",
        "tog-usenewrc": "Uutebreide lèste wiezigiengen-pagina gebruken (JavaScript vereist)",
        "tog-numberheadings": "Koppn automaotisch nummern",
-       "tog-showtoolbar": "Bewerkiengswerkbalke weerheven (JavaScript vereist)",
        "tog-editondblclick": "Dubbelklikkn voe bewerkn (JavaScript vereist)",
        "tog-editsectiononrightclick": "Bewerken van deêlpahina's meulijk maeken mie een rechtermuusklik op een tussenkopje (JavaScript vereist)",
        "tog-watchcreations": "Pahina's die ak anmik automaotisch volhen",
index 7c64fcf..403ebbc 100644 (file)
@@ -19,7 +19,6 @@
        "tog-extendwatchlist": "ⵙⵙⵉⵔⵉⵡ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ ⴰⴼⴰⴷ ⴰⴷ ⵜⵙⴽⵏⴷ ⵉⵙⵏⵉⴼⵉⵍⵏ ⴰⴽⴽ ⵓⵔ ⴷ ⵖⴰⵙ ⵉⵎⴳⴳⵓⵔⴰ",
        "tog-usenewrc": "ⵙⵎⵓⵏ ⵉⵙⵏⴼⵍⵏ ⴷ ⵜⴰⵙⵏⴰ ⵏⵙⵏ ⴳ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴳⴳⵓⵔⴰ ⴷ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⵓⵔ",
        "tog-numberheadings": "ⴰⵙⵓⵟⵟⵏ ⴰⵡⵓⵔⵎⴰⵏ ⵏ ⵉⵣⵡⵍⴰⵏ",
-       "tog-showtoolbar": "ⵙⴽⵏ ⵜⴰⵙⵙⴼⵉⴼⵜ ⵏ ⵉⵎⴰⵙⵙⵏ ⵏ ⵓⵥⵔⴰⴳ",
        "tog-editondblclick": "ⵙⵏⴼⵍ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵙ ⵙⵉⵏ ⵉⴽⵍⵉⴽⵉⵜⵏ",
        "tog-editsectiononrightclick": "ⵙⵙⵔⵎⴷ ⴰⵙⵏⴼⵍ ⵏ ⵜⵣⵓⵏⵉⵡⵉⵏ ⵙ ⵢⴰⵏ ⵓⴽⵍⵉⴽⵉ ⵖⴼ ⵉⵣⵡⵍⴰⵏ ⵏ ⵜⵣⵓⵏⵉ",
        "tog-watchcreations": "ⵔⵏⵓ ⵖⵔ ⵜⴳⵍⴰⵎⵜ ⵉⵏⵓ ⵏ ⵓⴹⴼⴼⵓⵔ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏⵏⴰ ⵙⴽⵔⵖ ⴷ ⵉⴼⵓⵢⵍⴰ ⵏⵏⴰ ⴷ ⵙⴽⵛⵎⵖ",
index c9ecdf1..342fa18 100644 (file)
        "tog-extendwatchlist": "扩展监视列表以显示所有更改,而不仅是最近的更改",
        "tog-usenewrc": "按页面合并最近更改和监视列表中的更改",
        "tog-numberheadings": "自动将标题编号",
-       "tog-showtoolbar": "显示编辑工具栏",
        "tog-editondblclick": "双击编辑页面",
        "tog-editsectiononrightclick": "启用右击段落标题编辑段落",
        "tog-watchcreations": "添加我创建的页面和我上传的文件至我的监视列表",
index 2145a3b..8d3717b 100644 (file)
        "tog-extendwatchlist": "展開監視清單顯示包含最近以外的所有變更",
        "tog-usenewrc": "依近期變更與監視清單的頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
-       "tog-showtoolbar": "顯示編輯工具列",
        "tog-editondblclick": "點選兩次以編輯頁面",
        "tog-editsectiononrightclick": "開啟滑鼠右鍵點選章節標題編輯",
        "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視清單",
        "subject-preview": "預覽主旨:",
        "previewerrortext": "嘗試預覽您的變更時發生錯誤。",
        "blockedtitle": "使用者已被封鎖",
+       "blocked-email-user": "<strong>您的使用者名稱已被禁止發送電子郵件,但您仍可在此 wiki 上編輯其它頁面。</strong>您可以在[[Special:MyContributions|帳號貢獻]]檢視完整的封鎖詳情。\n\n封鎖是由$1所執行。\n\n原因出自<em>$2</em>。\n\n*封鎖開始時間:$8\n*封鎖結束時間:$6\n*防止行為:$7\n*封鎖 ID #$5",
+       "blockedtext-partial": "<strong>您的使用者名稱或 IP 地址已被禁止更改此頁面,但您仍可在此 wiki 上編輯其它頁面。</strong>您可以在[[Special:MyContributions|帳號貢獻]]檢視完整的封鎖詳情。\n\n封鎖是由$1所執行。\n\n原因出自<em>$2</em>。\n\n*封鎖開始時間:$8\n*封鎖結束時間:$6\n*防止行為:$7\n*封鎖 ID #$5",
        "blockedtext": "<strong>您的使用者名稱或 IP 位址已被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"{{int:emailuser}}\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細訊息。",
        "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"{{int:emailuser}}\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細資料。",
        "systemblockedtext": "您的使用者名稱或 IP 位址已被 MediaWiki 自動封鎖,原因如下:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 被封鎖的使用者:$7\n\n您目前的 IP 位址為 $3。\n請在做詢問時附上以上資訊。",
        "confirmdeletetext": "您正要刪除一個頁面或圖片以及其所有歷史。請確定您要進行此操作,並了解其後果,同時您的行為符合[[{{MediaWiki:Policy-url}}|方針]]。",
        "actioncomplete": "操作完成",
        "actionfailed": "操作失敗",
-       "deletedtext": "已刪除 \"$1\"。\n請參考 $2 檢視最近的刪除記錄。",
+       "deletedtext": "已刪除「$1」。請參考$2檢視最近的刪除記錄。",
        "dellogpage": "刪除日誌",
        "dellogpagetext": "以下為最近刪除記錄的清單。",
        "deletionlog": "刪除日誌",
        "ipb-disableusertalk": "禁止使用者在封鎖期間編輯自己的對話頁面",
        "ipb-change-block": "使用現有設定重新封鎖使用者",
        "ipb-confirm": "確認封鎖",
+       "ipb-sitewide": "站台範圍",
+       "ipb-partial": "部分",
+       "ipb-type-label": "類型",
+       "ipb-pages-label": "頁面",
        "badipaddress": "無效的 IP 位址",
        "blockipsuccesssub": "封鎖成功",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] 已經被封鎖。<br />\n請參考 [[Special:BlockList|封鎖清單]] 以檢查目前的封鎖。",
        "createaccountblock": "帳號建立已停用",
        "emailblock": "停用電子郵件",
        "blocklist-nousertalk": "無法編輯自己的對話頁面",
+       "blocklist-editing": "編輯",
+       "blocklist-editing-sitewide": "編輯(站台範圍)",
        "ipblocklist-empty": "封鎖清單為空。",
        "ipblocklist-no-results": "請求的 IP 位址或使用者名稱尚未被封鎖。",
        "blocklink": "封鎖",
        "logentry-block-block": "$1{{GENDER:$2|已封鎖}}{{GENDER:$4|$3}}期限為$5$6",
        "logentry-block-unblock": "$1 {{GENDER:$2|已解除封鎖}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1{{GENDER:$2|已變更}}{{GENDER:$4|$3}}的封鎖設定期限為$5$6",
+       "logentry-partialblock-block": "$1{{GENDER:$2|已封鎖}}{{GENDER:$4|$3}}對於{{PLURAL:$8||頁面}}$7的編輯至期限$5 $6",
+       "logentry-partialblock-reblock": "$1{{GENDER:$2|已變更}}{{GENDER:$4|$3}}禁止編輯{{PLURAL:$8||頁面}}$7的封鎖設定為期限時間至$5 $6",
+       "logentry-non-editing-block-block": "$1{{GENDER:$2|已封鎖}}{{GENDER:$4|$3}}的編輯操作至其期限$5 $6",
+       "logentry-non-editing-block-reblock": "$1{{GENDER:$2|已變更}}{{GENDER:$4|$3}}禁止編輯操作的封鎖設定為期限至$5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|已封鎖}} {{GENDER:$4|$3}} 期限為 $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|已變更}} {{GENDER:$4|$3}} 的封鎖設定期限為 $5 $6",
        "logentry-import-upload": "$1 已由檔案上傳{{GENDER:$2|匯入}} $3",
        "mw-widgets-titleinput-description-redirect": "重新導向至 $1",
        "mw-widgets-categoryselector-add-category-placeholder": "加入分類...",
        "mw-widgets-usersmultiselect-placeholder": "加入更多...",
+       "mw-widgets-titlesmultiselect-placeholder": "加入更多...",
        "date-range-from": "開始日期:",
        "date-range-to": "結束日期:",
        "sessionmanager-tie": "無法合併多個請求認證類型:$1。",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "密碼不可以同於被列入黑名單的特定密碼",
        "passwordpolicies-policy-maximalpasswordlength": "密碼必須小於 $1 個{{PLURAL:$1|字元|字元}}長度",
        "passwordpolicies-policy-passwordcannotbepopular": "密碼不可以是{{PLURAL:$1|常用密碼內容|在清單中的編號 $1 常用密碼}}",
-       "easydeflate-invaliddeflate": "提供的內容未被正常的壓縮"
+       "easydeflate-invaliddeflate": "提供的內容未被正常的壓縮",
+       "unprotected-js": "基於安全因素,JavaScript 不能從未保護的頁面來載入。建立 JavaScript 請僅在 MediaWiki 的:命名空間或使用者子頁面"
 }
index 60be21c..3a3529a 100644 (file)
@@ -439,11 +439,3 @@ $specialPageAliases = [
  * Arabic trails too.
  */
 $linkTrail = '/^([a-zء-ي]+)(.*)$/sDu';
-
-$imageFiles = [
-       'button-bold'     => 'ar/button_bold.png',
-       'button-italic'   => 'ar/button_italic.png',
-       'button-link'     => 'ar/button_link.png',
-       'button-headline' => 'ar/button_headline.png',
-       'button-nowiki'   => 'ar/button_nowiki.png',
-];
index 00295fe..21bd60c 100644 (file)
@@ -239,9 +239,3 @@ $separatorTransformTable = [
 $minimumGroupingDigits = 2;
 
 $linkTrail = '/^([абвгґджзеёжзійклмнопрстуўфхцчшыьэюяćčłńśšŭźža-z]+)(.*)$/sDu';
-
-$imageFiles = [
-       'button-bold'     => 'be-tarask/button_bold.png',
-       'button-italic'   => 'be-tarask/button_italic.png',
-       'button-link'     => 'be-tarask/button_link.png',
-];
index 5227eba..d3167cc 100644 (file)
@@ -352,8 +352,3 @@ $bookstoreList = [
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
 $linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
-
-$imageFiles = [
-       'button-bold'     => 'de/button_bold.png',
-       'button-italic'   => 'de/button_italic.png',
-];
index 7a7370f..4c078a6 100644 (file)
@@ -531,23 +531,6 @@ $linkTrail = '/^([a-z]+)(.*)$/sD';
  */
 $linkPrefixCharset = 'a-zA-Z\\x{80}-\\x{10ffff}';
 
-/**
- * List of filenames for some ui images that can be overridden per language
- * basis if needed.
- */
-$imageFiles = [
-       'button-bold'     => 'en/button_bold.png',
-       'button-italic'   => 'en/button_italic.png',
-       'button-link'     => 'en/button_link.png',
-       'button-extlink'  => 'en/button_extlink.png',
-       'button-headline' => 'en/button_headline.png',
-       'button-image'    => 'en/button_image.png',
-       'button-media'    => 'en/button_media.png',
-       'button-nowiki'   => 'en/button_nowiki.png',
-       'button-sig'      => 'en/button_sig.png',
-       'button-hr'       => 'en/button_hr.png',
-];
-
 /**
  * A list of messages to preload for each request.
  * Here we add messages that are needed for a typical anonymous parser cache hit.
index bda468c..a78233f 100644 (file)
@@ -412,11 +412,3 @@ $dateFormats = [
 # Harakat are intentionally not included in the linkTrail. Their addition should
 # take place after enough tests.
 $linkTrail = "/^([ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیآأئؤة‌]+)(.*)$/sDu";
-
-$imageFiles = [
-       'button-bold'     => 'fa/button_bold.png',
-       'button-italic'   => 'fa/button_italic.png',
-       'button-link'     => 'fa/button_link.png',
-       'button-headline' => 'fa/button_headline.png',
-       'button-nowiki'   => 'fa/button_nowiki.png',
-];
index c96c94d..0687a42 100644 (file)
@@ -201,7 +201,3 @@ $magicWords = [
        'language'                  => [ '0', '#SHPROOCH:', '#SPROCH:', '#SPRACHE:', '#LANGUAGE:' ],
        'hiddencat'                 => [ '1', '__VERSHTOCHE_SAACHJRUPP__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ],
 ];
-
-$imageFiles = [
-       'button-italic'   => 'ksh/button_italic.png',
-];
index b513648..fbd8096 100644 (file)
@@ -425,10 +425,4 @@ $minimumGroupingDigits = 2;
 $fallback8bitEncoding = 'windows-1251';
 $linkPrefixExtension = false;
 
-$imageFiles = [
-       'button-bold'   => 'ru/button_bold.png',
-       'button-italic' => 'ru/button_italic.png',
-       'button-link'   => 'ru/button_link.png',
-];
-
 $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюя]+)(.*)$/sDu';
index 6219476..c786ce8 100644 (file)
@@ -1699,13 +1699,9 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
                        return false;
                }
 
-               if ( $db->insert( 'updatelog', [ 'ul_key' => $key ], __METHOD__, 'IGNORE' ) ) {
-                       return true;
-               } else {
-                       $this->output( $this->updatelogFailedMessage() . "\n" );
+               $db->insert( 'updatelog', [ 'ul_key' => $key ], __METHOD__, 'IGNORE' );
 
-                       return false;
-               }
+               return true;
        }
 
        /**
@@ -1718,16 +1714,6 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
                return "Update '{$key}' already logged as completed.";
        }
 
-       /**
-        * Message to show that the update log was unable to log the completion of this update
-        * @return string
-        */
-       protected function updatelogFailedMessage() {
-               $key = $this->getUpdateKey();
-
-               return "Unable to log update '{$key}' as completed.";
-       }
-
        /**
         * Do the actual work. All child classes will need to implement this.
         * Return true to log the update as done or false (usually on failure).
index a0177b1..0345ad6 100644 (file)
@@ -3697,7 +3697,6 @@ showredirs
 showreviewed
 showsizediff
 showtoc
-showtoolbar
 showunreviewed
 shtml
 si
index 7ff972e..54c1d38 100644 (file)
                                        "mw.visibleTimeout"
                                ]
                        },
-                       {
-                               "name": "Actions",
-                               "classes": ["mw.toolbar"]
-                       },
                        {
                                "name": "API",
                                "classes": ["mw.Api*", "mw.ForeignApi*"]
index f2a0007..f07bc55 100644 (file)
@@ -133,20 +133,14 @@ TEXT
                        usleep( $throttle * 1000 );
                }
 
-               if ( $dbw->insert(
+               $dbw->insert(
                        'updatelog',
                        [ 'ul_key' => 'populate category' ],
                        __METHOD__,
                        'IGNORE'
-               ) ) {
-                       $this->output( "Category population complete.\n" );
-
-                       return true;
-               } else {
-                       $this->output( "Could not insert category population row.\n" );
+               );
 
-                       return false;
-               }
+               return true;
        }
 }
 
index 9603830..86315fc 100644 (file)
@@ -1394,12 +1394,6 @@ return [
                'dependencies' => 'jquery.cookie',
                'targets' => [ 'desktop', 'mobile' ],
        ],
-       'mediawiki.toolbar' => [
-               'class' => ResourceLoaderEditToolbarModule::class,
-               'scripts' => 'resources/src/mediawiki.toolbar/toolbar.js',
-               'styles' => 'resources/src/mediawiki.toolbar/toolbar.less',
-               'dependencies' => 'jquery.textSelection',
-       ],
        'mediawiki.experiments' => [
                'scripts' => 'resources/src/mediawiki.experiments.js',
                'targets' => [ 'desktop', 'mobile' ],
@@ -2067,6 +2061,7 @@ return [
        ],
        'mediawiki.special.block' => [
                'scripts' => 'resources/src/mediawiki.special.block.js',
+               'styles' => 'resources/src/mediawiki.special.block.less',
                'dependencies' => [
                        'oojs-ui-core',
                        'oojs-ui.styles.icons-editing-core',
@@ -2077,6 +2072,7 @@ return [
                        'mediawiki.htmlform',
                        'moment',
                ],
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.changecredentials.js' => [
                'scripts' => 'resources/src/mediawiki.special.changecredentials.js',
@@ -2706,6 +2702,18 @@ return [
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.widgets.TitlesMultiselectWidget' => [
+               'scripts' => [
+                       'resources/src/mediawiki.widgets/mw.widgets.TitlesMultiselectWidget.js',
+               ],
+               'dependencies' => [
+                       'mediawiki.api',
+                       'oojs-ui-widgets',
+                       // FIXME: Needs TitleInputWidget only
+                       'mediawiki.widgets',
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.widgets.SearchInputWidget' => [
                'scripts' => [
                        'resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js',
index 5820b83..8a44dcc 100644 (file)
        mw.log.deprecate( window, '$j', $, 'Use $ or jQuery instead.' );
 
        // Process callbacks for Grade A that require modules.
-       // Plain ones were already processed by startup.js.
        queue = window.RLQ;
-       // Redefine publicly to capture any late arrivals
+       // Replace temporary RLQ implementation from startup.js with the
+       // final implementation that also processes callbacks that can
+       // require modules. It must also support late arrivals of
+       // plain callbacks. (T208093)
        window.RLQ = {
                push: function ( entry ) {
-                       mw.loader.using( entry[ 0 ], entry[ 1 ] );
+                       if ( typeof entry === 'function' ) {
+                               entry();
+                       } else {
+                               mw.loader.using( entry[ 0 ], entry[ 1 ] );
+                       }
                }
        };
        while ( queue[ 0 ] ) {
index 3d5bca2..516a79b 100644 (file)
@@ -9,10 +9,6 @@
                        list-style: none;
                }
        }
-
-       & > div {
-               margin-right: @margin-circle-result;
-       }
 }
 
 // Make more specific for the overrides
index 07e43c0..ea50841 100644 (file)
@@ -5,6 +5,7 @@
 .mw-rcfilters-ui-filterMenuOptionWidget {
        .mw-rcfilters-ui-filterMenuSectionOptionWidget ~ & {
                padding-left: 12 / @font-size-system-ui / @font-size-vector;
+               padding-right: 12 / @font-size-system-ui / @font-size-vector;
        }
 
        &.oo-ui-flaggedElement-muted {
index bf855be..61872bd 100644 (file)
@@ -6,17 +6,19 @@
        padding: 0 0.5em;
        .box-sizing( border-box );
 
-       &:not( :last-child ) {
+       &:not( :last-child ):not( .mw-rcfilters-ui-itemMenuOptionWidget-identifier-talk ) {
                border-bottom: 1px solid @colorGray14;
        }
 
        &-view-namespaces {
                border-top: 4px solid @colorGray12;
+       }
 
-               &:first-child,
-               &.mw-rcfilters-ui-itemMenuOptionWidget-identifier-subject + &.mw-rcfilters-ui-itemMenuOptionWidget-identifier-talk {
-                       border-top: 0;
-               }
+       // Don't show border for first namespace
+       &-view-default + &-view-namespaces,
+       // Hide for every 'talk' option
+       &-view-namespaces&.mw-rcfilters-ui-itemMenuOptionWidget-identifier-subject + &-view-namespaces.mw-rcfilters-ui-itemMenuOptionWidget-identifier-talk {
+               border-top: 0;
        }
 
        &:hover {
diff --git a/resources/src/mediawiki.skinning/images/external-link-icons.svg b/resources/src/mediawiki.skinning/images/external-link-icons.svg
deleted file mode 100644 (file)
index 6a67993..0000000
+++ /dev/null
@@ -1,697 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="13"
-   height="110"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.48.5 r10040"
-   sodipodi:docname="external link icons.svg">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="15.999999"
-     inkscape:cx="10.40536"
-     inkscape:cy="65.686256"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer5"
-     showgrid="true"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0"
-     inkscape:window-width="1283"
-     inkscape:window-height="711"
-     inkscape:window-x="1790"
-     inkscape:window-y="-6"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3246"
-       empspacing="4"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true"
-       originx="0px"
-       originy="-27.999997px" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="base"
-     style="display:none"
-     transform="translate(-505,-869.36218)">
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646"
-       width="13"
-       height="12.999996"
-       x="505"
-       y="885.36218" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646-4"
-       width="13"
-       height="12.999998"
-       x="505"
-       y="901.36218" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646-4-6"
-       width="13"
-       height="12.999996"
-       x="505"
-       y="917.36218"
-       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646-4-6-9"
-       width="13"
-       height="12.999996"
-       x="505"
-       y="933.36218" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646-4-6-6"
-       width="13"
-       height="12.999996"
-       x="505"
-       y="950.36218" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4646-4-6-2"
-       width="13"
-       height="12.999998"
-       x="505"
-       y="966.36218" />
-    <rect
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
-       id="rect4646-44"
-       width="13"
-       height="12.999996"
-       x="505"
-       y="869.36218" />
-  </g>
-  <g
-     inkscape:label="sketch 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-505,-869.36218)"
-     style="display:none"
-     sodipodi:insensitive="true">
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507,870.36218 0,5 3,0 4,4 0,-13 -4,4 z"
-       id="path3194"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 517,869.36218 c 1,2 1,5 0,7"
-       id="path3196"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 520,867.36218 c 2,2 2,9 0,11"
-       id="path3198"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,989.90562 0,15.99988 13,0 0,-10.99988 -5,-5 z"
-       id="path3200"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 506.93861,918.90546 0,11.5 15,0 0,-11.5 z"
-       id="path3202"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 506.93861,918.90546 7.5,6 7.5,-6"
-       id="path3204"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,890.90546 3,0"
-       id="path3212"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,893.90546 3,0"
-       id="path3214"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,899.90546 3,0"
-       id="path3218"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,902.90546 3,0"
-       id="path3220"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 517.93861,890.90546 3,0"
-       id="path3222"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,896.90546 13,0"
-       id="path3224"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 517.93861,893.90546 3,0"
-       id="path3226"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 517.93861,899.90546 3,0"
-       id="path3230"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 517.93861,902.90546 3,0"
-       id="path3232"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 510.93861,890.90546 0,12 7,0 0,-12 z"
-       id="path3206"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 507.93861,888.90546 0,16"
-       id="path3208"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 520.93861,888.90546 0,16"
-       id="path3210"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 515.93861,989.90562 0,5 5,0"
-       id="path3234"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 513.93861,969.40546 c -2,0 -5,0 -7,0 l 0,10.99995 11,5e-5 c 0,-2.33332 0,-4.66668 0,-7"
-       id="path3236"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none"
-       d="m 513.93861,976.40546 5,-4 3,3 0,-10 -10,0 3,3 -4,5"
-       id="path3242"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:none;stroke:#0066ff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 506.93861,940.40546 15,0 0,10 -6,0 -6,4 1,-4 -4,0 z"
-       id="path3244"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccc" />
-    <path
-       style="fill:none;stroke:#5b9dff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 509.93861,972.40546 c 2,1 4,3 5,5"
-       id="path4641"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer4"
-     inkscape:label="sketch 2"
-     style="display:none"
-     transform="translate(0,-6.0000106)">
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 8.4921988,1.0623917 -4.0641234,4.064123 -3.2512987,0 0,5.6897733 3.2512987,0 4.0641234,4.064124 z m -1.6256494,4.064124 0,5.6897733 -1.6256493,-1.6256493 -2.438474,-1e-6 0,-2.438474 2.438474,1e-6 z"
-       id="path4755-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 9.3050235,5.1265157 c 0,-0.812824 0.8128245,-1.625649 1.6256495,-0.812824 0,0 0.812825,0.812824 0.812825,3.251298 0,2.4384743 -0.812825,3.2512993 -0.812825,3.2512993 -0.812825,0.812825 -1.6256495,0 -1.6256495,-0.812825 0,0 0.8128245,-0.8128243 0.8128245,-2.4384743 0,-1.625649 -0.8128245,-2.438474 -0.8128245,-2.438474 z"
-       id="path4760-1"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 11.743498,3.5008667 c 0,-0.812825 0.812824,-1.625649 1.625649,-0.812825 0,0 1.625649,1.62565 1.625649,4.876948 0,3.2512993 -1.625649,4.8769483 -1.625649,4.8769483 -0.812825,0.812825 -1.625649,0 -1.625649,-0.812824 0,0 1.625649,-1.62565 1.625649,-4.0641243 0,-2.438474 -1.625649,-4.064123 -1.625649,-4.064123 z"
-       id="path4762-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2.8024261,23.008658 0,0.812825 10.5667209,0 0,-0.812825 z"
-       id="path4772"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2.8024261,33.575379 10.5667209,0 0,-0.812825 -10.5667209,0 z"
-       id="path4774"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2.8024261,25.447132 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
-       id="path4782"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2.8024261,30.32408 0,0.812824 2.438474,0 0,-0.812824 z m 8.1282469,0 0,0.812824 2.438474,0 0,-0.812824 z"
-       id="path4778"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2.8024261,28.698431 10.5667209,0 0,-0.812825 -10.5667209,0 z"
-       id="path4780"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 5.2409001,27.479194 0,1.625649 5.6897729,0 0,-1.625649 z"
-       id="path4793"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 4.4280754,23.008658 0,10.56672 7.3154226,0 0,-10.56672 z m 1.6256494,1.625649 4.0641232,0 0,7.315422 -4.0641232,0 z"
-       id="path4768"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 1.9896014,21.383009 1.6256493,0 0,13.818019 -1.6256493,0 z"
-       id="path4764"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 12.556322,21.383009 1.62565,0 0,13.818019 -1.62565,0 z"
-       id="path4766"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 1.9896014,44.954923 6.096185,5.689773 6.0961856,-5.689773 -0.812825,-0.812825 -1.625649,0.813196 -3.6577116,3.251298 -3.657711,-3.251298 -1.6256493,-0.813196 z"
-       id="path4800-4"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 1.1767767,43.329273 0,11.379545 13.8180193,0 0,-11.379545 z m 1.6256494,1.625649 10.5667209,0 0,8.128247 -10.5667209,0 z"
-       id="path4795-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 1.9896014,62.024243 -0.8128247,0.812824 0,8.128247 0.8128247,0.812825 2.438474,0 -0.8128247,3.251297 5.6897728,-3.251297 4.8769485,0 0.812824,-0.812825 0,-8.128247 -0.812824,-0.812824 z m 0.8128247,1.625649 10.5667209,0 0,6.502598 -4.0641235,0 -3.5815088,2.133664 0.9144278,-2.133664 -3.8355164,0 z"
-       id="path4802-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 4.4280754,82.344856 10.5667206,0 0,10.56672 -3.251298,-3.25129 -3.2512992,2.43847 -0.8128247,-0.81282 4.0641239,-3.2513 1.625649,1.62565 0,-5.68978 -5.6897729,0 1.6256494,1.62565 -3.2512987,4.06413 -0.8128247,-0.81283 2.438474,-3.2513 z"
-       id="path4807-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 8.4921988,85.596156 -7.3154221,0 0,10.56672 10.5667213,0 0,-7.31542 -1.62565,0.81283 0,4.87694 -7.3154219,0 0,-7.31542 4.876948,0 z"
-       id="path4809-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 8.4921988,103.47831 0,4.87694 4.8769482,0 0,-1.62565 -3.251299,0 0,-3.25129 z"
-       id="path4818-67"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 1.9896014,102.66548 0,13.81802 12.1923706,0 0,-10.13799 -3.657711,-3.68003 z m 1.6256493,1.62565 6.5025973,0 2.438474,2.43847 0,8.12825 -8.9410713,0 z"
-       id="path4813-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 3.6152507,88.847456 c 0,-0.81282 0.8128247,-0.81282 0.8128247,-0.81282 2.438474,0.81282 4.0641234,2.43847 4.8769481,4.87694 0,0 0,0.81283 -0.8128247,0.81283 -1.6256494,-2.43847 -2.438474,-3.2513 -4.8769481,-4.87695 z"
-       id="path4822-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer3"
-     inkscape:label="Layer"
-     style="display:none"
-     transform="translate(-10,-26.000007)">
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 19,20.999995 -4,4 -3,0 0,6 3,0 4,4 z m -1,2.5 0,9 -2.6,-2.5 -2.4,0 0,-4 2.5,0 z"
-       id="path4755"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none"
-       d="m 19.75,24.999995 c 0,-1 0.75,-1 0.75,-1 0,0 1.5,1.029412 1.5,3.5 0,2.470588 -1.5,3.5 -1.5,3.5 0,0 -0.75,0 -0.75,-1 0,0 1,-0.852941 1,-2.5 0,-1.647059 -1,-2.5 -1,-2.5 z"
-       id="path4760"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none"
-       d="m 22.25,23.999995 c 0,-1 0.75,-1 0.75,-1 0,0 2,1.205882 2,4.5 0,3.294118 -2,4.5 -2,4.5 0,0 -0.75,0 -0.75,-1 0,0 1.5,-1.029412 1.5,-3.5 0,-2.470588 -1.5,-3.5 -1.5,-3.5 z"
-       id="path4762"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 31.4375,79.875 -1,1 0,10 1,1 3,0 -1,4 7,-4 6,0 1,-1 0,-10 -1,-1 z m 1,2 13,0 0,8 -5,0 -4.40625,2.625 1.125,-2.625 -4.71875,0 z"
-       id="path4802"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 35.125,98.8125 13,0 0,13 -4,-4 -4,3 -1,-1 5,-4 2,2 0,-7 -7,0 2,2 -4,5 -1,-1 3,-4 z"
-       id="path4807"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 40.125,102.8125 -9,0 0,13 13,0 0,-9 -2,1 0,6 -9,0 0,-9 6,0 z"
-       id="path4809"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none"
-       d="m 34.125,106.8125 c 0,-1 1,-1 1,-1 3,1 5,3 6,6 0,0 0,1 -1,1 -2,-3 -3,-4 -6,-6 z"
-       id="path4822"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       d="m 12,50.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
-       id="rect4841"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       d="m 12,44.499995 0,1 3,0 0,-1 -3,0 z m 9,0 0,1 3,0 0,-1 -3,0 z"
-       id="rect4843"
-       inkscape:connector-curvature="0" />
-    <path
-       inkscape:connector-curvature="0"
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
-       d="m 12,52.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
-       id="rect4843-1"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       inkscape:connector-curvature="0"
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
-       d="m 12,41.999995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
-       id="rect4843-17"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
-       d="m 12,47.499995 0,1 3,0 0,-1 z m 9,0 0,1 3,0 0,-1 z"
-       id="rect4841-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <rect
-       style="fill:#15a5ea;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4835"
-       width="7"
-       height="2"
-       x="4"
-       y="27"
-       transform="translate(10,19.999995)" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 2,21 1,0 0,14 -1,0 z"
-       id="path4826"
-       inkscape:connector-curvature="0"
-       transform="translate(10,19.999995)"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 13,21 1,0 0,14 -1,0 z"
-       id="path4828"
-       inkscape:connector-curvature="0"
-       transform="translate(10,19.999995)"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 4,22 0,12 8,0 0,-12 z m 1,1 6,0 0,10 -6,0 z"
-       transform="translate(10,19.999995)"
-       id="path4830"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <rect
-       style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4837"
-       width="8"
-       height="1"
-       x="4"
-       y="22"
-       transform="translate(10,19.999995)" />
-    <rect
-       style="fill:#3366bb;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="rect4839"
-       width="8"
-       height="1"
-       x="4"
-       y="33"
-       transform="translate(10,19.999995)" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none"
-       d="m 12,64.999995 6,5 6,-5 0.53033,-1.45299 -1.28033,0.45299 -5.25,4.5 -5.25,-4.5 -1.236136,-0.53033 z"
-       id="path4910"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none"
-       d="m 11,62.999995 0,10 14,0 0,-10 z m 1,1 12,0 0,8 -12,0 z"
-       id="path4905"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 19,121 0,5 5,0 -1,-1 -3,0 0,-3 z"
-       id="path4818-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 12,121 0,14 12,0 0,-10 -4,-4 z m 1,1 6.5,0 3.5,3.5 0,8.5 -10,0 z"
-       id="path4813-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccc" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer5"
-     inkscape:label="Layer#1"
-     style="opacity:0.98999999"
-     transform="translate(0,-6.0000106)">
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 7,23.000004 -3,3 -3,0 0,4 3,0 3,3 z m -1,2.500001 0,5 -1.5,-1.500001 -2.5,0 0,-2 2.5,0 z"
-       id="path4755-9-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 7.4319858,26.075368 c 0,-0.621323 0.6213237,-1.242647 1.2426477,-0.621323 0,0 0.6213228,0.621323 0.6213228,2.485294 0,1.863971 -0.6213228,2.485294 -0.6213228,2.485294 -0.621324,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 0.6213237,-0.621324 0.6213237,-1.863971 0,-1.242648 -0.6213237,-1.863971 -0.6213237,-1.863971 z"
-       id="path4760-1-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 9.2959563,24.832721 c 0,-0.621324 0.6213228,-1.242647 1.2426477,-0.621324 0,0 1.242646,1.242648 1.242646,3.727942 0,2.485294 -1.242646,3.727941 -1.242646,3.727941 -0.6213249,0.621324 -1.2426477,0 -1.2426477,-0.621323 0,0 1.2426477,-1.242647 1.2426477,-3.106618 0,-1.863971 -1.2426477,-3.106618 -1.2426477,-3.106618 z"
-       id="path4762-8-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccsccsc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
-       d="m 2.4916056,40.000004 0,0.621323 8.0979164,0 0,-0.621323 z"
-       id="path4772-4"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
-       d="m 2.4916056,48.000004 8.0979164,0 0,-0.621324 -8.0979164,0 z"
-       id="path4774-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
-       d="m 2.4916056,41.919118 0,0.621323 1.8687499,0 0,-0.621323 z m 6.2291665,0 0,0.621323 1.8687499,0 0,-0.621323 z"
-       id="path4782-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
-       d="m 2.4916056,45.589344 0,0.621322 1.8687499,0 0,-0.621322 z m 6.2291665,0 0,0.621322 1.8687499,0 0,-0.621322 z"
-       id="path4778-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:0.99215686;stroke:none;display:inline"
-       d="m 2.4916056,44.404412 8.0979164,0 0,-0.621323 -8.0979164,0 z"
-       id="path4780-0"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 4.3603555,43.472427 0,1.242647 4.3604166,0 0,-1.242647 z"
-       id="path4793-0"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 4,40.000004 0,8 5,0 0,-8 z m 1,1 3,0 0,6 -3,0 z"
-       id="path4768-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 2,39.000004 1,0 0,10 -1,0 z"
-       id="path4764-1"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 10,39.000004 1,0 0,10 -1,0 z"
-       id="path4766-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="M 1.8400738,58.055766 6.5000005,62.405031 11.159927,58.055766 10.538604,57.434442 9.2959563,58.056049 6.5000005,60.541343 3.7040445,58.056049 2.4613977,57.434442 z"
-       id="path4800-4-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 1,57.000008 0,8 11,0 0,-8 z m 1,1 9,0 0,6 -9,0 z"
-       id="path4795-8-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc"
-       inkscape:export-filename="/home/rahah/elvidishu/steak/unreal/dev/skins/external link icons/mail.png"
-       inkscape:export-xdpi="90"
-       inkscape:export-ydpi="90" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="M 1.6213238,72.000004 1,72.621328 l 0,5.757352 0.6213238,0.621324 1.6894529,0 L 2.6894528,81.727943 7,79.000004 l 4.378677,0 L 12,78.37868 12,72.621328 11.378677,72.000004 z m 0.3786762,1 9,0 0,5 -4,0 L 4.0978858,79.896603 5,78.000004 l -3,0 z"
-       id="path4802-8-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 5,88.000004 7,0 0,7 -2,-2 -3,2 0,-1 3,-2.249999 1,1 0,-3.750001 -3.75,0 1,1 -2.25,3 -1,0 2,-3 z"
-       id="path4807-5-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 7,90.000004 -5,0 0,8 8,0 0,-5 -1,0 0,4 -6,0 0,-6 4,0 z"
-       id="path4809-7-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 7.5,105.00001 0,3 2.5,0 1,-1 -2.5,0 0,-3 z"
-       id="path4818-67-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:#3366bb;fill-opacity:1;stroke:none;display:inline"
-       d="m 3,104 0,10 8,1e-5 0,-7 -2.5,-3 z m 1,1 4,1e-5 2,2.50001 0,5.49999 -6,0 z"
-       id="path4813-2-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccc" />
-    <path
-       style="fill:#15a5ea;fill-opacity:1;stroke:none;display:inline"
-       d="m 4.0827206,92.533089 c 0,-0.621319 0.6213239,-0.621319 0.6213239,-0.621319 1.8639706,0.621319 3.1066175,1.863968 3.7279413,3.727935 0,0 0,0.621328 -0.6213238,0.621328 C 6.5680151,94.397065 5.9466913,93.775738 4.0827206,92.533089 z"
-       id="path4822-8-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
-       d="m 1,8.500006 0,7.5001 1,-0.9872 0,-6.0129 2,0 2,1 4,-2e-4 0,2.0002 1,0 0,-2.5 -0.5,-0.5002 -4.5,2e-4 -2,-1 -2.5,0 z"
-       id="path3209"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccc" />
-    <path
-       style="fill:#16a4e8;fill-opacity:1;stroke:none;display:inline"
-       d="m 6,11.000106 -1,-10e-5 -2.5,0 -0.5,0.5 -1,4.5001 10,-10e-5 0,-4.4998 -0.5,-0.5 z m 0,1 4,-10e-5 0,3 -7.75,-1e-4 0.75,-3.0001 2,0 z"
-       id="path3215"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccccc" />
-    <path
-       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
-       d="m 2,17.000006 0,1 8,0 0,-1 z"
-       id="path3247"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#3465ba;fill-opacity:1;stroke:none;display:inline"
-       d="m 5,15.500006 0,2 2,0 0,-2 c 0,-0.5 -2,-0.5 -2,0 z"
-       id="path3249"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-  </g>
-</svg>
index cb54e71..1852231 100644 (file)
@@ -19,7 +19,9 @@
                        enableAutoblockField = infuseOrNull( $( '#mw-input-wpAutoBlock' ).closest( '.oo-ui-fieldLayout' ) ),
                        hideUserField = infuseOrNull( $( '#mw-input-wpHideUser' ).closest( '.oo-ui-fieldLayout' ) ),
                        watchUserField = infuseOrNull( $( '#mw-input-wpWatch' ).closest( '.oo-ui-fieldLayout' ) ),
-                       expiryWidget = infuseOrNull( 'mw-input-wpExpiry' );
+                       expiryWidget = infuseOrNull( 'mw-input-wpExpiry' ),
+                       editingRestrictionWidget = infuseOrNull( 'mw-input-wpEditingRestriction' ),
+                       pageRestrictionsWidget = infuseOrNull( 'mw-input-wpPageRestrictions' );
 
                function updateBlockOptions() {
                        var blocktarget = blockTargetWidget.getValue().trim(),
@@ -30,7 +32,8 @@
                                expiryValue = expiryWidget.getValue(),
                                // infinityValues  are the values the SpecialBlock class accepts as infinity (sf. wfIsInfinity)
                                infinityValues = [ 'infinite', 'indefinite', 'infinity', 'never' ],
-                               isIndefinite = infinityValues.indexOf( expiryValue ) !== -1;
+                               isIndefinite = infinityValues.indexOf( expiryValue ) !== -1,
+                               editingRestrictionValue = editingRestrictionWidget ? editingRestrictionWidget.getValue() : undefined;
 
                        if ( enableAutoblockField ) {
                                enableAutoblockField.toggle( !( isNonEmptyIp ) );
                        if ( watchUserField ) {
                                watchUserField.toggle( !( isIpRange && !isEmpty ) );
                        }
+                       if ( pageRestrictionsWidget ) {
+                               pageRestrictionsWidget.setDisabled( editingRestrictionValue === 'sitewide' );
+                       }
                }
 
                if ( blockTargetWidget ) {
                        // Bind functions so they're checked whenever stuff changes
                        blockTargetWidget.on( 'change', updateBlockOptions );
                        expiryWidget.on( 'change', updateBlockOptions );
+                       editingRestrictionWidget.on( 'change', updateBlockOptions );
 
                        // Call them now to set initial state (ie. Special:Block/Foobar?wpBlockExpiry=2+hours)
                        updateBlockOptions();
diff --git a/resources/src/mediawiki.special.block.less b/resources/src/mediawiki.special.block.less
new file mode 100644 (file)
index 0000000..c013994
--- /dev/null
@@ -0,0 +1,6 @@
+.mw-block-page-restrictions {
+       margin-left: 2em;
+       .oo-ui-widget {
+               max-width: 48em;
+       }
+}
diff --git a/resources/src/mediawiki.toolbar/images/ar/button_bold.png b/resources/src/mediawiki.toolbar/images/ar/button_bold.png
deleted file mode 100644 (file)
index 50e2ff0..0000000
Binary files a/resources/src/mediawiki.toolbar/images/ar/button_bold.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/ar/button_headline.png b/resources/src/mediawiki.toolbar/images/ar/button_headline.png
deleted file mode 100644 (file)
index 2e3e781..0000000
Binary files a/resources/src/mediawiki.toolbar/images/ar/button_headline.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/ar/button_italic.png b/resources/src/mediawiki.toolbar/images/ar/button_italic.png
deleted file mode 100644 (file)
index 6b54fb6..0000000
Binary files a/resources/src/mediawiki.toolbar/images/ar/button_italic.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/ar/button_link.png b/resources/src/mediawiki.toolbar/images/ar/button_link.png
deleted file mode 100644 (file)
index 4434e7f..0000000
Binary files a/resources/src/mediawiki.toolbar/images/ar/button_link.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/ar/button_nowiki.png b/resources/src/mediawiki.toolbar/images/ar/button_nowiki.png
deleted file mode 100644 (file)
index c9378de..0000000
Binary files a/resources/src/mediawiki.toolbar/images/ar/button_nowiki.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/be-tarask/button_bold.png b/resources/src/mediawiki.toolbar/images/be-tarask/button_bold.png
deleted file mode 100644 (file)
index df6700d..0000000
Binary files a/resources/src/mediawiki.toolbar/images/be-tarask/button_bold.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/be-tarask/button_italic.png b/resources/src/mediawiki.toolbar/images/be-tarask/button_italic.png
deleted file mode 100644 (file)
index 872c00f..0000000
Binary files a/resources/src/mediawiki.toolbar/images/be-tarask/button_italic.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/be-tarask/button_link.png b/resources/src/mediawiki.toolbar/images/be-tarask/button_link.png
deleted file mode 100644 (file)
index d3dd88e..0000000
Binary files a/resources/src/mediawiki.toolbar/images/be-tarask/button_link.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/de/button_bold.png b/resources/src/mediawiki.toolbar/images/de/button_bold.png
deleted file mode 100644 (file)
index 8e6b389..0000000
Binary files a/resources/src/mediawiki.toolbar/images/de/button_bold.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/de/button_italic.png b/resources/src/mediawiki.toolbar/images/de/button_italic.png
deleted file mode 100644 (file)
index 5e3cd11..0000000
Binary files a/resources/src/mediawiki.toolbar/images/de/button_italic.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_bold.png b/resources/src/mediawiki.toolbar/images/en/button_bold.png
deleted file mode 100644 (file)
index e582fb1..0000000
Binary files a/resources/src/mediawiki.toolbar/images/en/button_bold.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_extlink.png b/resources/src/mediawiki.toolbar/images/en/button_extlink.png
deleted file mode 100644 (file)
index 458943c..0000000
Binary files a/resources/src/mediawiki.toolbar/images/en/button_extlink.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_headline.png b/resources/src/mediawiki.toolbar/images/en/button_headline.png
deleted file mode 100644 (file)
index 7d64a16..0000000
Binary files a/resources/src/mediawiki.toolbar/images/en/button_headline.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_hr.png b/resources/src/mediawiki.toolbar/images/en/button_hr.png
deleted file mode 100644 (file)
index 47e1ca4..0000000
Binary files a/resources/src/mediawiki.toolbar/images/en/button_hr.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_image.png b/resources/src/mediawiki.toolbar/images/en/button_image.png
deleted file mode 100644 (file)
index 6919296..0000000
Binary files a/resources/src/mediawiki.toolbar/images/en/button_image.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_italic.png b/resources/src/mediawiki.toolbar/images/en/button_italic.png
deleted file mode 100644 (file)
index 820efe2..0000000
Binary files a/resources/src/mediawiki.toolbar/images/en/button_italic.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_link.png b/resources/src/mediawiki.toolbar/images/en/button_link.png
deleted file mode 100644 (file)
index 5dd362c..0000000
Binary files a/resources/src/mediawiki.toolbar/images/en/button_link.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_media.png b/resources/src/mediawiki.toolbar/images/en/button_media.png
deleted file mode 100644 (file)
index 80c3156..0000000
Binary files a/resources/src/mediawiki.toolbar/images/en/button_media.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_nowiki.png b/resources/src/mediawiki.toolbar/images/en/button_nowiki.png
deleted file mode 100644 (file)
index 05a977a..0000000
Binary files a/resources/src/mediawiki.toolbar/images/en/button_nowiki.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/en/button_sig.png b/resources/src/mediawiki.toolbar/images/en/button_sig.png
deleted file mode 100644 (file)
index 2cbcc0b..0000000
Binary files a/resources/src/mediawiki.toolbar/images/en/button_sig.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/fa/button_bold.png b/resources/src/mediawiki.toolbar/images/fa/button_bold.png
deleted file mode 100644 (file)
index 5489343..0000000
Binary files a/resources/src/mediawiki.toolbar/images/fa/button_bold.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/fa/button_headline.png b/resources/src/mediawiki.toolbar/images/fa/button_headline.png
deleted file mode 100644 (file)
index 4d48a5d..0000000
Binary files a/resources/src/mediawiki.toolbar/images/fa/button_headline.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/fa/button_italic.png b/resources/src/mediawiki.toolbar/images/fa/button_italic.png
deleted file mode 100644 (file)
index 41098c7..0000000
Binary files a/resources/src/mediawiki.toolbar/images/fa/button_italic.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/fa/button_link.png b/resources/src/mediawiki.toolbar/images/fa/button_link.png
deleted file mode 100644 (file)
index 8c2d85a..0000000
Binary files a/resources/src/mediawiki.toolbar/images/fa/button_link.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/fa/button_nowiki.png b/resources/src/mediawiki.toolbar/images/fa/button_nowiki.png
deleted file mode 100644 (file)
index c9378de..0000000
Binary files a/resources/src/mediawiki.toolbar/images/fa/button_nowiki.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/ksh/LICENSE b/resources/src/mediawiki.toolbar/images/ksh/LICENSE
deleted file mode 100644 (file)
index 640bbff..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-
-button_italic.png
--------------------
-Source : https://commons.wikimedia.org/wiki/Image:Button_S_italic.png
-License: Public domain
-Author : Purodha Blissenbach, https://ksh.wikipedia.org/wiki/User:Purodha
-
diff --git a/resources/src/mediawiki.toolbar/images/ksh/button_italic.png b/resources/src/mediawiki.toolbar/images/ksh/button_italic.png
deleted file mode 100644 (file)
index 34268d9..0000000
Binary files a/resources/src/mediawiki.toolbar/images/ksh/button_italic.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/ru/LICENSE b/resources/src/mediawiki.toolbar/images/ru/LICENSE
deleted file mode 100644 (file)
index 572864b..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-button_bold.png
----------------
-Source : https://commons.wikimedia.org/wiki/File:Button_bold_ukr.png
-License: Public domain
-Author : Alexey Belomoev
-
-button_italic.png
-------------------------
-Source : https://commons.wikimedia.org/wiki/File:Button_italic_ukr.png
-License: Public domain
-Author : Alexey Belomoev
-
-button_link.png
------------------
-Source : https://commons.wikimedia.org/wiki/File:Button_internal_link_ukr.png
-License: GPL
-Author : Saproj, Erik Möller
diff --git a/resources/src/mediawiki.toolbar/images/ru/button_bold.png b/resources/src/mediawiki.toolbar/images/ru/button_bold.png
deleted file mode 100644 (file)
index a7dceb1..0000000
Binary files a/resources/src/mediawiki.toolbar/images/ru/button_bold.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/ru/button_italic.png b/resources/src/mediawiki.toolbar/images/ru/button_italic.png
deleted file mode 100644 (file)
index 44a0a74..0000000
Binary files a/resources/src/mediawiki.toolbar/images/ru/button_italic.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/images/ru/button_link.png b/resources/src/mediawiki.toolbar/images/ru/button_link.png
deleted file mode 100644 (file)
index 36b9059..0000000
Binary files a/resources/src/mediawiki.toolbar/images/ru/button_link.png and /dev/null differ
diff --git a/resources/src/mediawiki.toolbar/toolbar.js b/resources/src/mediawiki.toolbar/toolbar.js
deleted file mode 100644 (file)
index be49d26..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- * Interface for the classic edit toolbar.
- *
- * @class mw.toolbar
- * @singleton
- */
-( function () {
-       var toolbar, isReady, $toolbar, queue, slice, $currentFocused;
-
-       /**
-        * Internal helper that does the actual insertion of the button into the toolbar.
-        *
-        * For backwards-compatibility, passing `imageFile`, `speedTip`, `tagOpen`, `tagClose`,
-        * `sampleText` and `imageId` as separate arguments (in this order) is also supported.
-        *
-        * @private
-        *
-        * @param {Object} button Object with the following properties.
-        *  You are required to provide *either* the `onClick` parameter, or the three parameters
-        *  `tagOpen`, `tagClose` and `sampleText`, but not both (they're mutually exclusive).
-        * @param {string} [button.imageFile] Image to use for the button.
-        * @param {string} button.speedTip Tooltip displayed when user mouses over the button.
-        * @param {Function} [button.onClick] Function to be executed when the button is clicked.
-        * @param {string} [button.tagOpen]
-        * @param {string} [button.tagClose]
-        * @param {string} [button.sampleText] Alternative to `onClick`. `tagOpen`, `tagClose` and
-        *  `sampleText` together provide the markup that should be inserted into page text at
-        *  current cursor position.
-        * @param {string} [button.imageId] `id` attribute of the button HTML element. Can be
-        *  used to define the image with CSS if it's not provided as `imageFile`.
-        * @param {string} [speedTip]
-        * @param {string} [tagOpen]
-        * @param {string} [tagClose]
-        * @param {string} [sampleText]
-        * @param {string} [imageId]
-        */
-       function insertButton( button, speedTip, tagOpen, tagClose, sampleText, imageId ) {
-               var $button;
-
-               // Backwards compatibility
-               if ( typeof button !== 'object' ) {
-                       button = {
-                               imageFile: button,
-                               speedTip: speedTip,
-                               tagOpen: tagOpen,
-                               tagClose: tagClose,
-                               sampleText: sampleText,
-                               imageId: imageId
-                       };
-               }
-
-               if ( button.imageFile ) {
-                       $button = $( '<img>' ).attr( {
-                               src: button.imageFile,
-                               alt: button.speedTip,
-                               title: button.speedTip,
-                               id: button.imageId || undefined,
-                               'class': 'mw-toolbar-editbutton'
-                       } );
-               } else {
-                       $button = $( '<div>' ).attr( {
-                               title: button.speedTip,
-                               id: button.imageId || undefined,
-                               'class': 'mw-toolbar-editbutton'
-                       } );
-               }
-
-               $button.click( function ( e ) {
-                       if ( button.onClick !== undefined ) {
-                               button.onClick( e );
-                       } else {
-                               toolbar.insertTags( button.tagOpen, button.tagClose, button.sampleText );
-                       }
-
-                       return false;
-               } );
-
-               $toolbar.append( $button );
-       }
-
-       isReady = false;
-       $toolbar = false;
-
-       /**
-        * @private
-        * @property {Array}
-        * Contains button objects (and for backwards compatibility, it can
-        * also contains an arguments array for insertButton).
-        */
-       queue = [];
-       slice = queue.slice;
-
-       toolbar = {
-
-               /**
-                * Add buttons to the toolbar.
-                *
-                * Takes care of race conditions and time-based dependencies by placing buttons in a queue if
-                * this method is called before the toolbar is created.
-                *
-                * For backwards-compatibility, passing `imageFile`, `speedTip`, `tagOpen`, `tagClose`,
-                * `sampleText` and `imageId` as separate arguments (in this order) is also supported.
-                *
-                * @inheritdoc #insertButton
-                */
-               addButton: function () {
-                       if ( isReady ) {
-                               insertButton.apply( toolbar, arguments );
-                       } else {
-                               // Convert arguments list to array
-                               queue.push( slice.call( arguments ) );
-                       }
-               },
-
-               /**
-                * Add multiple buttons to the toolbar (see also #addButton).
-                *
-                * Example usage:
-                *
-                *     addButtons( [ { .. }, { .. }, { .. } ] );
-                *     addButtons( { .. }, { .. } );
-                *
-                * @param {...Object|Array} [buttons] An array of button objects or the first
-                *  button object in a list of variadic arguments.
-                */
-               addButtons: function ( buttons ) {
-                       if ( !Array.isArray( buttons ) ) {
-                               buttons = slice.call( arguments );
-                       }
-                       if ( isReady ) {
-                               buttons.forEach( function ( button ) {
-                                       insertButton( button );
-                               } );
-                       } else {
-                               // Push each button into the queue
-                               queue.push.apply( queue, buttons );
-                       }
-               },
-
-               /**
-                * Apply tagOpen/tagClose to selection in currently focused textarea.
-                *
-                * Uses `sampleText` if selection is empty.
-                *
-                * @param {string} tagOpen
-                * @param {string} tagClose
-                * @param {string} sampleText
-                */
-               insertTags: function ( tagOpen, tagClose, sampleText ) {
-                       if ( $currentFocused && $currentFocused.length ) {
-                               $currentFocused.textSelection(
-                                       'encapsulateSelection', {
-                                               pre: tagOpen,
-                                               peri: sampleText,
-                                               post: tagClose
-                                       }
-                               );
-                       }
-               }
-       };
-
-       // Legacy (for compatibility with the code previously in skins/common.edit.js)
-       mw.log.deprecate( window, 'addButton', toolbar.addButton, 'Use mw.toolbar.addButton instead.' );
-       mw.log.deprecate( window, 'insertTags', toolbar.insertTags, 'Use mw.toolbar.insertTags instead.' );
-
-       // For backwards compatibility. Used to be called from EditPage.php, maybe other places as well.
-       toolbar.init = $.noop;
-
-       // Expose API publicly
-       // @deprecated since MW 1.29
-       mw.log.deprecate( mw, 'toolbar', toolbar, null, 'mw.toolbar' );
-
-       $( function () {
-               var i, button;
-
-               // Used to determine where to insert tags
-               $currentFocused = $( '#wpTextbox1' );
-
-               // Populate the selector cache for $toolbar
-               $toolbar = $( '#toolbar' );
-
-               for ( i = 0; i < queue.length; i++ ) {
-                       button = queue[ i ];
-                       if ( Array.isArray( button ) ) {
-                               // Forwarded arguments array from mw.toolbar.addButton
-                               insertButton.apply( toolbar, button );
-                       } else {
-                               // Raw object from mw.toolbar.addButtons
-                               insertButton( button );
-                       }
-               }
-
-               // Clear queue
-               queue.length = 0;
-
-               // This causes further calls to addButton to go to insertion directly
-               // instead of to the queue.
-               // It is important that this is after the one and only loop through
-               // the queue
-               isReady = true;
-
-               // Apply to dynamically created textboxes as well as normal ones
-               $( document ).on( 'focus', 'textarea, input:text', function () {
-                       $currentFocused = $( this );
-               } );
-       } );
-
-}() );
diff --git a/resources/src/mediawiki.toolbar/toolbar.less b/resources/src/mediawiki.toolbar/toolbar.less
deleted file mode 100644 (file)
index 93ea294..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-@import 'mediawiki.mixins';
-
-#mw-editbutton-bold {
-       .background-image('images/@{button-bold}');
-}
-
-#mw-editbutton-italic {
-       .background-image('images/@{button-italic}');
-}
-
-#mw-editbutton-link {
-       .background-image('images/@{button-link}');
-}
-
-#mw-editbutton-extlink {
-       .background-image('images/@{button-extlink}');
-}
-
-#mw-editbutton-headline {
-       .background-image('images/@{button-headline}');
-}
-
-#mw-editbutton-image {
-       .background-image('images/@{button-image}');
-}
-
-#mw-editbutton-media {
-       .background-image('images/@{button-media}');
-}
-
-#mw-editbutton-nowiki {
-       .background-image('images/@{button-nowiki}');
-}
-
-// Who decided to make only this single one different than the name of the data item?
-#mw-editbutton-signature {
-       .background-image('images/@{button-sig}');
-}
-
-#mw-editbutton-hr {
-       .background-image('images/@{button-hr}');
-}
index c256f1f..cb1281d 100644 (file)
@@ -28,6 +28,7 @@
         * @cfg {boolean} [excludeCurrentPage] Exclude the current page from suggestions
         * @cfg {boolean} [validateTitle=true] Whether the input must be a valid title
         * @cfg {boolean} [required=false] Whether the input must not be empty
+        * @cfg {boolean} [highlightSearchQuery=true] Highlight the partial query the user used for this title
         * @cfg {Object} [cache] Result cache which implements a 'set' method, taking keyed values as an argument
         * @cfg {mw.Api} [api] API object to use, creates a default mw.Api instance if not specified
         */
@@ -51,6 +52,7 @@
                this.addQueryInput = config.addQueryInput !== false;
                this.excludeCurrentPage = !!config.excludeCurrentPage;
                this.validateTitle = config.validateTitle !== undefined ? config.validateTitle : true;
+               this.highlightSearchQuery = config.highlightSearchQuery === undefined ? true : !!config.highlightSearchQuery;
                this.cache = config.cache;
                this.api = config.api || new mw.Api();
                // Supports: IE10, FF28, Chrome23
                        missing: data.missing,
                        redirect: data.redirect,
                        disambiguation: data.disambiguation,
-                       query: this.getQueryValue(),
+                       query: this.highlightSearchQuery ? this.getQueryValue() : null,
                        compare: this.compare
                };
        };
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitlesMultiselectWidget.js b/resources/src/mediawiki.widgets/mw.widgets.TitlesMultiselectWidget.js
new file mode 100644 (file)
index 0000000..71ba33f
--- /dev/null
@@ -0,0 +1,145 @@
+/*!
+ * MediaWiki Widgets - TitlesMultiselectWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function () {
+
+       /**
+        * Creates an mw.widgets.TitlesMultiselectWidget object
+        *
+        * @class
+        * @extends OO.ui.MenuTagMultiselectWidget
+        * @mixins OO.ui.mixin.RequestManager
+        * @mixins OO.ui.mixin.PendingElement
+        * @mixins mw.widgets.TitleWidget
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        */
+       mw.widgets.TitlesMultiselectWidget = function MwWidgetsTitlesMultiselectWidget( config ) {
+               config = $.extend( true, {
+                       // Shouldn't this be handled by MenuTagMultiselectWidget?
+                       options: config.selected ? config.selected.map( function ( title ) {
+                               return {
+                                       data: title,
+                                       label: title
+                               };
+                       } ) : []
+               }, config );
+
+               // Parent constructor
+               mw.widgets.TitlesMultiselectWidget.parent.call( this, $.extend( true,
+                       {
+                               clearInputOnChoose: true,
+                               inputPosition: 'inline',
+                               allowEditTags: false
+                       },
+                       config
+               ) );
+
+               // Mixin constructors
+               mw.widgets.TitleWidget.call( this, $.extend( true, {
+                       addQueryInput: true,
+                       highlightSearchQuery: false
+               }, config ) );
+               OO.ui.mixin.RequestManager.call( this, config );
+               OO.ui.mixin.PendingElement.call( this, $.extend( true, {}, config, {
+                       $pending: this.$handle
+               } ) );
+
+               // Validate from mw.widgets.TitleWidget
+               this.input.setValidation( this.isQueryValid.bind( this ) );
+
+               if ( this.maxLength !== undefined ) {
+                       // maxLength is defined through TitleWidget parent
+                       this.input.$input.attr( 'maxlength', this.maxLength );
+               }
+
+               // Initialization
+               this.$element
+                       .addClass( 'mw-widgets-titlesMultiselectWidget' );
+
+               this.menu.$element
+                       // For consistency, use the same classes as TitleWidget
+                       // expects for menu results
+                       .addClass( 'mw-widget-titleWidget-menu' )
+                       .toggleClass( 'mw-widget-titleWidget-menu-withImages', this.showImages )
+                       .toggleClass( 'mw-widget-titleWidget-menu-withDescriptions', this.showDescriptions );
+
+               if ( 'name' in config ) {
+                       // Use this instead of <input type="hidden">, because hidden inputs do not have separate
+                       // 'value' and 'defaultValue' properties. The script on Special:Preferences
+                       // (mw.special.preferences.confirmClose) checks this property to see if a field was changed.
+                       this.hiddenInput = $( '<textarea>' )
+                               .addClass( 'oo-ui-element-hidden' )
+                               .attr( 'name', config.name )
+                               .appendTo( this.$element );
+                       // Update with preset values
+                       // Set the default value (it might be different from just being empty)
+                       this.hiddenInput.prop( 'defaultValue', this.getItems().map( function ( item ) {
+                               return item.getData();
+                       } ).join( '\n' ) );
+                       this.on( 'change', function ( items ) {
+                               this.hiddenInput.val( items.map( function ( item ) {
+                                       return item.getData();
+                               } ).join( '\n' ) );
+                               // Trigger a 'change' event as if a user edited the text
+                               // (it is not triggered when changing the value from JS code).
+                               this.hiddenInput.trigger( 'change' );
+                       }.bind( this ) );
+               }
+
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.TitlesMultiselectWidget, OO.ui.MenuTagMultiselectWidget );
+       OO.mixinClass( mw.widgets.TitlesMultiselectWidget, OO.ui.mixin.RequestManager );
+       OO.mixinClass( mw.widgets.TitlesMultiselectWidget, OO.ui.mixin.PendingElement );
+       OO.mixinClass( mw.widgets.TitlesMultiselectWidget, mw.widgets.TitleWidget );
+
+       /* Methods */
+
+       mw.widgets.TitlesMultiselectWidget.prototype.getQueryValue = function () {
+               return this.input.getValue();
+       };
+
+       /**
+        * @inheritdoc OO.ui.MenuTagMultiselectWidget
+        */
+       mw.widgets.TitlesMultiselectWidget.prototype.onInputChange = function () {
+               var widget = this;
+
+               this.getRequestData()
+                       .then( function ( data ) {
+                               // Reset
+                               widget.menu.clearItems();
+                               widget.menu.addItems( widget.getOptionsFromData( data ) );
+                       } );
+
+               mw.widgets.TitlesMultiselectWidget.parent.prototype.onInputChange.call( this );
+       };
+
+       /**
+        * @inheritdoc OO.ui.mixin.RequestManager
+        */
+       mw.widgets.TitlesMultiselectWidget.prototype.getRequestQuery = function () {
+               return this.getQueryValue();
+       };
+
+       /**
+        * @inheritdoc OO.ui.mixin.RequestManager
+        */
+       mw.widgets.TitlesMultiselectWidget.prototype.getRequest = function () {
+               return this.getSuggestionsPromise();
+       };
+
+       /**
+        * @inheritdoc OO.ui.mixin.RequestManager
+        */
+       mw.widgets.TitlesMultiselectWidget.prototype.getRequestCacheDataFromResponse = function ( response ) {
+               return response.query || {};
+       };
+}() );
index 5483ad2..bebf4dc 100644 (file)
@@ -118,9 +118,10 @@ if ( !isCompatible() ) {
                mw.config.set( $VARS.configuration );
 
                // Process callbacks for Grade A
-               // Must be after registrations and mw.config.set, which mw.loader depends on.
                var queue = window.RLQ;
-               // Redefine push(), but keep type as array for storing callbacks that require modules.
+               // Replace RLQ placeholder from ResourceLoaderClientHtml with an implementation
+               // that executes simple callbacks, but continues to store callbacks that require
+               // modules.
                window.RLQ = [];
                /* global RLQ */
                RLQ.push = function ( fn ) {
@@ -132,7 +133,7 @@ if ( !isCompatible() ) {
                        }
                };
                while ( queue && queue[ 0 ] ) {
-                       // Re-use our push()
+                       // Re-use our new push() method
                        RLQ.push( queue.shift() );
                }
 
index 41f3192..f843123 100644 (file)
@@ -93,6 +93,9 @@ $wgAutoloadClasses += [
        'MediaWiki\\Auth\\AuthenticationRequestTestCase' =>
                "$testDir/phpunit/includes/auth/AuthenticationRequestTestCase.php",
 
+       # tests/phpunit/includes/block
+       'MediaWiki\\Tests\\Block\\Restriction\\RestrictionTestCase' => "$testDir/phpunit/includes/block/Restriction/RestrictionTestCase.php",
+
        # tests/phpunit/includes/changes
        'TestRecentChangesHelper' => "$testDir/phpunit/includes/changes/TestRecentChangesHelper.php",
 
index 50d1bc9..2dc1b85 100644 (file)
Binary files a/tests/parser/extraParserTests.txt and b/tests/parser/extraParserTests.txt differ
index a921ee0..9954425 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use MediaWiki\Block\BlockRestriction;
+use MediaWiki\Block\Restriction\PageRestriction;
+
 /**
  * @group Database
  * @group Blocking
@@ -460,4 +463,263 @@ class BlockTest extends MediaWikiLangTestCase {
                }
        }
 
+       /**
+        * @covers Block::newFromRow
+        */
+       public function testNewFromRow() {
+               $badActor = $this->getTestUser()->getUser();
+               $sysop = $this->getTestSysop()->getUser();
+
+               $block = new Block( [
+                       'address' => $badActor->getName(),
+                       'user' => $badActor->getId(),
+                       'by' => $sysop->getId(),
+                       'expiry' => 'infinity',
+               ] );
+               $block->insert();
+
+               $blockQuery = Block::getQueryInfo();
+               $row = $this->db->select(
+                       $blockQuery['tables'],
+                       $blockQuery['fields'],
+                       [
+                               'ipb_id' => $block->getId(),
+                       ],
+                       __METHOD__,
+                       [],
+                       $blockQuery['joins']
+               )->fetchObject();
+
+               $block = Block::newFromRow( $row );
+               $this->assertInstanceOf( Block::class, $block );
+               $this->assertEquals( $block->getBy(), $sysop->getId() );
+               $this->assertEquals( $block->getTarget()->getName(), $badActor->getName() );
+               $block->delete();
+       }
+
+       /**
+        * @covers Block::equals
+        */
+       public function testEquals() {
+               $block = new Block();
+
+               $this->assertTrue( $block->equals( $block ) );
+
+               $partial = new Block( [
+                       'sitewide' => false,
+               ] );
+               $this->assertFalse( $block->equals( $partial ) );
+       }
+
+       /**
+        * @covers Block::isSitewide
+        */
+       public function testIsSitewide() {
+               $block = new Block();
+               $this->assertTrue( $block->isSitewide() );
+
+               $block = new Block( [
+                       'sitewide' => true,
+               ] );
+               $this->assertTrue( $block->isSitewide() );
+
+               $block = new Block( [
+                       'sitewide' => false,
+               ] );
+               $this->assertFalse( $block->isSitewide() );
+
+               $block = new Block( [
+                       'sitewide' => false,
+               ] );
+               $block->isSitewide( true );
+               $this->assertTrue( $block->isSitewide() );
+       }
+
+       /**
+        * @covers Block::getRestrictions
+        * @covers Block::setRestrictions
+        */
+       public function testRestrictions() {
+               $block = new Block();
+               $restrictions = [
+                       new PageRestriction( 0, 1 )
+               ];
+               $block->setRestrictions( $restrictions );
+
+               $this->assertSame( $restrictions, $block->getRestrictions() );
+       }
+
+       /**
+        * @covers Block::getRestrictions
+        * @covers Block::insert
+        */
+       public function testRestrictionsFromDatabase() {
+               $badActor = $this->getTestUser()->getUser();
+               $sysop = $this->getTestSysop()->getUser();
+
+               $block = new Block( [
+                       'address' => $badActor->getName(),
+                       'user' => $badActor->getId(),
+                       'by' => $sysop->getId(),
+                       'expiry' => 'infinity',
+               ] );
+               $page = $this->getExistingTestPage( 'Foo' );
+               $restriction = new PageRestriction( 0, $page->getId() );
+               $block->setRestrictions( [ $restriction ] );
+               $block->insert();
+
+               // Refresh the block from the database.
+               $block = Block::newFromID( $block->getId() );
+               $restrictions = $block->getRestrictions();
+               $this->assertCount( 1, $restrictions );
+               $this->assertTrue( $restriction->equals( $restrictions[0] ) );
+               $block->delete();
+       }
+
+       /**
+        * @covers Block::insert
+        */
+       public function testInsertExistingBlock() {
+               $badActor = $this->getTestUser()->getUser();
+               $sysop = $this->getTestSysop()->getUser();
+
+               $block = new Block( [
+                       'address' => $badActor->getName(),
+                       'user' => $badActor->getId(),
+                       'by' => $sysop->getId(),
+                       'expiry' => 'infinity',
+               ] );
+               $page = $this->getExistingTestPage( 'Foo' );
+               $restriction = new PageRestriction( 0, $page->getId() );
+               $block->setRestrictions( [ $restriction ] );
+               $block->insert();
+
+               // Insert the block again, which should result in a failur
+               $result = $block->insert();
+
+               $this->assertFalse( $result );
+
+               // Ensure that there are no restrictions where the blockId is 0.
+               $count = $this->db->selectRowCount(
+                       'ipblocks_restrictions',
+                       '*',
+                       [ 'ir_ipb_id' => 0 ],
+                       __METHOD__
+               );
+               $this->assertSame( 0, $count );
+
+               $block->delete();
+       }
+
+       /**
+        * @covers Block::preventsEdit
+        */
+       public function testPreventsEditReturnsTrueOnSitewideBlock() {
+               $user = $this->getTestUser()->getUser();
+               $block = new Block( [
+                       'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 40 * 60 * 60 ) ),
+                       'allowUsertalk' => true,
+                       'sitewide' => true
+               ] );
+
+               $block->setTarget( $user );
+               $block->setBlocker( $this->getTestSysop()->getUser() );
+               $block->insert();
+
+               $title = $this->getExistingTestPage( 'Foo' )->getTitle();
+
+               $this->assertTrue( $block->preventsEdit( $title ) );
+
+               $block->delete();
+       }
+
+       /**
+        * @covers Block::preventsEdit
+        */
+       public function testPreventsEditOnPartialBlock() {
+               $user = $this->getTestUser()->getUser();
+               $block = new Block( [
+                       'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 40 * 60 * 60 ) ),
+                       'allowUsertalk' => true,
+                       'sitewide' => false
+               ] );
+
+               $block->setTarget( $user );
+               $block->setBlocker( $this->getTestSysop()->getUser() );
+               $block->insert();
+
+               $pageFoo = $this->getExistingTestPage( 'Foo' );
+               $pageBar = $this->getExistingTestPage( 'Bar' );
+
+               $pageRestriction = new PageRestriction( $block->getId(), $pageFoo->getId() );
+               BlockRestriction::insert( [ $pageRestriction ] );
+
+               $this->assertTrue( $block->preventsEdit( $pageFoo->getTitle() ) );
+               $this->assertFalse( $block->preventsEdit( $pageBar->getTitle() ) );
+
+               $block->delete();
+       }
+
+       /**
+        * @covers Block::preventsEdit
+        * @dataProvider preventsEditOnUserTalkProvider
+        */
+       public function testPreventsEditOnUserTalkPage(
+               $allowUsertalk, $sitewide, $result, $blockAllowsUTEdit = true
+       ) {
+               $this->setMwGlobals( [
+                       'wgBlockAllowsUTEdit' => $blockAllowsUTEdit,
+               ] );
+
+               $user = $this->getTestUser()->getUser();
+               $block = new Block( [
+                       'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 40 * 60 * 60 ) ),
+                       'allowUsertalk' => $allowUsertalk,
+                       'sitewide' => $sitewide
+               ] );
+
+               $block->setTarget( $user );
+               $block->setBlocker( $this->getTestSysop()->getUser() );
+               $block->insert();
+
+               $this->assertEquals( $result, $block->preventsEdit( $user->getTalkPage() ) );
+               $block->delete();
+       }
+
+       public function preventsEditOnUserTalkProvider() {
+               return [
+                       [
+                               'allowUsertalk' => false,
+                               'sitewide' => true,
+                               'result' => true,
+                       ],
+                       [
+                               'allowUsertalk' => true,
+                               'sitewide' => true,
+                               'result' => false,
+                       ],
+                       [
+                               'allowUsertalk' => true,
+                               'sitewide' => false,
+                               'result' => false,
+                       ],
+                       [
+                               'allowUsertalk' => false,
+                               'sitewide' => false,
+                               'result' => true,
+                       ],
+                       [
+                               'allowUsertalk' => true,
+                               'sitewide' => true,
+                               'result' => true,
+                               'blockAllowsUTEdit' => false
+                       ],
+                       [
+                               'allowUsertalk' => true,
+                               'sitewide' => false,
+                               'result' => true,
+                               'blockAllowsUTEdit' => false
+                       ],
+               ];
+       }
 }
index c838fc3..ab9a472 100644 (file)
@@ -11,6 +11,7 @@ use MediaWiki\Services\ServiceDisabledException;
  * @group MediaWiki
  */
 class MediaWikiServicesTest extends MediaWikiTestCase {
+       private $deprecatedServices = [ 'CryptRand' ];
 
        /**
         * @return Config
@@ -276,6 +277,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        $getterCases[$name] = [
                                'get' . $service,
                                $class,
+                               in_array( $service, $this->deprecatedServices )
                        ];
                }
 
@@ -285,7 +287,11 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideGetters
         */
-       public function testGetters( $getter, $type ) {
+       public function testGetters( $getter, $type, $isDeprecated = false ) {
+               if ( $isDeprecated ) {
+                       $this->hideDeprecated( MediaWikiServices::class . "::$getter" );
+               }
+
                // Test against the default instance, since the dummy will not know the default services.
                $services = MediaWikiServices::getInstance();
                $service = $services->$getter();
index 18d2a8a..90413c4 100644 (file)
@@ -1442,10 +1442,13 @@ class OutputPageTest extends MediaWikiTestCase {
                $op = $this->newInstance();
                $this->assertSame( '', $op->getHTML() );
 
+               $this->hideDeprecated( 'OutputPage::addWikiText' );
                $this->hideDeprecated( 'OutputPage::addWikiTextTitle' );
                $this->hideDeprecated( 'OutputPage::addWikiTextWithTitle' );
                $this->hideDeprecated( 'OutputPage::addWikiTextTidy' );
                $this->hideDeprecated( 'OutputPage::addWikiTextTitleTidy' );
+               $this->hideDeprecated( 'disabling tidy' );
+
                if ( in_array(
                        $method,
                        [ 'addWikiTextWithTitle', 'addWikiTextTitleTidy', 'addWikiTextTitle' ]
@@ -1614,6 +1617,7 @@ class OutputPageTest extends MediaWikiTestCase {
         * @covers OutputPage::addWikiText
         */
        public function testAddWikiTextNoTitle() {
+               $this->hideDeprecated( 'OutputPage::addWikiText' );
                $this->setExpectedException( MWException::class, 'Title is null' );
 
                $op = $this->newInstance( [], null, 'notitle' );
@@ -1650,9 +1654,8 @@ class OutputPageTest extends MediaWikiTestCase {
                $op = $this->newInstance();
                $this->assertSame( '', $op->getHTML() );
                $op->addWikiMsg( 'parentheses', "<b>a" );
-               // This is known to be bad unbalanced HTML; this will be fixed
-               // by I743f4185a03403f8d9b9db010ff1ee4e9342e062 (T198214)
-               $this->assertSame( "<p>(<b>a)\n</p>", $op->getHTML() );
+               // The input is bad unbalanced HTML, but the output is tidied
+               $this->assertSame( "<p>(<b>a)\n</b></p>", $op->getHTML() );
        }
 
        /**
index 060099e..dbe4d4e 100644 (file)
@@ -25,6 +25,11 @@ class MutableRevisionRecordTest extends MediaWikiTestCase {
 
        use RevisionRecordTests;
 
+       function setUp() {
+               Title::clearCaches();
+               parent::setUp();
+       }
+
        /**
         * @param array $rowOverrides
         *
index 715d469..44d440f 100644 (file)
@@ -352,4 +352,9 @@ class TitleMethodsTest extends MediaWikiLangTestCase {
                $this->assertNotSame( $title1, $title2, 'title cache should be empty' );
                $this->assertEquals( 0, $linkCache->getGoodLinkID( 'Foo' ), 'link cache should be empty' );
        }
+
+       function tearDown() {
+               Title::clearCaches();
+               parent::tearDown();
+       }
 }
index 5aa24e5..11b9c01 100644 (file)
@@ -969,5 +969,22 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                'Useruser', 'test', '23:00, 31 December 1969', '127.0.8.1',
                                $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ] ],
                        $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
+
+               // partial block message test
+               $this->user->mBlockedby = $this->user->getName();
+               $this->user->mBlock = new Block( [
+                       'address' => '127.0.8.1',
+                       'by' => $this->user->getId(),
+                       'reason' => 'no reason given',
+                       'timestamp' => $now,
+                       'sitewide' => false,
+                       'expiry' => 10,
+               ] );
+
+               $this->assertEquals( [ [ 'blockedtext-partial',
+                               '[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
+                               'Useruser', null, '23:00, 31 December 1969', '127.0.8.1',
+                               $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ] ],
+                       $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
        }
 }
index 07e861f..563d5e3 100644 (file)
@@ -233,6 +233,26 @@ class ApiBlockTest extends ApiTestCase {
                $this->doBlock( [ 'expiry' => '' ] );
        }
 
+       public function testBlockWithRestrictions() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => true,
+               ] );
+
+               $title = 'Foo';
+               $page = $this->getExistingTestPage( $title );
+
+               $this->doBlock( [
+                       'partial' => true,
+                       'pagerestrictions' => $title,
+               ] );
+
+               $block = Block::newFromTarget( $this->mUser->getName() );
+
+               $this->assertFalse( $block->isSitewide() );
+               $this->assertCount( 1, $block->getRestrictions() );
+               $this->assertEquals( $title, $block->getRestrictions()[0]->getTitle()->getText() );
+       }
+
        /**
         * @expectedException ApiUsageException
         * @expectedExceptionMessage The "token" parameter must be set
@@ -249,4 +269,50 @@ class ApiBlockTest extends ApiTestCase {
                        self::$users['sysop']->getUser()
                );
        }
+
+       /**
+        * @expectedException ApiUsageException
+        * @expectedExceptionMessage Invalid value "127.0.0.1/64" for user parameter "user".
+        */
+       public function testBlockWithLargeRange() {
+               $tokens = $this->getTokens();
+
+               $this->doApiRequest(
+                       [
+                               'action' => 'block',
+                               'user' => '127.0.0.1/64',
+                               'reason' => 'Some reason',
+                               'token' => $tokens['blocktoken'],
+                       ],
+                       null,
+                       false,
+                       self::$users['sysop']->getUser()
+               );
+       }
+
+       /**
+        * @expectedException ApiUsageException
+        * @expectedExceptionMessage "pagerestrictions" may not be over 10 (set to 11) for bots or sysops.
+        */
+       public function testBlockingToManyRestrictions() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => true,
+               ] );
+
+               $tokens = $this->getTokens();
+
+               $this->doApiRequest(
+                       [
+                               'action' => 'block',
+                               'user' => $this->mUser->getName(),
+                               'reason' => 'Some reason',
+                               'partial' => true,
+                               'pagerestrictions' => 'One|Two|Three|Four|Five|Six|Seven|Eight|Nine|Ten|Eleven',
+                               'token' => $tokens['blocktoken'],
+                       ],
+                       null,
+                       false,
+                       self::$users['sysop']->getUser()
+               );
+       }
 }
diff --git a/tests/phpunit/includes/api/ApiQueryBlocksTest.php b/tests/phpunit/includes/api/ApiQueryBlocksTest.php
new file mode 100644 (file)
index 0000000..dc7d450
--- /dev/null
@@ -0,0 +1,157 @@
+<?php
+
+use MediaWiki\Block\Restriction\PageRestriction;
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ *
+ * @covers ApiQueryBlocks
+ */
+class ApiQueryBlocksTest extends ApiTestCase {
+
+       protected $tablesUsed = [
+               'ipblocks',
+               'ipblocks_restrictions',
+       ];
+
+       public function testExecute() {
+               list( $data ) = $this->doApiRequest( [
+                       'action' => 'query',
+                       'list' => 'blocks',
+               ] );
+               $this->assertEquals( [ 'batchcomplete' => true, 'query' => [ 'blocks' => [] ] ], $data );
+       }
+
+       public function testExecuteBlock() {
+               $badActor = $this->getTestUser()->getUser();
+               $sysop = $this->getTestSysop()->getUser();
+
+               $block = new Block( [
+                       'address' => $badActor->getName(),
+                       'user' => $badActor->getId(),
+                       'by' => $sysop->getId(),
+                       'expiry' => 'infinity',
+               ] );
+
+               $block->insert();
+
+               list( $data ) = $this->doApiRequest( [
+                       'action' => 'query',
+                       'list' => 'blocks',
+               ] );
+               $this->arrayHasKey( 'query', $data );
+               $this->arrayHasKey( 'blocks', $data['query'] );
+               $this->assertCount( 1, $data['query']['blocks'] );
+               $subset = [
+                       'id' => $block->getId(),
+                       'user' => $badActor->getName(),
+                       'expiry' => $block->getExpiry(),
+               ];
+               $this->assertArraySubset( $subset, $data['query']['blocks'][0] );
+       }
+
+       public function testExecuteSitewide() {
+               $badActor = $this->getTestUser()->getUser();
+               $sysop = $this->getTestSysop()->getUser();
+
+               $block = new Block( [
+                       'address' => $badActor->getName(),
+                       'user' => $badActor->getId(),
+                       'by' => $sysop->getId(),
+                       'ipb_expiry' => 'infinity',
+                       'ipb_sitewide' => 1,
+               ] );
+
+               $block->insert();
+
+               list( $data ) = $this->doApiRequest( [
+                       'action' => 'query',
+                       'list' => 'blocks',
+               ] );
+               $this->arrayHasKey( 'query', $data );
+               $this->arrayHasKey( 'blocks', $data['query'] );
+               $this->assertCount( 1, $data['query']['blocks'] );
+               $subset = [
+                       'id' => $block->getId(),
+                       'user' => $badActor->getName(),
+                       'expiry' => $block->getExpiry(),
+                       'partial' => !$block->isSitewide(),
+               ];
+               $this->assertArraySubset( $subset, $data['query']['blocks'][0] );
+       }
+
+       public function testExecuteRestrictions() {
+               $badActor = $this->getTestUser()->getUser();
+               $sysop = $this->getTestSysop()->getUser();
+
+               $block = new Block( [
+                       'address' => $badActor->getName(),
+                       'user' => $badActor->getId(),
+                       'by' => $sysop->getId(),
+                       'expiry' => 'infinity',
+                       'sitewide' => 0,
+               ] );
+
+               $block->insert();
+
+               $subset = [
+                       'id' => $block->getId(),
+                       'user' => $badActor->getName(),
+                       'expiry' => $block->getExpiry(),
+               ];
+
+               $title = 'Lady Macbeth';
+               $pageData = $this->insertPage( $title );
+               $pageId = $pageData['id'];
+
+               $this->db->insert( 'ipblocks_restrictions', [
+                       'ir_ipb_id' => $block->getId(),
+                       'ir_type' => PageRestriction::TYPE_ID,
+                       'ir_value' => $pageId,
+               ] );
+               $this->db->insert( 'ipblocks_restrictions', [
+                       'ir_ipb_id' => $block->getId(),
+                       'ir_type' => 2,
+                       'ir_value' => 3,
+               ] );
+
+               // Test without requesting restrictions.
+               list( $data ) = $this->doApiRequest( [
+                       'action' => 'query',
+                       'list' => 'blocks',
+               ] );
+               $this->arrayHasKey( 'query', $data );
+               $this->arrayHasKey( 'blocks', $data['query'] );
+               $this->assertCount( 1, $data['query']['blocks'] );
+               $flagSubset = array_merge( $subset, [
+                       'partial' => !$block->isSitewide(),
+               ] );
+               $this->assertArraySubset( $flagSubset, $data['query']['blocks'][0] );
+               $this->assertArrayNotHasKey( 'restrictions', $data['query']['blocks'][0] );
+
+               // Test requesting the restrictions.
+               list( $data ) = $this->doApiRequest( [
+                       'action' => 'query',
+                       'list' => 'blocks',
+                       'bkprop' => 'id|user|expiry|restrictions'
+               ] );
+               $this->arrayHasKey( 'query', $data );
+               $this->arrayHasKey( 'blocks', $data['query'] );
+               $this->assertCount( 1, $data['query']['blocks'] );
+               $restrictionsSubset = array_merge( $subset, [
+                       'restrictions' => [
+                               'pages' => [
+                                       [
+                                               'id' => $pageId,
+                                               'ns' => 0,
+                                               'title' => $title,
+                                       ],
+                               ],
+                       ],
+               ] );
+               $this->assertArraySubset( $restrictionsSubset, $data['query']['blocks'][0] );
+               $this->assertArrayNotHasKey( 'partial', $data['query']['blocks'][0] );
+       }
+}
index 80043da..3aaad48 100644 (file)
@@ -107,7 +107,7 @@ class ApiQueryInfoTest extends ApiTestCase {
                        'user' => $badActor->getId(),
                        'by' => $sysop->getId(),
                        'expiry' => 'infinity',
-                       'sitewide' => 0,
+                       'sitewide' => 1,
                        'enableAutoblock' => true,
                ] );
 
diff --git a/tests/phpunit/includes/api/ApiQueryUserInfoTest.php b/tests/phpunit/includes/api/ApiQueryUserInfoTest.php
new file mode 100644 (file)
index 0000000..7dcb75c
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * @group medium
+ * @covers ApiQueryUserInfo
+ */
+class ApiQueryUserInfoTest extends ApiTestCase {
+       public function testGetBlockInfo() {
+               $apiQueryUserInfo = new ApiQueryUserInfo(
+                       new ApiQuery( new ApiMain( $this->apiContext ), 'userinfo' ),
+                       'userinfo'
+               );
+
+               $block = new Block();
+               $info = $apiQueryUserInfo->getBlockInfo( $block );
+               $subset = [
+                       'blockid' => null,
+                       'blockedby' => '',
+                       'blockedbyid' => 0,
+                       'blockreason' => '',
+                       'blockexpiry' => 'infinite',
+                       'blockpartial' => false,
+               ];
+               $this->assertArraySubset( $subset, $info );
+       }
+
+       public function testGetBlockInfoPartial() {
+               $apiQueryUserInfo = new ApiQueryUserInfo(
+                       new ApiQuery( new ApiMain( $this->apiContext ), 'userinfo' ),
+                       'userinfo'
+               );
+
+               $block = new Block( [
+                       'sitewide' => false,
+               ] );
+               $info = $apiQueryUserInfo->getBlockInfo( $block );
+               $subset = [
+                       'blockid' => null,
+                       'blockedby' => '',
+                       'blockedbyid' => 0,
+                       'blockreason' => '',
+                       'blockexpiry' => 'infinite',
+                       'blockpartial' => true,
+               ];
+               $this->assertArraySubset( $subset, $info );
+       }
+}
index 61512d5..5ef3b04 100644 (file)
@@ -364,6 +364,7 @@ class ApiStashEditTest extends ApiTestCase {
                // Now let's also increment our editcount
                $this->editPage( ucfirst( __FUNCTION__ ), '' );
 
+               $user->clearInstanceCache();
                $this->assertFalse( $this->doCheckCache( $user ),
                        "Cache should be invalidated when it's old and the user has an intervening edit" );
        }
diff --git a/tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php b/tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php
deleted file mode 100644 (file)
index 4b89d25..0000000
+++ /dev/null
@@ -1,375 +0,0 @@
-<?php
-
-namespace MediaWiki\Auth;
-
-use MediaWiki\MediaWikiServices;
-
-/**
- * @group AuthManager
- * @group Database
- * @covers MediaWiki\Auth\LegacyHookPreAuthenticationProvider
- */
-class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
-       /**
-        * Get an instance of the provider
-        * @return LegacyHookPreAuthenticationProvider
-        */
-       protected function getProvider() {
-               $request = $this->getMockBuilder( \FauxRequest::class )
-                       ->setMethods( [ 'getIP' ] )->getMock();
-               $request->expects( $this->any() )->method( 'getIP' )->will( $this->returnValue( '127.0.0.42' ) );
-
-               $manager = new AuthManager(
-                       $request,
-                       MediaWikiServices::getInstance()->getMainConfig()
-               );
-
-               $provider = new LegacyHookPreAuthenticationProvider();
-               $provider->setManager( $manager );
-               $provider->setLogger( new \Psr\Log\NullLogger() );
-               $provider->setConfig( new \HashConfig( [
-                       'PasswordAttemptThrottle' => [ 'count' => 23, 'seconds' => 42 ],
-               ] ) );
-               return $provider;
-       }
-
-       /**
-        * Sets a mock on a hook
-        * @param string $hook
-        * @param object $expect From $this->once(), $this->never(), etc.
-        * @return object $mock->expects( $expect )->method( ... ).
-        */
-       protected function hook( $hook, $expect ) {
-               $mock = $this->getMockBuilder( __CLASS__ )->setMethods( [ "on$hook" ] )->getMock();
-               $this->mergeMwGlobalArrayValue( 'wgHooks', [
-                       $hook => [ $mock ],
-               ] );
-               $mockClass = get_class( $mock );
-               $this->hideDeprecated( "$hook hook (used in $mockClass::on$hook)" );
-               return $mock->expects( $expect )->method( "on$hook" );
-       }
-
-       /**
-        * Unsets a hook
-        * @param string $hook
-        */
-       protected function unhook( $hook ) {
-               $this->mergeMwGlobalArrayValue( 'wgHooks', [
-                       $hook => [],
-               ] );
-       }
-
-       // Stubs for hooks taking reference parameters
-       public function onLoginUserMigrated( $user, &$msg ) {
-       }
-       public function onAbortLogin( $user, $password, &$abort, &$msg ) {
-       }
-       public function onAbortNewAccount( $user, &$abortError, &$abortStatus ) {
-       }
-       public function onAbortAutoAccount( $user, &$abortError ) {
-       }
-
-       /**
-        * @dataProvider provideTestForAuthentication
-        * @param string|null $username
-        * @param string|null $password
-        * @param string|null $msgForLoginUserMigrated
-        * @param int|null $abortForAbortLogin
-        * @param string|null $msgForAbortLogin
-        * @param string|null $failMsg
-        * @param array $failParams
-        */
-       public function testTestForAuthentication(
-               $username, $password,
-               $msgForLoginUserMigrated, $abortForAbortLogin, $msgForAbortLogin,
-               $failMsg, $failParams = []
-       ) {
-               $reqs = [];
-               if ( $username === null ) {
-                       $this->hook( 'LoginUserMigrated', $this->never() );
-                       $this->hook( 'AbortLogin', $this->never() );
-               } else {
-                       if ( $password === null ) {
-                               $req = $this->getMockForAbstractClass( AuthenticationRequest::class );
-                       } else {
-                               $req = new PasswordAuthenticationRequest();
-                               $req->action = AuthManager::ACTION_LOGIN;
-                               $req->password = $password;
-                       }
-                       $req->username = $username;
-                       $reqs[get_class( $req )] = $req;
-
-                       $h = $this->hook( 'LoginUserMigrated', $this->once() );
-                       if ( $msgForLoginUserMigrated !== null ) {
-                               $h->will( $this->returnCallback(
-                                       function ( $user, &$msg ) use ( $username, $msgForLoginUserMigrated ) {
-                                               $this->assertInstanceOf( \User::class, $user );
-                                               $this->assertSame( $username, $user->getName() );
-                                               $msg = $msgForLoginUserMigrated;
-                                               return false;
-                                       }
-                               ) );
-                               $this->hook( 'AbortLogin', $this->never() );
-                       } else {
-                               $h->will( $this->returnCallback(
-                                       function ( $user, &$msg ) use ( $username ) {
-                                               $this->assertInstanceOf( \User::class, $user );
-                                               $this->assertSame( $username, $user->getName() );
-                                               return true;
-                                       }
-                               ) );
-                               $h2 = $this->hook( 'AbortLogin', $this->once() );
-                               if ( $abortForAbortLogin !== null ) {
-                                       $h2->will( $this->returnCallback(
-                                               function ( $user, $pass, &$abort, &$msg )
-                                                       use ( $username, $password, $abortForAbortLogin, $msgForAbortLogin )
-                                               {
-                                                       $this->assertInstanceOf( \User::class, $user );
-                                                       $this->assertSame( $username, $user->getName() );
-                                                       if ( $password !== null ) {
-                                                               $this->assertSame( $password, $pass );
-                                                       } else {
-                                                               $this->assertInternalType( 'string', $pass );
-                                                       }
-                                                       $abort = $abortForAbortLogin;
-                                                       $msg = $msgForAbortLogin;
-                                                       return false;
-                                               }
-                                       ) );
-                               } else {
-                                       $h2->will( $this->returnCallback(
-                                               function ( $user, $pass, &$abort, &$msg ) use ( $username, $password ) {
-                                                       $this->assertInstanceOf( \User::class, $user );
-                                                       $this->assertSame( $username, $user->getName() );
-                                                       if ( $password !== null ) {
-                                                               $this->assertSame( $password, $pass );
-                                                       } else {
-                                                               $this->assertInternalType( 'string', $pass );
-                                                       }
-                                                       return true;
-                                               }
-                                       ) );
-                               }
-                       }
-               }
-               unset( $h, $h2 );
-
-               $status = $this->getProvider()->testForAuthentication( $reqs );
-
-               $this->unhook( 'LoginUserMigrated' );
-               $this->unhook( 'AbortLogin' );
-
-               if ( $failMsg === null ) {
-                       $this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
-               } else {
-                       $this->assertInstanceOf( \StatusValue::class, $status, 'should fail (type)' );
-                       $this->assertFalse( $status->isOk(), 'should fail (ok)' );
-                       $errors = $status->getErrors();
-                       $this->assertEquals( $failMsg, $errors[0]['message'], 'should fail (message)' );
-                       $this->assertEquals( $failParams, $errors[0]['params'], 'should fail (params)' );
-               }
-       }
-
-       public static function provideTestForAuthentication() {
-               return [
-                       'No valid requests' => [
-                               null, null, null, null, null, null
-                       ],
-                       'No hook errors' => [
-                               'User', 'PaSsWoRd', null, null, null, null
-                       ],
-                       'No hook errors, no password' => [
-                               'User', null, null, null, null, null
-                       ],
-                       'LoginUserMigrated no message' => [
-                               'User', 'PaSsWoRd', false, null, null, 'login-migrated-generic'
-                       ],
-                       'LoginUserMigrated with message' => [
-                               'User', 'PaSsWoRd', 'LUM-abort', null, null, 'LUM-abort'
-                       ],
-                       'LoginUserMigrated with message and params' => [
-                               'User', 'PaSsWoRd', [ 'LUM-abort', 'foo' ], null, null, 'LUM-abort', [ 'foo' ]
-                       ],
-                       'AbortLogin, SUCCESS' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::SUCCESS, null, null
-                       ],
-                       'AbortLogin, NEED_TOKEN, no message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::NEED_TOKEN, null, 'nocookiesforlogin'
-                       ],
-                       'AbortLogin, NEED_TOKEN, with message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::NEED_TOKEN, 'needtoken', 'needtoken'
-                       ],
-                       'AbortLogin, WRONG_TOKEN, no message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::WRONG_TOKEN, null, 'sessionfailure'
-                       ],
-                       'AbortLogin, WRONG_TOKEN, with message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::WRONG_TOKEN, 'wrongtoken', 'wrongtoken'
-                       ],
-                       'AbortLogin, ILLEGAL, no message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::ILLEGAL, null, 'noname'
-                       ],
-                       'AbortLogin, ILLEGAL, with message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::ILLEGAL, 'badname', 'badname'
-                       ],
-                       'AbortLogin, NO_NAME, no message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::NO_NAME, null, 'noname'
-                       ],
-                       'AbortLogin, NO_NAME, with message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::NO_NAME, 'badname', 'badname'
-                       ],
-                       'AbortLogin, WRONG_PASS, no message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::WRONG_PASS, null, 'wrongpassword'
-                       ],
-                       'AbortLogin, WRONG_PASS, with message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::WRONG_PASS, 'badpass', 'badpass'
-                       ],
-                       'AbortLogin, WRONG_PLUGIN_PASS, no message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::WRONG_PLUGIN_PASS, null, 'wrongpassword'
-                       ],
-                       'AbortLogin, WRONG_PLUGIN_PASS, with message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::WRONG_PLUGIN_PASS, 'badpass', 'badpass'
-                       ],
-                       'AbortLogin, NOT_EXISTS, no message' => [
-                               "User'", 'A', null, \LoginForm::NOT_EXISTS, null, 'nosuchusershort', [ 'User&#39;' ]
-                       ],
-                       'AbortLogin, NOT_EXISTS, with message' => [
-                               "User'", 'A', null, \LoginForm::NOT_EXISTS, 'badname', 'badname', [ 'User&#39;' ]
-                       ],
-                       'AbortLogin, EMPTY_PASS, no message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::EMPTY_PASS, null, 'wrongpasswordempty'
-                       ],
-                       'AbortLogin, EMPTY_PASS, with message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::EMPTY_PASS, 'badpass', 'badpass'
-                       ],
-                       'AbortLogin, RESET_PASS, no message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::RESET_PASS, null, 'resetpass_announce'
-                       ],
-                       'AbortLogin, RESET_PASS, with message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::RESET_PASS, 'resetpass', 'resetpass'
-                       ],
-                       'AbortLogin, THROTTLED, no message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::THROTTLED, null, 'login-throttled',
-                               [ \Message::durationParam( 42 ) ]
-                       ],
-                       'AbortLogin, THROTTLED, with message' => [
-                               'User', 'PaSsWoRd', null, \LoginForm::THROTTLED, 't', 't',
-                               [ \Message::durationParam( 42 ) ]
-                       ],
-                       'AbortLogin, USER_BLOCKED, no message' => [
-                               "User'", 'P', null, \LoginForm::USER_BLOCKED, null, 'login-userblocked', [ 'User&#39;' ]
-                       ],
-                       'AbortLogin, USER_BLOCKED, with message' => [
-                               "User'", 'P', null, \LoginForm::USER_BLOCKED, 'blocked', 'blocked', [ 'User&#39;' ]
-                       ],
-                       'AbortLogin, ABORTED, no message' => [
-                               "User'", 'P', null, \LoginForm::ABORTED, null, 'login-abort-generic', [ 'User&#39;' ]
-                       ],
-                       'AbortLogin, ABORTED, with message' => [
-                               "User'", 'P', null, \LoginForm::ABORTED, 'aborted', 'aborted', [ 'User&#39;' ]
-                       ],
-                       'AbortLogin, USER_MIGRATED, no message' => [
-                               'User', 'P', null, \LoginForm::USER_MIGRATED, null, 'login-migrated-generic'
-                       ],
-                       'AbortLogin, USER_MIGRATED, with message' => [
-                               'User', 'P', null, \LoginForm::USER_MIGRATED, 'migrated', 'migrated'
-                       ],
-                       'AbortLogin, USER_MIGRATED, with message and params' => [
-                               'User', 'P', null, \LoginForm::USER_MIGRATED, [ 'migrated', 'foo' ],
-                               'migrated', [ 'foo' ]
-                       ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideTestForAccountCreation
-        * @param string $msg
-        * @param Status|null $status
-        * @param StatusValue $result
-        */
-       public function testTestForAccountCreation( $msg, $status, $result ) {
-               $this->hook( 'AbortNewAccount', $this->once() )
-                       ->will( $this->returnCallback( function ( $user, &$error, &$abortStatus )
-                               use ( $msg, $status )
-                       {
-                               $this->assertInstanceOf( \User::class, $user );
-                               $this->assertSame( 'User', $user->getName() );
-                               $error = $msg;
-                               $abortStatus = $status;
-                               return $error === null && $status === null;
-                       } ) );
-
-               $user = \User::newFromName( 'User' );
-               $creator = \User::newFromName( 'UTSysop' );
-               $ret = $this->getProvider()->testForAccountCreation( $user, $creator, [] );
-
-               $this->unhook( 'AbortNewAccount' );
-
-               $this->assertEquals( $result, $ret );
-       }
-
-       public static function provideTestForAccountCreation() {
-               return [
-                       'No hook errors' => [
-                               null, null, \StatusValue::newGood()
-                       ],
-                       'AbortNewAccount, old style' => [
-                               'foobar', null, \StatusValue::newFatal(
-                                       \Message::newFromKey( 'createaccount-hook-aborted' )->rawParams( 'foobar' )
-                               )
-                       ],
-                       'AbortNewAccount, new style' => [
-                               'foobar',
-                               \Status::newFatal( 'aborted!', 'param' ),
-                               \StatusValue::newFatal( 'aborted!', 'param' )
-                       ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideTestUserForCreation
-        * @param string|null $error
-        * @param string|null $failMsg
-        */
-       public function testTestUserForCreation( $error, $failMsg ) {
-               $testUser = self::getTestUser()->getUser();
-               $provider = $this->getProvider();
-               $options = [ 'flags' => \User::READ_LOCKING, 'creating' => true ];
-
-               $this->hook( 'AbortNewAccount', $this->never() );
-               $this->hook( 'AbortAutoAccount', $this->once() )
-                       ->will( $this->returnCallback( function ( $user, &$abortError ) use ( $testUser, $error ) {
-                               $this->assertInstanceOf( \User::class, $user );
-                               $this->assertSame( $testUser->getName(), $user->getName() );
-                               $abortError = $error;
-                               return $error === null;
-                       } ) );
-               $status = $provider->testUserForCreation(
-                       $testUser, AuthManager::AUTOCREATE_SOURCE_SESSION, $options
-               );
-               $this->unhook( 'AbortNewAccount' );
-               $this->unhook( 'AbortAutoAccount' );
-               if ( $failMsg === null ) {
-                       $this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
-               } else {
-                       $this->assertInstanceOf( \StatusValue::class, $status, 'should fail (type)' );
-                       $this->assertFalse( $status->isOk(), 'should fail (ok)' );
-                       $errors = $status->getErrors();
-                       $this->assertEquals( $failMsg, $errors[0]['message'], 'should fail (message)' );
-               }
-
-               $this->hook( 'AbortAutoAccount', $this->never() );
-               $this->hook( 'AbortNewAccount', $this->never() );
-               $status = $provider->testUserForCreation( $testUser, false, $options );
-               $this->unhook( 'AbortNewAccount' );
-               $this->unhook( 'AbortAutoAccount' );
-               $this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
-       }
-
-       public static function provideTestUserForCreation() {
-               return [
-                       'Success' => [ null, null ],
-                       'Fail, no message' => [ false, 'login-abort-generic' ],
-                       'Fail, with message' => [ 'fail', 'fail' ],
-               ];
-       }
-}
diff --git a/tests/phpunit/includes/block/BlockRestrictionTest.php b/tests/phpunit/includes/block/BlockRestrictionTest.php
new file mode 100644 (file)
index 0000000..7889f36
--- /dev/null
@@ -0,0 +1,556 @@
+<?php
+
+namespace MediaWiki\Tests\Block;
+
+use MediaWiki\Block\BlockRestriction;
+use MediaWiki\Block\Restriction\PageRestriction;
+use MediaWiki\Block\Restriction\Restriction;
+
+/**
+ * @group Database
+ * @group Blocking
+ * @coversDefaultClass \MediaWiki\Block\BlockRestriction
+ */
+class BlockRestrictionTest extends \MediaWikiLangTestCase {
+
+       public function tearDown() {
+               parent::tearDown();
+               $this->resetTables();
+       }
+
+       /**
+        * @covers ::loadByBlockId
+        * @covers ::resultToRestrictions
+        * @covers ::rowToRestriction
+        */
+       public function testLoadMultipleRestrictions() {
+               $block = $this->insertBlock();
+
+               $pageFoo = $this->getExistingTestPage( 'Foo' );
+               $pageBar = $this->getExistingTestPage( 'Bar' );
+
+               BlockRestriction::insert( [
+                               new PageRestriction( $block->getId(), $pageFoo->getId() ),
+                               new PageRestriction( $block->getId(), $pageBar->getId() ),
+               ] );
+
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+
+               $this->assertCount( 2, $restrictions );
+       }
+
+       /**
+        * @covers ::loadByBlockId
+        * @covers ::resultToRestrictions
+        * @covers ::rowToRestriction
+        */
+       public function testWithNoRestrictions() {
+               $block = $this->insertBlock();
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertEmpty( $restrictions );
+       }
+
+       /**
+        * @covers ::loadByBlockId
+        * @covers ::resultToRestrictions
+        * @covers ::rowToRestriction
+        */
+       public function testWithEmptyParam() {
+               $restrictions = BlockRestriction::loadByBlockId( [] );
+
+               $this->assertEmpty( $restrictions );
+       }
+
+       /**
+        * @covers ::loadByBlockId
+        * @covers ::resultToRestrictions
+        * @covers ::rowToRestriction
+        */
+       public function testIgnoreNotSupportedTypes() {
+               $block = $this->insertBlock();
+
+               $pageFoo = $this->getExistingTestPage( 'Foo' );
+               $pageBar = $this->getExistingTestPage( 'Bar' );
+
+               // valid type
+               $this->insertRestriction( $block->getId(), PageRestriction::TYPE_ID, $pageFoo->getId() );
+
+               // invalid type
+               $this->insertRestriction( $block->getId(), 9, $pageBar->getId() );
+
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 1, $restrictions );
+       }
+
+       /**
+        * @covers ::loadByBlockId
+        * @covers ::resultToRestrictions
+        * @covers ::rowToRestriction
+        */
+       public function testMappingRestrictionObject() {
+               $block = $this->insertBlock();
+               $title = 'Lady Macbeth';
+               $page = $this->getExistingTestPage( $title );
+
+               BlockRestriction::insert( [
+                               new PageRestriction( $block->getId(), $page->getId() ),
+               ] );
+
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+
+               list( $pageRestriction ) = $restrictions;
+               $this->assertInstanceOf( PageRestriction::class, $pageRestriction );
+               $this->assertEquals( $block->getId(), $pageRestriction->getBlockId() );
+               $this->assertEquals( $page->getId(), $pageRestriction->getValue() );
+               $this->assertEquals( $pageRestriction->getType(), PageRestriction::TYPE );
+               $this->assertEquals( $pageRestriction->getTitle()->getText(), $title );
+       }
+
+       /**
+        * @covers ::insert
+        */
+       public function testInsert() {
+               $block = $this->insertBlock();
+
+               $pageFoo = $this->getExistingTestPage( 'Foo' );
+               $pageBar = $this->getExistingTestPage( 'Bar' );
+
+               $restrictions = [
+                       new \stdClass(),
+                       new PageRestriction( $block->getId(), $pageFoo->getId() ),
+                       new PageRestriction( $block->getId(), $pageBar->getId() ),
+               ];
+
+               $result = BlockRestriction::insert( $restrictions );
+               $this->assertTrue( $result );
+
+               $restrictions = [
+                       new \stdClass(),
+               ];
+
+               $result = BlockRestriction::insert( $restrictions );
+               $this->assertFalse( $result );
+
+               $result = BlockRestriction::insert( [] );
+               $this->assertFalse( $result );
+       }
+
+       /**
+        * @covers ::insert
+        */
+       public function testInsertTypes() {
+               $block = $this->insertBlock();
+
+               $pageFoo = $this->getExistingTestPage( 'Foo' );
+               $pageBar = $this->getExistingTestPage( 'Bar' );
+
+               $namespace = $this->createMock( Restriction::class );
+               $namespace->method( 'toRow' )
+                       ->willReturn( [
+                               'ir_ipb_id' => $block->getId(),
+                               'ir_type' => 2,
+                               'ir_value' => 0,
+                       ] );
+
+               $invalid = $this->createMock( Restriction::class );
+               $invalid->method( 'toRow' )
+                       ->willReturn( [
+                               'ir_ipb_id' => $block->getId(),
+                               'ir_type' => 9,
+                               'ir_value' => 42,
+                       ] );
+
+               $restrictions = [
+                       new \stdClass(),
+                       new PageRestriction( $block->getId(), $pageFoo->getId() ),
+                       new PageRestriction( $block->getId(), $pageBar->getId() ),
+                       $namespace,
+                       $invalid,
+               ];
+
+               $result = BlockRestriction::insert( $restrictions );
+               $this->assertTrue( $result );
+
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 2, $restrictions );
+       }
+
+       /**
+        * @covers ::update
+        * @covers ::restrictionsByBlockId
+        * @covers ::restrictionsToRemove
+        */
+       public function testUpdateInsert() {
+               $block = $this->insertBlock();
+               $pageFoo = $this->getExistingTestPage( 'Foo' );
+               $pageBar = $this->getExistingTestPage( 'Bar' );
+               BlockRestriction::insert( [
+                               new PageRestriction( $block->getId(), $pageFoo->getId() ),
+               ] );
+
+               BlockRestriction::update( [
+                       new \stdClass(),
+                       new PageRestriction( $block->getId(), $pageBar->getId() ),
+               ] );
+
+               $db = wfGetDb( DB_REPLICA );
+               $result = $db->select(
+                       [ 'ipblocks_restrictions' ],
+                       [ '*' ],
+                       [ 'ir_ipb_id' => $block->getId() ]
+               );
+
+               $this->assertEquals( 1, $result->numRows() );
+               $row = $result->fetchObject();
+               $this->assertEquals( $block->getId(), $row->ir_ipb_id );
+               $this->assertEquals( $pageBar->getId(), $row->ir_value );
+       }
+
+       /**
+        * @covers ::update
+        * @covers ::restrictionsByBlockId
+        * @covers ::restrictionsToRemove
+        */
+       public function testUpdateChange() {
+               $block = $this->insertBlock();
+               $page = $this->getExistingTestPage( 'Foo' );
+
+               BlockRestriction::update( [
+                       new PageRestriction( $block->getId(), $page->getId() ),
+               ] );
+
+               $db = wfGetDb( DB_REPLICA );
+               $result = $db->select(
+                       [ 'ipblocks_restrictions' ],
+                       [ '*' ],
+                       [ 'ir_ipb_id' => $block->getId() ]
+               );
+
+               $this->assertEquals( 1, $result->numRows() );
+               $row = $result->fetchObject();
+               $this->assertEquals( $block->getId(), $row->ir_ipb_id );
+               $this->assertEquals( $page->getId(), $row->ir_value );
+       }
+
+       /**
+        * @covers ::update
+        * @covers ::restrictionsByBlockId
+        * @covers ::restrictionsToRemove
+        */
+       public function testUpdateNoRestrictions() {
+               $block = $this->insertBlock();
+
+               BlockRestriction::update( [] );
+
+               $db = wfGetDb( DB_REPLICA );
+               $result = $db->select(
+                       [ 'ipblocks_restrictions' ],
+                       [ '*' ],
+                       [ 'ir_ipb_id' => $block->getId() ]
+               );
+
+               $this->assertEquals( 0, $result->numRows() );
+       }
+
+       /**
+        * @covers ::update
+        * @covers ::restrictionsByBlockId
+        * @covers ::restrictionsToRemove
+        */
+       public function testUpdateSame() {
+               $block = $this->insertBlock();
+               $page = $this->getExistingTestPage( 'Foo' );
+               BlockRestriction::insert( [
+                               new PageRestriction( $block->getId(), $page->getId() ),
+               ] );
+
+               BlockRestriction::update( [
+                       new PageRestriction( $block->getId(), $page->getId() ),
+               ] );
+
+               $db = wfGetDb( DB_REPLICA );
+               $result = $db->select(
+                       [ 'ipblocks_restrictions' ],
+                       [ '*' ],
+                       [ 'ir_ipb_id' => $block->getId() ]
+               );
+
+               $this->assertEquals( 1, $result->numRows() );
+               $row = $result->fetchObject();
+               $this->assertEquals( $block->getId(), $row->ir_ipb_id );
+               $this->assertEquals( $page->getId(), $row->ir_value );
+       }
+
+       /**
+        * @covers ::updateByParentBlockId
+        */
+       public function testDeleteAllUpdateByParentBlockId() {
+               // Create a block and an autoblock (a child block)
+               $block = $this->insertBlock();
+               $pageFoo = $this->getExistingTestPage( 'Foo' );
+               $pageBar = $this->getExistingTestPage( 'Bar' );
+               BlockRestriction::insert( [
+                       new PageRestriction( $block->getId(), $pageFoo->getId() ),
+               ] );
+               $autoblockId = $block->doAutoblock( '127.0.0.1' );
+
+               // Ensure that the restrictions on the block have not changed.
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 1, $restrictions );
+               $this->assertEquals( $pageFoo->getId(), $restrictions[0]->getValue() );
+
+               // Ensure that the restrictions on the autoblock are the same as the block.
+               $restrictions = BlockRestriction::loadByBlockId( $autoblockId );
+               $this->assertCount( 1, $restrictions );
+               $this->assertEquals( $pageFoo->getId(), $restrictions[0]->getValue() );
+
+               // Update the restrictions on the autoblock (but leave the block unchanged)
+               BlockRestriction::updateByParentBlockId( $block->getId(), [
+                       new PageRestriction( $block->getId(), $pageBar->getId() ),
+               ] );
+
+               // Ensure that the restrictions on the block have not changed.
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 1, $restrictions );
+               $this->assertEquals( $pageFoo->getId(), $restrictions[0]->getValue() );
+
+               // Ensure that the restrictions on the autoblock have been updated.
+               $restrictions = BlockRestriction::loadByBlockId( $autoblockId );
+               $this->assertCount( 1, $restrictions );
+               $this->assertEquals( $pageBar->getId(), $restrictions[0]->getValue() );
+       }
+
+       /**
+        * @covers ::updateByParentBlockId
+        */
+       public function testUpdateByParentBlockId() {
+               // Create a block and an autoblock (a child block)
+               $block = $this->insertBlock();
+               $page = $this->getExistingTestPage( 'Foo' );
+               BlockRestriction::insert( [
+                       new PageRestriction( $block->getId(), $page->getId() ),
+               ] );
+               $autoblockId = $block->doAutoblock( '127.0.0.1' );
+
+               // Ensure that the restrictions on the block have not changed.
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 1, $restrictions );
+
+               // Ensure that the restrictions on the autoblock have not changed.
+               $restrictions = BlockRestriction::loadByBlockId( $autoblockId );
+               $this->assertCount( 1, $restrictions );
+
+               // Remove the restrictions on the autoblock (but leave the block unchanged)
+               BlockRestriction::updateByParentBlockId( $block->getId(), [] );
+
+               // Ensure that the restrictions on the block have not changed.
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 1, $restrictions );
+
+               // Ensure that the restrictions on the autoblock have been updated.
+               $restrictions = BlockRestriction::loadByBlockId( $autoblockId );
+               $this->assertCount( 0, $restrictions );
+       }
+
+       /**
+        * @covers ::updateByParentBlockId
+        */
+       public function testNoAutoblocksUpdateByParentBlockId() {
+               // Create a block with no autoblock.
+               $block = $this->insertBlock();
+               $page = $this->getExistingTestPage( 'Foo' );
+               BlockRestriction::insert( [
+                       new PageRestriction( $block->getId(), $page->getId() ),
+               ] );
+
+               // Ensure that the restrictions on the block have not changed.
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 1, $restrictions );
+
+               // Update the restrictions on any autoblocks (there are none).
+               BlockRestriction::updateByParentBlockId( $block->getId(), $restrictions );
+
+               // Ensure that the restrictions on the block have not changed.
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 1, $restrictions );
+       }
+
+       /**
+        * @covers ::delete
+        */
+       public function testDelete() {
+               $block = $this->insertBlock();
+               $page = $this->getExistingTestPage( 'Foo' );
+               BlockRestriction::insert( [
+                       new PageRestriction( $block->getId(), $page->getId() ),
+               ] );
+
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 1, $restrictions );
+
+               $result = BlockRestriction::delete( array_merge( $restrictions, [ new \stdClass() ] ) );
+               $this->assertTrue( $result );
+
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 0, $restrictions );
+       }
+
+       /**
+        * @covers ::deleteByBlockId
+        */
+       public function testDeleteByBlockId() {
+               $block = $this->insertBlock();
+               $page = $this->getExistingTestPage( 'Foo' );
+               BlockRestriction::insert( [
+                       new PageRestriction( $block->getId(), $page->getId() ),
+               ] );
+
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 1, $restrictions );
+
+               $result = BlockRestriction::deleteByBlockId( $block->getId() );
+               $this->assertNotFalse( $result );
+
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 0, $restrictions );
+       }
+
+       /**
+        * @covers ::deleteByParentBlockId
+        */
+       public function testDeleteByParentBlockId() {
+               // Create a block with no autoblock.
+               $block = $this->insertBlock();
+               $page = $this->getExistingTestPage( 'Foo' );
+               BlockRestriction::insert( [
+                       new PageRestriction( $block->getId(), $page->getId() ),
+               ] );
+               $autoblockId = $block->doAutoblock( '127.0.0.1' );
+
+               // Ensure that the restrictions on the block have not changed.
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 1, $restrictions );
+
+               // Ensure that the restrictions on the autoblock are the same as the block.
+               $restrictions = BlockRestriction::loadByBlockId( $autoblockId );
+               $this->assertCount( 1, $restrictions );
+
+               // Remove all of the restrictions on the autoblock (but leave the block unchanged).
+               $result = BlockRestriction::deleteByParentBlockId( $block->getId() );
+               // NOTE: commented out until https://gerrit.wikimedia.org/r/c/mediawiki/core/+/469324 is merged
+               //$this->assertTrue( $result );
+
+               // Ensure that the restrictions on the block have not changed.
+               $restrictions = BlockRestriction::loadByBlockId( $block->getId() );
+               $this->assertCount( 1, $restrictions );
+
+               // Ensure that the restrictions on the autoblock have been removed.
+               $restrictions = BlockRestriction::loadByBlockId( $autoblockId );
+               $this->assertCount( 0, $restrictions );
+       }
+
+       /**
+        * @covers ::equals
+        * @dataProvider equalsDataProvider
+        *
+        * @param array $a
+        * @param array $b
+        * @param bool $expected
+        */
+       public function testEquals( array $a, array $b, $expected ) {
+               $this->assertSame( $expected, BlockRestriction::equals( $a, $b ) );
+       }
+
+       public function equalsDataProvider() {
+               return [
+                       [
+                               [
+                                       new \stdClass(),
+                                       new PageRestriction( 1, 1 ),
+                               ],
+                               [
+                                       new \stdClass(),
+                                       new PageRestriction( 1, 2 )
+                               ],
+                               false,
+                       ],
+                       [
+                               [
+                                       new PageRestriction( 1, 1 ),
+                               ],
+                               [
+                                       new PageRestriction( 1, 1 ),
+                                       new PageRestriction( 1, 2 )
+                               ],
+                               false,
+                       ],
+                       [
+                               [],
+                               [],
+                               true,
+                       ],
+                       [
+                               [
+                                       new PageRestriction( 1, 1 ),
+                                       new PageRestriction( 1, 2 ),
+                                       new PageRestriction( 2, 3 ),
+                               ],
+                               [
+                                       new PageRestriction( 2, 3 ),
+                                       new PageRestriction( 1, 2 ),
+                                       new PageRestriction( 1, 1 ),
+                               ],
+                               true
+                       ],
+               ];
+       }
+
+       /**
+        * @covers ::setBlockId
+        */
+       public function testSetBlockId() {
+               $restrictions = [
+                       new \stdClass(),
+                       new PageRestriction( 1, 1 ),
+                       new PageRestriction( 1, 2 ),
+               ];
+
+               $result = BlockRestriction::setBlockId( 2, $restrictions );
+
+               $this->assertSame( 1, $restrictions[1]->getBlockId() );
+               $this->assertSame( 1, $restrictions[2]->getBlockId() );
+               $this->assertSame( 2, $result[0]->getBlockId() );
+               $this->assertSame( 2, $result[1]->getBlockId() );
+       }
+
+       protected function insertBlock() {
+               $badActor = $this->getTestUser()->getUser();
+               $sysop = $this->getTestSysop()->getUser();
+
+               $block = new \Block( [
+                       'address' => $badActor->getName(),
+                       'user' => $badActor->getId(),
+                       'by' => $sysop->getId(),
+                       'expiry' => 'infinity',
+                       'sitewide' => 0,
+                       'enableAutoblock' => true,
+               ] );
+
+               $block->insert();
+
+               return $block;
+       }
+
+       protected function insertRestriction( $blockId, $type, $value ) {
+               $this->db->insert( 'ipblocks_restrictions', [
+                       'ir_ipb_id' => $blockId,
+                       'ir_type' => $type,
+                       'ir_value' => $value,
+               ] );
+       }
+
+       protected function resetTables() {
+               $this->db->delete( 'ipblocks', '*', __METHOD__ );
+               $this->db->delete( 'ipblocks_restrictions', '*', __METHOD__ );
+       }
+}
diff --git a/tests/phpunit/includes/block/Restriction/PageRestrictionTest.php b/tests/phpunit/includes/block/Restriction/PageRestrictionTest.php
new file mode 100644 (file)
index 0000000..95cb3b7
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+namespace MediaWiki\Tests\Block\Restriction;
+
+use MediaWiki\Block\Restriction\PageRestriction;
+
+/**
+ * @group Database
+ * @group Blocking
+ * @covers \MediaWiki\Block\Restriction\AbstractRestriction
+ * @covers \MediaWiki\Block\Restriction\PageRestriction
+ */
+class PageRestrictionTest extends RestrictionTestCase {
+
+       public function testMatches() {
+               $class = $this->getClass();
+               $page = $this->getExistingTestPage( 'Saturn' );
+               $restriction = new $class( 1, $page->getId() );
+               $this->assertTrue( $restriction->matches( $page->getTitle() ) );
+
+               $page = $this->getExistingTestPage( 'Mars' );
+               $this->assertFalse( $restriction->matches( $page->getTitle() ) );
+       }
+
+       public function testGetType() {
+               $class = $this->getClass();
+               $restriction = new $class( 1, 2 );
+               $this->assertEquals( 'page', $restriction->getType() );
+       }
+
+       public function testGetTitle() {
+               $class = $this->getClass();
+               $restriction = new $class( 1, 2 );
+               $title = \Title::newFromText( 'Pluto' );
+               $title->mArticleID = 2;
+               $restriction->setTitle( $title );
+               $this->assertSame( $title, $restriction->getTitle() );
+
+               $restriction = new $class( 1, 1 );
+               $title = \Title::newFromId( 1 );
+               $this->assertEquals( $title->getArticleId(), $restriction->getTitle()->getArticleId() );
+       }
+
+       public function testNewFromRow() {
+               $class = $this->getClass();
+               $restriction = $class::newFromRow( (object)[
+                       'ir_ipb_id' => 1,
+                       'ir_value' => 2,
+                       'page_namespace' => 0,
+                       'page_title' => 'Saturn',
+               ] );
+
+               $this->assertSame( 1, $restriction->getBlockId() );
+               $this->assertSame( 2, $restriction->getValue() );
+               $this->assertSame( 'Saturn', $restriction->getTitle()->getText() );
+       }
+
+       /**
+        * {@inheritdoc}
+        */
+       protected function getClass() {
+               return PageRestriction::class;
+       }
+}
diff --git a/tests/phpunit/includes/block/Restriction/RestrictionTestCase.php b/tests/phpunit/includes/block/Restriction/RestrictionTestCase.php
new file mode 100644 (file)
index 0000000..51e004c
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+
+namespace MediaWiki\Tests\Block\Restriction;
+
+/**
+ * @group Blocking
+ */
+abstract class RestrictionTestCase extends \MediaWikiTestCase {
+       public function testConstruct() {
+               $class = $this->getClass();
+               $restriction = new $class( 1, 2 );
+
+               $this->assertSame( $restriction->getBlockId(), 1 );
+               $this->assertSame( $restriction->getValue(), 2 );
+       }
+
+       public function testSetBlockId() {
+               $class = $this->getClass();
+               $restriction = new $class( 1, 2 );
+
+               $restriction->setBlockId( 10 );
+               $this->assertSame( $restriction->getBlockId(), 10 );
+       }
+
+       public function testEquals() {
+               $class = $this->getClass();
+
+               // Test two restrictions with the same data.
+               $restriction = new $class( 1, 2 );
+               $second = new $class( 1, 2 );
+               $this->assertTrue( $restriction->equals( $second ) );
+
+               // Test two restrictions that implement different classes.
+               $second = $this->createMock( $this->getClass() );
+               $this->assertFalse( $restriction->equals( $second ) );
+
+               // Not the same block id.
+               $second = new $class( 2, 2 );
+               $this->assertTrue( $restriction->equals( $second ) );
+
+               // Not the same value.
+               $second = new $class( 1, 3 );
+               $this->assertFalse( $restriction->equals( $second ) );
+       }
+
+       public function testNewFromRow() {
+               $class = $this->getClass();
+
+               $restriction = $class::newFromRow( (object)[
+                       'ir_ipb_id' => 1,
+                       'ir_value' => 2,
+               ] );
+
+               $this->assertSame( 1, $restriction->getBlockId() );
+               $this->assertSame( 2, $restriction->getValue() );
+       }
+
+       public function testToRow() {
+               $class = $this->getClass();
+
+               $restriction = new $class( 1, 2 );
+               $row = $restriction->toRow();
+
+               $this->assertSame( 1, $row['ir_ipb_id'] );
+               $this->assertSame( 2, $row['ir_value'] );
+       }
+
+       /**
+        * Get the class name of the class that is being tested.
+        *
+        * @return string
+        */
+       abstract protected function getClass();
+}
index 8a05641..d550dcb 100644 (file)
@@ -191,4 +191,8 @@ class LinkRendererTest extends MediaWikiLangTestCase {
                );
        }
 
+       function tearDown() {
+               Title::clearCaches();
+               parent::tearDown();
+       }
 }
index 03671ac..85ccebc 100644 (file)
@@ -376,4 +376,77 @@ class BlockLogFormatterTest extends LogFormatterTestCase {
        public function testSuppressReblockLogDatabaseRows( $row, $extra ) {
                $this->doTestLogFormatter( $row, $extra );
        }
+
+       public function providePartialBlockLogDatabaseRows() {
+               return [
+                       [
+                               [
+                                       'type' => 'block',
+                                       'action' => 'block',
+                                       'comment' => 'Block comment',
+                                       'user' => 0,
+                                       'user_text' => 'Sysop',
+                                       'namespace' => NS_USER,
+                                       'title' => 'Logtestuser',
+                                       'params' => [
+                                               '5::duration' => 'infinite',
+                                               '6::flags' => 'anononly',
+                                               '7::restrictions' => [ 'pages' => [ 'User:Test1', 'Main Page' ] ],
+                                               'sitewide' => false,
+                                       ],
+                               ],
+                               [
+                                       'text' => 'Sysop blocked Logtestuser from editing the pages User:Test1 and Main Page'
+                                               . ' with an expiration time of indefinite (anonymous users only)',
+                                       'api' => [
+                                               'duration' => 'infinite',
+                                               'flags' => [ 'anononly' ],
+                                               'restrictions' => [ 'pages' => [
+                                                               [
+                                                                       'page_ns' => 2,
+                                                                       'page_title' => 'User:Test1',
+                                                               ], [
+                                                                       'page_ns' => 0,
+                                                                       'page_title' => 'Main Page',
+                                                               ],
+                                                       ],
+                                               ],
+                                               'sitewide' => false,
+                                       ],
+                               ],
+                       ],
+                       [
+                               [
+                                       'type' => 'block',
+                                       'action' => 'block',
+                                       'comment' => 'Block comment',
+                                       'user' => 0,
+                                       'user_text' => 'Sysop',
+                                       'namespace' => NS_USER,
+                                       'title' => 'Logtestuser',
+                                       'params' => [
+                                               '5::duration' => 'infinite',
+                                               '6::flags' => 'anononly',
+                                               'sitewide' => false,
+                                       ],
+                               ],
+                               [
+                                       'text' => 'Sysop blocked Logtestuser from non-editing actions'
+                                               . ' with an expiration time of indefinite (anonymous users only)',
+                                       'api' => [
+                                               'duration' => 'infinite',
+                                               'flags' => [ 'anononly' ],
+                                               'sitewide' => false,
+                                       ],
+                               ],
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider providePartialBlockLogDatabaseRows
+        */
+       public function testPartialBlockLogDatabaseRows( $row, $extra ) {
+               $this->doTestLogFormatter( $row, $extra );
+       }
 }
index d9c92f5..fee4583 100644 (file)
@@ -816,6 +816,15 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                                "#REDIRECT [[Media:hello_world]]",
                                "File:Hello world"
                        ],
+                       // Test fragments longer than 255 bytes (T207876)
+                       [
+                               'WikiPageTest_testGetRedirectTarget_4',
+                               CONTENT_MODEL_WIKITEXT,
+                               // phpcs:ignore Generic.Files.LineLength
+                               '#REDIRECT [[Foobar#🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿]]',
+                               // phpcs:ignore Generic.Files.LineLength
+                               'Foobar#🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬󠁦󠁲󠁿🏴󠁮󠁬...'
+                       ]
                ];
        }
 
@@ -836,7 +845,7 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
 
                # now, test the actual redirect
                $t = $page->getRedirectTarget();
-               $this->assertEquals( $target, is_null( $t ) ? null : $t->getPrefixedText() );
+               $this->assertEquals( $target, is_null( $t ) ? null : $t->getFullText() );
        }
 
        /**
index 291d75b..d702084 100644 (file)
@@ -370,6 +370,21 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                }
        }
 
+       public static function provideGuessSectionNameFromWikiText() {
+               return [
+                       [ '1/2', 'html5', '#1/2' ],
+                       [ '1/2', 'legacy', '#1.2F2' ],
+               ];
+       }
+
+       /** @dataProvider provideGuessSectionNameFromWikiText */
+       public function testGuessSectionNameFromWikiText( $input, $mode, $expected ) {
+               $this->setMwGlobals( [ 'wgFragmentMode' => [ $mode ] ] );
+               global $wgParser;
+               $result = $wgParser->guessSectionNameFromWikiText( $input );
+               $this->assertEquals( $result, $expected );
+       }
+
        // @todo Add tests for cleanSig() / cleanSigInSig(), getSection(),
        // replaceSection(), getPreloadText()
 }
index a1ad8f9..ad8fa78 100644 (file)
@@ -442,6 +442,11 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                        'Redirect resolved by getContent'
                );
        }
+
+       function tearDown() {
+               Title::clearCaches();
+               parent::tearDown();
+       }
 }
 
 class TestResourceLoaderWikiModule extends ResourceLoaderWikiModule {
index 132011a..9ccae8c 100644 (file)
@@ -27,4 +27,9 @@ class SearchNearMatcherTest extends \PHPUnit\Framework\TestCase {
                $title = $matcher->getNearMatch( $searchterm );
                $this->assertEquals( $expected, $title === null ? null : (string)$title );
        }
+
+       function tearDown() {
+               Title::clearCaches();
+               parent::tearDown();
+       }
 }
diff --git a/tests/phpunit/includes/specials/SpecialBlockTest.php b/tests/phpunit/includes/specials/SpecialBlockTest.php
new file mode 100644 (file)
index 0000000..080c6e4
--- /dev/null
@@ -0,0 +1,405 @@
+<?php
+
+use MediaWiki\Block\BlockRestriction;
+use MediaWiki\Block\Restriction\PageRestriction;
+use Wikimedia\TestingAccessWrapper;
+
+/**
+ * @group Blocking
+ * @group Database
+ * @coversDefaultClass SpecialBlock
+ */
+class SpecialBlockTest extends SpecialPageTestBase {
+       /**
+        * {@inheritdoc}
+        */
+       protected function newSpecialPage() {
+               return new SpecialBlock();
+       }
+
+       public function tearDown() {
+               parent::tearDown();
+               $this->resetTables();
+       }
+
+       /**
+        * @covers ::getFormFields()
+        */
+       public function testGetFormFields() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => false,
+               ] );
+               $page = $this->newSpecialPage();
+               $wrappedPage = TestingAccessWrapper::newFromObject( $page );
+               $fields = $wrappedPage->getFormFields();
+               $this->assertInternalType( 'array', $fields );
+               $this->assertArrayHasKey( 'Target', $fields );
+               $this->assertArrayHasKey( 'Expiry', $fields );
+               $this->assertArrayHasKey( 'Reason', $fields );
+               $this->assertArrayHasKey( 'CreateAccount', $fields );
+               $this->assertArrayHasKey( 'DisableUTEdit', $fields );
+               $this->assertArrayHasKey( 'DisableUTEdit', $fields );
+               $this->assertArrayHasKey( 'AutoBlock', $fields );
+               $this->assertArrayHasKey( 'HardBlock', $fields );
+               $this->assertArrayHasKey( 'PreviousTarget', $fields );
+               $this->assertArrayHasKey( 'Confirm', $fields );
+
+               $this->assertArrayNotHasKey( 'EditingRestriction', $fields );
+               $this->assertArrayNotHasKey( 'PageRestrictions', $fields );
+       }
+
+       /**
+        * @covers ::getFormFields()
+        */
+       public function testGetFormFieldsPartialBlocks() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => true,
+               ] );
+               $page = $this->newSpecialPage();
+               $wrappedPage = TestingAccessWrapper::newFromObject( $page );
+               $fields = $wrappedPage->getFormFields();
+
+               $this->assertArrayHasKey( 'EditingRestriction', $fields );
+               $this->assertArrayHasKey( 'PageRestrictions', $fields );
+       }
+
+       /**
+        * @covers ::maybeAlterFormDefaults()
+        */
+       public function testMaybeAlterFormDefaults() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => false,
+               ] );
+
+               $block = $this->insertBlock();
+
+               // Refresh the block from the database.
+               $block = Block::newFromTarget( $block->getTarget() );
+
+               $page = $this->newSpecialPage();
+
+               $wrappedPage = TestingAccessWrapper::newFromObject( $page );
+               $wrappedPage->target = $block->getTarget();
+               $fields = $wrappedPage->getFormFields();
+
+               $this->assertSame( (string)$block->getTarget(), $fields['Target']['default'] );
+               $this->assertSame( $block->isHardblock(), $fields['HardBlock']['default'] );
+               $this->assertSame( $block->prevents( 'createaccount' ), $fields['CreateAccount']['default'] );
+               $this->assertSame( $block->isAutoblocking(), $fields['AutoBlock']['default'] );
+               $this->assertSame( $block->prevents( 'editownusertalk' ), $fields['DisableUTEdit']['default'] );
+               $this->assertSame( $block->mReason, $fields['Reason']['default'] );
+               $this->assertSame( 'infinite', $fields['Expiry']['default'] );
+       }
+
+       /**
+        * @covers ::maybeAlterFormDefaults()
+        */
+       public function testMaybeAlterFormDefaultsPartial() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => true,
+               ] );
+
+               $badActor = $this->getTestUser()->getUser();
+               $sysop = $this->getTestSysop()->getUser();
+               $pageSaturn = $this->getExistingTestPage( 'Saturn' );
+               $pageMars = $this->getExistingTestPage( 'Mars' );
+
+               $block = new \Block( [
+                       'address' => $badActor->getName(),
+                       'user' => $badActor->getId(),
+                       'by' => $sysop->getId(),
+                       'expiry' => 'infinity',
+                       'sitewide' => 0,
+                       'enableAutoblock' => true,
+               ] );
+
+               $block->setRestrictions( [
+                       new PageRestriction( 0, $pageSaturn->getId() ),
+                       new PageRestriction( 0, $pageMars->getId() ),
+               ] );
+
+               $block->insert();
+
+               // Refresh the block from the database.
+               $block = Block::newFromTarget( $block->getTarget() );
+
+               $page = $this->newSpecialPage();
+
+               $wrappedPage = TestingAccessWrapper::newFromObject( $page );
+               $wrappedPage->target = $block->getTarget();
+               $fields = $wrappedPage->getFormFields();
+
+               $titles = [
+                       $pageMars->getTitle()->getPrefixedText(),
+                       $pageSaturn->getTitle()->getPrefixedText(),
+               ];
+
+               $this->assertSame( (string)$block->getTarget(), $fields['Target']['default'] );
+               $this->assertSame( 'partial', $fields['EditingRestriction']['default'] );
+               $this->assertSame( implode( "\n", $titles ), $fields['PageRestrictions']['default'] );
+       }
+
+       /**
+        * @covers ::processForm()
+        */
+       public function testProcessForm() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => false,
+               ] );
+               $badActor = $this->getTestUser()->getUser();
+               $context = RequestContext::getMain();
+
+               $page = $this->newSpecialPage();
+               $reason = 'test';
+               $expiry = 'infinity';
+               $data = [
+                       'Target' => (string)$badActor,
+                       'Expiry' => 'infinity',
+                       'Reason' => [
+                               $reason,
+                       ],
+                       'Confirm' => '1',
+                       'CreateAccount' => '0',
+                       'DisableUTEdit' => '0',
+                       'DisableEmail' => '0',
+                       'HardBlock' => '0',
+                       'AutoBlock' => '1',
+                       'HideUser' => '0',
+                       'Watch' => '0',
+               ];
+               $result = $page->processForm( $data, $context );
+
+               $this->assertTrue( $result );
+
+               $block = Block::newFromTarget( $badActor );
+               $this->assertSame( $reason, $block->mReason );
+               $this->assertSame( $expiry, $block->getExpiry() );
+       }
+
+       /**
+        * @covers ::processForm()
+        */
+       public function testProcessFormExisting() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => false,
+               ] );
+               $badActor = $this->getTestUser()->getUser();
+               $sysop = $this->getTestSysop()->getUser();
+               $context = RequestContext::getMain();
+
+               // Create a block that will be updated.
+               $block = new \Block( [
+                       'address' => $badActor->getName(),
+                       'user' => $badActor->getId(),
+                       'by' => $sysop->getId(),
+                       'expiry' => 'infinity',
+                       'sitewide' => 0,
+                       'enableAutoblock' => false,
+               ] );
+               $block->insert();
+
+               $page = $this->newSpecialPage();
+               $reason = 'test';
+               $expiry = 'infinity';
+               $data = [
+                       'Target' => (string)$badActor,
+                       'Expiry' => 'infinity',
+                       'Reason' => [
+                               $reason,
+                       ],
+                       'Confirm' => '1',
+                       'CreateAccount' => '0',
+                       'DisableUTEdit' => '0',
+                       'DisableEmail' => '0',
+                       'HardBlock' => '0',
+                       'AutoBlock' => '1',
+                       'HideUser' => '0',
+                       'Watch' => '0',
+               ];
+               $result = $page->processForm( $data, $context );
+
+               $this->assertTrue( $result );
+
+               $block = Block::newFromTarget( $badActor );
+               $this->assertSame( $reason, $block->mReason );
+               $this->assertSame( $expiry, $block->getExpiry() );
+               $this->assertSame( '1', $block->isAutoblocking() );
+       }
+
+       /**
+        * @covers ::processForm()
+        */
+       public function testProcessFormRestictions() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => true,
+               ] );
+               $badActor = $this->getTestUser()->getUser();
+               $context = RequestContext::getMain();
+
+               $pageSaturn = $this->getExistingTestPage( 'Saturn' );
+               $pageMars = $this->getExistingTestPage( 'Mars' );
+
+               $titles = [
+                       $pageSaturn->getTitle()->getText(),
+                       $pageMars->getTitle()->getText(),
+               ];
+
+               $page = $this->newSpecialPage();
+               $reason = 'test';
+               $expiry = 'infinity';
+               $data = [
+                       'Target' => (string)$badActor,
+                       'Expiry' => 'infinity',
+                       'Reason' => [
+                               $reason,
+                       ],
+                       'Confirm' => '1',
+                       'CreateAccount' => '0',
+                       'DisableUTEdit' => '0',
+                       'DisableEmail' => '0',
+                       'HardBlock' => '0',
+                       'AutoBlock' => '1',
+                       'HideUser' => '0',
+                       'Watch' => '0',
+                       'EditingRestriction' => 'partial',
+                       'PageRestrictions' => implode( "\n", $titles ),
+               ];
+               $result = $page->processForm( $data, $context );
+
+               $this->assertTrue( $result );
+
+               $block = Block::newFromTarget( $badActor );
+               $this->assertSame( $reason, $block->mReason );
+               $this->assertSame( $expiry, $block->getExpiry() );
+               $this->assertCount( 2, $block->getRestrictions() );
+               $this->assertTrue( BlockRestriction::equals( $block->getRestrictions(), [
+                       new PageRestriction( $block->getId(), $pageMars->getId() ),
+                       new PageRestriction( $block->getId(), $pageSaturn->getId() ),
+               ] ) );
+       }
+
+       /**
+        * @covers ::processForm()
+        */
+       public function testProcessFormRestrictionsChange() {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => true,
+               ] );
+               $badActor = $this->getTestUser()->getUser();
+               $context = RequestContext::getMain();
+
+               $pageSaturn = $this->getExistingTestPage( 'Saturn' );
+               $pageMars = $this->getExistingTestPage( 'Mars' );
+
+               $titles = [
+                       $pageSaturn->getTitle()->getText(),
+                       $pageMars->getTitle()->getText(),
+               ];
+
+               // Create a partial block.
+               $page = $this->newSpecialPage();
+               $reason = 'test';
+               $expiry = 'infinity';
+               $data = [
+                       'Target' => (string)$badActor,
+                       'Expiry' => 'infinity',
+                       'Reason' => [
+                               $reason,
+                       ],
+                       'Confirm' => '1',
+                       'CreateAccount' => '0',
+                       'DisableUTEdit' => '0',
+                       'DisableEmail' => '0',
+                       'HardBlock' => '0',
+                       'AutoBlock' => '1',
+                       'HideUser' => '0',
+                       'Watch' => '0',
+                       'EditingRestriction' => 'partial',
+                       'PageRestrictions' => implode( "\n", $titles ),
+               ];
+               $result = $page->processForm( $data, $context );
+
+               $this->assertTrue( $result );
+
+               $block = Block::newFromTarget( $badActor );
+               $this->assertSame( $reason, $block->mReason );
+               $this->assertSame( $expiry, $block->getExpiry() );
+               $this->assertFalse( $block->isSitewide() );
+               $this->assertCount( 2, $block->getRestrictions() );
+               $this->assertTrue( BlockRestriction::equals( $block->getRestrictions(), [
+                       new PageRestriction( $block->getId(), $pageMars->getId() ),
+                       new PageRestriction( $block->getId(), $pageSaturn->getId() ),
+               ] ) );
+
+               // Remove a page from the partial block.
+               $data['PageRestrictions'] = $pageMars->getTitle()->getText();
+               $result = $page->processForm( $data, $context );
+
+               $this->assertTrue( $result );
+
+               $block = Block::newFromTarget( $badActor );
+               $this->assertSame( $reason, $block->mReason );
+               $this->assertSame( $expiry, $block->getExpiry() );
+               $this->assertFalse( $block->isSitewide() );
+               $this->assertCount( 1, $block->getRestrictions() );
+               $this->assertTrue( BlockRestriction::equals( $block->getRestrictions(), [
+                       new PageRestriction( $block->getId(), $pageMars->getId() ),
+               ] ) );
+
+               // Remove the last page from the block.
+               $data['PageRestrictions'] = '';
+               $result = $page->processForm( $data, $context );
+
+               $this->assertTrue( $result );
+
+               $block = Block::newFromTarget( $badActor );
+               $this->assertSame( $reason, $block->mReason );
+               $this->assertSame( $expiry, $block->getExpiry() );
+               $this->assertFalse( $block->isSitewide() );
+               $this->assertCount( 0, $block->getRestrictions() );
+
+               // Change to sitewide.
+               $data['EditingRestriction'] = 'sitewide';
+               $result = $page->processForm( $data, $context );
+
+               $this->assertTrue( $result );
+
+               $block = Block::newFromTarget( $badActor );
+               $this->assertSame( $reason, $block->mReason );
+               $this->assertSame( $expiry, $block->getExpiry() );
+               $this->assertTrue( $block->isSitewide() );
+               $this->assertCount( 0, $block->getRestrictions() );
+
+               // Ensure that there are no restrictions where the blockId is 0.
+               $count = $this->db->selectRowCount(
+                       'ipblocks_restrictions',
+                       '*',
+                       [ 'ir_ipb_id' => 0 ],
+                       __METHOD__
+               );
+               $this->assertSame( 0, $count );
+       }
+
+       protected function insertBlock() {
+               $badActor = $this->getTestUser()->getUser();
+               $sysop = $this->getTestSysop()->getUser();
+
+               $block = new \Block( [
+                       'address' => $badActor->getName(),
+                       'user' => $badActor->getId(),
+                       'by' => $sysop->getId(),
+                       'expiry' => 'infinity',
+                       'sitewide' => 1,
+                       'enableAutoblock' => true,
+               ] );
+
+               $block->insert();
+
+               return $block;
+       }
+
+       protected function resetTables() {
+               $this->db->delete( 'ipblocks', '*', __METHOD__ );
+               $this->db->delete( 'ipblocks_restrictions', '*', __METHOD__ );
+       }
+}
diff --git a/tests/phpunit/includes/specials/pagers/BlockListPagerTest.php b/tests/phpunit/includes/specials/pagers/BlockListPagerTest.php
new file mode 100644 (file)
index 0000000..80df1d0
--- /dev/null
@@ -0,0 +1,239 @@
+<?php
+
+use MediaWiki\Block\Restriction\PageRestriction;
+use MediaWiki\MediaWikiServices;
+use Wikimedia\TestingAccessWrapper;
+
+/**
+ * @group Database
+ * @coversDefaultClass BlockListPager
+ */
+class BlockListPagerTest extends MediaWikiTestCase {
+
+       /**
+        * @covers ::formatValue
+        * @dataProvider formatValueEmptyProvider
+        * @dataProvider formatValueDefaultProvider
+        * @param string $name
+        * @param string $value
+        * @param string $expected
+        */
+       public function testFormatValue( $name, $value, $expected, $row = null ) {
+               $this->setMwGlobals( [
+                       'wgEnablePartialBlocks' => false,
+               ] );
+               $row = $row ?: new stdClass;
+               $pager = new BlockListPager( new SpecialPage(),  [] );
+               $wrappedPager = TestingAccessWrapper::newFromObject( $pager );
+               $wrappedPager->mCurrentRow = $row;
+
+               $formatted = $pager->formatValue( $name, $value );
+               $this->assertEquals( $expected, $formatted );
+       }
+
+       /**
+        * Test empty values.
+        */
+       public function formatValueEmptyProvider() {
+               return [
+                       [
+                               'test',
+                               '',
+                               'Unable to format test',
+                       ],
+                       [
+                               'ipb_timestamp',
+                               wfTimestamp( TS_UNIX ),
+                               date( 'H:i, j F Y' ),
+                       ],
+                       [
+                               'ipb_expiry',
+                               '',
+                               'infinite<br />0 minutes left',
+                       ],
+               ];
+       }
+
+       /**
+        * Test the default row values.
+        */
+       public function formatValueDefaultProvider() {
+               $row = (object)[
+                       'ipb_user' => 0,
+                       'ipb_address' => '127.0.0.1',
+                       'ipb_by_text' => 'Admin',
+                       'ipb_create_account' => 1,
+                       'ipb_auto' => 0,
+                       'ipb_anon_only' => 0,
+                       'ipb_create_account' => 1,
+                       'ipb_enable_autoblock' => 1,
+                       'ipb_deleted' => 0,
+                       'ipb_block_email' => 0,
+                       'ipb_allow_usertalk' => 0,
+                       'ipb_sitewide' => 1,
+               ];
+
+               return [
+                       [
+                               'test',
+                               '',
+                               'Unable to format test',
+                               $row,
+                       ],
+                       [
+                               'ipb_timestamp',
+                               wfTimestamp( TS_UNIX ),
+                               date( 'H:i, j F Y' ),
+                               $row,
+                       ],
+                       [
+                               'ipb_expiry',
+                               '',
+                               'infinite<br />0 minutes left',
+                               $row,
+                       ],
+                       [
+                               'ipb_by',
+                               '',
+                               $row->ipb_by_text,
+                               $row,
+                       ],
+                       [
+                               'ipb_params',
+                               '',
+                               '<ul><li>account creation disabled</li><li>cannot edit own talk page</li></ul>',
+                               $row,
+                       ]
+               ];
+       }
+
+       /**
+        * @covers ::formatValue
+        */
+       public function testFormatValueRestrictions() {
+               $this->setMwGlobals( 'wgArticlePath', '/wiki/$1' );
+
+               $pager = new BlockListPager( new SpecialPage(),  [] );
+
+               $row = (object)[
+                       'ipb_id' => 0,
+                       'ipb_user' => 0,
+                       'ipb_anon_only' => 0,
+                       'ipb_enable_autoblock' => 0,
+                       'ipb_create_account' => 0,
+                       'ipb_block_email' => 0,
+                       'ipb_allow_usertalk' => 1,
+                       'ipb_sitewide' => 0,
+               ];
+               $wrappedPager = TestingAccessWrapper::newFromObject( $pager );
+               $wrappedPager->mCurrentRow = $row;
+
+               $pageName = 'Victor Frankenstein';
+               $page = $this->insertPage( $pageName );
+               $title = $page['title'];
+               $pageId = $page['id'];
+
+               $restrictions = [
+                       ( new PageRestriction( 0, $pageId ) )->setTitle( $title )
+               ];
+
+               $wrappedPager = TestingAccessWrapper::newFromObject( $pager );
+               $wrappedPager->restrictions = $restrictions;
+
+               $formatted = $pager->formatValue( 'ipb_params', '' );
+               $this->assertEquals( '<ul><li>'
+                       // FIXME: Expectation value should not be dynamic
+                       // and must not depend on a localisation message.
+                       // TODO: Mock the message or consider using qqx.
+                       . wfMessage( 'blocklist-editing' )->text()
+                       . '<ul><li><a href="/wiki/Victor_Frankenstein" title="'
+                       . $pageName
+                       . '">'
+                       . $pageName
+                       . '</a></li></ul></li></ul>',
+                       $formatted
+               );
+       }
+
+       /**
+        * @covers ::preprocessResults
+        */
+       public function testPreprocessResults() {
+               // Test the Link Cache.
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+               $wrappedlinkCache = TestingAccessWrapper::newFromObject( $linkCache );
+
+               $links = [
+                       'User:127.0.0.1',
+                       'User_talk:127.0.0.1',
+                       'User:Admin',
+                       'User_talk:Admin',
+               ];
+
+               foreach ( $links as $link ) {
+                       $this->assertNull( $wrappedlinkCache->badLinks->get( $link ) );
+               }
+
+               $row = (object)[
+                       'ipb_address' => '127.0.0.1',
+                       'by_user_name' => 'Admin',
+                       'ipb_sitewide' => 1,
+                       'ipb_timestamp' => $this->db->timestamp( wfTimestamp( TS_MW ) ),
+               ];
+               $pager = new BlockListPager( new SpecialPage(),  [] );
+               $pager->preprocessResults( [ $row ] );
+
+               foreach ( $links as $link ) {
+                       $this->assertSame( 1, $wrappedlinkCache->badLinks->get( $link ) );
+               }
+
+               // Test Sitewide Blocks.
+               $row = (object)[
+                       'ipb_address' => '127.0.0.1',
+                       'by_user_name' => 'Admin',
+                       'ipb_sitewide' => 1,
+               ];
+               $pager = new BlockListPager( new SpecialPage(),  [] );
+               $pager->preprocessResults( [ $row ] );
+
+               $this->assertObjectNotHasAttribute( 'ipb_restrictions', $row );
+
+               $pageName = 'Victor Frankenstein';
+               $page = $this->getExistingTestPage( 'Victor Frankenstein' );
+               $title = $page->getTitle();
+
+               $target = '127.0.0.1';
+
+               // Test Partial Blocks Blocks.
+               $block = new Block( [
+                       'address' => $target,
+                       'by' => $this->getTestSysop()->getUser()->getId(),
+                       'reason' => 'Parce que',
+                       'expiry' => $this->db->getInfinity(),
+                       'sitewide' => false,
+               ] );
+               $block->setRestrictions( [
+                       new PageRestriction( 0, $page->getId() ),
+               ] );
+               $block->insert();
+
+               $result = $this->db->select( 'ipblocks', [ '*' ], [ 'ipb_id' => $block->getId() ] );
+
+               $pager = new BlockListPager( new SpecialPage(),  [] );
+               $pager->preprocessResults( $result );
+
+               $wrappedPager = TestingAccessWrapper::newFromObject( $pager );
+
+               $restrictions = $wrappedPager->restrictions;
+               $this->assertInternalType( 'array', $restrictions );
+
+               $restriction = $restrictions[0];
+               $this->assertEquals( $page->getId(), $restriction->getValue() );
+               $this->assertEquals( $page->getId(), $restriction->getTitle()->getArticleId() );
+               $this->assertEquals( $title->getDBKey(), $restriction->getTitle()->getDBKey() );
+               $this->assertEquals( $title->getNamespace(), $restriction->getTitle()->getNamespace() );
+
+               // Delete the block and the restrictions.
+               $block->delete();
+       }
+}
index 1e1f739..55b3bfc 100644 (file)
@@ -263,6 +263,7 @@ class UserTest extends MediaWikiTestCase {
 
                // increase the edit count
                $user->incEditCount();
+               $user->clearInstanceCache();
 
                $this->assertEquals(
                        4,
index e828e3f..dca1363 100644 (file)
@@ -1878,6 +1878,19 @@ class LanguageTest extends LanguageClassesTestCase {
                ];
        }
 
+       /**
+        * @covers Language::hasVariant
+        */
+       public function testHasVariant() {
+               // See LanguageSrTest::testHasVariant() for additional tests
+               $en = Language::factory( 'en' );
+               $this->assertTrue( $en->hasVariant( 'en' ), 'base is always a variant' );
+               $this->assertFalse( $en->hasVariant( 'en-bogus' ), 'bogus en variant' );
+
+               $bogus = Language::factory( 'bogus' );
+               $this->assertTrue( $bogus->hasVariant( 'bogus' ), 'base is always a variant' );
+       }
+
        /**
         * @covers Language::equals
         */
index b846c56..c9f2f3e 100644 (file)
  * @covers SrConverter
  */
 class LanguageSrTest extends LanguageClassesTestCase {
+       /**
+        * @covers Language::hasVariants
+        */
+       public function testHasVariants() {
+               $this->assertTrue( $this->getLang()->hasVariants(), 'sr has variants' );
+       }
+
+       /**
+        * @covers Language::hasVariant
+        */
+       public function testHasVariant() {
+               $langs = [
+                       'sr' => $this->getLang(),
+                       'sr-ec' => Language::factory( 'sr-ec' ),
+                       'sr-cyrl' => Language::factory( 'sr-cyrl' ),
+               ];
+               foreach ( $langs as $code => $l ) {
+                       $p = $l->getParentLanguage();
+                       $this->assertTrue( $p !== null, 'parent language exists' );
+                       $this->assertEquals( 'sr', $p->getCode(), 'sr is parent language' );
+                       $this->assertTrue( $p instanceof LanguageSr, 'parent is LanguageSr' );
+                       // This is a valid variant of the base
+                       $this->assertTrue( $p->hasVariant( $l->getCode() ) );
+                       // This test should be tweaked if/when sr-ec is renamed (T117845)
+                       // to swap the roles of sr-ec and sr-Cyrl
+                       $this->assertTrue( $l->hasVariant( 'sr-ec' ), 'sr-ec exists' );
+                       // note that sr-cyrl is an alias, not a (strict) variant name
+                       foreach ( [ 'sr-EC', 'sr-Cyrl', 'sr-cyrl', 'sr-bogus' ] as $v ) {
+                               $this->assertFalse( $l->hasVariant( $v ), "$v is not a variant of $code" );
+                       }
+               }
+       }
+
+       /**
+        * @covers Language::hasVariant
+        */
+       public function testHasVariantBogus() {
+               $langs = [
+                       // Note that case matters when calling Language::factory();
+                       // these are all bogus language codes
+                       'sr-EC' => Language::factory( 'sr-EC' ),
+                       'sr-Cyrl' => Language::factory( 'sr-Cyrl' ),
+                       'sr-bogus' => Language::factory( 'sr-bogus' ),
+               ];
+               foreach ( $langs as $code => $l ) {
+                       $p = $l->getParentLanguage();
+                       $this->assertTrue( $p === null, 'no parent for bogus language' );
+                       $this->assertFalse( $l instanceof LanguageSr, "$code is not sr" );
+                       $this->assertFalse( $this->getLang()->hasVariant( $code ), "$code is not a sr variant" );
+                       foreach ( [ 'sr', 'sr-ec', 'sr-EC', 'sr-Cyrl', 'sr-cyrl', 'sr-bogus' ] as $v ) {
+                               if ( $v !== $code ) {
+                                       $this->assertFalse( $l->hasVariant( $v ), "no variant $v" );
+                               }
+                       }
+               }
+       }
+
        /**
         * @covers LanguageConverter::convertTo
         */
index 33423d8..b8f0d12 100644 (file)
        QUnit.test( 'RLQ.push', function ( assert ) {
                /* global RLQ */
                var loaded = 0,
+                       called = 0,
                        done = assert.async();
                mw.loader.testCallback = function () {
                        loaded++;
                        delete mw.loader.testCallback;
                };
-               mw.loader.implement( 'test.rlq-push', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/mwLoaderTestCallback.js' ) ] );
+               mw.loader.implement( 'test.rlq-push', [
+                       QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/mwLoaderTestCallback.js' )
+               ] );
+
+               // Regression test for T208093
+               RLQ.push( function () {
+                       called++;
+               } );
+               assert.strictEqual( called, 1, 'Invoke plain callbacks' );
 
                RLQ.push( [ 'test.rlq-push', function () {
                        assert.strictEqual( loaded, 1, 'Load the required module' );